Skip to content

Commit 3287f2c

Browse files
committed
feat: repeat zones
1 parent 4135354 commit 3287f2c

File tree

5 files changed

+87
-49
lines changed

5 files changed

+87
-49
lines changed

compositor/node_settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@
422422

423423

424424

425-
#UTILITIES
425+
# UTILITIES
426426
'CompositorNodeMapRange' : [("use_clamp", ST.BOOL)],
427427

428428
'CompositorNodeMapValue' : [("max", ST.VEC1),

geometry/node_settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@
367367
'FunctionNodeRandomValue' : [("data_type", ST.ENUM)],
368368

369369
'GeometryNodeRepeatInput' : [],
370-
'GeometryNodeRepeatOutput' : [],
370+
'GeometryNodeRepeatOutput' : [("inspection_index", ST.INT)],
371371

372372
'GeometryNodeSwitch' : [("input_type", ST.ENUM)],
373373

geometry/node_tree.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,18 @@
1-
from bpy.types import GeometryNodeTree, GeometryNodeSimulationInput
1+
import bpy
2+
from bpy.types import GeometryNodeTree
3+
4+
if bpy.app.version >= (3, 6, 0):
5+
from bpy.types import GeometryNodeSimulationInput
6+
7+
if bpy.app.version > (4, 0, 0):
8+
from bpy.types import GeometryNodeRepeatInput
29

310
from ..ntp_node_tree import NTP_NodeTree
411

512
class NTP_GeoNodeTree(NTP_NodeTree):
613
def __init__(self, node_tree: GeometryNodeTree, var: str):
714
super().__init__(node_tree, var)
8-
self.sim_inputs: list[GeometryNodeSimulationInput] = []
15+
if bpy.app.version >= (3, 6, 0):
16+
self.sim_inputs: list[GeometryNodeSimulationInput] = []
17+
if bpy.app.version >= (4, 0, 0):
18+
self.repeat_inputs: list[GeometryNodeRepeatInput] = []

geometry/operator.py

Lines changed: 72 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
import bpy
2-
from bpy.types import GeometryNodeSimulationInput
3-
from bpy.types import GeometryNodeSimulationOutput
4-
from bpy.types import GeometryNodeTree
2+
from bpy.types import GeometryNode, GeometryNodeTree
53
from bpy.types import Node
64

5+
if bpy.app.version >= (3, 6, 0):
6+
from bpy.types import GeometryNodeSimulationInput
7+
from bpy.types import GeometryNodeSimulationOutput
8+
if bpy.app.version >= (4, 0, 0):
9+
from bpy.types import GeometryNodeRepeatInput
10+
from bpy.types import GeometryNodeRepeatOutput
11+
712
from io import StringIO
813

914
from ..ntp_operator import NTP_Operator
@@ -30,21 +35,34 @@ def __init__(self):
3035
super().__init__()
3136
self._settings = geo_node_settings
3237

33-
def _process_sim_output_node(self, node: GeometryNodeSimulationOutput,
34-
inner: str, node_var: str) -> None:
35-
self._write(f"{inner}# Remove generated sim state items\n")
36-
self._write(f"{inner}for item in {node_var}.state_items:\n")
37-
self._write(f"{inner}\t{node_var}.state_items.remove(item)\n")
38-
39-
for i, si in enumerate(node.state_items):
40-
socket_type = enum_to_py_str(si.socket_type)
41-
name = str_to_py_str(si.name)
42-
self._write(f"{inner}#create SSI {name}\n")
43-
self._write((f"{inner}{node_var}.state_items.new"
44-
f"({socket_type}, {name})\n"))
45-
si_var = f"{node_var}.state_items[{i}]"
46-
attr_domain = enum_to_py_str(si.attribute_domain)
47-
self._write((f"{inner}{si_var}.attribute_domain = {attr_domain}\n"))
38+
if bpy.app.version >= (3, 6, 0):
39+
def _process_zone_output_node(self, node: GeometryNode, inner: str,
40+
node_var: str) -> None:
41+
is_sim = False
42+
if node.bl_idname == 'GeometryNodeSimulationOutput':
43+
items = "state_items"
44+
is_sim = True
45+
elif node.bl_idname == 'GeometryNodeRepeatOutput':
46+
items = "repeat_items"
47+
else:
48+
self.report({'WARNING'}, f"{node.bl_idname} is not recognized "
49+
f" as avalid zone output")
50+
51+
self._write(f"{inner}# Remove generated {items}\n")
52+
self._write(f"{inner}for item in {node_var}.{items}:\n")
53+
self._write(f"{inner}\t{node_var}.{items}.remove(item)\n")
54+
55+
for i, item in enumerate(getattr(node, items)):
56+
socket_type = enum_to_py_str(item.socket_type)
57+
name = str_to_py_str(item.name)
58+
self._write(f"{inner}# Create item {name}\n")
59+
self._write(f"{inner}{node_var}.{items}.new"
60+
f"({socket_type}, {name})\n")
61+
if is_sim:
62+
item_var = f"{node_var}.{items}[{i}]"
63+
attr_domain = enum_to_py_str(item.attribute_domain)
64+
self._write((f"{inner}{item_var}.attribute_domain = "
65+
f"{attr_domain}\n"))
4866

4967
def _process_node(self, node: Node, ntp_node_tree: NTP_GeoNodeTree,
5068
inner: str, level: int) -> None:
@@ -66,34 +84,42 @@ def _process_node(self, node: Node, ntp_node_tree: NTP_GeoNodeTree,
6684
ntp_node_tree.sim_inputs.append(node)
6785

6886
elif node.bl_idname == 'GeometryNodeSimulationOutput':
69-
self._process_sim_output_node(node, inner, node_var)
87+
self._process_zone_output_node(node, inner, node_var)
88+
89+
elif node.bl_idname == 'GeometryNodeRepeatInput':
90+
ntp_node_tree.repeat_inputs.append(node)
91+
92+
elif node.bl_idname == 'GeometryNodeRepeatOutput':
93+
self._process_zone_output_node(node, inner, node_var)
7094

7195
self._hide_hidden_sockets(node, inner, node_var)
7296

73-
if node.bl_idname != 'GeometryNodeSimulationInput':
97+
if node.bl_idname not in {'GeometryNodeSimulationInput', 'GeometryNodeRepeatInput'}:
7498
self._set_socket_defaults(node, node_var, inner)
7599

76-
77-
def _process_sim_zones(self, sim_inputs: list[GeometryNodeSimulationInput],
78-
inner: str) -> None:
79-
"""
80-
Recreate simulation zones
81-
sim_inputs (list[GeometryNodeSimulationInput]): list of
82-
simulation input nodes
83-
inner (str): identation string
84-
"""
85-
for sim_input in sim_inputs:
86-
sim_output = sim_input.paired_output
87-
88-
sim_input_var = self._node_vars[sim_input]
89-
sim_output_var = self._node_vars[sim_output]
90-
self._write((f"{inner}{sim_input_var}.pair_with_output"
91-
f"({sim_output_var})\n"))
92-
93-
#must set defaults after paired with output
94-
self._set_socket_defaults(sim_input, sim_input_var, inner)
95-
self._set_socket_defaults(sim_output, sim_output_var, inner)
96-
100+
if bpy.app.version >= (3, 6, 0):
101+
def _process_zones(self, zone_inputs: list[GeometryNode],
102+
inner: str) -> None:
103+
"""
104+
Recreates a zone
105+
zone_inputs (list[GeometryNodeSimulationInput]): list of
106+
simulation input nodes
107+
inner (str): identation string
108+
"""
109+
for zone_input in zone_inputs:
110+
zone_output = zone_input.paired_output
111+
112+
zone_input_var = self._node_vars[zone_input]
113+
zone_output_var = self._node_vars[zone_output]
114+
115+
self._write(f"{inner}#Process zone input {zone_input.name}\n")
116+
self._write((f"{inner}{zone_input_var}.pair_with_output"
117+
f"({zone_output_var})\n"))
118+
119+
#must set defaults after paired with output
120+
self._set_socket_defaults(zone_input, zone_input_var, inner)
121+
self._set_socket_defaults(zone_output, zone_output_var, inner)
122+
self._write("\n")
97123

98124
def _process_node_tree(self, node_tree: GeometryNodeTree,
99125
level: int) -> None:
@@ -145,8 +171,11 @@ def _process_node_tree(self, node_tree: GeometryNodeTree,
145171
for node in node_tree.nodes:
146172
self._process_node(node, ntp_nt, inner, level)
147173

148-
self._process_sim_zones(ntp_nt.sim_inputs, inner)
149-
174+
if bpy.app.version >= (3, 6, 0):
175+
self._process_zones(ntp_nt.sim_inputs, inner)
176+
if bpy.app.version >= (4, 0, 0):
177+
self._process_zones(ntp_nt.repeat_inputs, inner)
178+
150179
#set look of nodes
151180
self._set_parents(node_tree, inner)
152181
self._set_locations(node_tree, inner)

ntp_operator.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,8 +1069,7 @@ def _report_finished(self, object: str):
10691069
location = "clipboard"
10701070
else:
10711071
location = self._dir
1072-
self.report({'INFO'},
1073-
f"NodeToPython: Saved {object} to {location}")
1072+
self.report({'INFO'}, f"NodeToPython: Saved {object} to {location}")
10741073

10751074
# ABSTRACT
10761075
def execute(self):

0 commit comments

Comments
 (0)