Skip to content

Commit 10f936b

Browse files
committed
feat: foreach element zones
1 parent 2352763 commit 10f936b

File tree

4 files changed

+65
-7
lines changed

4 files changed

+65
-7
lines changed

NodeToPython/geometry/node_tree.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44
if bpy.app.version >= (3, 6, 0):
55
from bpy.types import GeometryNodeSimulationInput
66

7-
if bpy.app.version > (4, 0, 0):
7+
if bpy.app.version >= (4, 0, 0):
88
from bpy.types import GeometryNodeRepeatInput
99

10+
if bpy.app.version >= (4, 3, 0):
11+
from bpy.types import GeometryNodeForeachGeometryElementInput
12+
1013
from ..ntp_node_tree import NTP_NodeTree
1114

1215
class NTP_GeoNodeTree(NTP_NodeTree):
@@ -16,3 +19,5 @@ def __init__(self, node_tree: GeometryNodeTree, var: str):
1619
self.sim_inputs: list[GeometryNodeSimulationInput] = []
1720
if bpy.app.version >= (4, 0, 0):
1821
self.repeat_inputs: list[GeometryNodeRepeatInput] = []
22+
if bpy.app.version >= (4, 3, 0):
23+
self.foreach_element_inputs: list[GeometryNodeForeachGeometryElementInput] = []

NodeToPython/geometry/operator.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,16 @@ def _process_node(self, node: Node, ntp_nt: NTP_GeoNodeTree) -> None:
5151

5252
if node.bl_idname == 'GeometryNodeSimulationInput':
5353
ntp_nt.sim_inputs.append(node)
54-
5554
elif node.bl_idname == 'GeometryNodeRepeatInput':
5655
ntp_nt.repeat_inputs.append(node)
56+
elif node.bl_idname == 'GeometryNodeForeachGeometryElementInput':
57+
ntp_nt.foreach_element_inputs.append(node)
5758

5859
self._hide_hidden_sockets(node)
5960

6061
if node.bl_idname not in {'GeometryNodeSimulationInput',
61-
'GeometryNodeRepeatInput'}:
62+
'GeometryNodeRepeatInput',
63+
'GeometryNodeForeachGeometryElementInput'}:
6264
self._set_socket_defaults(node)
6365

6466
if bpy.app.version >= (3, 6, 0):
@@ -143,6 +145,8 @@ def _process_node_tree(self, node_tree: GeometryNodeTree) -> None:
143145
self._process_zones(ntp_nt.sim_inputs)
144146
if bpy.app.version >= (4, 0, 0):
145147
self._process_zones(ntp_nt.repeat_inputs)
148+
if bpy.app.version >= (4, 3, 0):
149+
self._process_zones(ntp_nt.foreach_element_inputs)
146150

147151
#set look of nodes
148152
self._set_parents(node_tree)

NodeToPython/node_settings.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class ST(Enum):
99
COLOR = auto()
1010
ENUM = auto()
1111
ENUM_SET = auto()
12+
EULER = auto()
1213
FLOAT = auto()
1314
INT = auto()
1415
STRING = auto()
@@ -17,26 +18,28 @@ class ST(Enum):
1718
VEC3 = auto()
1819
VEC4 = auto()
1920
BAKE_ITEMS = auto()
21+
CAPTURE_ATTRIBUTE_ITEMS = auto()
2022
COLOR_RAMP = auto()
2123
CURVE_MAPPING = auto()
2224
ENUM_DEFINITION = auto()
25+
ENUM_ITEM = auto()
26+
FOREACH_GEO_ELEMENT_GENERATION_ITEMS = auto()
27+
FOREACH_GEO_ELEMENT_INPUT_ITEMS = auto()
28+
FOREACH_GEO_ELEMENT_MAIN_ITEMS = auto()
2329
INDEX_SWITCH_ITEMS = auto()
30+
MENU_SWITCH_ITEMS = auto()
2431
NODE_TREE = auto()
2532
REPEAT_OUTPUT_ITEMS = auto()
2633
SIM_OUTPUT_ITEMS = auto()
2734
IMAGE = auto()
2835
IMAGE_USER = auto()
29-
CAPTURE_ATTRIBUTE_ITEMS = auto()
3036
CRYPTOMATTE_ENTRIES = auto()
31-
ENUM_ITEM = auto()
32-
EULER = auto()
3337
FILE_SLOTS = auto()
3438
FONT = auto()
3539
IMAGE_FORMAT_SETTINGS = auto()
3640
LAYER_SLOTS = auto()
3741
MASK = auto()
3842
MATERIAL = auto()
39-
MENU_SWITCH_ITEMS = auto()
4043
MOVIE_CLIP = auto()
4144
OBJECT = auto()
4245
PARTICLE_SYSTEM = auto()
@@ -1467,7 +1470,10 @@ class NodeInfo(NamedTuple):
14671470
NTPNodeSetting("active_input_index", ST.INT),
14681471
NTPNodeSetting("active_main_index", ST.INT),
14691472
NTPNodeSetting("domain", ST.ENUM),
1473+
NTPNodeSetting("generation_items", ST.FOREACH_GEO_ELEMENT_GENERATION_ITEMS),
1474+
NTPNodeSetting("input_items", ST.FOREACH_GEO_ELEMENT_INPUT_ITEMS),
14701475
NTPNodeSetting("inspection_index", ST.INT),
1476+
NTPNodeSetting("main_items", ST.FOREACH_GEO_ELEMENT_MAIN_ITEMS),
14711477
],
14721478
min_version_ = (4, 3, 0)
14731479
),

