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/input.py CHANGED
@@ -1,23 +1,20 @@
1
- """
2
- Auto-generated Blender Geometry Node classes.
3
-
4
- DO NOT EDIT THIS FILE MANUALLY.
5
- This file is generated by molecularnodes/nodes/generator.py
6
-
7
- To regenerate: Run generator.py from within Blender
1
+ import bpy
2
+ from mathutils import Euler
3
+ from typing_extensions import Literal
8
4
 
9
- KNOWN LIMITATIONS:
10
- - Dynamic multi-input/output sockets are not yet supported
11
- (these are the unnamed sockets that appear in the UI for nodes like
12
- "Evaluate Closure", "Join Geometry", etc. that allow dragging in
13
- multiple connections)
14
- - TODO: Add support for dynamic socket creation
15
- """
5
+ from nodebpy.builder import NodeBuilder, SocketLinker
16
6
 
17
- from __future__ import annotations
18
- import bpy
19
- from ..builder import NodeBuilder, NodeSocket
20
- from .types import LINKABLE, TYPE_INPUT_BOOLEAN
7
+ from .types import (
8
+ TYPE_INPUT_BOOLEAN,
9
+ TYPE_INPUT_COLLECTION,
10
+ TYPE_INPUT_IMAGE,
11
+ TYPE_INPUT_INT,
12
+ TYPE_INPUT_OBJECT,
13
+ TYPE_INPUT_STRING,
14
+ TYPE_INPUT_VALUE,
15
+ TYPE_INPUT_VECTOR,
16
+ _SampleIndexDataTypes,
17
+ )
21
18
 
22
19
 
23
20
  class Boolean(NodeBuilder):
@@ -26,14 +23,12 @@ class Boolean(NodeBuilder):
26
23
  name = "FunctionNodeInputBool"
27
24
  node: bpy.types.FunctionNodeInputBool
28
25
 
29
- def __init__(self, boolean: bool = False, **kwargs):
26
+ def __init__(self, boolean: bool = False):
30
27
  super().__init__()
31
- key_args = kwargs
32
28
  self.boolean = boolean
33
- self._establish_links(**key_args)
34
29
 
35
30
  @property
36
- def o_boolean(self) -> bpy.types.NodeSocketBool:
31
+ def o_boolean(self) -> SocketLinker:
37
32
  """Output socket: Boolean"""
38
33
  return self._output("Boolean")
39
34
 
@@ -52,23 +47,23 @@ class Color(NodeBuilder):
52
47
  name = "FunctionNodeInputColor"
53
48
  node: bpy.types.FunctionNodeInputColor
54
49
 
55
- def __init__(self, value: float = 0.0, **kwargs):
50
+ def __init__(
51
+ self, value: tuple[float, float, float, float] = (1.0, 0.0, 1.0, 1.0), **kwargs
52
+ ):
56
53
  super().__init__()
57
- key_args = kwargs
58
54
  self.value = value
59
- self._establish_links(**key_args)
60
55
 
61
56
  @property
62
- def o_color(self) -> bpy.types.NodeSocketColor:
57
+ def o_color(self) -> SocketLinker:
63
58
  """Output socket: Color"""
64
59
  return self._output("Color")
65
60
 
66
61
  @property
67
- def value(self) -> float:
68
- return self.node.value
62
+ def value(self) -> tuple[float, float, float, float]:
63
+ return self.node.value # type: ignore
69
64
 
70
65
  @value.setter
71
- def value(self, value: float):
66
+ def value(self, value: tuple[float, float, float, float]):
72
67
  self.node.value = value
73
68
 
74
69
 
@@ -78,14 +73,12 @@ class Integer(NodeBuilder):
78
73
  name = "FunctionNodeInputInt"
79
74
  node: bpy.types.FunctionNodeInputInt
80
75
 
81
- def __init__(self, integer: int = 1, **kwargs):
76
+ def __init__(self, integer: int = 1):
82
77
  super().__init__()
83
- key_args = kwargs
84
78
  self.integer = integer
85
- self._establish_links(**key_args)
86
79
 
87
80
  @property
88
- def o_integer(self) -> bpy.types.NodeSocketInt:
81
+ def o_integer(self) -> SocketLinker:
89
82
  """Output socket: Integer"""
90
83
  return self._output("Integer")
91
84
 
@@ -104,23 +97,30 @@ class Rotation(NodeBuilder):
104
97
  name = "FunctionNodeInputRotation"
105
98
  node: bpy.types.FunctionNodeInputRotation
106
99
 
107
- def __init__(self, rotation_euler: float = 0.0, **kwargs):
100
+ def __init__(
101
+ self,
102
+ rotation_euler: tuple[float, float, float] | Euler = (
103
+ 0,
104
+ 0,
105
+ 0,
106
+ ),
107
+ ):
108
108
  super().__init__()
109
- key_args = kwargs
110
109
  self.rotation_euler = rotation_euler
111
- self._establish_links(**key_args)
112
110
 
113
111
  @property
114
- def o_rotation(self) -> bpy.types.NodeSocketRotation:
112
+ def o_rotation(self) -> SocketLinker:
115
113
  """Output socket: Rotation"""
116
114
  return self._output("Rotation")
117
115
 
118
116
  @property
119
- def rotation_euler(self) -> float:
117
+ def rotation_euler(
118
+ self,
119
+ ) -> tuple[float, float, float] | Euler:
120
120
  return self.node.rotation_euler
121
121
 
122
122
  @rotation_euler.setter
123
- def rotation_euler(self, value: float):
123
+ def rotation_euler(self, value: tuple[float, float, float] | Euler):
124
124
  self.node.rotation_euler = value
125
125
 
126
126
 
@@ -130,19 +130,13 @@ class SpecialCharacters(NodeBuilder):
130
130
  name = "FunctionNodeInputSpecialCharacters"
131
131
  node: bpy.types.FunctionNodeInputSpecialCharacters
132
132
 
133
- def __init__(self, **kwargs):
134
- super().__init__()
135
- key_args = kwargs
136
-
137
- self._establish_links(**key_args)
138
-
139
133
  @property
140
- def o_line_break(self) -> bpy.types.NodeSocketString:
134
+ def o_line_break(self) -> SocketLinker:
141
135
  """Output socket: Line Break"""
142
136
  return self._output("Line Break")
143
137
 
144
138
  @property
145
- def o_tab(self) -> bpy.types.NodeSocketString:
139
+ def o_tab(self) -> SocketLinker:
146
140
  """Output socket: Tab"""
147
141
  return self._output("Tab")
148
142
 
@@ -153,14 +147,12 @@ class String(NodeBuilder):
153
147
  name = "FunctionNodeInputString"
154
148
  node: bpy.types.FunctionNodeInputString
155
149
 
156
- def __init__(self, string: str = "", **kwargs):
150
+ def __init__(self, string: str = ""):
157
151
  super().__init__()
158
- key_args = kwargs
159
152
  self.string = string
160
- self._establish_links(**key_args)
161
153
 
162
154
  @property
163
- def o_string(self) -> bpy.types.NodeSocketString:
155
+ def o_string(self) -> SocketLinker:
164
156
  """Output socket: String"""
165
157
  return self._output("String")
166
158
 
@@ -173,65 +165,14 @@ class String(NodeBuilder):
173
165
  self.node.string = value
174
166
 
175
167
 
176
- class ForEachGeometryElementInput(NodeBuilder):
177
- """For Each Geometry Element Input node"""
178
-
179
- name = "GeometryNodeForeachGeometryElementInput"
180
- node: bpy.types.GeometryNodeForeachGeometryElementInput
181
-
182
- def __init__(
183
- self,
184
- geometry: LINKABLE = None,
185
- selection: TYPE_INPUT_BOOLEAN = True,
186
- extend: LINKABLE | None = None,
187
- **kwargs,
188
- ):
189
- super().__init__()
190
- key_args = {"Geometry": geometry, "Selection": selection, "__extend__": extend}
191
- key_args.update(kwargs)
192
-
193
- self._establish_links(**key_args)
194
-
195
- @property
196
- def i_geometry(self) -> NodeSocket:
197
- """Input socket: Geometry"""
198
- return self._input("Geometry")
199
-
200
- @property
201
- def i_selection(self) -> bpy.types.NodeSocketBool:
202
- """Input socket: Selection"""
203
- return self._input("Selection")
204
-
205
- @property
206
- def i_input_socket(self) -> NodeSocket:
207
- """Input socket:"""
208
- return self._input("__extend__")
209
-
210
- @property
211
- def o_index(self) -> bpy.types.NodeSocketInt:
212
- """Output socket: Index"""
213
- return self._output("Index")
214
-
215
- @property
216
- def o_input_socket(self) -> NodeSocket:
217
- """Output socket:"""
218
- return self._output("__extend__")
219
-
220
-
221
168
  class ActiveCamera(NodeBuilder):
222
169
  """Retrieve the scene's active camera"""
223
170
 
224
171
  name = "GeometryNodeInputActiveCamera"
225
172
  node: bpy.types.GeometryNodeInputActiveCamera
226
173
 
227
- def __init__(self, **kwargs):
228
- super().__init__()
229
- key_args = kwargs
230
-
231
- self._establish_links(**key_args)
232
-
233
174
  @property
234
- def o_active_camera(self) -> bpy.types.NodeSocketObject:
175
+ def o_active_camera(self) -> SocketLinker:
235
176
  """Output socket: Active Camera"""
236
177
  return self._output("Active Camera")
237
178
 
@@ -242,14 +183,20 @@ class Collection(NodeBuilder):
242
183
  name = "GeometryNodeInputCollection"
243
184
  node: bpy.types.GeometryNodeInputCollection
244
185
 
245
- def __init__(self, **kwargs):
186
+ def __init__(self, collection: bpy.types.Collection | None = None):
246
187
  super().__init__()
247
- key_args = kwargs
188
+ self.collection = collection
248
189
 
249
- self._establish_links(**key_args)
190
+ @property
191
+ def collection(self) -> bpy.types.Collection | None:
192
+ return self.node.collection
193
+
194
+ @collection.setter
195
+ def collection(self, value: bpy.types.Collection | None):
196
+ self.node.collection = value
250
197
 
251
198
  @property
252
- def o_collection(self) -> bpy.types.NodeSocketCollection:
199
+ def o_collection(self) -> SocketLinker:
253
200
  """Output socket: Collection"""
254
201
  return self._output("Collection")
255
202
 
