nodebpy 0.1.1__py3-none-any.whl → 0.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
nodebpy/nodes/mesh.py CHANGED
@@ -15,1394 +15,3 @@ KNOWN LIMITATIONS:
15
15
  """
16
16
 
17
17
  from __future__ import annotations
18
- import bpy
19
- from typing_extensions import Literal
20
- from ..builder import NodeBuilder, NodeSocket
21
- from .types import LINKABLE, TYPE_INPUT_BOOLEAN, TYPE_INPUT_VECTOR
22
-
23
-
24
- class CurveToMesh(NodeBuilder):
25
- """Convert curves into a mesh, optionally with a custom profile shape defined by curves"""
26
-
27
- name = "GeometryNodeCurveToMesh"
28
- node: bpy.types.GeometryNodeCurveToMesh
29
-
30
- def __init__(
31
- self,
32
- curve: LINKABLE = None,
33
- profile_curve: LINKABLE = None,
34
- scale: float | LINKABLE | None = 1.0,
35
- fill_caps: TYPE_INPUT_BOOLEAN = False,
36
- **kwargs,
37
- ):
38
- super().__init__()
39
- key_args = {
40
- "Curve": curve,
41
- "Profile Curve": profile_curve,
42
- "Scale": scale,
43
- "Fill Caps": fill_caps,
44
- }
45
- key_args.update(kwargs)
46
-
47
- self._establish_links(**key_args)
48
-
49
- @property
50
- def i_curve(self) -> NodeSocket:
51
- """Input socket: Curve"""
52
- return self._input("Curve")
53
-
54
- @property
55
- def i_profile_curve(self) -> NodeSocket:
56
- """Input socket: Profile Curve"""
57
- return self._input("Profile Curve")
58
-
59
- @property
60
- def i_scale(self) -> bpy.types.NodeSocketFloat:
61
- """Input socket: Scale"""
62
- return self._input("Scale")
63
-
64
- @property
65
- def i_fill_caps(self) -> bpy.types.NodeSocketBool:
66
- """Input socket: Fill Caps"""
67
- return self._input("Fill Caps")
68
-
69
- @property
70
- def o_mesh(self) -> NodeSocket:
71
- """Output socket: Mesh"""
72
- return self._output("Mesh")
73
-
74
-
75
- class DualMesh(NodeBuilder):
76
- """Convert Faces into vertices and vertices into faces"""
77
-
78
- name = "GeometryNodeDualMesh"
79
- node: bpy.types.GeometryNodeDualMesh
80
-
81
- def __init__(
82
- self,
83
- mesh: LINKABLE = None,
84
- keep_boundaries: TYPE_INPUT_BOOLEAN = False,
85
- **kwargs,
86
- ):
87
- super().__init__()
88
- key_args = {"Mesh": mesh, "Keep Boundaries": keep_boundaries}
89
- key_args.update(kwargs)
90
-
91
- self._establish_links(**key_args)
92
-
93
- @property
94
- def i_mesh(self) -> NodeSocket:
95
- """Input socket: Mesh"""
96
- return self._input("Mesh")
97
-
98
- @property
99
- def i_keep_boundaries(self) -> bpy.types.NodeSocketBool:
100
- """Input socket: Keep Boundaries"""
101
- return self._input("Keep Boundaries")
102
-
103
- @property
104
- def o_dual_mesh(self) -> NodeSocket:
105
- """Output socket: Dual Mesh"""
106
- return self._output("Dual Mesh")
107
-
108
-
109
- class ExtrudeMesh(NodeBuilder):
110
- """Generate new vertices, edges, or faces from selected elements and move them based on an offset while keeping them connected by their boundary"""
111
-
112
- name = "GeometryNodeExtrudeMesh"
113
- node: bpy.types.GeometryNodeExtrudeMesh
114
-
115
- def __init__(
116
- self,
117
- mesh: LINKABLE = None,
118
- selection: TYPE_INPUT_BOOLEAN = True,
119
- offset: LINKABLE | None = [0.0, 0.0, 0.0],
120
- offset_scale: float | LINKABLE | None = 1.0,
121
- individual: TYPE_INPUT_BOOLEAN = True,
122
- mode: Literal["VERTICES", "EDGES", "FACES"] = "FACES",
123
- **kwargs,
124
- ):
125
- super().__init__()
126
- key_args = {
127
- "Mesh": mesh,
128
- "Selection": selection,
129
- "Offset": offset,
130
- "Offset Scale": offset_scale,
131
- "Individual": individual,
132
- }
133
- key_args.update(kwargs)
134
- self.mode = mode
135
- self._establish_links(**key_args)
136
-
137
- @property
138
- def i_mesh(self) -> NodeSocket:
139
- """Input socket: Mesh"""
140
- return self._input("Mesh")
141
-
142
- @property
143
- def i_selection(self) -> bpy.types.NodeSocketBool:
144
- """Input socket: Selection"""
145
- return self._input("Selection")
146
-
147
- @property
148
- def i_offset(self) -> NodeSocket:
149
- """Input socket: Offset"""
150
- return self._input("Offset")
151
-
152
- @property
153
- def i_offset_scale(self) -> bpy.types.NodeSocketFloat:
154
- """Input socket: Offset Scale"""
155
- return self._input("Offset Scale")
156
-
157
- @property
158
- def i_individual(self) -> bpy.types.NodeSocketBool:
159
- """Input socket: Individual"""
160
- return self._input("Individual")
161
-
162
- @property
163
- def o_mesh(self) -> NodeSocket:
164
- """Output socket: Mesh"""
165
- return self._output("Mesh")
166
-
167
- @property
168
- def o_top(self) -> bpy.types.NodeSocketBool:
169
- """Output socket: Top"""
170
- return self._output("Top")
171
-
172
- @property
173
- def o_side(self) -> bpy.types.NodeSocketBool:
174
- """Output socket: Side"""
175
- return self._output("Side")
176
-
177
- @property
178
- def mode(self) -> Literal["VERTICES", "EDGES", "FACES"]:
179
- return self.node.mode
180
-
181
- @mode.setter
182
- def mode(self, value: Literal["VERTICES", "EDGES", "FACES"]):
183
- self.node.mode = value
184
-
185
-
186
- class GridToMesh(NodeBuilder):
187
- """Generate a mesh on the "surface" of a volume grid"""
188
-
189
- name = "GeometryNodeGridToMesh"
190
- node: bpy.types.GeometryNodeGridToMesh
191
-
192
- def __init__(
193
- self,
194
- grid: float | LINKABLE | None = 0.0,
195
- threshold: float | LINKABLE | None = 0.10000000149011612,
196
- adaptivity: LINKABLE | None = 0.0,
197
- **kwargs,
198
- ):
199
- super().__init__()
200
- key_args = {"Grid": grid, "Threshold": threshold, "Adaptivity": adaptivity}
201
- key_args.update(kwargs)
202
-
203
- self._establish_links(**key_args)
204
-
205
- @property
206
- def i_grid(self) -> bpy.types.NodeSocketFloat:
207
- """Input socket: Grid"""
208
- return self._input("Grid")
209
-
210
- @property
211
- def i_threshold(self) -> bpy.types.NodeSocketFloat:
212
- """Input socket: Threshold"""
213
- return self._input("Threshold")
214
-
215
- @property
216
- def i_adaptivity(self) -> NodeSocket:
217
- """Input socket: Adaptivity"""
218
- return self._input("Adaptivity")
219
-
220
- @property
221
- def o_mesh(self) -> NodeSocket:
222
- """Output socket: Mesh"""
223
- return self._output("Mesh")
224
-
225
-
226
- class EdgeAngle(NodeBuilder):
227
- """The angle between the normals of connected manifold faces"""
228
-
229
- name = "GeometryNodeInputMeshEdgeAngle"
230
- node: bpy.types.GeometryNodeInputMeshEdgeAngle
231
-
232
- def __init__(self, **kwargs):
233
- super().__init__()
234
- key_args = kwargs
235
-
236
- self._establish_links(**key_args)
237
-
238
- @property
239
- def o_unsigned_angle(self) -> bpy.types.NodeSocketFloat:
240
- """Output socket: Unsigned Angle"""
241
- return self._output("Unsigned Angle")
242
-
243
- @property
244
- def o_signed_angle(self) -> bpy.types.NodeSocketFloat:
245
- """Output socket: Signed Angle"""
246
- return self._output("Signed Angle")
247
-
248
-
249
- class EdgeNeighbors(NodeBuilder):
250
- """Retrieve the number of faces that use each edge as one of their sides"""
251
-
252
- name = "GeometryNodeInputMeshEdgeNeighbors"
253
- node: bpy.types.GeometryNodeInputMeshEdgeNeighbors
254
-
255
- def __init__(self, **kwargs):
256
- super().__init__()
257
- key_args = kwargs
258
-
259
- self._establish_links(**key_args)
260
-
261
- @property
262
- def o_face_count(self) -> bpy.types.NodeSocketInt:
263
- """Output socket: Face Count"""
264
- return self._output("Face Count")
265
-
266
-
267
- class EdgeVertices(NodeBuilder):
268
- """Retrieve topology information relating to each edge of a mesh"""
269
-
270
- name = "GeometryNodeInputMeshEdgeVertices"
271
- node: bpy.types.GeometryNodeInputMeshEdgeVertices
272
-
273
- def __init__(self, **kwargs):
274
- super().__init__()
275
- key_args = kwargs
276
-
277
- self._establish_links(**key_args)
278
-
279
- @property
280
- def o_vertex_index_1(self) -> bpy.types.NodeSocketInt:
281
- """Output socket: Vertex Index 1"""
282
- return self._output("Vertex Index 1")
283
-
284
- @property
285
- def o_vertex_index_2(self) -> bpy.types.NodeSocketInt:
286
- """Output socket: Vertex Index 2"""
287
- return self._output("Vertex Index 2")
288
-
289
- @property
290
- def o_position_1(self) -> bpy.types.NodeSocketVector:
291
- """Output socket: Position 1"""
292
- return self._output("Position 1")
293
-
294
- @property
295
- def o_position_2(self) -> bpy.types.NodeSocketVector:
296
- """Output socket: Position 2"""
297
- return self._output("Position 2")
298
-
299
-
300
- class FaceArea(NodeBuilder):
301
- """Calculate the surface area of a mesh's faces"""
302
-
303
- name = "GeometryNodeInputMeshFaceArea"
304
- node: bpy.types.GeometryNodeInputMeshFaceArea
305
-
306
- def __init__(self, **kwargs):
307
- super().__init__()
308
- key_args = kwargs
309
-
310
- self._establish_links(**key_args)
311
-
312
- @property
313
- def o_area(self) -> bpy.types.NodeSocketFloat:
314
- """Output socket: Area"""
315
- return self._output("Area")
316
-
317
-
318
- class IsFacePlanar(NodeBuilder):
319
- """Retrieve whether all triangles in a face are on the same plane, i.e. whether they have the same normal"""
320
-
321
- name = "GeometryNodeInputMeshFaceIsPlanar"
322
- node: bpy.types.GeometryNodeInputMeshFaceIsPlanar
323
-
324
- def __init__(self, threshold: LINKABLE | None = 0.009999999776482582, **kwargs):
325
- super().__init__()
326
- key_args = {"Threshold": threshold}
327
- key_args.update(kwargs)
328
-
329
- self._establish_links(**key_args)
330
-
331
- @property
332
- def i_threshold(self) -> NodeSocket:
333
- """Input socket: Threshold"""
334
- return self._input("Threshold")
335
-
336
- @property
337
- def o_planar(self) -> bpy.types.NodeSocketBool:
338
- """Output socket: Planar"""
339
- return self._output("Planar")
340
-
341
-
342
- class FaceNeighbors(NodeBuilder):
343
- """Retrieve topology information relating to each face of a mesh"""
344
-
345
- name = "GeometryNodeInputMeshFaceNeighbors"
346
- node: bpy.types.GeometryNodeInputMeshFaceNeighbors
347
-
348
- def __init__(self, **kwargs):
349
- super().__init__()
350
- key_args = kwargs
351
-
352
- self._establish_links(**key_args)
353
-
354
- @property
355
- def o_vertex_count(self) -> bpy.types.NodeSocketInt:
356
- """Output socket: Vertex Count"""
357
- return self._output("Vertex Count")
358
-
359
- @property
360
- def o_face_count(self) -> bpy.types.NodeSocketInt:
361
- """Output socket: Face Count"""
362
- return self._output("Face Count")
363
-
364
-
365
- class MeshIsland(NodeBuilder):
366
- """Retrieve information about separate connected regions in a mesh"""
367
-
368
- name = "GeometryNodeInputMeshIsland"
369
- node: bpy.types.GeometryNodeInputMeshIsland
370
-
371
- def __init__(self, **kwargs):
372
- super().__init__()
373
- key_args = kwargs
374
-
375
- self._establish_links(**key_args)
376
-
377
- @property
378
- def o_island_index(self) -> bpy.types.NodeSocketInt:
379
- """Output socket: Island Index"""
380
- return self._output("Island Index")
381
-
382
- @property
383
- def o_island_count(self) -> bpy.types.NodeSocketInt:
384
- """Output socket: Island Count"""
385
- return self._output("Island Count")
386
-
387
-
388
- class VertexNeighbors(NodeBuilder):
389
- """Retrieve topology information relating to each vertex of a mesh"""
390
-
391
- name = "GeometryNodeInputMeshVertexNeighbors"
392
- node: bpy.types.GeometryNodeInputMeshVertexNeighbors
393
-
394
- def __init__(self, **kwargs):
395
- super().__init__()
396
- key_args = kwargs
397
-
398
- self._establish_links(**key_args)
399
-
400
- @property
401
- def o_vertex_count(self) -> bpy.types.NodeSocketInt:
402
- """Output socket: Vertex Count"""
403
- return self._output("Vertex Count")
404
-
405
- @property
406
- def o_face_count(self) -> bpy.types.NodeSocketInt:
407
- """Output socket: Face Count"""
408
- return self._output("Face Count")
409
-
410
-
411
- class MeshBoolean(NodeBuilder):
412
- """Cut, subtract, or join multiple mesh inputs"""
413
-
414
- name = "GeometryNodeMeshBoolean"
415
- node: bpy.types.GeometryNodeMeshBoolean
416
-
417
- def __init__(
418
- self,
419
- mesh_1: LINKABLE = None,
420
- mesh_2: LINKABLE = None,
421
- operation: Literal["INTERSECT", "UNION", "DIFFERENCE"] = "DIFFERENCE",
422
- solver: Literal["EXACT", "FLOAT", "MANIFOLD"] = "FLOAT",
423
- **kwargs,
424
- ):
425
- super().__init__()
426
- key_args = {"Mesh 1": mesh_1, "Mesh 2": mesh_2}
427
- key_args.update(kwargs)
428
- self.operation = operation
429
- self.solver = solver
430
- self._establish_links(**key_args)
431
-
432
- @classmethod
433
- def intersect(
434
- cls, mesh_1: LINKABLE = None, mesh_2: LINKABLE = None
435
- ) -> "MeshBoolean":
436
- """Create Mesh Boolean with operation 'Intersect'."""
437
- return cls(operation="INTERSECT", mesh_1=mesh_1, mesh_2=mesh_2)
438
-
439
- @classmethod
440
- def union(cls, mesh_1: LINKABLE = None, mesh_2: LINKABLE = None) -> "MeshBoolean":
441
- """Create Mesh Boolean with operation 'Union'."""
442
- return cls(operation="UNION", mesh_1=mesh_1, mesh_2=mesh_2)
443
-
444
- @classmethod
445
- def difference(
446
- cls, mesh_1: LINKABLE = None, mesh_2: LINKABLE = None
447
- ) -> "MeshBoolean":
448
- """Create Mesh Boolean with operation 'Difference'."""
449
- return cls(operation="DIFFERENCE", mesh_1=mesh_1, mesh_2=mesh_2)
450
-
451
- @property
452
- def i_mesh_1(self) -> NodeSocket:
453
- """Input socket: Mesh 1"""
454
- return self._input("Mesh 1")
455
-
456
- @property
457
- def i_mesh_2(self) -> NodeSocket:
458
- """Input socket: Mesh 2"""
459
- return self._input("Mesh 2")
460
-
461
- @property
462
- def o_mesh(self) -> NodeSocket:
463
- """Output socket: Mesh"""
464
- return self._output("Mesh")
465
-
466
- @property
467
- def operation(self) -> Literal["INTERSECT", "UNION", "DIFFERENCE"]:
468
- return self.node.operation
469
-
470
- @operation.setter
471
- def operation(self, value: Literal["INTERSECT", "UNION", "DIFFERENCE"]):
472
- self.node.operation = value
473
-
474
- @property
475
- def solver(self) -> Literal["EXACT", "FLOAT", "MANIFOLD"]:
476
- return self.node.solver
477
-
478
- @solver.setter
479
- def solver(self, value: Literal["EXACT", "FLOAT", "MANIFOLD"]):
480
- self.node.solver = value
481
-
482
-
483
- class MeshCircle(NodeBuilder):
484
- """Generate a circular ring of edges"""
485
-
486
- name = "GeometryNodeMeshCircle"
487
- node: bpy.types.GeometryNodeMeshCircle
488
-
489
- def __init__(
490
- self,
491
- vertices: int | LINKABLE | None = 32,
492
- radius: LINKABLE | None = 1.0,
493
- fill_type: Literal["NONE", "NGON", "TRIANGLE_FAN"] = "NONE",
494
- **kwargs,
495
- ):
496
- super().__init__()
497
- key_args = {"Vertices": vertices, "Radius": radius}
498
- key_args.update(kwargs)
499
- self.fill_type = fill_type
500
- self._establish_links(**key_args)
501
-
502
- @property
503
- def i_vertices(self) -> bpy.types.NodeSocketInt:
504
- """Input socket: Vertices"""
505
- return self._input("Vertices")
506
-
507
- @property
508
- def i_radius(self) -> NodeSocket:
509
- """Input socket: Radius"""
510
- return self._input("Radius")
511
-
512
- @property
513
- def o_mesh(self) -> NodeSocket:
514
- """Output socket: Mesh"""
515
- return self._output("Mesh")
516
-
517
- @property
518
- def fill_type(self) -> Literal["NONE", "NGON", "TRIANGLE_FAN"]:
519
- return self.node.fill_type
520
-
521
- @fill_type.setter
522
- def fill_type(self, value: Literal["NONE", "NGON", "TRIANGLE_FAN"]):
523
- self.node.fill_type = value
524
-
525
-
526
- class Cone(NodeBuilder):
527
- """Generate a cone mesh"""
528
-
529
- name = "GeometryNodeMeshCone"
530
- node: bpy.types.GeometryNodeMeshCone
531
-
532
- def __init__(
533
- self,
534
- vertices: int | LINKABLE | None = 32,
535
- side_segments: int | LINKABLE | None = 1,
536
- fill_segments: int | LINKABLE | None = 1,
537
- radius_top: LINKABLE | None = 0.0,
538
- radius_bottom: LINKABLE | None = 1.0,
539
- depth: LINKABLE | None = 2.0,
540
- fill_type: Literal["NONE", "NGON", "TRIANGLE_FAN"] = "NGON",
541
- **kwargs,
542
- ):
543
- super().__init__()
544
- key_args = {
545
- "Vertices": vertices,
546
- "Side Segments": side_segments,
547
- "Fill Segments": fill_segments,
548
- "Radius Top": radius_top,
549
- "Radius Bottom": radius_bottom,
550
- "Depth": depth,
551
- }
552
- key_args.update(kwargs)
553
- self.fill_type = fill_type
554
- self._establish_links(**key_args)
555
-
556
- @property
557
- def i_vertices(self) -> bpy.types.NodeSocketInt:
558
- """Input socket: Vertices"""
559
- return self._input("Vertices")
560
-
561
- @property
562
- def i_side_segments(self) -> bpy.types.NodeSocketInt:
563
- """Input socket: Side Segments"""
564
- return self._input("Side Segments")
565
-
566
- @property
567
- def i_fill_segments(self) -> bpy.types.NodeSocketInt:
568
- """Input socket: Fill Segments"""
569
- return self._input("Fill Segments")
570
-
571
- @property
572
- def i_radius_top(self) -> NodeSocket:
573
- """Input socket: Radius Top"""
574
- return self._input("Radius Top")
575
-
576
- @property
577
- def i_radius_bottom(self) -> NodeSocket:
578
- """Input socket: Radius Bottom"""
579
- return self._input("Radius Bottom")
580
-
581
- @property
582
- def i_depth(self) -> NodeSocket:
583
- """Input socket: Depth"""
584
- return self._input("Depth")
585
-
586
- @property
587
- def o_mesh(self) -> NodeSocket:
588
- """Output socket: Mesh"""
589
- return self._output("Mesh")
590
-
591
- @property
592
- def o_top(self) -> bpy.types.NodeSocketBool:
593
- """Output socket: Top"""
594
- return self._output("Top")
595
-
596
- @property
597
- def o_bottom(self) -> bpy.types.NodeSocketBool:
598
- """Output socket: Bottom"""
599
- return self._output("Bottom")
600
-
601
- @property
602
- def o_side(self) -> bpy.types.NodeSocketBool:
603
- """Output socket: Side"""
604
- return self._output("Side")
605
-
606
- @property
607
- def o_uv_map(self) -> bpy.types.NodeSocketVector:
608
- """Output socket: UV Map"""
609
- return self._output("UV Map")
610
-
611
- @property
612
- def fill_type(self) -> Literal["NONE", "NGON", "TRIANGLE_FAN"]:
613
- return self.node.fill_type
614
-
615
- @fill_type.setter
616
- def fill_type(self, value: Literal["NONE", "NGON", "TRIANGLE_FAN"]):
617
- self.node.fill_type = value
618
-
619
-
620
- class Cube(NodeBuilder):
621
- """Generate a cuboid mesh with variable side lengths and subdivisions"""
622
-
623
- name = "GeometryNodeMeshCube"
624
- node: bpy.types.GeometryNodeMeshCube
625
-
626
- def __init__(
627
- self,
628
- size: LINKABLE | None = [1.0, 1.0, 1.0],
629
- vertices_x: int | LINKABLE | None = 2,
630
- vertices_y: int | LINKABLE | None = 2,
631
- vertices_z: int | LINKABLE | None = 2,
632
- **kwargs,
633
- ):
634
- super().__init__()
635
- key_args = {
636
- "Size": size,
637
- "Vertices X": vertices_x,
638
- "Vertices Y": vertices_y,
639
- "Vertices Z": vertices_z,
640
- }
641
- key_args.update(kwargs)
642
-
643
- self._establish_links(**key_args)
644
-
645
- @property
646
- def i_size(self) -> NodeSocket:
647
- """Input socket: Size"""
648
- return self._input("Size")
649
-
650
- @property
651
- def i_vertices_x(self) -> bpy.types.NodeSocketInt:
652
- """Input socket: Vertices X"""
653
- return self._input("Vertices X")
654
-
655
- @property
656
- def i_vertices_y(self) -> bpy.types.NodeSocketInt:
657
- """Input socket: Vertices Y"""
658
- return self._input("Vertices Y")
659
-
660
- @property
661
- def i_vertices_z(self) -> bpy.types.NodeSocketInt:
662
- """Input socket: Vertices Z"""
663
- return self._input("Vertices Z")
664
-
665
- @property
666
- def o_mesh(self) -> NodeSocket:
667
- """Output socket: Mesh"""
668
- return self._output("Mesh")
669
-
670
- @property
671
- def o_uv_map(self) -> bpy.types.NodeSocketVector:
672
- """Output socket: UV Map"""
673
- return self._output("UV Map")
674
-
675
-
676
- class Cylinder(NodeBuilder):
677
- """Generate a cylinder mesh"""
678
-
679
- name = "GeometryNodeMeshCylinder"
680
- node: bpy.types.GeometryNodeMeshCylinder
681
-
682
- def __init__(
683
- self,
684
- vertices: int | LINKABLE | None = 32,
685
- side_segments: int | LINKABLE | None = 1,
686
- fill_segments: int | LINKABLE | None = 1,
687
- radius: LINKABLE | None = 1.0,
688
- depth: LINKABLE | None = 2.0,
689
- fill_type: Literal["NONE", "NGON", "TRIANGLE_FAN"] = "NGON",
690
- **kwargs,
691
- ):
692
- super().__init__()
693
- key_args = {
694
- "Vertices": vertices,
695
- "Side Segments": side_segments,
696
- "Fill Segments": fill_segments,
697
- "Radius": radius,
698
- "Depth": depth,
699
- }
700
- key_args.update(kwargs)
701
- self.fill_type = fill_type
702
- self._establish_links(**key_args)
703
-
704
- @property
705
- def i_vertices(self) -> bpy.types.NodeSocketInt:
706
- """Input socket: Vertices"""
707
- return self._input("Vertices")
708
-
709
- @property
710
- def i_side_segments(self) -> bpy.types.NodeSocketInt:
711
- """Input socket: Side Segments"""
712
- return self._input("Side Segments")
713
-
714
- @property
715
- def i_fill_segments(self) -> bpy.types.NodeSocketInt:
716
- """Input socket: Fill Segments"""
717
- return self._input("Fill Segments")
718
-
719
- @property
720
- def i_radius(self) -> NodeSocket:
721
- """Input socket: Radius"""
722
- return self._input("Radius")
723
-
724
- @property
725
- def i_depth(self) -> NodeSocket:
726
- """Input socket: Depth"""
727
- return self._input("Depth")
728
-
729
- @property
730
- def o_mesh(self) -> NodeSocket:
731
- """Output socket: Mesh"""
732
- return self._output("Mesh")
733
-
734
- @property
735
- def o_top(self) -> bpy.types.NodeSocketBool:
736
- """Output socket: Top"""
737
- return self._output("Top")
738
-
739
- @property
740
- def o_side(self) -> bpy.types.NodeSocketBool:
741
- """Output socket: Side"""
742
- return self._output("Side")
743
-
744
- @property
745
- def o_bottom(self) -> bpy.types.NodeSocketBool:
746
- """Output socket: Bottom"""
747
- return self._output("Bottom")
748
-
749
- @property
750
- def o_uv_map(self) -> bpy.types.NodeSocketVector:
751
- """Output socket: UV Map"""
752
- return self._output("UV Map")
753
-
754
- @property
755
- def fill_type(self) -> Literal["NONE", "NGON", "TRIANGLE_FAN"]:
756
- return self.node.fill_type
757
-
758
- @fill_type.setter
759
- def fill_type(self, value: Literal["NONE", "NGON", "TRIANGLE_FAN"]):
760
- self.node.fill_type = value
761
-
762
-
763
- class FaceGroupBoundaries(NodeBuilder):
764
- """Find edges on the boundaries between groups of faces with the same ID value"""
765
-
766
- name = "GeometryNodeMeshFaceSetBoundaries"
767
- node: bpy.types.GeometryNodeMeshFaceSetBoundaries
768
-
769
- def __init__(self, face_set: int | LINKABLE | None = 0, **kwargs):
770
- super().__init__()
771
- key_args = {"Face Set": face_set}
772
- key_args.update(kwargs)
773
-
774
- self._establish_links(**key_args)
775
-
776
- @property
777
- def i_face_group_id(self) -> bpy.types.NodeSocketInt:
778
- """Input socket: Face Group ID"""
779
- return self._input("Face Set")
780
-
781
- @property
782
- def o_boundary_edges(self) -> bpy.types.NodeSocketBool:
783
- """Output socket: Boundary Edges"""
784
- return self._output("Boundary Edges")
785
-
786
-
787
- class Grid(NodeBuilder):
788
- """Generate a planar mesh on the XY plane"""
789
-
790
- name = "GeometryNodeMeshGrid"
791
- node: bpy.types.GeometryNodeMeshGrid
792
-
793
- def __init__(
794
- self,
795
- size_x: LINKABLE | None = 1.0,
796
- size_y: LINKABLE | None = 1.0,
797
- vertices_x: int | LINKABLE | None = 3,
798
- vertices_y: int | LINKABLE | None = 3,
799
- **kwargs,
800
- ):
801
- super().__init__()
802
- key_args = {
803
- "Size X": size_x,
804
- "Size Y": size_y,
805
- "Vertices X": vertices_x,
806
- "Vertices Y": vertices_y,
807
- }
808
- key_args.update(kwargs)
809
-
810
- self._establish_links(**key_args)
811
-
812
- @property
813
- def i_size_x(self) -> NodeSocket:
814
- """Input socket: Size X"""
815
- return self._input("Size X")
816
-
817
- @property
818
- def i_size_y(self) -> NodeSocket:
819
- """Input socket: Size Y"""
820
- return self._input("Size Y")
821
-
822
- @property
823
- def i_vertices_x(self) -> bpy.types.NodeSocketInt:
824
- """Input socket: Vertices X"""
825
- return self._input("Vertices X")
826
-
827
- @property
828
- def i_vertices_y(self) -> bpy.types.NodeSocketInt:
829
- """Input socket: Vertices Y"""
830
- return self._input("Vertices Y")
831
-
832
- @property
833
- def o_mesh(self) -> NodeSocket:
834
- """Output socket: Mesh"""
835
- return self._output("Mesh")
836
-
837
- @property
838
- def o_uv_map(self) -> bpy.types.NodeSocketVector:
839
- """Output socket: UV Map"""
840
- return self._output("UV Map")
841
-
842
-
843
- class IcoSphere(NodeBuilder):
844
- """Generate a spherical mesh that consists of equally sized triangles"""
845
-
846
- name = "GeometryNodeMeshIcoSphere"
847
- node: bpy.types.GeometryNodeMeshIcoSphere
848
-
849
- def __init__(
850
- self,
851
- radius: LINKABLE | None = 1.0,
852
- subdivisions: int | LINKABLE | None = 1,
853
- **kwargs,
854
- ):
855
- super().__init__()
856
- key_args = {"Radius": radius, "Subdivisions": subdivisions}
857
- key_args.update(kwargs)
858
-
859
- self._establish_links(**key_args)
860
-
861
- @property
862
- def i_radius(self) -> NodeSocket:
863
- """Input socket: Radius"""
864
- return self._input("Radius")
865
-
866
- @property
867
- def i_subdivisions(self) -> bpy.types.NodeSocketInt:
868
- """Input socket: Subdivisions"""
869
- return self._input("Subdivisions")
870
-
871
- @property
872
- def o_mesh(self) -> NodeSocket:
873
- """Output socket: Mesh"""
874
- return self._output("Mesh")
875
-
876
- @property
877
- def o_uv_map(self) -> bpy.types.NodeSocketVector:
878
- """Output socket: UV Map"""
879
- return self._output("UV Map")
880
-
881
-
882
- class MeshLine(NodeBuilder):
883
- """Generate vertices in a line and connect them with edges"""
884
-
885
- name = "GeometryNodeMeshLine"
886
- node: bpy.types.GeometryNodeMeshLine
887
-
888
- def __init__(
889
- self,
890
- count: int | LINKABLE | None = 10,
891
- start_location: LINKABLE | None = [0.0, 0.0, 0.0],
892
- offset: LINKABLE | None = [0.0, 0.0, 1.0],
893
- mode: Literal["OFFSET", "END_POINTS"] = "OFFSET",
894
- count_mode: Literal["TOTAL", "RESOLUTION"] = "TOTAL",
895
- **kwargs,
896
- ):
897
- super().__init__()
898
- key_args = {"Count": count, "Start Location": start_location, "Offset": offset}
899
- key_args.update(kwargs)
900
- self.mode = mode
901
- self.count_mode = count_mode
902
- self._establish_links(**key_args)
903
-
904
- @property
905
- def i_count(self) -> bpy.types.NodeSocketInt:
906
- """Input socket: Count"""
907
- return self._input("Count")
908
-
909
- @property
910
- def i_start_location(self) -> NodeSocket:
911
- """Input socket: Start Location"""
912
- return self._input("Start Location")
913
-
914
- @property
915
- def i_offset(self) -> NodeSocket:
916
- """Input socket: Offset"""
917
- return self._input("Offset")
918
-
919
- @property
920
- def o_mesh(self) -> NodeSocket:
921
- """Output socket: Mesh"""
922
- return self._output("Mesh")
923
-
924
- @property
925
- def mode(self) -> Literal["OFFSET", "END_POINTS"]:
926
- return self.node.mode
927
-
928
- @mode.setter
929
- def mode(self, value: Literal["OFFSET", "END_POINTS"]):
930
- self.node.mode = value
931
-
932
- @property
933
- def count_mode(self) -> Literal["TOTAL", "RESOLUTION"]:
934
- return self.node.count_mode
935
-
936
- @count_mode.setter
937
- def count_mode(self, value: Literal["TOTAL", "RESOLUTION"]):
938
- self.node.count_mode = value
939
-
940
-
941
- class MeshToCurve(NodeBuilder):
942
- """Generate a curve from a mesh"""
943
-
944
- name = "GeometryNodeMeshToCurve"
945
- node: bpy.types.GeometryNodeMeshToCurve
946
-
947
- def __init__(
948
- self,
949
- mesh: LINKABLE = None,
950
- selection: TYPE_INPUT_BOOLEAN = True,
951
- mode: Literal["EDGES", "FACES"] = "EDGES",
952
- **kwargs,
953
- ):
954
- super().__init__()
955
- key_args = {"Mesh": mesh, "Selection": selection}
956
- key_args.update(kwargs)
957
- self.mode = mode
958
- self._establish_links(**key_args)
959
-
960
- @property
961
- def i_mesh(self) -> NodeSocket:
962
- """Input socket: Mesh"""
963
- return self._input("Mesh")
964
-
965
- @property
966
- def i_selection(self) -> bpy.types.NodeSocketBool:
967
- """Input socket: Selection"""
968
- return self._input("Selection")
969
-
970
- @property
971
- def o_curve(self) -> NodeSocket:
972
- """Output socket: Curve"""
973
- return self._output("Curve")
974
-
975
- @property
976
- def mode(self) -> Literal["EDGES", "FACES"]:
977
- return self.node.mode
978
-
979
- @mode.setter
980
- def mode(self, value: Literal["EDGES", "FACES"]):
981
- self.node.mode = value
982
-
983
-
984
- class MeshToDensityGrid(NodeBuilder):
985
- """Create a filled volume grid from a mesh"""
986
-
987
- name = "GeometryNodeMeshToDensityGrid"
988
- node: bpy.types.GeometryNodeMeshToDensityGrid
989
-
990
- def __init__(
991
- self,
992
- mesh: LINKABLE = None,
993
- density: float | LINKABLE | None = 1.0,
994
- voxel_size: LINKABLE | None = 0.30000001192092896,
995
- gradient_width: LINKABLE | None = 0.20000000298023224,
996
- **kwargs,
997
- ):
998
- super().__init__()
999
- key_args = {
1000
- "Mesh": mesh,
1001
- "Density": density,
1002
- "Voxel Size": voxel_size,
1003
- "Gradient Width": gradient_width,
1004
- }
1005
- key_args.update(kwargs)
1006
-
1007
- self._establish_links(**key_args)
1008
-
1009
- @property
1010
- def i_mesh(self) -> NodeSocket:
1011
- """Input socket: Mesh"""
1012
- return self._input("Mesh")
1013
-
1014
- @property
1015
- def i_density(self) -> bpy.types.NodeSocketFloat:
1016
- """Input socket: Density"""
1017
- return self._input("Density")
1018
-
1019
- @property
1020
- def i_voxel_size(self) -> NodeSocket:
1021
- """Input socket: Voxel Size"""
1022
- return self._input("Voxel Size")
1023
-
1024
- @property
1025
- def i_gradient_width(self) -> NodeSocket:
1026
- """Input socket: Gradient Width"""
1027
- return self._input("Gradient Width")
1028
-
1029
- @property
1030
- def o_density_grid(self) -> bpy.types.NodeSocketFloat:
1031
- """Output socket: Density Grid"""
1032
- return self._output("Density Grid")
1033
-
1034
-
1035
- class MeshToPoints(NodeBuilder):
1036
- """Generate a point cloud from a mesh's vertices"""
1037
-
1038
- name = "GeometryNodeMeshToPoints"
1039
- node: bpy.types.GeometryNodeMeshToPoints
1040
-
1041
- def __init__(
1042
- self,
1043
- mesh: LINKABLE = None,
1044
- selection: TYPE_INPUT_BOOLEAN = True,
1045
- position: TYPE_INPUT_VECTOR = [0.0, 0.0, 0.0],
1046
- radius: LINKABLE | None = 0.05000000074505806,
1047
- mode: Literal["VERTICES", "EDGES", "FACES", "CORNERS"] = "VERTICES",
1048
- **kwargs,
1049
- ):
1050
- super().__init__()
1051
- key_args = {
1052
- "Mesh": mesh,
1053
- "Selection": selection,
1054
- "Position": position,
1055
- "Radius": radius,
1056
- }
1057
- key_args.update(kwargs)
1058
- self.mode = mode
1059
- self._establish_links(**key_args)
1060
-
1061
- @property
1062
- def i_mesh(self) -> NodeSocket:
1063
- """Input socket: Mesh"""
1064
- return self._input("Mesh")
1065
-
1066
- @property
1067
- def i_selection(self) -> bpy.types.NodeSocketBool:
1068
- """Input socket: Selection"""
1069
- return self._input("Selection")
1070
-
1071
- @property
1072
- def i_position(self) -> bpy.types.NodeSocketVector:
1073
- """Input socket: Position"""
1074
- return self._input("Position")
1075
-
1076
- @property
1077
- def i_radius(self) -> NodeSocket:
1078
- """Input socket: Radius"""
1079
- return self._input("Radius")
1080
-
1081
- @property
1082
- def o_points(self) -> NodeSocket:
1083
- """Output socket: Points"""
1084
- return self._output("Points")
1085
-
1086
- @property
1087
- def mode(self) -> Literal["VERTICES", "EDGES", "FACES", "CORNERS"]:
1088
- return self.node.mode
1089
-
1090
- @mode.setter
1091
- def mode(self, value: Literal["VERTICES", "EDGES", "FACES", "CORNERS"]):
1092
- self.node.mode = value
1093
-
1094
-
1095
- class MeshToSdfGrid(NodeBuilder):
1096
- """Create a signed distance volume grid from a mesh"""
1097
-
1098
- name = "GeometryNodeMeshToSDFGrid"
1099
- node: bpy.types.GeometryNodeMeshToSDFGrid
1100
-
1101
- def __init__(
1102
- self,
1103
- mesh: LINKABLE = None,
1104
- voxel_size: LINKABLE | None = 0.30000001192092896,
1105
- band_width: int | LINKABLE | None = 3,
1106
- **kwargs,
1107
- ):
1108
- super().__init__()
1109
- key_args = {"Mesh": mesh, "Voxel Size": voxel_size, "Band Width": band_width}
1110
- key_args.update(kwargs)
1111
-
1112
- self._establish_links(**key_args)
1113
-
1114
- @property
1115
- def i_mesh(self) -> NodeSocket:
1116
- """Input socket: Mesh"""
1117
- return self._input("Mesh")
1118
-
1119
- @property
1120
- def i_voxel_size(self) -> NodeSocket:
1121
- """Input socket: Voxel Size"""
1122
- return self._input("Voxel Size")
1123
-
1124
- @property
1125
- def i_band_width(self) -> bpy.types.NodeSocketInt:
1126
- """Input socket: Band Width"""
1127
- return self._input("Band Width")
1128
-
1129
- @property
1130
- def o_sdf_grid(self) -> bpy.types.NodeSocketFloat:
1131
- """Output socket: SDF Grid"""
1132
- return self._output("SDF Grid")
1133
-
1134
-
1135
- class MeshToVolume(NodeBuilder):
1136
- """Create a fog volume with the shape of the input mesh's surface"""
1137
-
1138
- name = "GeometryNodeMeshToVolume"
1139
- node: bpy.types.GeometryNodeMeshToVolume
1140
-
1141
- def __init__(
1142
- self,
1143
- mesh: LINKABLE = None,
1144
- density: float | LINKABLE | None = 1.0,
1145
- resolution_mode: LINKABLE | None = "Amount",
1146
- voxel_size: LINKABLE | None = 0.30000001192092896,
1147
- voxel_amount: float | LINKABLE | None = 64.0,
1148
- interior_band_width: LINKABLE | None = 0.20000000298023224,
1149
- **kwargs,
1150
- ):
1151
- super().__init__()
1152
- key_args = {
1153
- "Mesh": mesh,
1154
- "Density": density,
1155
- "Resolution Mode": resolution_mode,
1156
- "Voxel Size": voxel_size,
1157
- "Voxel Amount": voxel_amount,
1158
- "Interior Band Width": interior_band_width,
1159
- }
1160
- key_args.update(kwargs)
1161
-
1162
- self._establish_links(**key_args)
1163
-
1164
- @property
1165
- def i_mesh(self) -> NodeSocket:
1166
- """Input socket: Mesh"""
1167
- return self._input("Mesh")
1168
-
1169
- @property
1170
- def i_density(self) -> bpy.types.NodeSocketFloat:
1171
- """Input socket: Density"""
1172
- return self._input("Density")
1173
-
1174
- @property
1175
- def i_resolution_mode(self) -> NodeSocket:
1176
- """Input socket: Resolution Mode"""
1177
- return self._input("Resolution Mode")
1178
-
1179
- @property
1180
- def i_voxel_size(self) -> NodeSocket:
1181
- """Input socket: Voxel Size"""
1182
- return self._input("Voxel Size")
1183
-
1184
- @property
1185
- def i_voxel_amount(self) -> bpy.types.NodeSocketFloat:
1186
- """Input socket: Voxel Amount"""
1187
- return self._input("Voxel Amount")
1188
-
1189
- @property
1190
- def i_interior_band_width(self) -> NodeSocket:
1191
- """Input socket: Interior Band Width"""
1192
- return self._input("Interior Band Width")
1193
-
1194
- @property
1195
- def o_volume(self) -> NodeSocket:
1196
- """Output socket: Volume"""
1197
- return self._output("Volume")
1198
-
1199
-
1200
- class UvSphere(NodeBuilder):
1201
- """Generate a spherical mesh with quads, except for triangles at the top and bottom"""
1202
-
1203
- name = "GeometryNodeMeshUVSphere"
1204
- node: bpy.types.GeometryNodeMeshUVSphere
1205
-
1206
- def __init__(
1207
- self,
1208
- segments: int | LINKABLE | None = 32,
1209
- rings: int | LINKABLE | None = 16,
1210
- radius: LINKABLE | None = 1.0,
1211
- **kwargs,
1212
- ):
1213
- super().__init__()
1214
- key_args = {"Segments": segments, "Rings": rings, "Radius": radius}
1215
- key_args.update(kwargs)
1216
-
1217
- self._establish_links(**key_args)
1218
-
1219
- @property
1220
- def i_segments(self) -> bpy.types.NodeSocketInt:
1221
- """Input socket: Segments"""
1222
- return self._input("Segments")
1223
-
1224
- @property
1225
- def i_rings(self) -> bpy.types.NodeSocketInt:
1226
- """Input socket: Rings"""
1227
- return self._input("Rings")
1228
-
1229
- @property
1230
- def i_radius(self) -> NodeSocket:
1231
- """Input socket: Radius"""
1232
- return self._input("Radius")
1233
-
1234
- @property
1235
- def o_mesh(self) -> NodeSocket:
1236
- """Output socket: Mesh"""
1237
- return self._output("Mesh")
1238
-
1239
- @property
1240
- def o_uv_map(self) -> bpy.types.NodeSocketVector:
1241
- """Output socket: UV Map"""
1242
- return self._output("UV Map")
1243
-
1244
-
1245
- class SetMeshNormal(NodeBuilder):
1246
- """Store a normal vector for each mesh element"""
1247
-
1248
- name = "GeometryNodeSetMeshNormal"
1249
- node: bpy.types.GeometryNodeSetMeshNormal
1250
-
1251
- def __init__(
1252
- self,
1253
- mesh: LINKABLE = None,
1254
- remove_custom: TYPE_INPUT_BOOLEAN = True,
1255
- edge_sharpness: TYPE_INPUT_BOOLEAN = False,
1256
- face_sharpness: TYPE_INPUT_BOOLEAN = False,
1257
- mode: Literal["SHARPNESS", "FREE", "TANGENT_SPACE"] = "SHARPNESS",
1258
- domain: Literal["POINT", "FACE", "CORNER"] = "POINT",
1259
- **kwargs,
1260
- ):
1261
- super().__init__()
1262
- key_args = {
1263
- "Mesh": mesh,
1264
- "Remove Custom": remove_custom,
1265
- "Edge Sharpness": edge_sharpness,
1266
- "Face Sharpness": face_sharpness,
1267
- }
1268
- key_args.update(kwargs)
1269
- self.mode = mode
1270
- self.domain = domain
1271
- self._establish_links(**key_args)
1272
-
1273
- @property
1274
- def i_mesh(self) -> NodeSocket:
1275
- """Input socket: Mesh"""
1276
- return self._input("Mesh")
1277
-
1278
- @property
1279
- def i_remove_custom(self) -> bpy.types.NodeSocketBool:
1280
- """Input socket: Remove Custom"""
1281
- return self._input("Remove Custom")
1282
-
1283
- @property
1284
- def i_edge_sharpness(self) -> bpy.types.NodeSocketBool:
1285
- """Input socket: Edge Sharpness"""
1286
- return self._input("Edge Sharpness")
1287
-
1288
- @property
1289
- def i_face_sharpness(self) -> bpy.types.NodeSocketBool:
1290
- """Input socket: Face Sharpness"""
1291
- return self._input("Face Sharpness")
1292
-
1293
- @property
1294
- def o_mesh(self) -> NodeSocket:
1295
- """Output socket: Mesh"""
1296
- return self._output("Mesh")
1297
-
1298
- @property
1299
- def mode(self) -> Literal["SHARPNESS", "FREE", "TANGENT_SPACE"]:
1300
- return self.node.mode
1301
-
1302
- @mode.setter
1303
- def mode(self, value: Literal["SHARPNESS", "FREE", "TANGENT_SPACE"]):
1304
- self.node.mode = value
1305
-
1306
- @property
1307
- def domain(self) -> Literal["POINT", "FACE", "CORNER"]:
1308
- return self.node.domain
1309
-
1310
- @domain.setter
1311
- def domain(self, value: Literal["POINT", "FACE", "CORNER"]):
1312
- self.node.domain = value
1313
-
1314
-
1315
- class SubdivideMesh(NodeBuilder):
1316
- """Divide mesh faces into smaller ones without changing the shape or volume, using linear interpolation to place the new vertices"""
1317
-
1318
- name = "GeometryNodeSubdivideMesh"
1319
- node: bpy.types.GeometryNodeSubdivideMesh
1320
-
1321
- def __init__(
1322
- self, mesh: LINKABLE = None, level: int | LINKABLE | None = 1, **kwargs
1323
- ):
1324
- super().__init__()
1325
- key_args = {"Mesh": mesh, "Level": level}
1326
- key_args.update(kwargs)
1327
-
1328
- self._establish_links(**key_args)
1329
-
1330
- @property
1331
- def i_mesh(self) -> NodeSocket:
1332
- """Input socket: Mesh"""
1333
- return self._input("Mesh")
1334
-
1335
- @property
1336
- def i_level(self) -> bpy.types.NodeSocketInt:
1337
- """Input socket: Level"""
1338
- return self._input("Level")
1339
-
1340
- @property
1341
- def o_mesh(self) -> NodeSocket:
1342
- """Output socket: Mesh"""
1343
- return self._output("Mesh")
1344
-
1345
-
1346
- class VolumeToMesh(NodeBuilder):
1347
- """Generate a mesh on the "surface" of a volume"""
1348
-
1349
- name = "GeometryNodeVolumeToMesh"
1350
- node: bpy.types.GeometryNodeVolumeToMesh
1351
-
1352
- def __init__(
1353
- self,
1354
- volume: LINKABLE = None,
1355
- resolution_mode: LINKABLE | None = "Grid",
1356
- voxel_size: LINKABLE | None = 0.30000001192092896,
1357
- voxel_amount: float | LINKABLE | None = 64.0,
1358
- threshold: float | LINKABLE | None = 0.10000000149011612,
1359
- adaptivity: LINKABLE | None = 0.0,
1360
- **kwargs,
1361
- ):
1362
- super().__init__()
1363
- key_args = {
1364
- "Volume": volume,
1365
- "Resolution Mode": resolution_mode,
1366
- "Voxel Size": voxel_size,
1367
- "Voxel Amount": voxel_amount,
1368
- "Threshold": threshold,
1369
- "Adaptivity": adaptivity,
1370
- }
1371
- key_args.update(kwargs)
1372
-
1373
- self._establish_links(**key_args)
1374
-
1375
- @property
1376
- def i_volume(self) -> NodeSocket:
1377
- """Input socket: Volume"""
1378
- return self._input("Volume")
1379
-
1380
- @property
1381
- def i_resolution_mode(self) -> NodeSocket:
1382
- """Input socket: Resolution Mode"""
1383
- return self._input("Resolution Mode")
1384
-
1385
- @property
1386
- def i_voxel_size(self) -> NodeSocket:
1387
- """Input socket: Voxel Size"""
1388
- return self._input("Voxel Size")
1389
-
1390
- @property
1391
- def i_voxel_amount(self) -> bpy.types.NodeSocketFloat:
1392
- """Input socket: Voxel Amount"""
1393
- return self._input("Voxel Amount")
1394
-
1395
- @property
1396
- def i_threshold(self) -> bpy.types.NodeSocketFloat:
1397
- """Input socket: Threshold"""
1398
- return self._input("Threshold")
1399
-
1400
- @property
1401
- def i_adaptivity(self) -> NodeSocket:
1402
- """Input socket: Adaptivity"""
1403
- return self._input("Adaptivity")
1404
-
1405
- @property
1406
- def o_mesh(self) -> NodeSocket:
1407
- """Output socket: Mesh"""
1408
- return self._output("Mesh")