nodebpy 0.1.1__py3-none-any.whl → 0.2.1__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/builder.py +786 -316
- nodebpy/nodes/__init__.py +641 -10
- nodebpy/nodes/attribute.py +345 -389
- nodebpy/nodes/color.py +72 -0
- nodebpy/nodes/converter.py +3527 -0
- nodebpy/nodes/experimental.py +312 -0
- nodebpy/nodes/geometry.py +3677 -4717
- nodebpy/nodes/grid.py +1713 -0
- nodebpy/nodes/group.py +17 -0
- nodebpy/nodes/input.py +1821 -316
- nodebpy/nodes/interface.py +519 -0
- nodebpy/nodes/manual.py +2022 -0
- nodebpy/nodes/output.py +85 -0
- nodebpy/nodes/texture.py +930 -0
- nodebpy/nodes/vector.py +528 -0
- nodebpy/nodes/zone.py +442 -0
- nodebpy/screenshot.py +2 -1
- nodebpy/sockets.py +12 -12
- nodebpy/types.py +445 -0
- {nodebpy-0.1.1.dist-info → nodebpy-0.2.1.dist-info}/METADATA +5 -5
- nodebpy-0.2.1.dist-info/RECORD +26 -0
- nodebpy/nodes/curve.py +0 -2006
- nodebpy/nodes/manually_specified.py +0 -1382
- nodebpy/nodes/mesh.py +0 -1408
- nodebpy/nodes/types.py +0 -119
- nodebpy/nodes/utilities.py +0 -2344
- nodebpy-0.1.1.dist-info/RECORD +0 -19
- {nodebpy-0.1.1.dist-info → nodebpy-0.2.1.dist-info}/WHEEL +0 -0
- {nodebpy-0.1.1.dist-info → nodebpy-0.2.1.dist-info}/entry_points.txt +0 -0
nodebpy/nodes/attribute.py
CHANGED
|
@@ -1,457 +1,219 @@
|
|
|
1
|
-
|
|
2
|
-
Auto-generated Blender Geometry Node classes.
|
|
1
|
+
from typing import Literal
|
|
3
2
|
|
|
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
|
|
8
|
-
|
|
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
|
-
"""
|
|
16
|
-
|
|
17
|
-
from __future__ import annotations
|
|
18
3
|
import bpy
|
|
19
|
-
from typing_extensions import Literal
|
|
20
|
-
from ..builder import NodeBuilder, NodeSocket
|
|
21
|
-
from .types import LINKABLE, TYPE_INPUT_BOOLEAN
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class DomainSize(NodeBuilder):
|
|
25
|
-
"""Retrieve the number of elements in a geometry for each attribute domain"""
|
|
26
|
-
|
|
27
|
-
name = "GeometryNodeAttributeDomainSize"
|
|
28
|
-
node: bpy.types.GeometryNodeAttributeDomainSize
|
|
29
|
-
|
|
30
|
-
def __init__(
|
|
31
|
-
self,
|
|
32
|
-
geometry: LINKABLE = None,
|
|
33
|
-
component: Literal[
|
|
34
|
-
"MESH", "POINTCLOUD", "CURVE", "INSTANCES", "GREASEPENCIL"
|
|
35
|
-
] = "MESH",
|
|
36
|
-
**kwargs,
|
|
37
|
-
):
|
|
38
|
-
super().__init__()
|
|
39
|
-
key_args = {"Geometry": geometry}
|
|
40
|
-
key_args.update(kwargs)
|
|
41
|
-
self.component = component
|
|
42
|
-
self._establish_links(**key_args)
|
|
43
|
-
|
|
44
|
-
@property
|
|
45
|
-
def i_geometry(self) -> NodeSocket:
|
|
46
|
-
"""Input socket: Geometry"""
|
|
47
|
-
return self._input("Geometry")
|
|
48
|
-
|
|
49
|
-
@property
|
|
50
|
-
def o_point_count(self) -> bpy.types.NodeSocketInt:
|
|
51
|
-
"""Output socket: Point Count"""
|
|
52
|
-
return self._output("Point Count")
|
|
53
|
-
|
|
54
|
-
@property
|
|
55
|
-
def o_edge_count(self) -> bpy.types.NodeSocketInt:
|
|
56
|
-
"""Output socket: Edge Count"""
|
|
57
|
-
return self._output("Edge Count")
|
|
58
|
-
|
|
59
|
-
@property
|
|
60
|
-
def o_face_count(self) -> bpy.types.NodeSocketInt:
|
|
61
|
-
"""Output socket: Face Count"""
|
|
62
|
-
return self._output("Face Count")
|
|
63
|
-
|
|
64
|
-
@property
|
|
65
|
-
def o_face_corner_count(self) -> bpy.types.NodeSocketInt:
|
|
66
|
-
"""Output socket: Face Corner Count"""
|
|
67
|
-
return self._output("Face Corner Count")
|
|
68
|
-
|
|
69
|
-
@property
|
|
70
|
-
def component(
|
|
71
|
-
self,
|
|
72
|
-
) -> Literal["MESH", "POINTCLOUD", "CURVE", "INSTANCES", "GREASEPENCIL"]:
|
|
73
|
-
return self.node.component
|
|
74
|
-
|
|
75
|
-
@component.setter
|
|
76
|
-
def component(
|
|
77
|
-
self, value: Literal["MESH", "POINTCLOUD", "CURVE", "INSTANCES", "GREASEPENCIL"]
|
|
78
|
-
):
|
|
79
|
-
self.node.component = value
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
class AttributeStatistic(NodeBuilder):
|
|
83
|
-
"""Calculate statistics about a data set from a field evaluated on a geometry"""
|
|
84
|
-
|
|
85
|
-
name = "GeometryNodeAttributeStatistic"
|
|
86
|
-
node: bpy.types.GeometryNodeAttributeStatistic
|
|
87
|
-
|
|
88
|
-
def __init__(
|
|
89
|
-
self,
|
|
90
|
-
geometry: LINKABLE = None,
|
|
91
|
-
selection: TYPE_INPUT_BOOLEAN = True,
|
|
92
|
-
attribute: float | LINKABLE | None = 0.0,
|
|
93
|
-
data_type: Literal[
|
|
94
|
-
"FLOAT",
|
|
95
|
-
"INT",
|
|
96
|
-
"BOOLEAN",
|
|
97
|
-
"FLOAT_VECTOR",
|
|
98
|
-
"FLOAT_COLOR",
|
|
99
|
-
"QUATERNION",
|
|
100
|
-
"FLOAT4X4",
|
|
101
|
-
"STRING",
|
|
102
|
-
"INT8",
|
|
103
|
-
"INT16_2D",
|
|
104
|
-
"INT32_2D",
|
|
105
|
-
"FLOAT2",
|
|
106
|
-
"BYTE_COLOR",
|
|
107
|
-
] = "FLOAT",
|
|
108
|
-
domain: Literal[
|
|
109
|
-
"POINT", "EDGE", "FACE", "CORNER", "CURVE", "INSTANCE", "LAYER"
|
|
110
|
-
] = "POINT",
|
|
111
|
-
**kwargs,
|
|
112
|
-
):
|
|
113
|
-
super().__init__()
|
|
114
|
-
key_args = {
|
|
115
|
-
"Geometry": geometry,
|
|
116
|
-
"Selection": selection,
|
|
117
|
-
"Attribute": attribute,
|
|
118
|
-
}
|
|
119
|
-
key_args.update(kwargs)
|
|
120
|
-
self.data_type = data_type
|
|
121
|
-
self.domain = domain
|
|
122
|
-
self._establish_links(**key_args)
|
|
123
4
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
"""Input socket: Attribute"""
|
|
137
|
-
return self._input("Attribute")
|
|
138
|
-
|
|
139
|
-
@property
|
|
140
|
-
def o_mean(self) -> bpy.types.NodeSocketFloat:
|
|
141
|
-
"""Output socket: Mean"""
|
|
142
|
-
return self._output("Mean")
|
|
143
|
-
|
|
144
|
-
@property
|
|
145
|
-
def o_median(self) -> bpy.types.NodeSocketFloat:
|
|
146
|
-
"""Output socket: Median"""
|
|
147
|
-
return self._output("Median")
|
|
148
|
-
|
|
149
|
-
@property
|
|
150
|
-
def o_sum(self) -> bpy.types.NodeSocketFloat:
|
|
151
|
-
"""Output socket: Sum"""
|
|
152
|
-
return self._output("Sum")
|
|
153
|
-
|
|
154
|
-
@property
|
|
155
|
-
def o_min(self) -> bpy.types.NodeSocketFloat:
|
|
156
|
-
"""Output socket: Min"""
|
|
157
|
-
return self._output("Min")
|
|
158
|
-
|
|
159
|
-
@property
|
|
160
|
-
def o_max(self) -> bpy.types.NodeSocketFloat:
|
|
161
|
-
"""Output socket: Max"""
|
|
162
|
-
return self._output("Max")
|
|
163
|
-
|
|
164
|
-
@property
|
|
165
|
-
def o_range(self) -> bpy.types.NodeSocketFloat:
|
|
166
|
-
"""Output socket: Range"""
|
|
167
|
-
return self._output("Range")
|
|
168
|
-
|
|
169
|
-
@property
|
|
170
|
-
def o_standard_deviation(self) -> bpy.types.NodeSocketFloat:
|
|
171
|
-
"""Output socket: Standard Deviation"""
|
|
172
|
-
return self._output("Standard Deviation")
|
|
173
|
-
|
|
174
|
-
@property
|
|
175
|
-
def o_variance(self) -> bpy.types.NodeSocketFloat:
|
|
176
|
-
"""Output socket: Variance"""
|
|
177
|
-
return self._output("Variance")
|
|
178
|
-
|
|
179
|
-
@property
|
|
180
|
-
def data_type(
|
|
181
|
-
self,
|
|
182
|
-
) -> Literal[
|
|
183
|
-
"FLOAT",
|
|
184
|
-
"INT",
|
|
185
|
-
"BOOLEAN",
|
|
186
|
-
"FLOAT_VECTOR",
|
|
187
|
-
"FLOAT_COLOR",
|
|
188
|
-
"QUATERNION",
|
|
189
|
-
"FLOAT4X4",
|
|
190
|
-
"STRING",
|
|
191
|
-
"INT8",
|
|
192
|
-
"INT16_2D",
|
|
193
|
-
"INT32_2D",
|
|
194
|
-
"FLOAT2",
|
|
195
|
-
"BYTE_COLOR",
|
|
196
|
-
]:
|
|
197
|
-
return self.node.data_type
|
|
198
|
-
|
|
199
|
-
@data_type.setter
|
|
200
|
-
def data_type(
|
|
201
|
-
self,
|
|
202
|
-
value: Literal[
|
|
203
|
-
"FLOAT",
|
|
204
|
-
"INT",
|
|
205
|
-
"BOOLEAN",
|
|
206
|
-
"FLOAT_VECTOR",
|
|
207
|
-
"FLOAT_COLOR",
|
|
208
|
-
"QUATERNION",
|
|
209
|
-
"FLOAT4X4",
|
|
210
|
-
"STRING",
|
|
211
|
-
"INT8",
|
|
212
|
-
"INT16_2D",
|
|
213
|
-
"INT32_2D",
|
|
214
|
-
"FLOAT2",
|
|
215
|
-
"BYTE_COLOR",
|
|
216
|
-
],
|
|
217
|
-
):
|
|
218
|
-
self.node.data_type = value
|
|
219
|
-
|
|
220
|
-
@property
|
|
221
|
-
def domain(
|
|
222
|
-
self,
|
|
223
|
-
) -> Literal["POINT", "EDGE", "FACE", "CORNER", "CURVE", "INSTANCE", "LAYER"]:
|
|
224
|
-
return self.node.domain
|
|
225
|
-
|
|
226
|
-
@domain.setter
|
|
227
|
-
def domain(
|
|
228
|
-
self,
|
|
229
|
-
value: Literal["POINT", "EDGE", "FACE", "CORNER", "CURVE", "INSTANCE", "LAYER"],
|
|
230
|
-
):
|
|
231
|
-
self.node.domain = value
|
|
5
|
+
from ..builder import NodeBuilder, SocketLinker
|
|
6
|
+
from ..types import (
|
|
7
|
+
TYPE_INPUT_BOOLEAN,
|
|
8
|
+
TYPE_INPUT_GEOMETRY,
|
|
9
|
+
TYPE_INPUT_INT,
|
|
10
|
+
TYPE_INPUT_MENU,
|
|
11
|
+
TYPE_INPUT_STRING,
|
|
12
|
+
TYPE_INPUT_ROTATION,
|
|
13
|
+
TYPE_INPUT_COLOR,
|
|
14
|
+
TYPE_INPUT_VALUE,
|
|
15
|
+
TYPE_INPUT_VECTOR,
|
|
16
|
+
)
|
|
232
17
|
|
|
233
18
|
|
|
234
19
|
class BlurAttribute(NodeBuilder):
|
|
235
20
|
"""Mix attribute values of neighboring elements"""
|
|
236
21
|
|
|
237
|
-
|
|
22
|
+
_bl_idname = "GeometryNodeBlurAttribute"
|
|
238
23
|
node: bpy.types.GeometryNodeBlurAttribute
|
|
239
24
|
|
|
240
25
|
def __init__(
|
|
241
26
|
self,
|
|
242
|
-
value:
|
|
243
|
-
iterations:
|
|
244
|
-
weight:
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
"INT",
|
|
248
|
-
"BOOLEAN",
|
|
249
|
-
"FLOAT_VECTOR",
|
|
250
|
-
"FLOAT_COLOR",
|
|
251
|
-
"QUATERNION",
|
|
252
|
-
"FLOAT4X4",
|
|
253
|
-
"STRING",
|
|
254
|
-
"INT8",
|
|
255
|
-
"INT16_2D",
|
|
256
|
-
"INT32_2D",
|
|
257
|
-
"FLOAT2",
|
|
258
|
-
"BYTE_COLOR",
|
|
259
|
-
] = "FLOAT",
|
|
260
|
-
**kwargs,
|
|
27
|
+
value: TYPE_INPUT_VALUE = 0.0,
|
|
28
|
+
iterations: TYPE_INPUT_INT = 1,
|
|
29
|
+
weight: TYPE_INPUT_VALUE = 1.0,
|
|
30
|
+
*,
|
|
31
|
+
data_type: Literal["FLOAT", "INT", "FLOAT_VECTOR", "FLOAT_COLOR"] = "FLOAT",
|
|
261
32
|
):
|
|
262
33
|
super().__init__()
|
|
263
34
|
key_args = {"Value": value, "Iterations": iterations, "Weight": weight}
|
|
264
|
-
key_args.update(kwargs)
|
|
265
35
|
self.data_type = data_type
|
|
266
36
|
self._establish_links(**key_args)
|
|
267
37
|
|
|
268
|
-
@
|
|
269
|
-
def
|
|
38
|
+
@classmethod
|
|
39
|
+
def float(
|
|
40
|
+
cls,
|
|
41
|
+
value: TYPE_INPUT_VALUE = 0.0,
|
|
42
|
+
iterations: TYPE_INPUT_INT = 1,
|
|
43
|
+
weight: TYPE_INPUT_VALUE = 1.0,
|
|
44
|
+
) -> "BlurAttribute":
|
|
45
|
+
"""Create Blur Attribute with operation 'Float'."""
|
|
46
|
+
return cls(data_type="FLOAT", value=value, iterations=iterations, weight=weight)
|
|
47
|
+
|
|
48
|
+
@classmethod
|
|
49
|
+
def integer(
|
|
50
|
+
cls,
|
|
51
|
+
value: TYPE_INPUT_INT = 0,
|
|
52
|
+
iterations: TYPE_INPUT_INT = 1,
|
|
53
|
+
weight: TYPE_INPUT_VALUE = 1.0,
|
|
54
|
+
) -> "BlurAttribute":
|
|
55
|
+
"""Create Blur Attribute with operation 'Integer'."""
|
|
56
|
+
return cls(data_type="INT", value=value, iterations=iterations, weight=weight)
|
|
57
|
+
|
|
58
|
+
@classmethod
|
|
59
|
+
def vector(
|
|
60
|
+
cls,
|
|
61
|
+
value: TYPE_INPUT_VECTOR = None,
|
|
62
|
+
iterations: TYPE_INPUT_INT = 1,
|
|
63
|
+
weight: TYPE_INPUT_VALUE = 1.0,
|
|
64
|
+
) -> "BlurAttribute":
|
|
65
|
+
"""Create Blur Attribute with operation 'Vector'."""
|
|
66
|
+
return cls(
|
|
67
|
+
data_type="FLOAT_VECTOR", value=value, iterations=iterations, weight=weight
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
@classmethod
|
|
71
|
+
def color(
|
|
72
|
+
cls,
|
|
73
|
+
value: TYPE_INPUT_COLOR = None,
|
|
74
|
+
iterations: TYPE_INPUT_INT = 1,
|
|
75
|
+
weight: TYPE_INPUT_VALUE = 1.0,
|
|
76
|
+
) -> "BlurAttribute":
|
|
77
|
+
"""Create Blur Attribute with operation 'Color'."""
|
|
78
|
+
return cls(
|
|
79
|
+
data_type="FLOAT_COLOR", value=value, iterations=iterations, weight=weight
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
@property
|
|
83
|
+
def i_value(self) -> SocketLinker:
|
|
270
84
|
"""Input socket: Value"""
|
|
271
85
|
return self._input("Value")
|
|
272
86
|
|
|
273
87
|
@property
|
|
274
|
-
def i_iterations(self) ->
|
|
88
|
+
def i_iterations(self) -> SocketLinker:
|
|
275
89
|
"""Input socket: Iterations"""
|
|
276
90
|
return self._input("Iterations")
|
|
277
91
|
|
|
278
92
|
@property
|
|
279
|
-
def i_weight(self) ->
|
|
93
|
+
def i_weight(self) -> SocketLinker:
|
|
280
94
|
"""Input socket: Weight"""
|
|
281
95
|
return self._input("Weight")
|
|
282
96
|
|
|
283
97
|
@property
|
|
284
|
-
def o_value(self) ->
|
|
98
|
+
def o_value(self) -> SocketLinker:
|
|
285
99
|
"""Output socket: Value"""
|
|
286
100
|
return self._output("Value")
|
|
287
101
|
|
|
288
102
|
@property
|
|
289
|
-
def data_type(
|
|
290
|
-
self,
|
|
291
|
-
) -> Literal[
|
|
292
|
-
"FLOAT",
|
|
293
|
-
"INT",
|
|
294
|
-
"BOOLEAN",
|
|
295
|
-
"FLOAT_VECTOR",
|
|
296
|
-
"FLOAT_COLOR",
|
|
297
|
-
"QUATERNION",
|
|
298
|
-
"FLOAT4X4",
|
|
299
|
-
"STRING",
|
|
300
|
-
"INT8",
|
|
301
|
-
"INT16_2D",
|
|
302
|
-
"INT32_2D",
|
|
303
|
-
"FLOAT2",
|
|
304
|
-
"BYTE_COLOR",
|
|
305
|
-
]:
|
|
103
|
+
def data_type(self) -> Literal["FLOAT", "INT", "FLOAT_VECTOR", "FLOAT_COLOR"]:
|
|
306
104
|
return self.node.data_type
|
|
307
105
|
|
|
308
106
|
@data_type.setter
|
|
309
|
-
def data_type(
|
|
310
|
-
self,
|
|
311
|
-
value: Literal[
|
|
312
|
-
"FLOAT",
|
|
313
|
-
"INT",
|
|
314
|
-
"BOOLEAN",
|
|
315
|
-
"FLOAT_VECTOR",
|
|
316
|
-
"FLOAT_COLOR",
|
|
317
|
-
"QUATERNION",
|
|
318
|
-
"FLOAT4X4",
|
|
319
|
-
"STRING",
|
|
320
|
-
"INT8",
|
|
321
|
-
"INT16_2D",
|
|
322
|
-
"INT32_2D",
|
|
323
|
-
"FLOAT2",
|
|
324
|
-
"BYTE_COLOR",
|
|
325
|
-
],
|
|
326
|
-
):
|
|
107
|
+
def data_type(self, value: Literal["FLOAT", "INT", "FLOAT_VECTOR", "FLOAT_COLOR"]):
|
|
327
108
|
self.node.data_type = value
|
|
328
109
|
|
|
329
110
|
|
|
330
|
-
class
|
|
331
|
-
"""Retrieve the
|
|
111
|
+
class DomainSize(NodeBuilder):
|
|
112
|
+
"""Retrieve the number of elements in a geometry for each attribute domain"""
|
|
332
113
|
|
|
333
|
-
|
|
334
|
-
node: bpy.types.
|
|
114
|
+
_bl_idname = "GeometryNodeAttributeDomainSize"
|
|
115
|
+
node: bpy.types.GeometryNodeAttributeDomainSize
|
|
335
116
|
|
|
336
117
|
def __init__(
|
|
337
118
|
self,
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
"
|
|
342
|
-
|
|
343
|
-
"FLOAT_VECTOR",
|
|
344
|
-
"FLOAT_COLOR",
|
|
345
|
-
"QUATERNION",
|
|
346
|
-
"FLOAT4X4",
|
|
347
|
-
"STRING",
|
|
348
|
-
"INT8",
|
|
349
|
-
"INT16_2D",
|
|
350
|
-
"INT32_2D",
|
|
351
|
-
"FLOAT2",
|
|
352
|
-
"BYTE_COLOR",
|
|
353
|
-
] = "FLOAT",
|
|
354
|
-
**kwargs,
|
|
119
|
+
geometry: TYPE_INPUT_GEOMETRY = None,
|
|
120
|
+
*,
|
|
121
|
+
component: Literal[
|
|
122
|
+
"MESH", "POINTCLOUD", "CURVE", "INSTANCES", "GREASEPENCIL"
|
|
123
|
+
] = "MESH",
|
|
355
124
|
):
|
|
356
125
|
super().__init__()
|
|
357
|
-
key_args = {"
|
|
358
|
-
|
|
359
|
-
self.data_type = data_type
|
|
126
|
+
key_args = {"Geometry": geometry}
|
|
127
|
+
self.component = component
|
|
360
128
|
self._establish_links(**key_args)
|
|
361
129
|
|
|
362
130
|
@property
|
|
363
|
-
def
|
|
364
|
-
"""Input socket:
|
|
365
|
-
return self._input("
|
|
131
|
+
def i_geometry(self) -> SocketLinker:
|
|
132
|
+
"""Input socket: Geometry"""
|
|
133
|
+
return self._input("Geometry")
|
|
366
134
|
|
|
367
135
|
@property
|
|
368
|
-
def
|
|
369
|
-
"""Output socket:
|
|
370
|
-
return self._output("
|
|
136
|
+
def o_point_count(self) -> SocketLinker:
|
|
137
|
+
"""Output socket: Point Count"""
|
|
138
|
+
return self._output("Point Count")
|
|
371
139
|
|
|
372
140
|
@property
|
|
373
|
-
def
|
|
374
|
-
"""Output socket:
|
|
375
|
-
return self._output("
|
|
141
|
+
def o_edge_count(self) -> SocketLinker:
|
|
142
|
+
"""Output socket: Edge Count"""
|
|
143
|
+
return self._output("Edge Count")
|
|
376
144
|
|
|
377
145
|
@property
|
|
378
|
-
def
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
"FLOAT",
|
|
382
|
-
"INT",
|
|
383
|
-
"BOOLEAN",
|
|
384
|
-
"FLOAT_VECTOR",
|
|
385
|
-
"FLOAT_COLOR",
|
|
386
|
-
"QUATERNION",
|
|
387
|
-
"FLOAT4X4",
|
|
388
|
-
"STRING",
|
|
389
|
-
"INT8",
|
|
390
|
-
"INT16_2D",
|
|
391
|
-
"INT32_2D",
|
|
392
|
-
"FLOAT2",
|
|
393
|
-
"BYTE_COLOR",
|
|
394
|
-
]:
|
|
395
|
-
return self.node.data_type
|
|
146
|
+
def o_face_count(self) -> SocketLinker:
|
|
147
|
+
"""Output socket: Face Count"""
|
|
148
|
+
return self._output("Face Count")
|
|
396
149
|
|
|
397
|
-
@
|
|
398
|
-
def
|
|
150
|
+
@property
|
|
151
|
+
def o_face_corner_count(self) -> SocketLinker:
|
|
152
|
+
"""Output socket: Face Corner Count"""
|
|
153
|
+
return self._output("Face Corner Count")
|
|
154
|
+
|
|
155
|
+
@property
|
|
156
|
+
def o_spline_count(self) -> SocketLinker:
|
|
157
|
+
"""Output socket: Spline Count"""
|
|
158
|
+
return self._output("Spline Count")
|
|
159
|
+
|
|
160
|
+
@property
|
|
161
|
+
def o_instance_count(self) -> SocketLinker:
|
|
162
|
+
"""Output socket: Instance Count"""
|
|
163
|
+
return self._output("Instance Count")
|
|
164
|
+
|
|
165
|
+
@property
|
|
166
|
+
def o_layer_count(self) -> SocketLinker:
|
|
167
|
+
"""Output socket: Layer Count"""
|
|
168
|
+
return self._output("Layer Count")
|
|
169
|
+
|
|
170
|
+
@property
|
|
171
|
+
def component(
|
|
399
172
|
self,
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
"QUATERNION",
|
|
407
|
-
"FLOAT4X4",
|
|
408
|
-
"STRING",
|
|
409
|
-
"INT8",
|
|
410
|
-
"INT16_2D",
|
|
411
|
-
"INT32_2D",
|
|
412
|
-
"FLOAT2",
|
|
413
|
-
"BYTE_COLOR",
|
|
414
|
-
],
|
|
173
|
+
) -> Literal["MESH", "POINTCLOUD", "CURVE", "INSTANCES", "GREASEPENCIL"]:
|
|
174
|
+
return self.node.component
|
|
175
|
+
|
|
176
|
+
@component.setter
|
|
177
|
+
def component(
|
|
178
|
+
self, value: Literal["MESH", "POINTCLOUD", "CURVE", "INSTANCES", "GREASEPENCIL"]
|
|
415
179
|
):
|
|
416
|
-
self.node.
|
|
180
|
+
self.node.component = value
|
|
417
181
|
|
|
418
182
|
|
|
419
183
|
class RemoveNamedAttribute(NodeBuilder):
|
|
420
184
|
"""Delete an attribute with a specified name from a geometry. Typically used to optimize performance"""
|
|
421
185
|
|
|
422
|
-
|
|
186
|
+
_bl_idname = "GeometryNodeRemoveAttribute"
|
|
423
187
|
node: bpy.types.GeometryNodeRemoveAttribute
|
|
424
188
|
|
|
425
189
|
def __init__(
|
|
426
190
|
self,
|
|
427
|
-
geometry:
|
|
428
|
-
pattern_mode:
|
|
429
|
-
name:
|
|
430
|
-
**kwargs,
|
|
191
|
+
geometry: TYPE_INPUT_GEOMETRY = None,
|
|
192
|
+
pattern_mode: TYPE_INPUT_MENU = "Exact",
|
|
193
|
+
name: TYPE_INPUT_STRING = "",
|
|
431
194
|
):
|
|
432
195
|
super().__init__()
|
|
433
196
|
key_args = {"Geometry": geometry, "Pattern Mode": pattern_mode, "Name": name}
|
|
434
|
-
key_args.update(kwargs)
|
|
435
197
|
|
|
436
198
|
self._establish_links(**key_args)
|
|
437
199
|
|
|
438
200
|
@property
|
|
439
|
-
def i_geometry(self) ->
|
|
201
|
+
def i_geometry(self) -> SocketLinker:
|
|
440
202
|
"""Input socket: Geometry"""
|
|
441
203
|
return self._input("Geometry")
|
|
442
204
|
|
|
443
205
|
@property
|
|
444
|
-
def i_pattern_mode(self) ->
|
|
206
|
+
def i_pattern_mode(self) -> SocketLinker:
|
|
445
207
|
"""Input socket: Pattern Mode"""
|
|
446
208
|
return self._input("Pattern Mode")
|
|
447
209
|
|
|
448
210
|
@property
|
|
449
|
-
def i_name(self) ->
|
|
211
|
+
def i_name(self) -> SocketLinker:
|
|
450
212
|
"""Input socket: Name"""
|
|
451
213
|
return self._input("Name")
|
|
452
214
|
|
|
453
215
|
@property
|
|
454
|
-
def o_geometry(self) ->
|
|
216
|
+
def o_geometry(self) -> SocketLinker:
|
|
455
217
|
"""Output socket: Geometry"""
|
|
456
218
|
return self._output("Geometry")
|
|
457
219
|
|
|
@@ -459,15 +221,16 @@ class RemoveNamedAttribute(NodeBuilder):
|
|
|
459
221
|
class StoreNamedAttribute(NodeBuilder):
|
|
460
222
|
"""Store the result of a field on a geometry as an attribute with the specified name"""
|
|
461
223
|
|
|
462
|
-
|
|
224
|
+
_bl_idname = "GeometryNodeStoreNamedAttribute"
|
|
463
225
|
node: bpy.types.GeometryNodeStoreNamedAttribute
|
|
464
226
|
|
|
465
227
|
def __init__(
|
|
466
228
|
self,
|
|
467
|
-
geometry:
|
|
229
|
+
geometry: TYPE_INPUT_GEOMETRY = None,
|
|
468
230
|
selection: TYPE_INPUT_BOOLEAN = True,
|
|
469
|
-
name:
|
|
470
|
-
value:
|
|
231
|
+
name: TYPE_INPUT_STRING = "",
|
|
232
|
+
value: TYPE_INPUT_VALUE = 0.0,
|
|
233
|
+
*,
|
|
471
234
|
data_type: Literal[
|
|
472
235
|
"FLOAT",
|
|
473
236
|
"INT",
|
|
@@ -476,17 +239,13 @@ class StoreNamedAttribute(NodeBuilder):
|
|
|
476
239
|
"FLOAT_COLOR",
|
|
477
240
|
"QUATERNION",
|
|
478
241
|
"FLOAT4X4",
|
|
479
|
-
"STRING",
|
|
480
242
|
"INT8",
|
|
481
|
-
"INT16_2D",
|
|
482
|
-
"INT32_2D",
|
|
483
243
|
"FLOAT2",
|
|
484
244
|
"BYTE_COLOR",
|
|
485
245
|
] = "FLOAT",
|
|
486
246
|
domain: Literal[
|
|
487
247
|
"POINT", "EDGE", "FACE", "CORNER", "CURVE", "INSTANCE", "LAYER"
|
|
488
248
|
] = "POINT",
|
|
489
|
-
**kwargs,
|
|
490
249
|
):
|
|
491
250
|
super().__init__()
|
|
492
251
|
key_args = {
|
|
@@ -495,33 +254,236 @@ class StoreNamedAttribute(NodeBuilder):
|
|
|
495
254
|
"Name": name,
|
|
496
255
|
"Value": value,
|
|
497
256
|
}
|
|
498
|
-
key_args.update(kwargs)
|
|
499
257
|
self.data_type = data_type
|
|
500
258
|
self.domain = domain
|
|
501
259
|
self._establish_links(**key_args)
|
|
502
260
|
|
|
503
|
-
@
|
|
504
|
-
def
|
|
261
|
+
@classmethod
|
|
262
|
+
def float(
|
|
263
|
+
cls,
|
|
264
|
+
geometry: TYPE_INPUT_GEOMETRY = None,
|
|
265
|
+
selection: TYPE_INPUT_BOOLEAN = True,
|
|
266
|
+
name: TYPE_INPUT_STRING = "",
|
|
267
|
+
value: TYPE_INPUT_VALUE = 0.0,
|
|
268
|
+
) -> "StoreNamedAttribute":
|
|
269
|
+
"""Create Store Named Attribute with operation 'Float'."""
|
|
270
|
+
return cls(
|
|
271
|
+
data_type="FLOAT",
|
|
272
|
+
geometry=geometry,
|
|
273
|
+
selection=selection,
|
|
274
|
+
name=name,
|
|
275
|
+
value=value,
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
@classmethod
|
|
279
|
+
def integer(
|
|
280
|
+
cls,
|
|
281
|
+
geometry: TYPE_INPUT_GEOMETRY = None,
|
|
282
|
+
selection: TYPE_INPUT_BOOLEAN = True,
|
|
283
|
+
name: TYPE_INPUT_STRING = "",
|
|
284
|
+
value: TYPE_INPUT_INT = 0,
|
|
285
|
+
) -> "StoreNamedAttribute":
|
|
286
|
+
"""Create Store Named Attribute with operation 'Integer'."""
|
|
287
|
+
return cls(
|
|
288
|
+
data_type="INT",
|
|
289
|
+
geometry=geometry,
|
|
290
|
+
selection=selection,
|
|
291
|
+
name=name,
|
|
292
|
+
value=value,
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
@classmethod
|
|
296
|
+
def boolean(
|
|
297
|
+
cls,
|
|
298
|
+
geometry: TYPE_INPUT_GEOMETRY = None,
|
|
299
|
+
selection: TYPE_INPUT_BOOLEAN = True,
|
|
300
|
+
name: TYPE_INPUT_STRING = "",
|
|
301
|
+
value: TYPE_INPUT_BOOLEAN = False,
|
|
302
|
+
) -> "StoreNamedAttribute":
|
|
303
|
+
"""Create Store Named Attribute with operation 'Boolean'."""
|
|
304
|
+
return cls(
|
|
305
|
+
data_type="BOOLEAN",
|
|
306
|
+
geometry=geometry,
|
|
307
|
+
selection=selection,
|
|
308
|
+
name=name,
|
|
309
|
+
value=value,
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
@classmethod
|
|
313
|
+
def vector(
|
|
314
|
+
cls,
|
|
315
|
+
geometry: TYPE_INPUT_GEOMETRY = None,
|
|
316
|
+
selection: TYPE_INPUT_BOOLEAN = True,
|
|
317
|
+
name: TYPE_INPUT_STRING = "",
|
|
318
|
+
value: TYPE_INPUT_VECTOR = None,
|
|
319
|
+
) -> "StoreNamedAttribute":
|
|
320
|
+
"""Create Store Named Attribute with operation 'Vector'."""
|
|
321
|
+
return cls(
|
|
322
|
+
data_type="FLOAT_VECTOR",
|
|
323
|
+
geometry=geometry,
|
|
324
|
+
selection=selection,
|
|
325
|
+
name=name,
|
|
326
|
+
value=value,
|
|
327
|
+
)
|
|
328
|
+
|
|
329
|
+
@classmethod
|
|
330
|
+
def color(
|
|
331
|
+
cls,
|
|
332
|
+
geometry: TYPE_INPUT_GEOMETRY = None,
|
|
333
|
+
selection: TYPE_INPUT_BOOLEAN = True,
|
|
334
|
+
name: TYPE_INPUT_STRING = "",
|
|
335
|
+
value: TYPE_INPUT_COLOR = None,
|
|
336
|
+
) -> "StoreNamedAttribute":
|
|
337
|
+
"""Create Store Named Attribute with operation 'Color'."""
|
|
338
|
+
return cls(
|
|
339
|
+
data_type="FLOAT_COLOR",
|
|
340
|
+
geometry=geometry,
|
|
341
|
+
selection=selection,
|
|
342
|
+
name=name,
|
|
343
|
+
value=value,
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
@classmethod
|
|
347
|
+
def quaternion(
|
|
348
|
+
cls,
|
|
349
|
+
geometry: TYPE_INPUT_GEOMETRY = None,
|
|
350
|
+
selection: TYPE_INPUT_BOOLEAN = True,
|
|
351
|
+
name: TYPE_INPUT_STRING = "",
|
|
352
|
+
value: TYPE_INPUT_ROTATION = None,
|
|
353
|
+
) -> "StoreNamedAttribute":
|
|
354
|
+
"""Create Store Named Attribute with operation 'Quaternion'."""
|
|
355
|
+
return cls(
|
|
356
|
+
data_type="QUATERNION",
|
|
357
|
+
geometry=geometry,
|
|
358
|
+
selection=selection,
|
|
359
|
+
name=name,
|
|
360
|
+
value=value,
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
@classmethod
|
|
364
|
+
def point(
|
|
365
|
+
cls,
|
|
366
|
+
geometry: TYPE_INPUT_GEOMETRY = None,
|
|
367
|
+
selection: TYPE_INPUT_BOOLEAN = True,
|
|
368
|
+
name: TYPE_INPUT_STRING = "",
|
|
369
|
+
value: TYPE_INPUT_COLOR = None,
|
|
370
|
+
) -> "StoreNamedAttribute":
|
|
371
|
+
"""Create Store Named Attribute with operation 'Point'."""
|
|
372
|
+
return cls(
|
|
373
|
+
domain="POINT",
|
|
374
|
+
geometry=geometry,
|
|
375
|
+
selection=selection,
|
|
376
|
+
name=name,
|
|
377
|
+
value=value,
|
|
378
|
+
)
|
|
379
|
+
|
|
380
|
+
@classmethod
|
|
381
|
+
def edge(
|
|
382
|
+
cls,
|
|
383
|
+
geometry: TYPE_INPUT_GEOMETRY = None,
|
|
384
|
+
selection: TYPE_INPUT_BOOLEAN = True,
|
|
385
|
+
name: TYPE_INPUT_STRING = "",
|
|
386
|
+
value: TYPE_INPUT_COLOR = None,
|
|
387
|
+
) -> "StoreNamedAttribute":
|
|
388
|
+
"""Create Store Named Attribute with operation 'Edge'."""
|
|
389
|
+
return cls(
|
|
390
|
+
domain="EDGE",
|
|
391
|
+
geometry=geometry,
|
|
392
|
+
selection=selection,
|
|
393
|
+
name=name,
|
|
394
|
+
value=value,
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
@classmethod
|
|
398
|
+
def face(
|
|
399
|
+
cls,
|
|
400
|
+
geometry: TYPE_INPUT_GEOMETRY = None,
|
|
401
|
+
selection: TYPE_INPUT_BOOLEAN = True,
|
|
402
|
+
name: TYPE_INPUT_STRING = "",
|
|
403
|
+
value: TYPE_INPUT_COLOR = None,
|
|
404
|
+
) -> "StoreNamedAttribute":
|
|
405
|
+
"""Create Store Named Attribute with operation 'Face'."""
|
|
406
|
+
return cls(
|
|
407
|
+
domain="FACE",
|
|
408
|
+
geometry=geometry,
|
|
409
|
+
selection=selection,
|
|
410
|
+
name=name,
|
|
411
|
+
value=value,
|
|
412
|
+
)
|
|
413
|
+
|
|
414
|
+
@classmethod
|
|
415
|
+
def spline(
|
|
416
|
+
cls,
|
|
417
|
+
geometry: TYPE_INPUT_GEOMETRY = None,
|
|
418
|
+
selection: TYPE_INPUT_BOOLEAN = True,
|
|
419
|
+
name: TYPE_INPUT_STRING = "",
|
|
420
|
+
value: TYPE_INPUT_COLOR = None,
|
|
421
|
+
) -> "StoreNamedAttribute":
|
|
422
|
+
"""Create Store Named Attribute with operation 'Spline'."""
|
|
423
|
+
return cls(
|
|
424
|
+
domain="CURVE",
|
|
425
|
+
geometry=geometry,
|
|
426
|
+
selection=selection,
|
|
427
|
+
name=name,
|
|
428
|
+
value=value,
|
|
429
|
+
)
|
|
430
|
+
|
|
431
|
+
@classmethod
|
|
432
|
+
def instance(
|
|
433
|
+
cls,
|
|
434
|
+
geometry: TYPE_INPUT_GEOMETRY = None,
|
|
435
|
+
selection: TYPE_INPUT_BOOLEAN = True,
|
|
436
|
+
name: TYPE_INPUT_STRING = "",
|
|
437
|
+
value: TYPE_INPUT_COLOR = None,
|
|
438
|
+
) -> "StoreNamedAttribute":
|
|
439
|
+
"""Create Store Named Attribute with operation 'Instance'."""
|
|
440
|
+
return cls(
|
|
441
|
+
domain="INSTANCE",
|
|
442
|
+
geometry=geometry,
|
|
443
|
+
selection=selection,
|
|
444
|
+
name=name,
|
|
445
|
+
value=value,
|
|
446
|
+
)
|
|
447
|
+
|
|
448
|
+
@classmethod
|
|
449
|
+
def layer(
|
|
450
|
+
cls,
|
|
451
|
+
geometry: TYPE_INPUT_GEOMETRY = None,
|
|
452
|
+
selection: TYPE_INPUT_BOOLEAN = True,
|
|
453
|
+
name: TYPE_INPUT_STRING = "",
|
|
454
|
+
value: TYPE_INPUT_COLOR = None,
|
|
455
|
+
) -> "StoreNamedAttribute":
|
|
456
|
+
"""Create Store Named Attribute with operation 'Layer'."""
|
|
457
|
+
return cls(
|
|
458
|
+
domain="LAYER",
|
|
459
|
+
geometry=geometry,
|
|
460
|
+
selection=selection,
|
|
461
|
+
name=name,
|
|
462
|
+
value=value,
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
@property
|
|
466
|
+
def i_geometry(self) -> SocketLinker:
|
|
505
467
|
"""Input socket: Geometry"""
|
|
506
468
|
return self._input("Geometry")
|
|
507
469
|
|
|
508
470
|
@property
|
|
509
|
-
def i_selection(self) ->
|
|
471
|
+
def i_selection(self) -> SocketLinker:
|
|
510
472
|
"""Input socket: Selection"""
|
|
511
473
|
return self._input("Selection")
|
|
512
474
|
|
|
513
475
|
@property
|
|
514
|
-
def i_name(self) ->
|
|
476
|
+
def i_name(self) -> SocketLinker:
|
|
515
477
|
"""Input socket: Name"""
|
|
516
478
|
return self._input("Name")
|
|
517
479
|
|
|
518
480
|
@property
|
|
519
|
-
def i_value(self) ->
|
|
481
|
+
def i_value(self) -> SocketLinker:
|
|
520
482
|
"""Input socket: Value"""
|
|
521
483
|
return self._input("Value")
|
|
522
484
|
|
|
523
485
|
@property
|
|
524
|
-
def o_geometry(self) ->
|
|
486
|
+
def o_geometry(self) -> SocketLinker:
|
|
525
487
|
"""Output socket: Geometry"""
|
|
526
488
|
return self._output("Geometry")
|
|
527
489
|
|
|
@@ -536,10 +498,7 @@ class StoreNamedAttribute(NodeBuilder):
|
|
|
536
498
|
"FLOAT_COLOR",
|
|
537
499
|
"QUATERNION",
|
|
538
500
|
"FLOAT4X4",
|
|
539
|
-
"STRING",
|
|
540
501
|
"INT8",
|
|
541
|
-
"INT16_2D",
|
|
542
|
-
"INT32_2D",
|
|
543
502
|
"FLOAT2",
|
|
544
503
|
"BYTE_COLOR",
|
|
545
504
|
]:
|
|
@@ -556,10 +515,7 @@ class StoreNamedAttribute(NodeBuilder):
|
|
|
556
515
|
"FLOAT_COLOR",
|
|
557
516
|
"QUATERNION",
|
|
558
517
|
"FLOAT4X4",
|
|
559
|
-
"STRING",
|
|
560
518
|
"INT8",
|
|
561
|
-
"INT16_2D",
|
|
562
|
-
"INT32_2D",
|
|
563
519
|
"FLOAT2",
|
|
564
520
|
"BYTE_COLOR",
|
|
565
521
|
],
|