@@ -260,32 +207,20 @@ class IsEdgeSmooth(NodeBuilder):
260
207
  name = "GeometryNodeInputEdgeSmooth"
261
208
  node: bpy.types.GeometryNodeInputEdgeSmooth
262
209
 
263
- def __init__(self, **kwargs):
264
- super().__init__()
265
- key_args = kwargs
266
-
267
- self._establish_links(**key_args)
268
-
269
210
  @property
270
- def o_smooth(self) -> bpy.types.NodeSocketBool:
211
+ def o_smooth(self) -> SocketLinker:
271
212
  """Output socket: Smooth"""
272
213
  return self._output("Smooth")
273
214
 
274
215
 
275
- class Id(NodeBuilder):
216
+ class ID(NodeBuilder):
276
217
  """Retrieve a stable random identifier value from the "id" attribute on the point domain, or the index if the attribute does not exist"""
277
218
 
278
219
  name = "GeometryNodeInputID"
279
220
  node: bpy.types.GeometryNodeInputID
280
221
 
281
- def __init__(self, **kwargs):
282
- super().__init__()
283
- key_args = kwargs
284
-
285
- self._establish_links(**key_args)
286
-
287
222
  @property
288
- def o_id(self) -> bpy.types.NodeSocketInt:
223
+ def o_id(self) -> SocketLinker:
289
224
  """Output socket: ID"""
290
225
  return self._output("ID")
291
226
 
@@ -296,14 +231,21 @@ class Image(NodeBuilder):
296
231
  name = "GeometryNodeInputImage"
297
232
  node: bpy.types.GeometryNodeInputImage
298
233
 
299
- def __init__(self, **kwargs):
234
+ def __init__(self, image: bpy.types.Image | None = None):
300
235
  super().__init__()
301
- key_args = kwargs
236
+ self.image = image
302
237
 
303
- self._establish_links(**key_args)
238
+ @property
239
+ def image(self) -> bpy.types.Image | None:
240
+ """Input socket: Image"""
241
+ return self.node.image
242
+
243
+ @image.setter
244
+ def image(self, value: bpy.types.Image | None):
245
+ self.node.image = value
304
246
 
305
247
  @property
306
- def o_image(self) -> bpy.types.NodeSocketImage:
248
+ def o_image(self) -> SocketLinker:
307
249
  """Output socket: Image"""
308
250
  return self._output("Image")
309
251
 
@@ -314,14 +256,8 @@ class Index(NodeBuilder):
314
256
  name = "GeometryNodeInputIndex"
315
257
  node: bpy.types.GeometryNodeInputIndex
316
258
 
317
- def __init__(self, **kwargs):
318
- super().__init__()
319
- key_args = kwargs
320
-
321
- self._establish_links(**key_args)
322
-
323
259
  @property
324
- def o_index(self) -> bpy.types.NodeSocketInt:
260
+ def o_index(self) -> SocketLinker:
325
261
  """Output socket: Index"""
326
262
  return self._output("Index")
327
263
 
@@ -332,25 +268,23 @@ class InstanceBounds(NodeBuilder):
332
268
  name = "GeometryNodeInputInstanceBounds"
333
269
  node: bpy.types.GeometryNodeInputInstanceBounds
334
270
 
335
- def __init__(self, use_radius: TYPE_INPUT_BOOLEAN = True, **kwargs):
271
+ def __init__(self, use_radius: TYPE_INPUT_BOOLEAN = True):
336
272
  super().__init__()
337
273
  key_args = {"Use Radius": use_radius}
338
- key_args.update(kwargs)
339
-
340
274
  self._establish_links(**key_args)
341
275
 
342
276
  @property
343
- def i_use_radius(self) -> bpy.types.NodeSocketBool:
277
+ def i_use_radius(self) -> SocketLinker:
344
278
  """Input socket: Use Radius"""
345
279
  return self._input("Use Radius")
346
280
 
347
281
  @property
348
- def o_min(self) -> bpy.types.NodeSocketVector:
282
+ def o_min(self) -> SocketLinker:
349
283
  """Output socket: Min"""
350
284
  return self._output("Min")
351
285
 
352
286
  @property
353
- def o_max(self) -> bpy.types.NodeSocketVector:
287
+ def o_max(self) -> SocketLinker:
354
288
  """Output socket: Max"""
355
289
  return self._output("Max")
356
290
 
@@ -361,14 +295,8 @@ class InstanceRotation(NodeBuilder):
361
295
  name = "GeometryNodeInputInstanceRotation"
362
296
  node: bpy.types.GeometryNodeInputInstanceRotation
363
297
 
364
- def __init__(self, **kwargs):
365
- super().__init__()
366
- key_args = kwargs
367
-
368
- self._establish_links(**key_args)
369
-
370
298
  @property
371
- def o_rotation(self) -> bpy.types.NodeSocketRotation:
299
+ def o_rotation(self) -> SocketLinker:
372
300
  """Output socket: Rotation"""
373
301
  return self._output("Rotation")
374
302
 
@@ -379,14 +307,8 @@ class InstanceScale(NodeBuilder):
379
307
  name = "GeometryNodeInputInstanceScale"
380
308
  node: bpy.types.GeometryNodeInputInstanceScale
381
309
 
382
- def __init__(self, **kwargs):
383
- super().__init__()
384
- key_args = kwargs
385
-
386
- self._establish_links(**key_args)
387
-
388
310
  @property
389
- def o_scale(self) -> bpy.types.NodeSocketVector:
311
+ def o_scale(self) -> SocketLinker:
390
312
  """Output socket: Scale"""
391
313
  return self._output("Scale")
392
314
 
@@ -397,14 +319,21 @@ class Material(NodeBuilder):
397
319
  name = "GeometryNodeInputMaterial"
398
320
  node: bpy.types.GeometryNodeInputMaterial
399
321
 
400
- def __init__(self, **kwargs):
322
+ def __init__(self, material: bpy.types.Material | None = None):
401
323
  super().__init__()
402
- key_args = kwargs
324
+ self.material = material
403
325
 
404
- self._establish_links(**key_args)
326
+ @property
327
+ def material(self) -> bpy.types.Material | None:
328
+ """Input socket: Material"""
329
+ return self.node.material
330
+
331
+ @material.setter
332
+ def material(self, value: bpy.types.Material | None):
333
+ self.node.material
405
334
 
406
335
  @property
407
- def o_material(self) -> bpy.types.NodeSocketMaterial:
336
+ def o_material(self) -> SocketLinker:
408
337
  """Output socket: Material"""
409
338
  return self._output("Material")
410
339
 
@@ -415,14 +344,8 @@ class MaterialIndex(NodeBuilder):
415
344
  name = "GeometryNodeInputMaterialIndex"
416
345
  node: bpy.types.GeometryNodeInputMaterialIndex
417
346
 
418
- def __init__(self, **kwargs):
419
- super().__init__()
420
- key_args = kwargs
421
-
422
- self._establish_links(**key_args)
423
-
424
347
  @property
425
- def o_material_index(self) -> bpy.types.NodeSocketInt:
348
+ def o_material_index(self) -> SocketLinker:
426
349
  """Output socket: Material Index"""
427
350
  return self._output("Material Index")
428
351
 
@@ -433,20 +356,18 @@ class NamedLayerSelection(NodeBuilder):
433
356
  name = "GeometryNodeInputNamedLayerSelection"
434
357
  node: bpy.types.GeometryNodeInputNamedLayerSelection
435
358
 
436
- def __init__(self, name: str | LINKABLE | None = "", **kwargs):
359
+ def __init__(self, name: TYPE_INPUT_STRING = ""):
437
360
  super().__init__()
438
361
  key_args = {"Name": name}
439
- key_args.update(kwargs)
440
-
441
362
  self._establish_links(**key_args)
442
363
 
443
364
  @property
444
- def i_name(self) -> bpy.types.NodeSocketString:
365
+ def i_name(self) -> SocketLinker:
445
366
  """Input socket: Name"""
446
367
  return self._input("Name")
447
368
 
448
369
  @property
449
- def o_selection(self) -> bpy.types.NodeSocketBool:
370
+ def o_selection(self) -> SocketLinker:
450
371
  """Output socket: Selection"""
451
372
  return self._output("Selection")
452
373
 
@@ -457,19 +378,13 @@ class Normal(NodeBuilder):
457
378
  name = "GeometryNodeInputNormal"
458
379
  node: bpy.types.GeometryNodeInputNormal
459
380
 
460
- def __init__(self, legacy_corner_normals: bool = False, **kwargs):
461
- super().__init__()
462
- key_args = kwargs
463
- self.legacy_corner_normals = legacy_corner_normals
464
- self._establish_links(**key_args)
465
-
466
381
  @property
467
- def o_normal(self) -> bpy.types.NodeSocketVector:
382
+ def o_normal(self) -> SocketLinker:
468
383
  """Output socket: Normal"""
469
384
  return self._output("Normal")
470
385
 
471
386
  @property
472
- def o_true_normal(self) -> bpy.types.NodeSocketVector:
387
+ def o_true_normal(self) -> SocketLinker:
473
388
  """Output socket: True Normal"""
474
389
  return self._output("True Normal")
475
390
 
@@ -488,14 +403,20 @@ class Object(NodeBuilder):
488
403
  name = "GeometryNodeInputObject"
489
404
  node: bpy.types.GeometryNodeInputObject
490
405
 
491
- def __init__(self, **kwargs):
406
+ def __init__(self, object: bpy.types.Object | None = None):
492
407
  super().__init__()
493
- key_args = kwargs
408
+ self.node.object = object
494
409
 
495
- self._establish_links(**key_args)
410
+ @property
411
+ def object(self) -> bpy.types.Object | None:
412
+ return self.node.object
413
+
414
+ @object.setter
415
+ def object(self, value: bpy.types.Object | None):
416
+ self.node.object = value
496
417
 
497
418
  @property
498
- def o_object(self) -> bpy.types.NodeSocketObject:
419
+ def o_object(self) -> SocketLinker:
499
420
  """Output socket: Object"""
500
421
  return self._output("Object")
501
422
 
@@ -506,14 +427,8 @@ class Position(NodeBuilder):
506
427
  name = "GeometryNodeInputPosition"
507
428
  node: bpy.types.GeometryNodeInputPosition
508
429
 
509
- def __init__(self, **kwargs):
510
- super().__init__()
511
- key_args = kwargs
512
-
513
- self._establish_links(**key_args)
514
-
515
430
  @property
516
- def o_position(self) -> bpy.types.NodeSocketVector:
431
+ def o_position(self) -> SocketLinker:
517
432
  """Output socket: Position"""
