Преглед на файлове

cleanup: dedupe code when auto-generating nodes

Joseph Brandenburg преди 5 месеца
родител
ревизия
ea920075e5
променени са 2 файла, в които са добавени 42 реда и са изтрити 67 реда
  1. 18 18
      readtree.py
  2. 24 49
      schema_solve.py

+ 18 - 18
readtree.py

@@ -1,6 +1,5 @@
 from .utilities import prRed, prGreen, prPurple, prWhite, prOrange, \
                         wrapRed, wrapGreen, wrapPurple, wrapWhite, wrapOrange
-from .utilities import  gen_nc_input_for_data
 
     
 
@@ -96,6 +95,17 @@ def insert_lazy_parents(nc):
 
 from .base_definitions import replace_types, NodeSocket
 
+def autogen_node(base_tree, ui_socket, signature, mContext):
+    mantis_node=None
+    from .utilities import  gen_nc_input_for_data
+    nc_cls = gen_nc_input_for_data(ui_socket)
+    if (nc_cls):
+        mantis_node = nc_cls(signature, base_tree)
+        mantis_node.mContext = mContext
+        mantis_node.execution_prepared=True
+        mantis_node.outputs.init_sockets([ui_socket.name])
+    return mantis_node
+
 # TODO: investigate whether I can set the properties in the downstream nodes directly.
 #       I am doing this in Schema Solver and it seems to work quite efficiently.
 def make_connections_to_ng_dummy(base_tree, tree_path_names, local_nc, all_nc, nc_to):
