@@ -52,31 +52,25 @@ def _create_scene(self, indent: str):
5252 self ._write (f"{ indent } { SCENE_VAR } .use_fake_user = True\n " )
5353 self ._write (f"{ indent } bpy.context.window.scene = { SCENE_VAR } \n " )
5454
55- def _initialize_compositor_node_tree (self , outer , nt_var , level , inner , nt_name ):
56- #initialize node group
57- self ._write (f"{ outer } #initialize { nt_var } node group\n " )
58- self ._write (f"{ outer } def { nt_var } _node_group():\n " )
59-
60- if self ._is_outermost_node_group (level ): #outermost node group
61- self ._write (f"{ inner } { nt_var } = { SCENE_VAR } .node_tree\n " )
55+ def _initialize_compositor_node_tree (self , outer , ntp_nt , nt_name ):
56+ #initialize node group
57+ self ._write (f"{ outer } #initialize { nt_name } node group\n " )
58+ self ._write (f"{ outer } def { ntp_nt .var } _node_group():\n " )
59+
60+ inner = f"{ outer } \t "
61+ if ntp_nt .node_tree == self ._base_node_tree :
62+ self ._write (f"{ inner } { ntp_nt .var } = { SCENE_VAR } .node_tree\n " )
6263 self ._write (f"{ inner } #start with a clean node tree\n " )
63- self ._write (f"{ inner } for node in { nt_var } .nodes:\n " )
64- self ._write (f"{ inner } \t { nt_var } .nodes.remove(node)\n " )
64+ self ._write (f"{ inner } for node in { ntp_nt . var } .nodes:\n " )
65+ self ._write (f"{ inner } \t { ntp_nt . var } .nodes.remove(node)\n " )
6566 else :
66- self ._write ((f"{ inner } { nt_var } "
67+ self ._write ((f"{ inner } { ntp_nt . var } "
6768 f"= bpy.data.node_groups.new("
6869 f"type = \' CompositorNodeTree\' , "
6970 f"name = { str_to_py_str (nt_name )} )\n " ))
7071 self ._write ("\n " )
7172
72- def _process_node (self , node : Node , ntp_nt : NTP_NodeTree , inner : str , level : int ):
73- if node .bl_idname == 'CompositorNodeGroup' :
74- node_nt = node .node_tree
75- if node_nt is not None and node_nt not in self ._node_trees :
76- self ._process_comp_node_group (node_nt , level + 1 , self ._node_vars ,
77- self ._used_vars )
78- self ._node_trees .add (node_nt )
79-
73+ def _process_node (self , node : Node , ntp_nt : NTP_NodeTree , inner : str ):
8074 node_var : str = self ._create_node (node , inner , ntp_nt .var )
8175
8276 if node .bl_idname == 'CompositorNodeColorBalance' :
@@ -98,17 +92,14 @@ def _process_node(self, node: Node, ntp_nt: NTP_NodeTree, inner: str, level: int
9892 self ._hide_hidden_sockets (node , inner , node_var )
9993
10094 if node .bl_idname == 'CompositorNodeGroup' :
101- if node .node_tree is not None :
102- self ._write ((f"{ inner } { node_var } .node_tree = "
103- f"bpy.data.node_groups"
104- f"[\" { node .node_tree .name } \" ]\n " ))
105- elif node .bl_idname == 'NodeGroupInput' and not inputs_set :
95+ self ._process_group_node_tree (node , node_var , inner )
96+ elif node .bl_idname == 'NodeGroupInput' and not ntp_nt .inputs_set :
10697 self ._group_io_settings (node , inner , "input" , ntp_nt )
107- inputs_set = True
98+ ntp_nt . inputs_set = True
10899
109- elif node .bl_idname == 'NodeGroupOutput' and not outputs_set :
100+ elif node .bl_idname == 'NodeGroupOutput' and not ntp_nt . outputs_set :
110101 self ._group_io_settings (node , inner , "output" , ntp_nt )
111- outputs_set = True
102+ ntp_nt . outputs_set = True
112103
113104 self ._set_socket_defaults (node , node_var , inner )
114105
@@ -121,7 +112,7 @@ def _process_node_tree(self, node_tree, level):
121112 level (int): number of tabs to use for each line
122113
123114 """
124- if self ._is_outermost_node_group ( level ) :
115+ if node_tree == self ._base_node_tree :
125116 nt_var = self ._create_var (self .compositor_name )
126117 nt_name = self .compositor_name
127118 else :
@@ -130,32 +121,34 @@ def _process_node_tree(self, node_tree, level):
130121
131122 outer , inner = make_indents (level )
132123
133- self ._initialize_compositor_node_tree (outer , nt_var , level , inner , nt_name )
134-
135124 ntp_nt = NTP_NodeTree (node_tree , nt_var )
125+ self ._initialize_compositor_node_tree (outer , ntp_nt , nt_name )
136126
137127 #initialize nodes
138128 self ._write (f"{ inner } #initialize { nt_var } nodes\n " )
139129
140130 for node in node_tree .nodes :
141- self ._process_node (node , ntp_nt , inner , level )
131+ self ._process_node (node , ntp_nt , inner )
142132
143133 self ._set_parents (node_tree , inner )
144134 self ._set_locations (node_tree , inner )
145135 self ._set_dimensions (node_tree , inner )
146136
147137 self ._init_links (node_tree , inner , nt_var )
148138
149- self ._write (f"\n { outer } { nt_var } _node_group()\n \n " )
139+ self ._write (f"{ inner } return { nt_var } \n " )
140+
141+ self ._write (f"\n { outer } { nt_var } = { nt_var } _node_group()\n \n " )
142+ self ._node_trees [node_tree ] = nt_var
150143
151144 def execute (self , context ):
152145 #find node group to replicate
153146 if self .is_scene :
154- nt = bpy .data .scenes [self .compositor_name ].node_tree
147+ self . _base_node_tree = bpy .data .scenes [self .compositor_name ].node_tree
155148 else :
156- nt = bpy .data .node_groups [self .compositor_name ]
149+ self . _base_node_tree = bpy .data .node_groups [self .compositor_name ]
157150
158- if nt is None :
151+ if self . _base_node_tree is None :
159152 #shouldn't happen
160153 self .report ({'ERROR' },("NodeToPython: This doesn't seem to be a "
161154 "valid compositor node tree. Is Use Nodes "
@@ -187,8 +180,12 @@ def execute(self, context):
187180 if self .mode == 'ADDON' :
188181 level = 2
189182 else :
190- level = 0
191- self ._process_node_tree (nt , level )
183+ level = 0
184+
185+ node_trees_to_process = self ._topological_sort (self ._base_node_tree )
186+
187+ for node_tree in node_trees_to_process :
188+ self ._process_node_tree (node_tree , level )
192189
193190 if self .mode == 'ADDON' :
194191 self ._write ("\t \t return {'FINISHED'}\n \n " )
0 commit comments