518
433
  return self._output("Position")
519
434
 
@@ -524,14 +439,8 @@ class Radius(NodeBuilder):
524
439
  name = "GeometryNodeInputRadius"
525
440
  node: bpy.types.GeometryNodeInputRadius
526
441
 
527
- def __init__(self, **kwargs):
528
- super().__init__()
529
- key_args = kwargs
530
-
531
- self._establish_links(**key_args)
532
-
533
442
  @property
534
- def o_radius(self) -> bpy.types.NodeSocketFloat:
443
+ def o_radius(self) -> SocketLinker:
535
444
  """Output socket: Radius"""
536
445
  return self._output("Radius")
537
446
 
@@ -542,19 +451,13 @@ class SceneTime(NodeBuilder):
542
451
  name = "GeometryNodeInputSceneTime"
543
452
  node: bpy.types.GeometryNodeInputSceneTime
544
453
 
545
- def __init__(self, **kwargs):
546
- super().__init__()
547
- key_args = kwargs
548
-
549
- self._establish_links(**key_args)
550
-
551
454
  @property
552
- def o_seconds(self) -> bpy.types.NodeSocketFloat:
455
+ def o_seconds(self) -> SocketLinker:
553
456
  """Output socket: Seconds"""
554
457
  return self._output("Seconds")
555
458
 
556
459
  @property
557
- def o_frame(self) -> bpy.types.NodeSocketFloat:
460
+ def o_frame(self) -> SocketLinker:
558
461
  """Output socket: Frame"""
559
462
  return self._output("Frame")
560
463
 
@@ -565,14 +468,8 @@ class IsFaceSmooth(NodeBuilder):
565
468
  name = "GeometryNodeInputShadeSmooth"
566
469
  node: bpy.types.GeometryNodeInputShadeSmooth
567
470
 
568
- def __init__(self, **kwargs):
569
- super().__init__()
570
- key_args = kwargs
571
-
572
- self._establish_links(**key_args)
573
-
574
471
  @property
575
- def o_smooth(self) -> bpy.types.NodeSocketBool:
472
+ def o_smooth(self) -> SocketLinker:
576
473
  """Output socket: Smooth"""
577
474
  return self._output("Smooth")
578
475
 
@@ -585,8 +482,8 @@ class ShortestEdgePaths(NodeBuilder):
585
482
 
586
483
  def __init__(
587
484
  self,
588
- end_vertex: TYPE_INPUT_BOOLEAN = False,
589
- edge_cost: float | LINKABLE | None = 1.0,
485
+ end_vertex: TYPE_INPUT_BOOLEAN = None,
486
+ edge_cost: TYPE_INPUT_VALUE = None,
590
487
  **kwargs,
591
488
  ):
592
489
  super().__init__()
@@ -596,22 +493,22 @@ class ShortestEdgePaths(NodeBuilder):
596
493
  self._establish_links(**key_args)
597
494
 
598
495
  @property
599
- def i_end_vertex(self) -> bpy.types.NodeSocketBool:
496
+ def i_end_vertex(self) -> SocketLinker:
600
497
  """Input socket: End Vertex"""
601
498
  return self._input("End Vertex")
602
499
 
603
500
  @property
604
- def i_edge_cost(self) -> bpy.types.NodeSocketFloat:
501
+ def i_edge_cost(self) -> SocketLinker:
605
502
  """Input socket: Edge Cost"""
606
503
  return self._input("Edge Cost")
607
504
 
608
505
  @property
609
- def o_next_vertex_index(self) -> bpy.types.NodeSocketInt:
506
+ def o_next_vertex_index(self) -> SocketLinker:
610
507
  """Output socket: Next Vertex Index"""
611
508
  return self._output("Next Vertex Index")
612
509
 
613
510
  @property
614
- def o_total_cost(self) -> bpy.types.NodeSocketFloat:
511
+ def o_total_cost(self) -> SocketLinker:
615
512
  """Output socket: Total Cost"""
616
513
  return self._output("Total Cost")
617
514
 
@@ -622,14 +519,8 @@ class IsSplineCyclic(NodeBuilder):
622
519
  name = "GeometryNodeInputSplineCyclic"
623
520
  node: bpy.types.GeometryNodeInputSplineCyclic
624
521
 
625
- def __init__(self, **kwargs):
626
- super().__init__()
627
- key_args = kwargs
628
-
629
- self._establish_links(**key_args)
630
-
631
522
  @property
632
- def o_cyclic(self) -> bpy.types.NodeSocketBool:
523
+ def o_cyclic(self) -> SocketLinker:
633
524
  """Output socket: Cyclic"""
634
525
  return self._output("Cyclic")
635
526
 
@@ -640,14 +531,8 @@ class SplineResolution(NodeBuilder):
640
531
  name = "GeometryNodeInputSplineResolution"
641
532
  node: bpy.types.GeometryNodeInputSplineResolution
642
533
 
643
- def __init__(self, **kwargs):
644
- super().__init__()
645
- key_args = kwargs
646
-
647
- self._establish_links(**key_args)
648
-
649
534
  @property
650
- def o_resolution(self) -> bpy.types.NodeSocketInt:
535
+ def o_resolution(self) -> SocketLinker:
651
536
  """Output socket: Resolution"""
652
537
  return self._output("Resolution")
653
538
 
@@ -658,14 +543,8 @@ class CurveTangent(NodeBuilder):
658
543
  name = "GeometryNodeInputTangent"
659
544
  node: bpy.types.GeometryNodeInputTangent
660
545
 
661
- def __init__(self, **kwargs):
662
- super().__init__()
663
- key_args = kwargs
664
-
665
- self._establish_links(**key_args)
666
-
667
546
  @property
668
- def o_tangent(self) -> bpy.types.NodeSocketVector:
547
+ def o_tangent(self) -> SocketLinker:
669
548
  """Output socket: Tangent"""
670
549
  return self._output("Tangent")
671
550
 
@@ -676,44 +555,38 @@ class VoxelIndex(NodeBuilder):
676
555
  name = "GeometryNodeInputVoxelIndex"
677
556
  node: bpy.types.GeometryNodeInputVoxelIndex
678
557
 
679
- def __init__(self, **kwargs):
680
- super().__init__()
681
- key_args = kwargs
682
-
683
- self._establish_links(**key_args)
684
-
685
558
  @property
686
- def o_x(self) -> bpy.types.NodeSocketInt:
559
+ def o_x(self) -> SocketLinker:
687
560
  """Output socket: X"""
688
561
  return self._output("X")
689
562
 
690
563
  @property
691
- def o_y(self) -> bpy.types.NodeSocketInt:
564
+ def o_y(self) -> SocketLinker:
692
565
  """Output socket: Y"""
693
566
  return self._output("Y")
694
567
 
695
568
  @property
696
- def o_z(self) -> bpy.types.NodeSocketInt:
569
+ def o_z(self) -> SocketLinker:
697
570
  """Output socket: Z"""
698
571
  return self._output("Z")
699
572
 
700
573
  @property
701
- def o_is_tile(self) -> bpy.types.NodeSocketBool:
574
+ def o_is_tile(self) -> SocketLinker:
702
575
  """Output socket: Is Tile"""
703
576
  return self._output("Is Tile")
704
577
 
705
578
  @property
706
- def o_extent_x(self) -> bpy.types.NodeSocketInt:
579
+ def o_extent_x(self) -> SocketLinker:
707
580
  """Output socket: Extent X"""
708
581
  return self._output("Extent X")
709
582
 
710
583
  @property
711
- def o_extent_y(self) -> bpy.types.NodeSocketInt:
584
+ def o_extent_y(self) -> SocketLinker:
712
585
  """Output socket: Extent Y"""
713
586
  return self._output("Extent Y")
714
587
 
715
588
  @property
716
- def o_extent_z(self) -> bpy.types.NodeSocketInt:
589
+ def o_extent_z(self) -> SocketLinker:
717
590
  """Output socket: Extent Z"""
718
591
  return self._output("Extent Z")
719
592
 
@@ -724,13 +597,1457 @@ class Value(NodeBuilder):
724
597
  name = "ShaderNodeValue"
725
598
  node: bpy.types.ShaderNodeValue
726
599
 
727
- def __init__(self, **kwargs):
600
+ def __init__(self, value: float = 0.0):
728
601
  super().__init__()
729
- key_args = kwargs
602
+ self.value = value
730
603
 
731
- self._establish_links(**key_args)
604
+ @property
605
+ def value(self) -> float:
606
+ """Input socket: Value"""
607
+ # this node is a strange one because it doesn't have a value property,
608
+ # instead we directly access and change the sockets default output
609
+ return self.node.outputs[0].default_value # type: ignore
610
+
611
+ @value.setter
612
+ def value(self, value: float):
613
+ self.node.outputs[0].default_value = value # type: ignore
732
614
 
733
615
  @property
734
- def o_value(self) -> bpy.types.NodeSocketFloat:
616
+ def o_value(self) -> SocketLinker:
735
617
  """Output socket: Value"""
736
618
  return self._output("Value")
