Skip to content

Commit 59ee2a9

Browse files
committed
optimilize
1 parent fa4742c commit 59ee2a9

File tree

7 files changed

+149
-135
lines changed

7 files changed

+149
-135
lines changed

NodeGraphQt/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ def __init__(self):
8383

8484
from .base.graph import NodeGraph
8585
from .base.menu import NodesMenu, NodeGraphMenu, NodeGraphCommand
86-
from .base.node import NodeObject, BaseNode, BackdropNode
86+
from .base.node import NodeObject, BaseNode, BackdropNode, SubGraph
8787
from .base.port import Port
8888
from .pkg_info import __version__ as VERSION
8989
from .pkg_info import __license__ as LICENSE
@@ -112,6 +112,7 @@ def __init__(self):
112112
'VERSION',
113113
'constants',
114114
'setup_context_menu',
115-
'NodePublishWidget'
115+
'NodePublishWidget',
116+
'SubGraph',
116117
]
117118

NodeGraphQt/widgets/properties.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ def _init(self):
9696
QtWidgets.QSizePolicy.Preferred)
9797
self._spnbox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
9898
layout = QtWidgets.QHBoxLayout(self)
99+
layout.setContentsMargins(0, 0, 0, 0)
99100
layout.addWidget(self._spnbox)
100101
layout.addWidget(self._slider)
101102
self._spnbox.valueChanged.connect(self._on_spnbox_changed)
@@ -282,6 +283,7 @@ def __init__(self, parent=None):
282283
_button.setIcon(icon)
283284

284285
hbox = QtWidgets.QHBoxLayout()
286+
hbox.setContentsMargins(0, 0, 0, 0)
285287
hbox.addWidget(self._ledit)
286288
hbox.addWidget(_button)
287289
self.setLayout(hbox)
@@ -503,6 +505,7 @@ def __init__(self, parent=None):
503505
self._slider.valueChanged.connect(self._on_slider_changed)
504506

505507
hbox = QtWidgets.QHBoxLayout()
508+
hbox.setContentsMargins(0, 0, 0, 0)
506509
hbox.addWidget(self._edit)
507510
hbox.addWidget(self._slider)
508511
self.setLayout(hbox)
@@ -583,6 +586,7 @@ class PropVector(BaseProperty):
583586
def __init__(self, parent=None, dim=3):
584587
super(PropVector, self).__init__(parent)
585588
hbox = QtWidgets.QHBoxLayout()
589+
hbox.setContentsMargins(0, 0, 0, 0)
586590
self._value = []
587591
self._items = []
588592

example_auto_nodes.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
import sys
1010
import inspect
1111
import importlib
12-
from example_auto_nodes import AutoNode, ModuleNode, SubGraphNode, Publish
12+
from example_auto_nodes import AutoNode, ModuleNode, \
13+
SubGraphNode, Publish, RootNode
1314

1415

1516
def get_nodes_from_folder(folder_path):
@@ -131,7 +132,7 @@ def show_nodes_list(node):
131132
node_menu.add_command('Find Node By Path', find_node_by_path, node_class=AutoNode)
132133

133134
# create root node
134-
graph.create_node('Utility.RootGraph', name='root', selected=False)
135+
graph.add_node(RootNode())
135136

136137
# create test nodes
137138
graph.load_session(r'example_auto_nodes/networks/example_SubGraph.json')

example_auto_nodes/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
from .node_base.auto_node import AutoNode
22
from .node_base.module_node import ModuleNode
3-
from .node_base.subgraph_node import SubGraphNode
3+
from .node_base.subgraph_node import SubGraphNode, RootNode
44
from .subgraph_nodes import Publish

example_auto_nodes/node_base/auto_node.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
from NodeGraphQt.base.node import BaseNode, SubGraph
2-
from NodeGraphQt.base.port import Port
1+
from NodeGraphQt import BaseNode, SubGraph, Port, QtCore
32
from NodeGraphQt.constants import NODE_PROP
4-
from NodeGraphQt import QtCore
53
import traceback
64
import hashlib
75
import copy

example_auto_nodes/node_base/subgraph_node.py

Lines changed: 135 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from .auto_node import AutoNode
2-
from NodeGraphQt.base.node import SubGraph
2+
from NodeGraphQt import SubGraph
3+
import json
34

45

56
class 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

114232
class 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)

example_auto_nodes/subgraph_nodes.py

Lines changed: 2 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -35,136 +35,12 @@ def create_output_node(self, update=True):
3535
self.update_port()
3636
return output_node
3737

