11import 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
53from 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+
712from io import StringIO
813
914from ..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 )
0 commit comments