Skip to content

Commit a7af729

Browse files
committed
Add set_dynamic_port method to BaseNode && Optimilize AutoNode and SubGraph
1 parent beeee12 commit a7af729

File tree

14 files changed

+110
-99
lines changed

14 files changed

+110
-99
lines changed

NodeGraphQt/base/node.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1104,6 +1104,16 @@ def set_editable(self, state):
11041104
[wid.setEnabled(state) for wid in self.view._widgets.values()]
11051105
self.view.text_item.setEnabled(state)
11061106

1107+
def set_dynamic_port(self, state):
1108+
"""
1109+
Set whether the node will delete/add port after node has been created.
1110+
1111+
Args:
1112+
state(bool): If True, all port data will be serialized with the node,
1113+
when the node is been deserialized, all ports will restore.
1114+
"""
1115+
self.model.dynamic_port = state
1116+
11071117

11081118
class BackdropNode(NodeObject):
11091119
"""

example_auto_nodes.py

Lines changed: 10 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
#!/usr/bin/python
22
# -*- coding: utf-8 -*-
3-
import example_auto_nodes
4-
from NodeGraphQt import NodeGraph, setup_context_menu
5-
from NodeGraphQt import QtWidgets, QtCore, PropertiesBinWidget, \
6-
NodeTreeWidget, BackdropNode, NodePublishWidget
7-
import os
8-
import sys
9-
import inspect
3+
from NodeGraphQt import NodeGraph, setup_context_menu, \
4+
QtWidgets, QtCore, PropertiesBinWidget, BackdropNode
5+
from example_auto_nodes import Publish, RootNode, update_nodes, setup_node_menu
106
import importlib
11-
from example_auto_nodes import AutoNode, ModuleNode, \
12-
SubGraphNode, Publish, RootNode, update_nodes
7+
import inspect
8+
import sys
9+
import os
1310

1411

1512
def get_nodes_from_folder(folder_path):
@@ -49,58 +46,16 @@ def get_published_nodes_from_folder(folder_path):
4946
return nodes
5047

5148

52-
def cook_node(graph, node):
53-
node.update_stream(forceCook=True)
54-
55-
56-
def print_functions(graph, node):
57-
for func in node.module_functions:
58-
print(func)
59-
60-
61-
def toggle_auto_cook(graph, node):
62-
node.auto_cook = not node.auto_cook
63-
64-
65-
def enter_node(graph, node):
66-
graph.set_node_space(node)
67-
68-
69-
def allow_edit(graph, node):
70-
node.set_property('published', False)
71-
72-
73-
def print_path(graph, node):
74-
print(node.path())
75-
76-
77-
def find_node_by_path(graph, node):
78-
print(graph.get_node_by_path(node.path()))
79-
80-
81-
def print_children(graph, node):
82-
children = node.children()
83-
print(len(children), children)
84-
85-
86-
def publish_node(graph, node):
87-
wid = NodePublishWidget(node=node)
88-
wid.show()
89-
90-
91-
def cook_nodes(nodes):
92-
update_nodes(nodes)
93-
94-
9549
if __name__ == '__main__':
96-
app = QtWidgets.QApplication([])
50+
app = QtWidgets.QApplication()
9751

9852
# create node graph.
9953
graph = NodeGraph()
10054
graph.use_OpenGL()
10155

10256
# set up default menu and commands.
10357
setup_context_menu(graph)
58+
setup_node_menu(graph, Publish)
10459

10560
# show the properties bin when a node is "double clicked" in the graph.
10661
properties_bin = PropertiesBinWidget(node_graph=graph)
@@ -111,40 +66,20 @@ def show_prop_bin(node):
11166
properties_bin.show()
11267
graph.node_double_clicked.connect(show_prop_bin)
11368

114-
# show the nodes list when a node is "double clicked" in the graph.
115-
node_tree = NodeTreeWidget(node_graph=graph)
116-
117-
def show_nodes_list(node):
118-
if not node_tree.isVisible():
119-
node_tree.update()
120-
node_tree.show()
121-
graph.node_double_clicked.connect(show_nodes_list)
122-
12369
# register nodes
12470
reg_nodes = get_nodes_from_folder(os.getcwd() + "/example_auto_nodes")
12571
BackdropNode.__identifier__ = 'Utility::Backdrop'
12672
reg_nodes.append(BackdropNode)
12773
reg_nodes.extend(get_published_nodes_from_folder(os.getcwd() + "/example_auto_nodes/published_nodes"))
12874
[graph.register_node(n) for n in reg_nodes]
12975

130-
# setup node menu
131-
node_menu = graph.context_nodes_menu()
132-
node_menu.add_command('Allow Edit', allow_edit, node_class=Publish)
133-
node_menu.add_command('Enter Node', enter_node, node_class=SubGraphNode)
134-
node_menu.add_command('Publish Node', publish_node, node_class=SubGraphNode)
135-
node_menu.add_command('Print Children', print_children, node_class=SubGraphNode)
136-
node_menu.add_command('Print Functions', print_functions, node_class=ModuleNode)
137-
node_menu.add_command('Cook Node', cook_node, node_class=AutoNode)
138-
node_menu.add_command('Toggle Auto Cook', toggle_auto_cook, node_class=AutoNode)
139-
node_menu.add_command('Print Path', print_path, node_class=AutoNode)
140-
node_menu.add_command('Find Node By Path', find_node_by_path, node_class=AutoNode)
141-
14276
# create root node
77+
# if we want to use sub graph system, root node is must.
14378
graph.add_node(RootNode())
14479

14580
# create test nodes
14681
graph.load_session(r'example_auto_nodes/networks/example_SubGraph.json')
147-
cook_nodes(graph.root_node().children())
82+
update_nodes(graph.root_node().children())
14883

14984
# widget used for the node graph.
15085
graph_widget = graph.widget

example_auto_nodes/__init__.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from .node_base.auto_node import AutoNode
2-
from .node_base.module_node import ModuleNode
3-
from .node_base.subgraph_node import SubGraphNode, RootNode
1+
from .node_base import AutoNode, ModuleNode, SubGraphNode, RootNode
42
from .subgraph_nodes import Publish
5-
from .node_base.utils import update_node_down_stream, update_nodes
3+
from .node_base.utils import update_node_down_stream, update_nodes, setup_node_menu

example_auto_nodes/basic_nodes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from .node_base.auto_node import AutoNode
1+
from .node_base import AutoNode
22

33

44
class FooNode(AutoNode):

example_auto_nodes/data_node.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/usr/bin/python
22
# -*- coding: utf-8 -*-
3-
from .node_base.auto_node import AutoNode
3+
from .node_base import AutoNode
44

55

66
class VectorSplit(AutoNode):

example_auto_nodes/input_nodes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
NODE_PROP_VECTOR3,
44
NODE_PROP_VECTOR4)
55

6-
from .node_base.auto_node import AutoNode
6+
from .node_base import AutoNode
77
import os
88

99

example_auto_nodes/logic_nodes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from .basic_nodes import AutoNode
1+
from .node_base import AutoNode
22

33

44
class IfNode(AutoNode):

example_auto_nodes/module_nodes.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
from .node_base.module_node import (ModuleNode,
2-
get_functions_from_module,
3-
get_functions_from_type)
1+
from .node_base import (ModuleNode,
2+
get_functions_from_module,
3+
get_functions_from_type)
44

55
import os
66
import sys
@@ -156,7 +156,6 @@ class StringFunctionsNode(ModuleNode):
156156

157157
module_functions = get_functions_from_type(_str)
158158

159-
160159
def __init__(self):
161160
super(StringFunctionsNode, self).__init__()
162161

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from .auto_node import AutoNode
2+
from .module_node import ModuleNode, get_functions_from_module, get_functions_from_type
3+
from .subgraph_node import SubGraphNode, SubGraphInputNode, SubGraphOutputNode, RootNode

example_auto_nodes/node_base/subgraph_node.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from .auto_node import AutoNode
2+
from .utils import update_node_down_stream
23
from NodeGraphQt import SubGraph
34
import json
45
from NodeGraphQt import topological_sort_by_down, BackdropNode
@@ -18,11 +19,11 @@ def __init__(self, defaultInputType=None, defaultOutputType=None, dynamic_port=T
1819
self.create_property('graph_rect', None)
1920
self.create_property('published', False)
2021
if dynamic_port:
21-
self.model.dynamic_port = True
22+
self.set_dynamic_port(True)
2223
self.add_int_input('input count', 'input count', 0)
2324
self.add_int_input('output count', 'output count', 0)
2425
else:
25-
self.model.dynamic_port = False
26+
self.set_dynamic_port(False)
2627
self.create_property('input count', 0)
2728
self.create_property('output count', 0)
2829
self._marked_ports = []
@@ -413,6 +414,22 @@ def get_data(self, port=None):
413414
for from_port in from_ports:
414415
return from_port.node().get_data(from_port)
415416

417+
def run(self):
418+
parent = self.parent()
419+
if parent is None or not parent.auto_cook:
420+
return
421+
422+
port = parent.get_output(self.get_property('output index'))
423+
if not port:
424+
return
425+
426+
to_ports = port.connected_ports()
427+
if not to_ports:
428+
return
429+
430+
nodes = [p.node() for p in to_ports]
431+
update_node_down_stream(nodes)
432+
416433

417434
class RootNode(SubGraphNode):
418435
"""
@@ -439,7 +456,6 @@ def cook(self):
439456
def run(self):
440457
pass
441458

442-
def error(self, message=None):
443-
if message is None:
444-
return False
445-
self._error = False
459+
@property
460+
def has_error(self):
461+
return False

0 commit comments

Comments
 (0)