nodebpy 0.14.0__tar.gz → 0.15.1__tar.gz

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.
Files changed (69) hide show
  1. {nodebpy-0.14.0 → nodebpy-0.15.1}/PKG-INFO +1 -1
  2. {nodebpy-0.14.0 → nodebpy-0.15.1}/pyproject.toml +1 -1
  3. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/builder/socket.py +121 -3
  4. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/geometry/__init__.py +6 -5
  5. nodebpy-0.15.1/src/nodebpy/nodes/geometry/attribute.py +291 -0
  6. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/geometry/converter.py +0 -405
  7. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/geometry/manual.py +783 -17
  8. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/geometry/zone.py +48 -40
  9. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/types.py +69 -17
  10. nodebpy-0.14.0/src/nodebpy/nodes/geometry/attribute.py +0 -723
  11. {nodebpy-0.14.0 → nodebpy-0.15.1}/README.md +0 -0
  12. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/__init__.py +0 -0
  13. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/arrange.py +0 -0
  14. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/builder/__init__.py +0 -0
  15. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/builder/_registry.py +0 -0
  16. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/builder/_utils.py +0 -0
  17. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/builder/accessor.py +0 -0
  18. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/builder/mixins.py +0 -0
  19. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/builder/node.py +0 -0
  20. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/builder/tree.py +0 -0
  21. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/diagram.py +0 -0
  22. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/lib/nodearrange/__init__.py +0 -0
  23. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/lib/nodearrange/arrange/graph.py +0 -0
  24. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/lib/nodearrange/arrange/ordering.py +0 -0
  25. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/lib/nodearrange/arrange/ranking.py +0 -0
  26. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/lib/nodearrange/arrange/realize.py +0 -0
  27. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/lib/nodearrange/arrange/stacking.py +0 -0
  28. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/lib/nodearrange/arrange/structs.py +0 -0
  29. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/lib/nodearrange/arrange/sugiyama.py +0 -0
  30. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/lib/nodearrange/arrange/x_coords.py +0 -0
  31. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/lib/nodearrange/arrange/y_coords.py +0 -0
  32. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/lib/nodearrange/config.py +0 -0
  33. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/lib/nodearrange/utils.py +0 -0
  34. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/__init__.py +0 -0
  35. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/compositor/__init__.py +2 -2
  36. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/compositor/color.py +0 -0
  37. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/compositor/converter.py +0 -0
  38. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/compositor/distort.py +0 -0
  39. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/compositor/filter.py +0 -0
  40. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/compositor/group.py +0 -0
  41. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/compositor/input.py +0 -0
  42. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/compositor/interface.py +0 -0
  43. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/compositor/manual.py +0 -0
  44. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/compositor/matte.py +0 -0
  45. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/compositor/output.py +0 -0
  46. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/compositor/vector.py +0 -0
  47. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/geometry/color.py +0 -0
  48. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/geometry/geometry.py +0 -0
  49. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/geometry/grid.py +0 -0
  50. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/geometry/group.py +0 -0
  51. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/geometry/groups.py +0 -0
  52. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/geometry/input.py +0 -0
  53. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/geometry/interface.py +0 -0
  54. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/geometry/output.py +0 -0
  55. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/geometry/texture.py +0 -0
  56. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/geometry/utilities.py +0 -0
  57. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/geometry/vector.py +0 -0
  58. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/shader/__init__.py +2 -2
  59. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/shader/color.py +0 -0
  60. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/shader/converter.py +0 -0
  61. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/shader/grid.py +0 -0
  62. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/shader/group.py +0 -0
  63. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/shader/input.py +0 -0
  64. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/shader/manual.py +0 -0
  65. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/shader/output.py +0 -0
  66. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/shader/script.py +0 -0
  67. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/shader/shader.py +0 -0
  68. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/shader/texture.py +0 -0
  69. {nodebpy-0.14.0 → nodebpy-0.15.1}/src/nodebpy/nodes/shader/vector.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: nodebpy
3
- Version: 0.14.0
3
+ Version: 0.15.1
4
4
  Summary: Build nodes trees in Blender more elegantly with code
5
5
  Author: Brady Johnston
6
6
  Author-email: Brady Johnston <brady.johnston@me.com>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "nodebpy"
3
- version = "0.14.0"
3
+ version = "0.15.1"
4
4
  description = "Build nodes trees in Blender more elegantly with code"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -30,17 +30,36 @@ from bpy.types import (
30
30
  )
31
31
  from mathutils import Euler
32
32
 