38-
def create_from_nodes(self, nodes):
39-
if self in nodes:
40-
nodes.remove(self)
41-
[n.set_parent(self) for n in nodes]
42-
43-
self.set_property('input count', 0)
44-
self.set_property('output count', 0)
45-
46-
in_connect = []
47-
out_connect = []
48-
connected = []
49-
50-
for node in nodes:
51-
for port in node.input_ports():
52-
for pipe in port.view.connected_pipes:
53-
if pipe.output_port.isVisible():
54-
in_connect.append((pipe.output_port, pipe.input_port))
55-
for port in node.output_ports():
56-
for pipe in port.view.connected_pipes:
57-
if pipe.input_port.isVisible():
58-
out_connect.append((pipe.output_port, pipe.input_port))
59-
in_map = {}
60-
for idx, ports in enumerate(in_connect):
61-
if ports[0] in in_map.keys():
62-
in_map[ports[0]].append([ports[1], in_map[ports[0]][0][1]])
63-
else:
64-
self.create_input_node()
65-
if idx > 0:
66-
in_map[ports[0]] = [[ports[1], len(self.input_ports()) - 1]]
67-
else:
68-
in_map[ports[0]] = [[ports[1], 0]]
69-
70-
for port0, data in in_map.items():
71-
for port_data in data:
72-
idx = port_data[1]
73-
connected.append((port0, self.input_ports()[idx].view))
74-
connected.append((self.sub_graph_input_nodes[idx].output_ports()[0].view, port_data[0]))
75-
76-
out_map = {}
77-
for idx, ports in enumerate(out_connect):
78-
if ports[0] in out_map.keys():
79-
out_map[ports[0]].append([ports[1], out_map[ports[0]][0][1]])
80-
else:
81-
self.create_output_node()
82-
if idx > 0:
83-
out_map[ports[0]] = [[ports[1], len(self.output_ports()) - 1]]
84-
else:
85-
out_map[ports[0]] = [[ports[1], 0]]
86-
87-
for port0, data in out_map.items():
88-
for port_data in data:
89-
idx = port_data[1]
90-
connected.append((port0, self.sub_graph_output_nodes[idx].input_ports()[0].view))
91-
connected.append((self.output_ports()[idx].view, port_data[0]))
92-
93-
disconnected = in_connect + out_connect
94-
95-
if disconnected or connected:
96-
self.graph._on_connection_changed(disconnected, connected)
97-
98-
if len(self.input_ports()) == 0:
99-
self.create_input_node()
100-
if len(self.output_ports()) == 0:
101-
self.create_output_node()
102-
self.set_property('create_from_select', False)
103-
104-
def update_ports(self):
105-
input_count = self.get_property('input count')
106-
output_count = self.get_property('output count')
107-
current_input_count = len(self.input_ports())
108-
current_output_count = len(self.output_ports())
109-
110-
update = False
111-
if input_count != current_input_count:
112-
if input_count > current_input_count:
113-
for i in range(input_count - current_input_count):
114-
self.add_input('input' + str(len(self.input_ports())))
115-
else:
116-
for i in range(current_input_count - input_count):
117-
self.delete_input(current_input_count - i - 1)
118-
update = True
119-
120-
if output_count != current_output_count:
121-
if output_count > current_output_count:
122-
for i in range(output_count - current_output_count):
123-
self.add_output('output' + str(len(self.output_ports())))
124-
else:
125-
for i in range(current_output_count - output_count):
126-
self.delete_output(current_output_count - i - 1)
127-
update = True
128-
129-
if update:
130-
self.view.draw_node()
131-
132-
def run(self):
133-
self.update_ports()
134-
super(SubGraph, self).run()
135-
13638
def publish(self, file_path, node_name, node_identifier, node_class_name):
137-
if file_path and node_name and node_identifier and node_class_name:
138-
serialized_data = self.graph._serialize([self])
139-
data = {'node': serialized_data['nodes'][self.id]}
140-
data['sub_graph'] = data['node'].pop('sub_graph')
141-
data['node']['__identifier__'] = node_identifier
142-
data['node']['name'] = node_name
143-
data['node']['class_name'] = node_class_name.replace(" ", "_")
144-
data['node'].pop('type_')
145-
file_path = file_path.strip()
146-
with open(file_path, 'w') as file_out:
147-
json.dump(data, file_out, indent=2, separators=(',', ':'))
148-
39+
file_path = super(SubGraph, self).publish(file_path, node_name, node_identifier, node_class_name)
40+
if file_path:
14941
self.graph.register_node(Publish.create_node_class(file_path))
15042

15143

152-
class RootGraph(SubGraphNode):
153-
__identifier__ = 'Utility'
154-
155-
# initial default node name.
156-
NODE_NAME = 'RootGraph'
157-
158-
def __init__(self):
159-
super(RootGraph, self).__init__()
160-
self.create_property('root', True)
161-
self.model.set_property('id', '0' * 13)
162-
163-
def set_graph(self, graph):
164-
super(RootGraph, self).set_graph(graph)
165-
graph.set_node_space(self)
166-
167-
16844
class SubGraphInput(SubGraphInputNode):
16945
__identifier__ = 'Utility'
17046

0 commit comments

Comments
 (0)