@@ -106,25 +116,15 @@ def make_connections_to_ng_dummy(base_tree, tree_path_names, local_nc, all_nc, n
             continue # it isn't a real input so I don't think it is good to check it.
         to_s = inp.identifier
         if not inp.is_linked: # make an autogenerated NC for the inputs of the group node
-            if inp.bl_idname in ['xFormSocket']:
-                continue
-            from .node_container_common import get_socket_value
-            nc_cls = gen_nc_input_for_data(inp)
-            if (nc_cls):
-                sig = ("MANTIS_AUTOGENERATED", *tree_path_names, np.name, inp.name, inp.identifier)
-                nc_from = nc_cls(sig, base_tree)
-                nc_from.mContext = nc_to.mContext
-                # ugly! maybe even a HACK!
-                nc_from.inputs = {}
-                nc_from.outputs = {inp.name:NodeSocket(name = inp.name, node=nc_from)}
+            signature = ("MANTIS_AUTOGENERATED", *tree_path_names, np.name, inp.name, inp.identifier)
+            nc_from = autogen_node(base_tree, inp, signature, nc_to.mContext)
+            if nc_from:
+                from .node_container_common import get_socket_value
                 nc_from.parameters = {inp.name:get_socket_value(inp)}
-                # 
-                local_nc[sig] = nc_from; all_nc[sig] = nc_from
-                from_s = inp.name
-                nc_from.execution_prepared=True
+                local_nc[signature] = nc_from; all_nc[signature] = nc_from
+                nc_from.outputs[inp.name].connect(node=nc_to, socket=to_s, sort_id=0)
             else:
-                prRed("No available auto-generated class for input", *tree_path_names, np.name, inp.name)
-            nc_from.outputs[from_s].connect(node=nc_to, socket=to_s, sort_id=0)
+                prRed("No available auto-generated class for input", *tree_path_names, inp.name, np.name)
 
 def gen_node_containers(base_tree, current_tree, tree_path_names, all_nc, local_nc, dummy_nodes, group_nodes, schema_nodes ):
     from .internal_containers import DummyNode

+ 24 - 49
schema_solve.py

@@ -205,34 +205,19 @@ class SchemaSolver:
 
         if (not can_remove_socket_for_autogen(to_node, ui_link.to_socket.name)) or \
                                     to_node.node_type in ['DUMMY', 'DUMMY_SCHEMA']:
-            from .utilities import gen_nc_input_for_data
-            nc_cls = gen_nc_input_for_data(ui_link.from_socket)
-            if (nc_cls): #HACK
-                unique_name = "".join([
-                    ui_link.to_socket.node.name+self.index_str(),
-                    ui_link.from_socket.name,
-                    ui_link.from_socket.identifier,
-                    "==>",
-                    ui_link.to_socket.name,
-                    ui_link.to_socket.identifier,
-                    ])
-                sig = ("MANTIS_AUTOGENERATED", *self.tree_path_names[1:-1], unique_name)
-                nc_from = frame_mantis_nodes.get(sig)
-                if not nc_from:
-                    nc_from = nc_cls(sig, self.node.base_tree)
-                    nc_from.mContext = self.node.mContext
-                # ugly! maybe even a HACK!
-                nc_from.inputs = {}
-                from .base_definitions import NodeSocket
-                nc_from.outputs = {ui_link.from_socket.name:NodeSocket(name = ui_link.from_socket.name, node=nc_from)}
-                nc_from.parameters = {ui_link.from_socket.name:index}
-                frame_mantis_nodes[sig]=nc_from
-                nc_from.execution_prepared=True
-                from_node = nc_from
-                self.solved_nodes[sig]=from_node
-                _connection = from_node.outputs[ui_link.from_socket.name].connect(node=to_node, socket=ui_link.to_socket.identifier)
-            else:
-                raise RuntimeError()
+            from .readtree import autogen_node
+            unique_name = "".join([
+                ui_link.to_socket.node.name+self.index_str(),
+                ui_link.from_socket.name, ui_link.from_socket.identifier,
+                "==>", ui_link.to_socket.name, ui_link.to_socket.identifier,])
+            signature = ("MANTIS_AUTOGENERATED", *self.tree_path_names[1:-1], unique_name)
+            from_node = frame_mantis_nodes.get(signature)
+            if not from_node:
+                from_node = autogen_node(self.node.base_tree, ui_link.from_socket, 
+                                signature=signature, mContext=self.node.mContext)
+                from_node.parameters = {ui_link.from_socket.name:index}
+                frame_mantis_nodes[signature]=from_node; self.solved_nodes[signature]=from_node
+            _connection = from_node.outputs[ui_link.from_socket.name].connect(node=to_node, socket=ui_link.to_socket.identifier)
             return 
         # Since the index is already determined, it is safe to remove the socket and just keep the value.
         to_node.parameters[ui_link.to_socket.name] = index
@@ -438,27 +423,17 @@ class SchemaSolver:
                 from_node = self.schema_nodes[(*self.tree_path_names, from_ui_node.bl_idname)]
             to_node = outgoing.to_node
             from .schema_containers import SchemaIndex
-            if isinstance(from_node, SchemaIndex): # I think I need to dedup this stuff
-                # print("INDEX")
-                from .utilities import gen_nc_input_for_data
-                nc_cls = gen_nc_input_for_data(ui_link.from_socket)
-                if (nc_cls): #HACK
-                    sig = ("MANTIS_AUTOGENERATED", *self.tree_path_names[1:-1], self.index_str(), ui_link.from_socket.name, ui_link.from_socket.identifier)
-                    nc_from = nc_cls(sig, self.node.base_tree)
-                    nc_from.mContext = self.node.mContext
-                    nc_from.execution_prepared=True
-                    # ugly! maybe even a HACK!
-                    nc_from.inputs = {}
-                    from .node_container_common import NodeSocket
-                    nc_from.outputs = {ui_link.from_socket.name:NodeSocket(name = ui_link.from_socket.name, node=nc_from)}
-                    from .node_container_common import get_socket_value
-                    if ui_link.from_socket.name in ['Index']:
-                        nc_from.parameters = {ui_link.from_socket.name:index}
-                    else:
-                        nc_from.parameters = {ui_link.from_socket.name:self.solve_length}
-                    frame_mantis_nodes[sig]=nc_from
-                    from_node = nc_from
-                    self.solved_nodes[sig]=from_node
+            if isinstance(from_node, SchemaIndex):
+                signature = ("MANTIS_AUTOGENERATED", *self.tree_path_names[1:-1], self.index_str(),
+                             ui_link.from_socket.name, ui_link.from_socket.identifier)
+                from .readtree import autogen_node
+                from_node = autogen_node(self.node.base_tree, ui_link.from_socket,
+                                         signature, self.node.mContext)
+                if ui_link.from_socket.name in ['Index']:
+                    from_node.parameters = {ui_link.from_socket.name:index}
+                else:
+                    from_node.parameters = {ui_link.from_socket.name:self.solve_length}
+                frame_mantis_nodes[signature]=from_node; self.solved_nodes[signature]=from_node
             elif from_node.node_type == 'DUMMY_SCHEMA':
                 if isinstance( ui_link.from_socket, NodeSocket): # normal
                     from_socket_name = ui_link.from_socket.identifier