NodeToPython/ntp_operator.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,12 @@ def _set_settings_defaults(self, node: Node) -> None:
446446
self._capture_attribute_items(attr, f"{node_var}.{attr_name}")
447447
elif st == ST.MENU_SWITCH_ITEMS:
448448
self._menu_switch_items(attr, f"{node_var}.{attr_name}")
449+
elif st == ST.FOREACH_GEO_ELEMENT_GENERATION_ITEMS:
450+
self._foreach_geo_element_generation_items(attr, f"{node_var}.{attr_name}")
451+
elif st == ST.FOREACH_GEO_ELEMENT_INPUT_ITEMS:
452+
self._foreach_geo_element_input_items(attr, f"{node_var}.{attr_name}")
453+
elif st == ST.FOREACH_GEO_ELEMENT_MAIN_ITEMS:
454+
self._foreach_geo_element_main_items(attr, f"{node_var}.{attr_name}")
449455

450456
if bpy.app.version < (4, 0, 0):
451457
def _set_group_socket_defaults(self, socket_interface: NodeSocketInterface,
@@ -1277,6 +1283,43 @@ def _menu_switch_items(self, menu_switch_items: bpy.types.NodeMenuSwitchItems, m
12771283
desc_str = str_to_py_str(item.description)
12781284
self._write(f"{menu_switch_items_str}[{i}].description = {desc_str}")
12791285

1286+
if bpy.app.version >= (4, 3, 0):
1287+
def _foreach_geo_element_generation_items(self,
1288+
generation_items: bpy.types.NodeGeometryForeachGeometryElementGenerationItems,
1289+
generation_items_str: str
1290+
) -> None:
1291+
self._write(f"{generation_items_str}.clear()")
1292+
for i, item in enumerate(generation_items):
1293+
socket_type = enum_to_py_str(item.socket_type)
1294+
name_str = str_to_py_str(item.name)
1295+
self._write(f"{generation_items_str}.new({socket_type}, {name_str})")
1296+
1297+
item_str = f"{generation_items_str}[{i}]"
1298+
1299+
ad = enum_to_py_str(item.domain)
1300+
self._write(f"{item_str}.domain = {ad}")
1301+
1302+
def _foreach_geo_element_input_items(self,
1303+
input_items: bpy.types.NodeGeometryForeachGeometryElementInputItems,
1304+
input_items_str: str
1305+
) -> None:
1306+
self._write(f"{input_items_str}.clear()")
1307+
for i, item in enumerate(input_items):
1308+
socket_type = enum_to_py_str(item.socket_type)
1309+
name_str = str_to_py_str(item.name)
1310+
self._write(f"{input_items_str}.new({socket_type}, {name_str})")
1311+
1312+
def _foreach_geo_element_main_items(self,
1313+
main_items: bpy.types.NodeGeometryForeachGeometryElementMainItems,
1314+
main_items_str: str
1315+
) -> None:
1316+
self._write(f"{main_items_str}.clear()")
1317+
for i, item in enumerate(main_items):
1318+
socket_type = enum_to_py_str(item.socket_type)
1319+
name_str = str_to_py_str(item.name)
1320+
self._write(f"{main_items_str}.new({socket_type}, {name_str})")
1321+
1322+
12801323
def _set_parents(self, node_tree: NodeTree) -> None:
12811324
"""
12821325
Sets parents for all nodes, mostly used to put nodes in frames

0 commit comments

Comments
 (0)