33
-
34
- from ..types import SOCKET_TYPES
33
+ from ..types import (
34
+ SOCKET_TYPES,
35
+ InputBoolean,
36
+ InputBundle,
37
+ InputClosure,
38
+ InputCollection,
39
+ InputColor,
40
+ InputFloat,
41
+ InputFont,
42
+ InputGeometry,
43
+ InputImage,
44
+ InputInteger,
45
+ InputMaterial,
46
+ InputMatrix,
47
+ InputMenu,
48
+ InputObject,
49
+ InputRotation,
50
+ InputString,
51
+ InputVector,
52
+ )
35
53
  from ._registry import _SOCKET_LINKER_REGISTRY, _get_socket_linker
36
54
  from ._utils import _NodeLike, _SocketLike
37
55
  from .mixins import LinkingMixin, OperatorMixin
38
56
 
39
57
  if TYPE_CHECKING:
40
- from ..nodes.geometry.converter import (
58
+ from ..nodes.geometry import (
41
59
  IntegerMath,
42
60
  Math,
43
61
  MultiplyMatrices,
62
+ Switch,
44
63
  TransformPoint,
45
64
  )
46
65
  from ..nodes.geometry.manual import Compare
@@ -587,6 +606,99 @@ class _IntegerMixin(BaseSocket):
587
606
  # ---------------------------------------------------------------------------
588
607
 
589
608
 
609
+ class _BooleanSwitchSocketFactory:
610
+ def __init__(self, socket: NodeSocketBool):
611
+ self._socket = socket
612
+ from ..nodes.geometry import Switch
613
+
614
+ self._switch = Switch
615
+
616
+ def float(
617
+ self, false: InputFloat = None, true: InputFloat = None
618
+ ) -> "Switch[FloatSocket]":
619
+ return self._switch.float(self._socket, false, true)
620
+
621
+ def integer(
622
+ self, false: InputInteger = None, true: InputInteger = None
623
+ ) -> "Switch[IntegerSocket]":
624
+ return self._switch.integer(self._socket, false, true)
625
+
626
+ def boolean(
627
+ self, false: InputBoolean = None, true: InputBoolean = None
628
+ ) -> "Switch[BooleanSocket]":
629
+ return self._switch.boolean(self._socket, false, true)
630
+
631
+ def vector(
632
+ self, false: InputVector = None, true: InputVector = None
633
+ ) -> "Switch[VectorSocket]":
634
+ return self._switch.vector(self._socket, false, true)
635
+
636
+ def color(
637
+ self, false: InputColor = None, true: InputColor = None
638
+ ) -> "Switch[ColorSocket]":
639
+ return self._switch.color(self._socket, false, true)
640
+
641
+ def rotation(
642
+ self, false: InputRotation = None, true: InputRotation = None
643
+ ) -> "Switch[RotationSocket]":
644
+ return self._switch.rotation(self._socket, false, true)
645
+
646
+ def matrix(
647
+ self, false: InputMatrix = None, true: InputMatrix = None
648
+ ) -> "Switch[MatrixSocket]":
649
+ return self._switch.matrix(self._socket, false, true)
650
+
651
+ def string(
652
+ self, false: InputString = None, true: InputString = None
653
+ ) -> "Switch[StringSocket]":
654
+ return self._switch.string(self._socket, false, true)
655
+
656
+ def menu(
657
+ self, false: InputMenu = None, true: InputMenu = None
658
+ ) -> "Switch[MenuSocket]":
659
+ return self._switch.menu(self._socket, false, true)
660
+
661
+ def object(
662
+ self, false: InputObject = None, true: InputObject = None
663
+ ) -> "Switch[ObjectSocket]":
664
+ return self._switch.object(self._socket, false, true)
665
+
666
+ def image(
667
+ self, false: InputImage = None, true: InputImage = None
668
+ ) -> "Switch[ImageSocket]":
669
+ return self._switch.image(self._socket, false, true)
670
+
671
+ def geometry(
672
+ self, false: InputGeometry = None, true: InputGeometry = None
673
+ ) -> "Switch[GeometrySocket]":
674
+ return self._switch.geometry(self._socket, false, true)
675
+
676
+ def collection(
677
+ self, false: InputCollection = None, true: InputCollection = None
678
+ ) -> "Switch[CollectionSocket]":
679
+ return self._switch.collection(self._socket, false, true)
680
+
681
+ def material(
682
+ self, false: InputMaterial = None, true: InputMaterial = None
683
+ ) -> "Switch[MaterialSocket]":
684
+ return self._switch.material(self._socket, false, true)
685
+
686
+ def bundle(
687
+ self, false: InputBundle = None, true: InputBundle = None
688
+ ) -> "Switch[BundleSocket]":
689
+ return self._switch.bundle(self._socket, false, true)
690
+
691
+ def closure(
692
+ self, false: InputClosure = None, true: InputClosure = None
693
+ ) -> "Switch[ClosureSocket]":
694
+ return self._switch.closure(self._socket, false, true)
695
+
696
+ def font(
697
+ self, false: InputFont = None, true: InputFont = None
698
+ ) -> "Switch[FontSocket]":
699
+ return self._switch.font(self._socket, false, true)
700
+
701
+
590
702
  class _BooleanMixin(BaseSocket):
591
703
  """Boolean-specific operator overrides — routes directly through BooleanMath."""
592
704
 
@@ -610,6 +722,12 @@ class _BooleanMixin(BaseSocket):
610
722
 
611
723
  return BooleanMath.l_and(self.socket, other)
612
724
 
725
+ @property
726
+ def switch(self) -> "_BooleanSwitchSocketFactory":
727
+ "Creat a Switch node with this boolean as the `switch` input."
728
+
729
+ return _BooleanSwitchSocketFactory(self.socket)
730
+
613
731
 
614
732
  class _RotationMixin(BaseSocket):
615
733
  """Rotation-specific properties (.w, .x, .y, .z) via RotationToQuaternion."""
@@ -5,12 +5,12 @@ from .manual import (
5
5
  HandleTypeSelection,
6
6
  IndexSwitch,
7
7
  MenuSwitch,
8
+ Switch,
8
9
  CaptureAttribute,
9
10
  FieldToGrid,
10
11
  JoinGeometry,
11
12
  SDFGridBoolean,
12
13
  Bake,
13
- JoinStrings,
14
14
  GeometryToInstance,
15
15
  RepeatInput,
16
16
  RepeatOutput,
@@ -26,6 +26,7 @@ from .manual import (
26
26
  ClosureOutput,
27
27
  ClosureZone,
28
28
  FormatString,
29
+ JoinStrings,
29
30
  Collection,
30
31
  Material,
31
32
  Object,
@@ -43,6 +44,9 @@ from .manual import (
43
44
  SampleCurve,
44
45
  Frame,
45
46
  Float,
47
+ FloatCurve,
48
+ ColorRamp,
49
+ StoreNamedAttribute,
46
50
  tree,
47
51
  )
48
52
  from .converter import (
@@ -53,7 +57,6 @@ from .converter import (
53
57
  Blackbody,
54
58
  BooleanMath,
55
59
  Clamp,
56
- ColorRamp,
57
60
  CombineBundle,
58
61
  CombineColor,
59
62
  CombineMatrix,
@@ -61,7 +64,6 @@ from .converter import (
61
64
  CombineXYZ,
62
65
  EulerToRotation,
63
66
  FindInString,
64
- FloatCurve,
65
67
  FloatToInteger,
66
68
  GetBundleItem,
67
69
  HashValue,
@@ -97,7 +99,6 @@ from .converter import (
97
99
  StoreBundleItem,
98
100
  StringLength,
99
101
  StringToValue,
100
- Switch,
101
102
  TransformDirection,
102
103
  TransformPoint,
103
104
  TransposeMatrix,
@@ -186,7 +187,6 @@ from .attribute import (
186
187
  BlurAttribute,
187
188
  DomainSize,
188
189
  RemoveNamedAttribute,
189
- StoreNamedAttribute,
190
190
  )
191
191
  from .geometry import (
192
192
  Arc,
@@ -521,6 +521,7 @@ __all__ = (
521
521
  "JoinBundle",
522
522
  "JoinGeometry",
523
523
  "JoinStrings",
524
+ "JoinStrings",
524
525
  "LinearGizmo",
525
526
  "MagicTexture",
526
527
  "MapRange",
@@ -0,0 +1,291 @@
1
+ # Auto-generated by generate.py — do not edit manually.
2
+
3
+ from typing import TYPE_CHECKING, Literal
4
+
5
+ import bpy
6
+
7
+ from ...builder import (
8
+ BaseNode as BaseNode,
9
+ SocketAccessor,
10
+ FloatSocket,
11
+ GeometrySocket,
12
+ IntegerSocket,
13
+ MenuSocket,
14
+ StringSocket,
15
+ )
16
+
17
+ from ...types import (
18
+ InputColor,
19
+ InputGeometry,
20
+ InputInteger,
21
+ InputMenu,
22
+ InputString,
23
+ InputFloat,
24
+ InputVector,
25
+ )
26
+
27
+
28
+ class BlurAttribute(BaseNode):
29
+ """
30
+ Mix attribute values of neighboring elements
31
+
32
+ Parameters
33
+ ----------
34
+ value : InputFloat
35
+ Value
36
+ iterations : InputInteger
37
+ Iterations
38
+ weight : InputFloat
39
+ Weight
40
+
41
+ Inputs
42
+ ------
43
+ i.value : FloatSocket
44
+ Value
45
+ i.iterations : IntegerSocket
46
+ Iterations
47
+ i.weight : FloatSocket
48
+ Weight
49
+
50
+ Outputs
51
+ -------
52
+ o.value : FloatSocket
53
+ Value
54
+ """
55
+
56
+ _bl_idname = "GeometryNodeBlurAttribute"
57
+ node: bpy.types.GeometryNodeBlurAttribute
58
+
59
+ class _Inputs(SocketAccessor):
60
+ value: FloatSocket
61
+ """Value"""
62
+ iterations: IntegerSocket
63
+ """Iterations"""
64
+ weight: FloatSocket
65
+ """Weight"""
66
+
67
+ class _Outputs(SocketAccessor):
68
+ value: FloatSocket
69
+ """Value"""
70
+
71
+ if TYPE_CHECKING:
72
+
73
+ @property
74
+ def i(self) -> _Inputs: ...
75
+ @property
76
+ def o(self) -> _Outputs: ...
77
+
78
+ def __init__(
79
+ self,
80
+ value: InputFloat = 0.0,
81
+ iterations: InputInteger = 1,
82
+ weight: InputFloat = 1.0,
83
+ *,
84
+ data_type: Literal["FLOAT", "INT", "FLOAT_VECTOR", "FLOAT_COLOR"] = "FLOAT",
85
+ ):
86
+ super().__init__()
87
+ key_args = {"Value": value, "Iterations": iterations, "Weight": weight}
88
+ self.data_type = data_type
89
+ self._establish_links(**key_args)
90
+
91
+ @classmethod
92
+ def float(
93
+ cls,
94
+ value: InputFloat = 0.0,
95
+ iterations: InputInteger = 1,
96
+ weight: InputFloat = 1.0,
97
+ ) -> "BlurAttribute":
98
+ """Create Blur Attribute with operation 'Float'. Floating-point value"""
99
+ return cls(data_type="FLOAT", value=value, iterations=iterations, weight=weight)
100
+
101
+ @classmethod
102
+ def integer(
103
+ cls,
104
+ value: InputInteger = 0,
105
+ iterations: InputInteger = 1,
106
+ weight: InputFloat = 1.0,
107
+ ) -> "BlurAttribute":
108
+ """Create Blur Attribute with operation 'Integer'. 32-bit integer"""
109
+ return cls(data_type="INT", value=value, iterations=iterations, weight=weight)
110
+
111
+ @classmethod
112
+ def vector(
113
+ cls,
114
+ value: InputVector = None,
115
+ iterations: InputInteger = 1,
116
+ weight: InputFloat = 1.0,
117
+ ) -> "BlurAttribute":
118
+ """Create Blur Attribute with operation 'Vector'. 3D vector with floating-point values"""
119
+ return cls(
120
+ data_type="FLOAT_VECTOR", value=value, iterations=iterations, weight=weight
121
+ )
122
+
123
+ @classmethod
124
+ def color(
125
+ cls,
126
+ value: InputColor = None,
127
+ iterations: InputInteger = 1,
128
+ weight: InputFloat = 1.0,
129
+ ) -> "BlurAttribute":
130
+ """Create Blur Attribute with operation 'Color'. RGBA color with 32-bit floating-point values"""
131
+ return cls(
132
+ data_type="FLOAT_COLOR", value=value, iterations=iterations, weight=weight
133
+ )
134
+
135
+ @property
136
+ def data_type(self) -> Literal["FLOAT", "INT", "FLOAT_VECTOR", "FLOAT_COLOR"]:
137
+ return self.node.data_type
138
+
139
+ @data_type.setter
140
+ def data_type(self, value: Literal["FLOAT", "INT", "FLOAT_VECTOR", "FLOAT_COLOR"]):
141
+ self.node.data_type = value
142
+
143
+
144
+ class DomainSize(BaseNode):
145
+ """
146
+ Retrieve the number of elements in a geometry for each attribute domain
147
+
148
+ Parameters
149
+ ----------
150
+ geometry : InputGeometry
151
+ Geometry
152
+
153
+ Inputs
154
+ ------
155
+ i.geometry : GeometrySocket
156
+ Geometry
157
+
158
+ Outputs
159
+ -------
160
+ o.point_count : IntegerSocket
161
+ Point Count
162
+ o.edge_count : IntegerSocket
163
+ Edge Count
164
+ o.face_count : IntegerSocket
165
+ Face Count
166
+ o.face_corner_count : IntegerSocket
167
+ Face Corner Count
168
+ o.spline_count : IntegerSocket
169
+ Spline Count
170
+ o.instance_count : IntegerSocket
171
+ Instance Count
172
+ o.layer_count : IntegerSocket
173
+ Layer Count
174
+ """
175
+
176
+ _bl_idname = "GeometryNodeAttributeDomainSize"
177
+ node: bpy.types.GeometryNodeAttributeDomainSize
178
+
179
+ class _Inputs(SocketAccessor):
180
+ geometry: GeometrySocket
181
+ """Geometry"""
182
+
183
+ class _Outputs(SocketAccessor):
184
+ point_count: IntegerSocket
185
+ """Point Count"""
186
+ edge_count: IntegerSocket
187
+ """Edge Count"""
188
+ face_count: IntegerSocket
189
+ """Face Count"""
190
+ face_corner_count: IntegerSocket
191
+ """Face Corner Count"""
192
+ spline_count: IntegerSocket
193
+ """Spline Count"""
194
+ instance_count: IntegerSocket
195
+ """Instance Count"""
196
+ layer_count: IntegerSocket
197
+ """Layer Count"""
198
+
199
+ if TYPE_CHECKING:
200
+
201
+ @property
202
+ def i(self) -> _Inputs: ...
203
+ @property
204
+ def o(self) -> _Outputs: ...
205
+
206
+ def __init__(
207
+ self,
208
+ geometry: InputGeometry = None,
209
+ *,
210
+ component: Literal[
211
+ "MESH", "POINTCLOUD", "CURVE", "INSTANCES", "GREASEPENCIL"
212
+ ] = "MESH",
213
+ ):
214
+ super().__init__()
215
+ key_args = {"Geometry": geometry}
216
+ self.component = component
217
+ self._establish_links(**key_args)
218
+
219
+ @property
220
+ def component(
221
+ self,
222
+ ) -> Literal["MESH", "POINTCLOUD", "CURVE", "INSTANCES", "GREASEPENCIL"]:
223
+ return self.node.component
224
+
225
+ @component.setter
226
+ def component(
227
+ self, value: Literal["MESH", "POINTCLOUD", "CURVE", "INSTANCES", "GREASEPENCIL"]
228
+ ):
229
+ self.node.component = value
230
+
231
+
232
+ class RemoveNamedAttribute(BaseNode):
233
+ """
234
+ Delete an attribute with a specified name from a geometry. Typically used to optimize performance
235
+
236
+ Parameters
237
+ ----------
238
+ geometry : InputGeometry
239
+ Geometry
240
+ pattern_mode : InputMenu | Literal['Exact', 'Wildcard']
241
+ Pattern Mode
242
+ name : InputString
243
+ Name
244
+
245
+ Inputs
246
+ ------
247
+ i.geometry : GeometrySocket
248
+ Geometry
249
+ i.pattern_mode : MenuSocket
250
+ Pattern Mode
251
+ i.name : StringSocket
252
+ Name
253
+
254
+ Outputs
255
+ -------
256
+ o.geometry : GeometrySocket
257
+ Geometry
258
+ """
259
+
260
+ _bl_idname = "GeometryNodeRemoveAttribute"
261
+ node: bpy.types.GeometryNodeRemoveAttribute
262
+
263
+ class _Inputs(SocketAccessor):
264
+ geometry: GeometrySocket
265
+ """Geometry"""
266
+ pattern_mode: MenuSocket
267
+ """Pattern Mode"""
268
+ name: StringSocket
269
+ """Name"""
270
+
271
+ class _Outputs(SocketAccessor):
272
+ geometry: GeometrySocket
273
+ """Geometry"""
274
+
275
+ if TYPE_CHECKING:
276
+
277
+ @property
278
+ def i(self) -> _Inputs: ...
279
+ @property
280
+ def o(self) -> _Outputs: ...
281
+
282
+ def __init__(
283
+ self,
284
+ geometry: InputGeometry = None,
285
+ pattern_mode: InputMenu | Literal["Exact", "Wildcard"] = "Exact",
286
+ name: InputString = "",
287
+ ):
288
+ super().__init__()
289
+ key_args = {"Geometry": geometry, "Pattern Mode": pattern_mode, "Name": name}
290
+
291
+ self._establish_links(**key_args)