11from .auto_node import AutoNode
2- from NodeGraphQt .base .node import SubGraph
2+ from NodeGraphQt import SubGraph
3+ import json
34
45
56class SubGraphNode (AutoNode , SubGraph ):
@@ -86,6 +87,8 @@ def getData(self, port):
8687 return self .defaultValue
8788
8889 def run (self ):
90+ self .update_ports ()
91+
8992 for node in self .sub_graph_input_nodes :
9093 node ._parent = self
9194
@@ -110,6 +113,121 @@ def delete(self):
110113 def children (self ):
111114 return self ._children
112115
116+ def create_input_node (self , update = True ):
117+ pass
118+
119+ def create_output_node (self , update = True ):
120+ pass
121+
122+ def create_from_nodes (self , nodes ):
123+ if self in nodes :
124+ nodes .remove (self )
125+ [n .set_parent (self ) for n in nodes ]
126+
127+ self .set_property ('input count' , 0 )
128+ self .set_property ('output count' , 0 )
129+
130+ in_connect = []
131+ out_connect = []
132+ connected = []
133+
134+ for node in nodes :
135+ for port in node .input_ports ():
136+ for pipe in port .view .connected_pipes :
137+ if pipe .output_port .isVisible ():
138+ in_connect .append ((pipe .output_port , pipe .input_port ))
139+ for port in node .output_ports ():
140+ for pipe in port .view .connected_pipes :
141+ if pipe .input_port .isVisible ():
142+ out_connect .append ((pipe .output_port , pipe .input_port ))
143+ in_map = {}
144+ for idx , ports in enumerate (in_connect ):
145+ if ports [0 ] in in_map .keys ():
146+ in_map [ports [0 ]].append ([ports [1 ], in_map [ports [0 ]][0 ][1 ]])
147+ else :
148+ self .create_input_node ()
149+ if idx > 0 :
150+ in_map [ports [0 ]] = [[ports [1 ], len (self .input_ports ()) - 1 ]]
151+ else :
152+ in_map [ports [0 ]] = [[ports [1 ], 0 ]]
153+
154+ for port0 , data in in_map .items ():
155+ for port_data in data :
156+ idx = port_data [1 ]
157+ connected .append ((port0 , self .input_ports ()[idx ].view ))
158+ connected .append ((self .sub_graph_input_nodes [idx ].output_ports ()[0 ].view , port_data [0 ]))
159+
160+ out_map = {}
161+ for idx , ports in enumerate (out_connect ):
162+ if ports [0 ] in out_map .keys ():
163+ out_map [ports [0 ]].append ([ports [1 ], out_map [ports [0 ]][0 ][1 ]])
164+ else :
165+ self .create_output_node ()
166+ if idx > 0 :
167+ out_map [ports [0 ]] = [[ports [1 ], len (self .output_ports ()) - 1 ]]
168+ else :
169+ out_map [ports [0 ]] = [[ports [1 ], 0 ]]
170+
171+ for port0 , data in out_map .items ():
172+ for port_data in data :
173+ idx = port_data [1 ]
174+ connected .append ((port0 , self .sub_graph_output_nodes [idx ].input_ports ()[0 ].view ))
175+ connected .append ((self .output_ports ()[idx ].view , port_data [0 ]))
176+
177+ disconnected = in_connect + out_connect
178+
179+ if disconnected or connected :
180+ self .graph ._on_connection_changed (disconnected , connected )
181+
182+ if len (self .input_ports ()) == 0 :
183+ self .create_input_node ()
184+ if len (self .output_ports ()) == 0 :
185+ self .create_output_node ()
186+ self .set_property ('create_from_select' , False )
187+
188+ def update_ports (self ):
189+ input_count = self .get_property ('input count' )
190+ output_count = self .get_property ('output count' )
191+ current_input_count = len (self .input_ports ())
192+ current_output_count = len (self .output_ports ())
193+
194+ update = False
195+ if input_count != current_input_count :
196+ if input_count > current_input_count :
197+ for i in range (input_count - current_input_count ):
198+ self .add_input ('input' + str (len (self .input_ports ())))
199+ else :
200+ for i in range (current_input_count - input_count ):
201+ self .delete_input (current_input_count - i - 1 )
202+ update = True
203+
204+ if output_count != current_output_count :
205+ if output_count > current_output_count :
206+ for i in range (output_count - current_output_count ):
207+ self .add_output ('output' + str (len (self .output_ports ())))
208+ else :
209+ for i in range (current_output_count - output_count ):
210+ self .delete_output (current_output_count - i - 1 )
211+ update = True
212+
213+ if update :
214+ self .view .draw_node ()
215+
216+ def publish (self , file_path , node_name , node_identifier , node_class_name ):
217+ if file_path and node_name and node_identifier and node_class_name :
218+ serialized_data = self .graph ._serialize ([self ])
219+ data = {'node' : serialized_data ['nodes' ][self .id ]}
220+ data ['sub_graph' ] = data ['node' ].pop ('sub_graph' )
221+ data ['node' ]['__identifier__' ] = node_identifier
222+ data ['node' ]['name' ] = node_name
223+ data ['node' ]['class_name' ] = node_class_name .replace (" " , "_" )
224+ data ['node' ].pop ('type_' )
225+ file_path = file_path .strip ()
226+ with open (file_path , 'w' ) as file_out :
227+ json .dump (data , file_out , indent = 2 , separators = (',' , ':' ))
228+ return file_path
229+ return None
230+
113231
114232class SubGraphInputNode (AutoNode ):
115233 """
@@ -169,3 +287,19 @@ def getData(self, port=None):
169287
170288 for from_port in from_ports :
171289 return from_port .node ().getData (from_port )
290+
291+
292+ class RootNode (SubGraphNode ):
293+ __identifier__ = '__None'
294+
295+ # initial default node name.
296+ NODE_NAME = 'root'
297+
298+ def __init__ (self ):
299+ super (RootNode , self ).__init__ ()
300+ self .create_property ('root' , True )
301+ self .model .set_property ('id' , '0' * 13 )
302+
303+ def set_graph (self , graph ):
304+ super (RootNode , self ).set_graph (graph )
305+ graph .set_node_space (self )
0 commit comments