619
+
620
+
621
+ class Vector(NodeBuilder):
622
+ """Provide a vector value that can be connected to other nodes in the tree"""
623
+
624
+ name = "FunctionNodeInputVector"
625
+ node: bpy.types.FunctionNodeInputVector
626
+
627
+ def __init__(self, vector: tuple[float, float, float] = (0, 0, 0)):
628
+ super().__init__()
629
+ self.vector = vector
630
+
631
+ @property
632
+ def o_vector(self) -> SocketLinker:
633
+ """Output socket: Vector"""
634
+ return self._output("Vector")
635
+
636
+ @property
637
+ def vector(self) -> tuple[float, float, float]:
638
+ return tuple(list(self.node.vector)) # type: ignore
639
+
640
+ @vector.setter
641
+ def vector(self, value: tuple[float, float, float]):
642
+ self.node.vector = value
643
+
644
+
645
+ class CameraInfo(NodeBuilder):
646
+ """Retrieve information from a camera object"""
647
+
648
+ name = "GeometryNodeCameraInfo"
649
+ node: bpy.types.GeometryNodeCameraInfo
650
+
651
+ def __init__(self, camera: TYPE_INPUT_OBJECT = None):
652
+ super().__init__()
653
+ key_args = {"Camera": camera}
654
+ self._establish_links(**key_args)
655
+
656
+ @property
657
+ def i_camera(self) -> SocketLinker:
658
+ """Input socket: Camera"""
659
+ return self._input("Camera")
660
+
661
+ @property
662
+ def o_projection_matrix(self) -> SocketLinker:
663
+ """Output socket: Projection Matrix"""
664
+ return self._output("Projection Matrix")
665
+
666
+ @property
667
+ def o_focal_length(self) -> SocketLinker:
668
+ """Output socket: Focal Length"""
669
+ return self._output("Focal Length")
670
+
671
+ @property
672
+ def o_sensor(self) -> SocketLinker:
673
+ """Output socket: Sensor"""
674
+ return self._output("Sensor")
675
+
676
+ @property
677
+ def o_shift(self) -> SocketLinker:
678
+ """Output socket: Shift"""
679
+ return self._output("Shift")
680
+
681
+ @property
682
+ def o_clip_start(self) -> SocketLinker:
683
+ """Output socket: Clip Start"""
684
+ return self._output("Clip Start")
685
+
686
+ @property
687
+ def o_clip_end(self) -> SocketLinker:
688
+ """Output socket: Clip End"""
689
+ return self._output("Clip End")
690
+
691
+ @property
692
+ def o_focus_distance(self) -> SocketLinker:
693
+ """Output socket: Focus Distance"""
694
+ return self._output("Focus Distance")
695
+
696
+ @property
697
+ def o_is_orthographic(self) -> SocketLinker:
698
+ """Output socket: Is Orthographic"""
699
+ return self._output("Is Orthographic")
700
+
701
+ @property
702
+ def o_orthographic_scale(self) -> SocketLinker:
703
+ """Output socket: Orthographic Scale"""
704
+ return self._output("Orthographic Scale")
705
+
706
+
707
+ class CollectionInfo(NodeBuilder):
708
+ """Retrieve geometry instances from a collection"""
709
+
710
+ name = "GeometryNodeCollectionInfo"
711
+ node: bpy.types.GeometryNodeCollectionInfo
712
+
713
+ def __init__(
714
+ self,
715
+ collection: TYPE_INPUT_COLLECTION = None,
716
+ separate_children: TYPE_INPUT_BOOLEAN = False,
717
+ reset_children: TYPE_INPUT_BOOLEAN = False,
718
+ transform_space: Literal["ORIGINAL", "RELATIVE"] = "ORIGINAL",
719
+ ):
720
+ super().__init__()
721
+ key_args = {
722
+ "Collection": collection,
723
+ "Separate Children": separate_children,
724
+ "Reset Children": reset_children,
725
+ }
726
+ self.transform_space = transform_space
727
+ self._establish_links(**key_args)
728
+
729
+ @property
730
+ def i_collection(self) -> SocketLinker:
731
+ """Input socket: Collection"""
732
+ return self._input("Collection")
733
+
734
+ @property
735
+ def i_separate_children(self) -> SocketLinker:
736
+ """Input socket: Separate Children"""
737
+ return self._input("Separate Children")
738
+
739
+ @property
740
+ def i_reset_children(self) -> SocketLinker:
741
+ """Input socket: Reset Children"""
742
+ return self._input("Reset Children")
743
+
744
+ @property
745
+ def o_instances(self) -> SocketLinker:
746
+ """Output socket: Instances"""
747
+ return self._output("Instances")
748
+
749
+ @property
750
+ def transform_space(self) -> Literal["ORIGINAL", "RELATIVE"]:
751
+ return self.node.transform_space
752
+
753
+ @transform_space.setter
754
+ def transform_space(self, value: Literal["ORIGINAL", "RELATIVE"]):
755
+ self.node.transform_space = value
756
+
757
+
758
+ class CornersOfEdge(NodeBuilder):
759
+ """Retrieve face corners connected to edges"""
760
+
761
+ name = "GeometryNodeCornersOfEdge"
762
+ node: bpy.types.GeometryNodeCornersOfEdge
763
+
764
+ def __init__(
765
+ self,
766
+ edge_index: TYPE_INPUT_INT = None,
767
+ weights: TYPE_INPUT_VALUE = None,
768
+ sort_index: TYPE_INPUT_INT = 0,
769
+ ):
770
+ super().__init__()
771
+ key_args = {
772
+ "Edge Index": edge_index,
773
+ "Weights": weights,
774
+ "Sort Index": sort_index,
775
+ }
776
+ self._establish_links(**key_args)
777
+
778
+ @property
779
+ def i_edge_index(self) -> SocketLinker:
780
+ """Input socket: Edge Index"""
781
+ return self._input("Edge Index")
782
+
783
+ @property
784
+ def i_weights(self) -> SocketLinker:
785
+ """Input socket: Weights"""
786
+ return self._input("Weights")
787
+
788
+ @property
789
+ def i_sort_index(self) -> SocketLinker:
790
+ """Input socket: Sort Index"""
791
+ return self._input("Sort Index")
792
+
793
+ @property
794
+ def o_corner_index(self) -> SocketLinker:
795
+ """Output socket: Corner Index"""
796
+ return self._output("Corner Index")
797
+
798
+ @property
799
+ def o_total(self) -> SocketLinker:
800
+ """Output socket: Total"""
801
+ return self._output("Total")
802
+
803
+
804
+ class CornersOfVertex(NodeBuilder):
805
+ """Retrieve face corners connected to vertices"""
806
+
807
+ name = "GeometryNodeCornersOfVertex"
808
+ node: bpy.types.GeometryNodeCornersOfVertex
809
+
810
+ def __init__(
811
+ self,
812
+ vertex_index: TYPE_INPUT_INT = None,
813
+ weights: TYPE_INPUT_VALUE = None,
814
+ sort_index: TYPE_INPUT_INT = 0,
815
+ ):
816
+ super().__init__()
817
+ key_args = {
818
+ "Vertex Index": vertex_index,
819
+ "Weights": weights,
820
+ "Sort Index": sort_index,
821
+ }
822
+
823
+ self._establish_links(**key_args)
824
+
825
+ @property
826
+ def i_vertex_index(self) -> SocketLinker:
827
+ """Input socket: Vertex Index"""
828
+ return self._input("Vertex Index")
829
+
830
+ @property
831
+ def i_weights(self) -> SocketLinker:
832
+ """Input socket: Weights"""
833
+ return self._input("Weights")
834
+
835
+ @property
836
+ def i_sort_index(self) -> SocketLinker:
837
+ """Input socket: Sort Index"""
838
+ return self._input("Sort Index")
839
+
840
+ @property
841
+ def o_corner_index(self) -> SocketLinker:
842
+ """Output socket: Corner Index"""
843
+ return self._output("Corner Index")
844
+
845
+ @property
846
+ def o_total(self) -> SocketLinker:
847
+ """Output socket: Total"""
848
+ return self._output("Total")
849
+
850
+
851
+ class CornersOfFace(NodeBuilder):
852
+ """Retrieve corners that make up a face"""
853
+
854
+ name = "GeometryNodeCornersOfFace"
855
+ node: bpy.types.GeometryNodeCornersOfFace
856
+
857
+ def __init__(
858
+ self,
859
+ face_index: TYPE_INPUT_INT = None,
860
+ weights: TYPE_INPUT_VALUE = None,
861
+ sort_index: TYPE_INPUT_INT = 0,
862
+ ):
863
+ super().__init__()
864
+ key_args = {
865
+ "Face Index": face_index,
866
+ "Weights": weights,
867
+ "Sort Index": sort_index,
868
+ }
869
+ self._establish_links(**key_args)
870
+
871
+ @property
872
+ def i_face_index(self) -> SocketLinker:
873
+ """Input socket: Face Index"""
874
+ return self._input("Face Index")
875
+
876
+ @property
877
+ def i_weights(self) -> SocketLinker:
878
+ """Input socket: Weights"""
879
+ return self._input("Weights")
880
+
881
+ @property
882
+ def i_sort_index(self) -> SocketLinker:
883
+ """Input socket: Sort Index"""
884
+ return self._input("Sort Index")
885
+
886
+ @property
887
+ def o_corner_index(self) -> SocketLinker:
888
+ """Output socket: Corner Index"""
889
+ return self._output("Corner Index")
890
+
891
+ @property
892
+ def o_total(self) -> SocketLinker:
893
+ """Output socket: Total"""
894
+ return self._output("Total")
895
+
896
+
897
+ class EdgePathsToSelection(NodeBuilder):
898
+ """Output a selection of edges by following paths across mesh edges"""
899
+
900
+ name = "GeometryNodeEdgePathsToSelection"
901
+ node: bpy.types.GeometryNodeEdgePathsToSelection
902
+
903
+ def __init__(
904
+ self,
905
+ start_vertices: TYPE_INPUT_BOOLEAN = None,
906
+ next_vertex_index: TYPE_INPUT_INT = None,
907
+ ):
908
+ super().__init__()
909
+ key_args = {
910
+ "Start Vertices": start_vertices,
911
+ "Next Vertex Index": next_vertex_index,
912
+ }
913
+ self._establish_links(**key_args)
914
+
915
+ @property
916
+ def i_start_vertices(self) -> SocketLinker:
917
+ """Input socket: Start Vertices"""
918
+ return self._input("Start Vertices")
919
+
920
+ @property
921
+ def i_next_vertex_index(self) -> SocketLinker:
922
+ """Input socket: Next Vertex Index"""
923
+ return self._input("Next Vertex Index")
924
+
925
+ @property
926
+ def o_selection(self) -> SocketLinker:
927
+ """Output socket: Selection"""
928
+ return self._output("Selection")
929
+
930
+
931
+ class EdgesOfCorner(NodeBuilder):
932
+ """Retrieve the edges on both sides of a face corner"""
933
+
934
+ name = "GeometryNodeEdgesOfCorner"
935
+ node: bpy.types.GeometryNodeEdgesOfCorner
936
+
937
+ def __init__(self, corner_index: TYPE_INPUT_INT = None):
938
+ super().__init__()
939
+ key_args = {"Corner Index": corner_index}
940
+ self._establish_links(**key_args)
941
+
942
+ @property
943
+ def i_corner_index(self) -> SocketLinker:
944
+ """Input socket: Corner Index"""
945
+ return self._input("Corner Index")
946
+
947
+ @property
948
+ def o_next_edge_index(self) -> SocketLinker:
949
+ """Output socket: Next Edge Index"""
950
+ return self._output("Next Edge Index")
951
+
952
+ @property
953
+ def o_previous_edge_index(self) -> SocketLinker:
954
+ """Output socket: Previous Edge Index"""
955
+ return self._output("Previous Edge Index")
956
+
957
+
958
+ class EdgesOfVertex(NodeBuilder):
959
+ """Retrieve the edges connected to each vertex"""
960
+
961
+ name = "GeometryNodeEdgesOfVertex"
962
+ node: bpy.types.GeometryNodeEdgesOfVertex
963
+
964
+ def __init__(
965
+ self,
966
+ vertex_index: TYPE_INPUT_INT = None,
967
+ weights: TYPE_INPUT_VALUE = None,
968
+ sort_index: TYPE_INPUT_INT = 0,
969
+ ):
970
+ super().__init__()
971
+ key_args = {
972
+ "Vertex Index": vertex_index,
973
+ "Weights": weights,
974
+ "Sort Index": sort_index,
975
+ }
976
+ self._establish_links(**key_args)
977
+
978
+ @property
979
+ def i_vertex_index(self) -> SocketLinker:
980
+ """Input socket: Vertex Index"""
981
+ return self._input("Vertex Index")
982
+
983
+ @property
984
+ def i_weights(self) -> SocketLinker:
985
+ """Input socket: Weights"""
986
+ return self._input("Weights")
987
+
988
+ @property
989
+ def i_sort_index(self) -> SocketLinker:
990
+ """Input socket: Sort Index"""
991
+ return self._input("Sort Index")
992
+
993
+ @property
994
+ def o_edge_index(self) -> SocketLinker:
995
+ """Output socket: Edge Index"""
996
+ return self._output("Edge Index")
997
+
998
+ @property
999
+ def o_total(self) -> SocketLinker:
1000
+ """Output socket: Total"""
1001
+ return self._output("Total")
1002
+
1003
+
1004
+ class EdgesToFaceGroups(NodeBuilder):
1005
+ """Group faces into regions surrounded by the selected boundary edges"""
1006
+
1007
+ name = "GeometryNodeEdgesToFaceGroups"
1008
+ node: bpy.types.GeometryNodeEdgesToFaceGroups
1009
+
1010
+ def __init__(self, boundary_edges: TYPE_INPUT_BOOLEAN = None):
1011
+ super().__init__()
1012
+ key_args = {"Boundary Edges": boundary_edges}
1013
+ self._establish_links(**key_args)
1014
+
1015
+ @property
1016
+ def i_boundary_edges(self) -> SocketLinker:
1017
+ """Input socket: Boundary Edges"""
1018
+ return self._input("Boundary Edges")
1019
+
1020
+ @property
1021
+ def o_face_group_id(self) -> SocketLinker:
1022
+ """Output socket: Face Group ID"""
1023
+ return self._output("Face Group ID")
1024
+
1025
+
1026
+ class FaceOfCorner(NodeBuilder):
1027
+ """Retrieve the face each face corner is part of"""
1028
+
1029
+ name = "GeometryNodeFaceOfCorner"
1030
+ node: bpy.types.GeometryNodeFaceOfCorner
1031
+
1032
+ def __init__(self, corner_index: TYPE_INPUT_INT = None):
1033
+ super().__init__()
1034
+ key_args = {"Corner Index": corner_index}
1035
+ self._establish_links(**key_args)
1036
+
1037
+ @property
1038
+ def i_corner_index(self) -> SocketLinker:
1039
+ """Input socket: Corner Index"""
1040
+ return self._input("Corner Index")
1041
+
1042
+ @property
1043
+ def o_face_index(self) -> SocketLinker:
1044
+ """Output socket: Face Index"""
1045
+ return self._output("Face Index")
1046
+
1047
+ @property
1048
+ def o_index_in_face(self) -> SocketLinker:
1049
+ """Output socket: Index in Face"""
1050
+ return self._output("Index in Face")
1051
+
1052
+
1053
+ class ImageInfo(NodeBuilder):
1054
+ """Retrieve information about an image"""
1055
+
1056
+ name = "GeometryNodeImageInfo"
1057
+ node: bpy.types.GeometryNodeImageInfo
1058
+
1059
+ def __init__(self, image: TYPE_INPUT_IMAGE = None, frame: TYPE_INPUT_INT = 0):
1060
+ super().__init__()
1061
+ key_args = {"Image": image, "Frame": frame}
1062
+ self._establish_links(**key_args)
1063
+
1064
+ @property
1065
+ def i_image(self) -> SocketLinker:
1066
+ """Input socket: Image"""
1067
+ return self._input("Image")
1068
+
1069
+ @property
1070
+ def i_frame(self) -> SocketLinker:
1071
+ """Input socket: Frame"""
1072
+ return self._input("Frame")
1073
+
1074
+ @property
1075
+ def o_width(self) -> SocketLinker:
1076
+ """Output socket: Width"""
1077
+ return self._output("Width")
1078
+
1079
+ @property
1080
+ def o_height(self) -> SocketLinker:
1081
+ """Output socket: Height"""
1082
+ return self._output("Height")
1083
+
1084
+ @property
1085
+ def o_has_alpha(self) -> SocketLinker:
1086
+ """Output socket: Has Alpha"""
1087
+ return self._output("Has Alpha")
1088
+
1089
+ @property
1090
+ def o_frame_count(self) -> SocketLinker:
1091
+ """Output socket: Frame Count"""
1092
+ return self._output("Frame Count")
1093
+
1094
+ @property
1095
+ def o_fps(self) -> SocketLinker:
1096
+ """Output socket: FPS"""
1097
+ return self._output("FPS")
1098
+
1099
+
1100
+ class VertexOfCorner(NodeBuilder):
1101
+ """Retrieve the vertex each face corner is attached to"""
1102
+
1103
+ name = "GeometryNodeVertexOfCorner"
1104
+ node: bpy.types.GeometryNodeVertexOfCorner
1105
+
1106
+ def __init__(self, corner_index: TYPE_INPUT_INT = 0):
1107
+ super().__init__()
1108
+ key_args = {"Corner Index": corner_index}
1109
+ self._establish_links(**key_args)
1110
+
1111
+ @property
1112
+ def i_corner_index(self) -> SocketLinker:
1113
+ """Input socket: Corner Index"""
1114
+ return self._input("Corner Index")
1115
+
1116
+ @property
1117
+ def o_vertex_index(self) -> SocketLinker:
1118
+ """Output socket: Vertex Index"""
1119
+ return self._output("Vertex Index")
1120
+
1121
+
1122
+ class ImportCSV(NodeBuilder):
1123
+ """Import geometry from an CSV file"""
1124
+
1125
+ name = "GeometryNodeImportCSV"
1126
+ node: bpy.types.GeometryNodeImportCSV
1127
+
1128
+ def __init__(
1129
+ self, path: TYPE_INPUT_STRING = "", delimiter: TYPE_INPUT_STRING = ","
1130
+ ):
1131
+ super().__init__()
1132
+ key_args = {"Path": path, "Delimiter": delimiter}
1133
+ self._establish_links(**key_args)
1134
+
1135
+ @property
1136
+ def i_path(self) -> SocketLinker:
1137
+ """Input socket: Path"""
1138
+ return self._input("Path")
1139
+
1140
+ @property
1141
+ def i_delimiter(self) -> SocketLinker:
1142
+ """Input socket: Delimiter"""
1143
+ return self._input("Delimiter")
1144
+
1145
+ @property
1146
+ def o_point_cloud(self) -> SocketLinker:
1147
+ """Output socket: Point Cloud"""
1148
+ return self._output("Point Cloud")
1149
+
1150
+
1151
+ class ImportOBJ(NodeBuilder):
1152
+ """Import geometry from an OBJ file"""
1153
+
1154
+ name = "GeometryNodeImportOBJ"
1155
+ node: bpy.types.GeometryNodeImportOBJ
1156
+
1157
+ def __init__(self, path: TYPE_INPUT_STRING = ""):
1158
+ super().__init__()
1159
+ key_args = {"Path": path}
1160
+ self._establish_links(**key_args)
1161
+
1162
+ @property
1163
+ def i_path(self) -> SocketLinker:
1164
+ """Input socket: Path"""
1165
+ return self._input("Path")
1166
+
1167
+ @property
1168
+ def o_instances(self) -> SocketLinker:
1169
+ """Output socket: Instances"""
1170
+ return self._output("Instances")
1171
+
1172
+
1173
+ class ImportPLY(NodeBuilder):
1174
+ """Import a point cloud from a PLY file"""
1175
+
1176
+ name = "GeometryNodeImportPLY"
1177
+ node: bpy.types.GeometryNodeImportPLY
1178
+
1179
+ def __init__(self, path: TYPE_INPUT_STRING = ""):
1180
+ super().__init__()
1181
+ key_args = {"Path": path}
1182
+ self._establish_links(**key_args)
1183
+
1184
+ @property
1185
+ def i_path(self) -> SocketLinker:
1186
+ """Input socket: Path"""
1187
+ return self._input("Path")
1188
+
1189
+ @property
1190
+ def o_mesh(self) -> SocketLinker:
1191
+ """Output socket: Mesh"""
1192
+ return self._output("Mesh")
1193
+
1194
+
1195
+ class ImportSTL(NodeBuilder):
1196
+ """Import a mesh from an STL file"""
1197
+
1198
+ name = "GeometryNodeImportSTL"
1199
+ node: bpy.types.GeometryNodeImportSTL
1200
+
1201
+ def __init__(self, path: TYPE_INPUT_STRING = ""):
1202
+ super().__init__()
1203
+ key_args = {"Path": path}
1204
+ self._establish_links(**key_args)
1205
+
1206
+ @property
1207
+ def i_path(self) -> SocketLinker:
1208
+ """Input socket: Path"""
1209
+ return self._input("Path")
1210
+
1211
+ @property
1212
+ def o_mesh(self) -> SocketLinker:
1213
+ """Output socket: Mesh"""
1214
+ return self._output("Mesh")
1215
+
1216
+
1217
+ class ImportText(NodeBuilder):
1218
+ """Import a string from a text file"""
1219
+
1220
+ name = "GeometryNodeImportText"
1221
+ node: bpy.types.GeometryNodeImportText
1222
+
1223
+ def __init__(self, path: TYPE_INPUT_STRING = ""):
1224
+ super().__init__()
1225
+ key_args = {"Path": path}
1226
+ self._establish_links(**key_args)
1227
+
1228
+ @property
1229
+ def i_path(self) -> SocketLinker:
1230
+ """Input socket: Path"""
1231
+ return self._input("Path")
1232
+
1233
+ @property
1234
+ def o_string(self) -> SocketLinker:
1235
+ """Output socket: String"""
1236
+ return self._output("String")
1237
+
1238
+
1239
+ class ImportVDB(NodeBuilder):
1240
+ """Import volume data from a .vdb file"""
1241
+
1242
+ name = "GeometryNodeImportVDB"
1243
+ node: bpy.types.GeometryNodeImportVDB
1244
+
1245
+ def __init__(self, path: TYPE_INPUT_STRING = ""):
1246
+ super().__init__()
1247
+ key_args = {"Path": path}
1248
+ self._establish_links(**key_args)
1249
+
1250
+ @property
1251
+ def i_path(self) -> SocketLinker:
1252
+ """Input socket: Path"""
1253
+ return self._input("Path")
1254
+
1255
+ @property
1256
+ def o_volume(self) -> SocketLinker:
1257
+ """Output socket: Volume"""
1258
+ return self._output("Volume")
1259
+
1260
+
1261
+ class InstanceTransform(NodeBuilder):
1262
+ """Retrieve the full transformation of each instance in the geometry"""
1263
+
1264
+ name = "GeometryNodeInstanceTransform"
1265
+ node: bpy.types.GeometryNodeInstanceTransform
1266
+
1267
+ @property
1268
+ def o_transform(self) -> SocketLinker:
1269
+ """Output socket: Transform"""
1270
+ return self._output("Transform")
1271
+
1272
+
1273
+ class IsViewport(NodeBuilder):
1274
+ """Retrieve whether the nodes are being evaluated for the viewport rather than the final render"""
1275
+
1276
+ name = "GeometryNodeIsViewport"
1277
+ node: bpy.types.GeometryNodeIsViewport
1278
+
1279
+ @property
1280
+ def o_is_viewport(self) -> SocketLinker:
1281
+ """Output socket: Is Viewport"""
1282
+ return self._output("Is Viewport")
1283
+
1284
+
1285
+ class OffsetCornerInFace(NodeBuilder):
1286
+ """Retrieve corners in the same face as another"""
1287
+
1288
+ name = "GeometryNodeOffsetCornerInFace"
1289
+ node: bpy.types.GeometryNodeOffsetCornerInFace
1290
+
1291
+ def __init__(self, corner_index: TYPE_INPUT_INT = None, offset: TYPE_INPUT_INT = 0):
1292
+ super().__init__()
1293
+ key_args = {"Corner Index": corner_index, "Offset": offset}
1294
+ self._establish_links(**key_args)
1295
+
1296
+ @property
1297
+ def i_corner_index(self) -> SocketLinker:
1298
+ """Input socket: Corner Index"""
1299
+ return self._input("Corner Index")
1300
+
1301
+ @property
1302
+ def i_offset(self) -> SocketLinker:
1303
+ """Input socket: Offset"""
1304
+ return self._input("Offset")
1305
+
1306
+ @property
1307
+ def o_corner_index(self) -> SocketLinker:
1308
+ """Output socket: Corner Index"""
1309
+ return self._output("Corner Index")
1310
+
1311
+
1312
+ class ObjectInfo(NodeBuilder):
1313
+ """Retrieve information from an object"""
1314
+
1315
+ name = "GeometryNodeObjectInfo"
1316
+ node: bpy.types.GeometryNodeObjectInfo
1317
+
1318
+ def __init__(
1319
+ self,
1320
+ object: TYPE_INPUT_OBJECT = None,
1321
+ as_instance: TYPE_INPUT_BOOLEAN = False,
1322
+ *,
1323
+ transform_space: Literal["ORIGINAL", "RELATIVE"] = "ORIGINAL",
1324
+ ):
1325
+ super().__init__()
1326
+ key_args = {"Object": object, "As Instance": as_instance}
1327
+ self.transform_space = transform_space
1328
+ self._establish_links(**key_args)
1329
+
1330
+ @property
1331
+ def i_object(self) -> SocketLinker:
1332
+ """Input socket: Object"""
1333
+ return self._input("Object")
1334
+
1335
+ @property
1336
+ def i_as_instance(self) -> SocketLinker:
1337
+ """Input socket: As Instance"""
1338
+ return self._input("As Instance")
1339
+
1340
+ @property
1341
+ def o_transform(self) -> SocketLinker:
1342
+ """Output socket: Transform"""
1343
+ return self._output("Transform")
1344
+
1345
+ @property
1346
+ def o_location(self) -> SocketLinker:
1347
+ """Output socket: Location"""
1348
+ return self._output("Location")
1349
+
1350
+ @property
1351
+ def o_rotation(self) -> SocketLinker:
1352
+ """Output socket: Rotation"""
1353
+ return self._output("Rotation")
1354
+
1355
+ @property
1356
+ def o_scale(self) -> SocketLinker:
1357
+ """Output socket: Scale"""
1358
+ return self._output("Scale")
1359
+
1360
+ @property
1361
+ def o_geometry(self) -> SocketLinker:
1362
+ """Output socket: Geometry"""
1363
+ return self._output("Geometry")
1364
+
1365
+ @property
1366
+ def transform_space(self) -> Literal["ORIGINAL", "RELATIVE"]:
1367
+ return self.node.transform_space
1368
+
1369
+ @transform_space.setter
1370
+ def transform_space(self, value: Literal["ORIGINAL", "RELATIVE"]):
1371
+ self.node.transform_space = value
1372
+
1373
+
1374
+ class SelfObject(NodeBuilder):
1375
+ """Retrieve the object that contains the geometry nodes modifier currently being executed"""
1376
+
1377
+ name = "GeometryNodeSelfObject"
1378
+ node: bpy.types.GeometryNodeSelfObject
1379
+
1380
+ @property
1381
+ def o_self_object(self) -> SocketLinker:
1382
+ """Output socket: Self Object"""
1383
+ return self._output("Self Object")
1384
+
1385
+
1386
+ class SplineLength(NodeBuilder):
1387
+ """Retrieve the total length of each spline, as a distance or as a number of points"""
1388
+
1389
+ name = "GeometryNodeSplineLength"
1390
+ node: bpy.types.GeometryNodeSplineLength
1391
+
1392
+ @property
1393
+ def o_length(self) -> SocketLinker:
1394
+ """Output socket: Length"""
1395
+ return self._output("Length")
1396
+
1397
+ @property
1398
+ def o_point_count(self) -> SocketLinker:
1399
+ """Output socket: Point Count"""
1400
+ return self._output("Point Count")
1401
+
1402
+
1403
+ class SplineParameter(NodeBuilder):
1404
+ """Retrieve how far along each spline a control point is"""
1405
+
1406
+ name = "GeometryNodeSplineParameter"
1407
+ node: bpy.types.GeometryNodeSplineParameter
1408
+
1409
+ @property
1410
+ def o_factor(self) -> SocketLinker:
1411
+ """Output socket: Factor"""
1412
+ return self._output("Factor")
1413
+
1414
+ @property
1415
+ def o_length(self) -> SocketLinker:
1416
+ """Output socket: Length"""
1417
+ return self._output("Length")
1418
+
1419
+ @property
1420
+ def o_index(self) -> SocketLinker:
1421
+ """Output socket: Index"""
1422
+ return self._output("Index")
1423
+
1424
+
1425
+ class Cursor3D(NodeBuilder):
1426
+ """The scene's 3D cursor location and rotation"""
1427
+
1428
+ name = "GeometryNodeTool3DCursor"
1429
+ node: bpy.types.GeometryNodeTool3DCursor
1430
+
1431
+ @property
1432
+ def o_location(self) -> SocketLinker:
1433
+ """Output socket: Location"""
1434
+ return self._output("Location")
1435
+
1436
+ @property
1437
+ def o_rotation(self) -> SocketLinker:
1438
+ """Output socket: Rotation"""
1439
+ return self._output("Rotation")
1440
+
1441
+
1442
+ class ActiveElement(NodeBuilder):
1443
+ """Active element indices of the edited geometry, for tool execution"""
1444
+
1445
+ name = "GeometryNodeToolActiveElement"
1446
+ node: bpy.types.GeometryNodeToolActiveElement
1447
+
1448
+ def __init__(self, domain: Literal["POINT", "EDGE", "FACE", "LAYER"] = "POINT"):
1449
+ super().__init__()
1450
+ self.domain = domain
1451
+
1452
+ @property
1453
+ def o_index(self) -> SocketLinker:
1454
+ """Output socket: Index"""
1455
+ return self._output("Index")
1456
+
1457
+ @property
1458
+ def o_exists(self) -> SocketLinker:
1459
+ """Output socket: Exists"""
1460
+ return self._output("Exists")
1461
+
1462
+ @property
1463
+ def domain(self) -> Literal["POINT", "EDGE", "FACE", "LAYER"]:
1464
+ return self.node.domain
1465
+
1466
+ @domain.setter
1467
+ def domain(self, value: Literal["POINT", "EDGE", "FACE", "LAYER"]):
1468
+ self.node.domain = value
1469
+
1470
+
1471
+ class FaceSet(NodeBuilder):
1472
+ """Each face's sculpt face set value"""
1473
+
1474
+ name = "GeometryNodeToolFaceSet"
1475
+ node: bpy.types.GeometryNodeToolFaceSet
1476
+
1477
+ @property
1478
+ def o_face_set(self) -> SocketLinker:
1479
+ """Output socket: Face Set"""
1480
+ return self._output("Face Set")
1481
+
1482
+ @property
1483
+ def o_exists(self) -> SocketLinker:
1484
+ """Output socket: Exists"""
1485
+ return self._output("Exists")
1486
+
1487
+
1488
+ class MousePosition(NodeBuilder):
1489
+ """Retrieve the position of the mouse cursor"""
1490
+
1491
+ name = "GeometryNodeToolMousePosition"
1492
+ node: bpy.types.GeometryNodeToolMousePosition
1493
+
1494
+ @property
1495
+ def o_mouse_x(self) -> SocketLinker:
1496
+ """Output socket: Mouse X"""
1497
+ return self._output("Mouse X")
1498
+
1499
+ @property
1500
+ def o_mouse_y(self) -> SocketLinker:
1501
+ """Output socket: Mouse Y"""
1502
+ return self._output("Mouse Y")
1503
+
1504
+ @property
1505
+ def o_region_width(self) -> SocketLinker:
1506
+ """Output socket: Region Width"""
1507
+ return self._output("Region Width")
1508
+
1509
+ @property
1510
+ def o_region_height(self) -> SocketLinker:
1511
+ """Output socket: Region Height"""
1512
+ return self._output("Region Height")
1513
+
1514
+
1515
+ class Selection(NodeBuilder):
1516
+ """User selection of the edited geometry, for tool execution"""
1517
+
1518
+ name = "GeometryNodeToolSelection"
1519
+ node: bpy.types.GeometryNodeToolSelection
1520
+
1521
+ @property
1522
+ def o_boolean(self) -> SocketLinker:
1523
+ """Output socket: Boolean"""
1524
+ return self._output("Selection")
1525
+
1526
+ @property
1527
+ def o_float(self) -> SocketLinker:
1528
+ """Output socket: Float"""
1529
+ return self._output("Float")
1530
+
1531
+
1532
+ class UVTangent(NodeBuilder):
1533
+ """Generate tangent directions based on a UV map"""
1534
+
1535
+ name = "GeometryNodeUVTangent"
1536
+ node: bpy.types.GeometryNodeUVTangent
1537
+
1538
+ def __init__(
1539
+ self,
1540
+ method: Literal["Exact", "Fast"] = "Exact",
1541
+ uv: TYPE_INPUT_VECTOR = (0.0, 0.0), # type: ignore
1542
+ ):
1543
+ super().__init__()
1544
+ key_args = {"Method": method, "UV": uv}
1545
+ self._establish_links(**key_args)
1546
+
1547
+ @property
1548
+ def i_method(self) -> SocketLinker:
1549
+ """Input socket: Method"""
1550
+ return self._input("Method")
1551
+
1552
+ @property
1553
+ def i_uv(self) -> SocketLinker:
1554
+ """Input socket: UV"""
1555
+ return self._input("UV")
1556
+
1557
+ @property
1558
+ def o_tangent(self) -> SocketLinker:
1559
+ """Output socket: Tangent"""
1560
+ return self._output("Tangent")
1561
+
1562
+
1563
+ class ViewportTransform(NodeBuilder):
1564
+ """Retrieve the view direction and location of the 3D viewport"""
1565
+
1566
+ name = "GeometryNodeViewportTransform"
1567
+ node: bpy.types.GeometryNodeViewportTransform
1568
+
1569
+ @property
1570
+ def o_projection(self) -> SocketLinker:
1571
+ """Output socket: Projection"""
1572
+ return self._output("Projection")
1573
+
1574
+ @property
1575
+ def o_view(self) -> SocketLinker:
1576
+ """Output socket: View"""
1577
+ return self._output("View")
1578
+
1579
+ @property
1580
+ def o_is_orthographic(self) -> SocketLinker:
1581
+ """Output socket: Is Orthographic"""
1582
+ return self._output("Is Orthographic")
1583
+
1584
+
1585
+ def _typed_named_attribute(data_type: str):
1586
+ @classmethod
1587
+ def method(cls, name: TYPE_INPUT_STRING) -> "NamedAttribute":
1588
+ """Create a NamedAttribute with a non-default_data_type"""
1589
+ return cls(name=name, data_type=data_type)
1590
+
1591
+ return method
1592
+
1593
+
1594
+ class NamedAttribute(NodeBuilder):
1595
+ """Retrieve the data of a specified attribute"""
1596
+
1597
+ name = "GeometryNodeInputNamedAttribute"
1598
+ node: bpy.types.GeometryNodeInputNamedAttribute
1599
+ float = _typed_named_attribute("FLOAT")
1600
+ integer = _typed_named_attribute("INT")
1601
+ boolean = _typed_named_attribute("BOOLEAN")
1602
+ vector = _typed_named_attribute("FLOAT_VECTOR")
1603
+ color = _typed_named_attribute("FLOAT_COLOR")
1604
+ quaternion = _typed_named_attribute("QUATNERNION")
1605
+ matrix = _typed_named_attribute("FLOAT4X4")
1606
+
1607
+ def __init__(
1608
+ self,
1609
+ name: TYPE_INPUT_STRING = "",
1610
+ *,
1611
+ data_type: _SampleIndexDataTypes = "FLOAT",
1612
+ ):
1613
+ super().__init__()
1614
+ key_args = {"Name": name}
1615
+ self.data_type = data_type
1616
+ self._establish_links(**key_args)
1617
+
1618
+ @property
1619
+ def i_name(self) -> SocketLinker:
1620
+ """Input socket: Name"""
1621
+ return self._input("Name")
1622
+
1623
+ @property
1624
+ def o_attribute(self) -> SocketLinker:
1625
+ """Output socket: Attribute"""
1626
+ return self._output("Attribute")
1627
+
1628
+ @property
1629
+ def o_exists(self) -> SocketLinker:
1630
+ """Output socket: Exists"""
1631
+ return self._output("Exists")
1632
+
1633
+ @property
1634
+ def data_type(
1635
+ self,
1636
+ ) -> _SampleIndexDataTypes:
1637
+ return self.node.data_type # type: ignore
1638
+
1639
+ @data_type.setter
1640
+ def data_type(
1641
+ self,
1642
+ value: _SampleIndexDataTypes,
1643
+ ):
1644
+ self.node.data_type = value
1645
+
1646
+
1647
+ class EndpointSelection(NodeBuilder):
1648
+ """Provide a selection for an arbitrary number of endpoints in each spline"""
1649
+
1650
+ name = "GeometryNodeCurveEndpointSelection"
1651
+ node: bpy.types.GeometryNodeCurveEndpointSelection
1652
+
1653
+ def __init__(
1654
+ self,
1655
+ start_size: TYPE_INPUT_INT = 1,
1656
+ end_size: TYPE_INPUT_INT = 1,
1657
+ ):
1658
+ super().__init__()
1659
+ key_args = {"Start Size": start_size, "End Size": end_size}
1660
+ self._establish_links(**key_args)
1661
+
1662
+ @property
1663
+ def i_start_size(self) -> SocketLinker:
1664
+ """Input socket: Start Size"""
1665
+ return self._input("Start Size")
1666
+
1667
+ @property
1668
+ def i_end_size(self) -> SocketLinker:
1669
+ """Input socket: End Size"""
1670
+ return self._input("End Size")
1671
+
1672
+ @property
1673
+ def o_selection(self) -> SocketLinker:
1674
+ """Output socket: Selection"""
1675
+ return self._output("Selection")
1676
+
1677
+
1678
+ class HandleTypeSelection(NodeBuilder):
1679
+ """Provide a selection based on the handle types of Bézier control points"""
1680
+
1681
+ name = "GeometryNodeCurveHandleTypeSelection"
1682
+ node: bpy.types.GeometryNodeCurveHandleTypeSelection
1683
+
1684
+ def __init__(
1685
+ self,
1686
+ handle_type: Literal["FREE", "AUTO", "VECTOR", "ALIGN"] = "AUTO",
1687
+ left: bool = True,
1688
+ right: bool = True,
1689
+ ):
1690
+ super().__init__()
1691
+ self.handle_type = handle_type
1692
+ self.left = left
1693
+ self.right = right
1694
+
1695
+ @property
1696
+ def o_selection(self) -> SocketLinker:
1697
+ """Output socket: Selection"""
1698
+ return self._output("Selection")
1699
+
1700
+ @property
1701
+ def handle_type(self) -> Literal["FREE", "AUTO", "VECTOR", "ALIGN"]:
1702
+ return self.node.handle_type
1703
+
1704
+ @handle_type.setter
1705
+ def handle_type(self, value: Literal["FREE", "AUTO", "VECTOR", "ALIGN"]):
1706
+ self.node.handle_type = value
1707
+
1708
+ @property
1709
+ def left(self) -> bool:
1710
+ return "LEFT" in self.node.mode
1711
+
1712
+ @left.setter
1713
+ def left(self, value: bool):
1714
+ match value, self.right:
1715
+ case True, True:
1716
+ self.node.mode = {"LEFT", "RIGHT"}
1717
+ case True, False:
1718
+ self.node.mode = {"LEFT"}
1719
+ case False, True:
1720
+ self.node.mode = {"RIGHT"}
1721
+ case False, False:
1722
+ self.node.mode = set()
1723
+
1724
+ @property
1725
+ def right(self) -> bool:
1726
+ return "RIGHT" in self.node.mode
1727
+
1728
+ @right.setter
1729
+ def right(self, value: bool):
1730
+ match self.left, value:
1731
+ case True, True:
1732
+ self.node.mode = {"LEFT", "RIGHT"}
1733
+ case True, False:
1734
+ self.node.mode = {"LEFT"}
1735
+ case False, True:
1736
+ self.node.mode = {"RIGHT"}
1737
+ case False, False:
1738
+ self.node.mode = set()
1739
+
1740
+ @property
1741
+ def mode(self) -> set[Literal["LEFT", "RIGHT"]]:
1742
+ return self.node.mode
1743
+
1744
+ @mode.setter
1745
+ def mode(self, value: set[Literal["LEFT", "RIGHT"]]):
1746
+ self.node.mode = value
1747
+
1748
+
1749
+ class CurveOfPoint(NodeBuilder):
1750
+ """Retrieve the curve a control point is part of"""
1751
+
1752
+ name = "GeometryNodeCurveOfPoint"
1753
+ node: bpy.types.GeometryNodeCurveOfPoint
1754
+
1755
+ def __init__(self, point_index: TYPE_INPUT_INT = None):
1756
+ super().__init__()
1757
+ key_args = {"Point Index": point_index}
1758
+ self._establish_links(**key_args)
1759
+
1760
+ @property
1761
+ def i_point_index(self) -> SocketLinker:
1762
+ """Input socket: Point Index"""
1763
+ return self._input("Point Index")
1764
+
1765
+ @property
1766
+ def o_curve_index(self) -> SocketLinker:
1767
+ """Output socket: Curve Index"""
1768
+ return self._output("Curve Index")
1769
+
1770
+ @property
1771
+ def o_index_in_curve(self) -> SocketLinker:
1772
+ """Output socket: Index in Curve"""
1773
+ return self._output("Index in Curve")
1774
+
1775
+
1776
+ class CurveHandlePositions(NodeBuilder):
1777
+ """Retrieve the position of each Bézier control point's handles"""
1778
+
1779
+ name = "GeometryNodeInputCurveHandlePositions"
1780
+ node: bpy.types.GeometryNodeInputCurveHandlePositions
1781
+
1782
+ def __init__(self, relative: TYPE_INPUT_BOOLEAN = False):
1783
+ super().__init__()
1784
+ key_args = {"Relative": relative}
1785
+ self._establish_links(**key_args)
1786
+
1787
+ @property
1788
+ def i_relative(self) -> SocketLinker:
1789
+ """Input socket: Relative"""
1790
+ return self._input("Relative")
1791
+
1792
+ @property
1793
+ def o_left(self) -> SocketLinker:
1794
+ """Output socket: Left"""
1795
+ return self._output("Left")
1796
+
1797
+ @property
1798
+ def o_right(self) -> SocketLinker:
1799
+ """Output socket: Right"""
1800
+ return self._output("Right")
1801
+
1802
+
1803
+ class CurveTilt(NodeBuilder):
1804
+ """Retrieve the angle at each control point used to twist the curve's normal around its tangent"""
1805
+
1806
+ name = "GeometryNodeInputCurveTilt"
1807
+ node: bpy.types.GeometryNodeInputCurveTilt
1808
+
1809
+ @property
1810
+ def o_tilt(self) -> SocketLinker:
1811
+ """Output socket: Tilt"""
1812
+ return self._output("Tilt")
1813
+
1814
+
1815
+ class OffsetPointInCurve(NodeBuilder):
1816
+ """Offset a control point index within its curve"""
1817
+
1818
+ name = "GeometryNodeOffsetPointInCurve"
1819
+ node: bpy.types.GeometryNodeOffsetPointInCurve
1820
+
1821
+ def __init__(self, point_index: TYPE_INPUT_INT = None, offset: TYPE_INPUT_INT = 0):
1822
+ super().__init__()
1823
+ key_args = {"Point Index": point_index, "Offset": offset}
1824
+ self._establish_links(**key_args)
1825
+
1826
+ @property
1827
+ def i_point_index(self) -> SocketLinker:
1828
+ """Input socket: Point Index"""
1829
+ return self._input("Point Index")
1830
+
1831
+ @property
1832
+ def i_offset(self) -> SocketLinker:
1833
+ """Input socket: Offset"""
1834
+ return self._input("Offset")
1835
+
1836
+ @property
1837
+ def o_is_valid_offset(self) -> SocketLinker:
1838
+ """Output socket: Is Valid Offset"""
1839
+ return self._output("Is Valid Offset")
1840
+
1841
+ @property
1842
+ def o_point_index(self) -> SocketLinker:
1843
+ """Output socket: Point Index"""
1844
+ return self._output("Point Index")
1845
+
1846
+
1847
+ class PointsOfCurve(NodeBuilder):
1848
+ """Retrieve a point index within a curve"""
1849
+
1850
+ name = "GeometryNodePointsOfCurve"
1851
+ node: bpy.types.GeometryNodePointsOfCurve
1852
+
1853
+ def __init__(
1854
+ self,
1855
+ curve_index: TYPE_INPUT_INT = None,
1856
+ weights: TYPE_INPUT_VALUE = None,
1857
+ sort_index: TYPE_INPUT_INT = 0,
1858
+ ):
1859
+ super().__init__()
1860
+ key_args = {
1861
+ "Curve Index": curve_index,
1862
+ "Weights": weights,
1863
+ "Sort Index": sort_index,
1864
+ }
1865
+ self._establish_links(**key_args)
1866
+
1867
+ @property
1868
+ def i_curve_index(self) -> SocketLinker:
1869
+ """Input socket: Curve Index"""
1870
+ return self._input("Curve Index")
1871
+
1872
+ @property
1873
+ def i_weights(self) -> SocketLinker:
1874
+ """Input socket: Weights"""
1875
+ return self._input("Weights")
1876
+
1877
+ @property
1878
+ def i_sort_index(self) -> SocketLinker:
1879
+ """Input socket: Sort Index"""
1880
+ return self._input("Sort Index")
1881
+
1882
+ @property
1883
+ def o_point_index(self) -> SocketLinker:
1884
+ """Output socket: Point Index"""
1885
+ return self._output("Point Index")
1886
+
1887
+ @property
1888
+ def o_total(self) -> SocketLinker:
1889
+ """Output socket: Total"""
1890
+ return self._output("Total")
1891
+
1892
+
1893
+ class EdgeAngle(NodeBuilder):
1894
+ """The angle between the normals of connected manifold faces"""
1895
+
1896
+ name = "GeometryNodeInputMeshEdgeAngle"
1897
+ node: bpy.types.GeometryNodeInputMeshEdgeAngle
1898
+
1899
+ @property
1900
+ def o_unsigned_angle(self) -> SocketLinker:
1901
+ """Output socket: Unsigned Angle"""
1902
+ return self._output("Unsigned Angle")
1903
+
1904
+ @property
1905
+ def o_signed_angle(self) -> SocketLinker:
1906
+ """Output socket: Signed Angle"""
1907
+ return self._output("Signed Angle")
1908
+
1909
+
1910
+ class EdgeNeighbors(NodeBuilder):
1911
+ """Retrieve the number of faces that use each edge as one of their sides"""
1912
+
1913
+ name = "GeometryNodeInputMeshEdgeNeighbors"
1914
+ node: bpy.types.GeometryNodeInputMeshEdgeNeighbors
1915
+
1916
+ @property
1917
+ def o_face_count(self) -> SocketLinker:
1918
+ """Output socket: Face Count"""
1919
+ return self._output("Face Count")
1920
+
1921
+
1922
+ class EdgeVertices(NodeBuilder):
1923
+ """Retrieve topology information relating to each edge of a mesh"""
1924
+
1925
+ name = "GeometryNodeInputMeshEdgeVertices"
1926
+ node: bpy.types.GeometryNodeInputMeshEdgeVertices
1927
+
1928
+ @property
1929
+ def o_vertex_index_1(self) -> SocketLinker:
1930
+ """Output socket: Vertex Index 1"""
1931
+ return self._output("Vertex Index 1")
1932
+
1933
+ @property
1934
+ def o_vertex_index_2(self) -> SocketLinker:
1935
+ """Output socket: Vertex Index 2"""
1936
+ return self._output("Vertex Index 2")
1937
+
1938
+ @property
1939
+ def o_position_1(self) -> SocketLinker:
1940
+ """Output socket: Position 1"""
1941
+ return self._output("Position 1")
1942
+
1943
+ @property
1944
+ def o_position_2(self) -> SocketLinker:
1945
+ """Output socket: Position 2"""
1946
+ return self._output("Position 2")
1947
+
1948
+
1949
+ class FaceArea(NodeBuilder):
1950
+ """Calculate the surface area of a mesh's faces"""
1951
+
1952
+ name = "GeometryNodeInputMeshFaceArea"
1953
+ node: bpy.types.GeometryNodeInputMeshFaceArea
1954
+
1955
+ @property
1956
+ def o_area(self) -> SocketLinker:
1957
+ """Output socket: Area"""
1958
+ return self._output("Area")
1959
+
1960
+
1961
+ class IsFacePlanar(NodeBuilder):
1962
+ """Retrieve whether all triangles in a face are on the same plane, i.e. whether they have the same normal"""
1963
+
1964
+ name = "GeometryNodeInputMeshFaceIsPlanar"
1965
+ node: bpy.types.GeometryNodeInputMeshFaceIsPlanar
1966
+
1967
+ def __init__(self, threshold: TYPE_INPUT_VALUE = 0.001):
1968
+ super().__init__()
1969
+ key_args = {"Threshold": threshold}
1970
+ self._establish_links(**key_args)
1971
+
1972
+ @property
1973
+ def i_threshold(self) -> SocketLinker:
1974
+ """Input socket: Threshold"""
1975
+ return self._input("Threshold")
1976
+
1977
+ @property
1978
+ def o_planar(self) -> SocketLinker:
1979
+ """Output socket: Planar"""
1980
+ return self._output("Planar")
1981
+
1982
+
1983
+ class FaceNeighbors(NodeBuilder):
1984
+ """Retrieve topology information relating to each face of a mesh"""
1985
+
1986
+ name = "GeometryNodeInputMeshFaceNeighbors"
1987
+ node: bpy.types.GeometryNodeInputMeshFaceNeighbors
1988
+
1989
+ @property
1990
+ def o_vertex_count(self) -> SocketLinker:
1991
+ """Output socket: Vertex Count"""
1992
+ return self._output("Vertex Count")
1993
+
1994
+ @property
1995
+ def o_face_count(self) -> SocketLinker:
1996
+ """Output socket: Face Count"""
1997
+ return self._output("Face Count")
1998
+
1999
+
2000
+ class MeshIsland(NodeBuilder):
2001
+ """Retrieve information about separate connected regions in a mesh"""
2002
+
2003
+ name = "GeometryNodeInputMeshIsland"
2004
+ node: bpy.types.GeometryNodeInputMeshIsland
2005
+
2006
+ @property
2007
+ def o_island_index(self) -> SocketLinker:
2008
+ """Output socket: Island Index"""
2009
+ return self._output("Island Index")
2010
+
2011
+ @property
2012
+ def o_island_count(self) -> SocketLinker:
2013
+ """Output socket: Island Count"""
2014
+ return self._output("Island Count")
2015
+
2016
+
2017
+ class VertexNeighbors(NodeBuilder):
2018
+ """Retrieve topology information relating to each vertex of a mesh"""
2019
+
2020
+ name = "GeometryNodeInputMeshVertexNeighbors"
2021
+ node: bpy.types.GeometryNodeInputMeshVertexNeighbors
2022
+
2023
+ @property
2024
+ def o_vertex_count(self) -> SocketLinker:
2025
+ """Output socket: Vertex Count"""
2026
+ return self._output("Vertex Count")
2027
+
2028
+ @property
2029
+ def o_face_count(self) -> SocketLinker:
2030
+ """Output socket: Face Count"""
2031
+ return self._output("Face Count")
2032
+
2033
+
2034
+ class FaceGroupBoundaries(NodeBuilder):
2035
+ """Find edges on the boundaries between groups of faces with the same ID value"""
2036
+
2037
+ name = "GeometryNodeMeshFaceSetBoundaries"
2038
+ node: bpy.types.GeometryNodeMeshFaceSetBoundaries
2039
+
2040
+ def __init__(self, face_set: TYPE_INPUT_INT = 0):
2041
+ super().__init__()
2042
+ key_args = {"Face Set": face_set}
2043
+ self._establish_links(**key_args)
2044
+
2045
+ @property
2046
+ def i_face_group_id(self) -> SocketLinker:
2047
+ """Input socket: Face Group ID"""
2048
+ return self._input("Face Set")
2049
+
2050
+ @property
2051
+ def o_boundary_edges(self) -> SocketLinker:
2052
+ """Output socket: Boundary Edges"""
2053
+ return self._output("Boundary Edges")