瀏覽代碼

New Feature: Default Values for base tree

Joseph Brandenburg 3 周之前
父節點
當前提交
244aab3f34
共有 1 個文件被更改,包括 60 次插入3 次删除
  1. 60 3
      readtree.py

+ 60 - 3
readtree.py

@@ -97,9 +97,6 @@ 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):
     from .internal_containers import AutoGenNode
     mantis_node = AutoGenNode(signature, base_tree)
     mantis_node.mContext = mContext
@@ -193,6 +190,9 @@ def data_from_tree(base_tree, tree_path, dummy_nodes, all_nc, all_schema):#
         from .utilities import link_node_containers
         for link in links:
             link_node_containers((None, *tree_path_names), link, local_nc)
+        if current_tree == base_tree:
+            # in the base tree, we need to auto-gen the default values in a slightly different way to node groups.
+            insert_default_values_base_tree(base_tree, all_nc)
         # Now, descend into the Node Groups and recurse
         for nc in group_nodes:
             data_from_tree(base_tree, tree_path+[nc.prototype], dummy_nodes, all_nc, all_schema)
@@ -292,6 +292,63 @@ def get_schema_length_dependencies(node, all_nodes={}):
                     trees.append((sub_node.prototype.node_tree, sub_node.signature))
     return list(filter(deps_filter, deps))
 
+def insert_default_values_base_tree(base_tree, all_mantis_nodes):
+    # we can get this by name because group inputs are gathered to the bl_idname
+    InputNode = all_mantis_nodes.get((None, 'NodeGroupInput'))
+    for output in InputNode.outputs:
+        for interface_item in base_tree.interface.items_tree:
+            if interface_item.identifier == output.name: break
+        else:
+            raise RuntimeError(f"Default value {output.name} does not exist in {base_tree.name} ")
+        if interface_item.item_type == "PANEL":
+            raise RuntimeError(f"Cannot get default value for {output.name} in {base_tree.name} ")
+        default_value = None
+        match interface_item.bl_socket_idname:
+            case "BooleanSocket":
+                default_value = interface_item.default_bool
+            case "IntSocket":
+                default_value = interface_item.default_int
+            case "FloatSocket":
+                default_value = interface_item.default_float
+            case "BooleanThreeTupleSocket":
+                default_value = interface_item.default_bool_vector
+            case "VectorSocket":
+                default_value = interface_item.default_float
+            case "StringSocket":
+                default_value = interface_item.default_string
+            case "xFormSocket":
+                if interface_item.default_xForm == 'ARMATURE':
+                    default_value = 'MANTIS_DEFAULT_ARMATURE'
+                else:
+                    raise RuntimeError(f"No xForm connected for {output.name} in {base_tree.name}.")
+            case _:
+                raise RuntimeError(f"Cannot get default value for {output.name} in {base_tree.name} ")
+        output_name = output.name
+        if interface_item.bl_socket_idname not in ['xFormSocket']:
+            signature = ("MANTIS_AUTOGENERATED", f"Default Value {output.name}",)
+            autogen_mantis_node = all_mantis_nodes.get(signature)
+            if autogen_mantis_node is None: 
+                autogen_mantis_node = autogen_node(base_tree, output, signature, InputNode.mContext)
+                autogen_mantis_node.parameters[output_name]=default_value
+        elif interface_item.bl_socket_idname == 'xFormSocket' \
+                                        and default_value == 'MANTIS_DEFAULT_ARMATURE':
+            signature = ("MANTIS_AUTOGENERATED", "MANTIS_DEFAULT_ARMATURE",)
+            autogen_mantis_node = all_mantis_nodes.get(signature)
+            if autogen_mantis_node is None: 
+                from .xForm_nodes import xFormArmature
+                autogen_mantis_node = xFormArmature(signature, base_tree)
+                autogen_mantis_node.parameters['Name']=base_tree.name+'_MANTIS_AUTOGEN'
+                autogen_mantis_node.mContext =  InputNode.mContext
+                from mathutils import Matrix
+                autogen_mantis_node.parameters['Matrix'] = Matrix.Identity(4)
+            output_name = 'xForm Out'
+        while output.links:
+            l = output.links.pop()
+            to_node = l.to_node; to_socket = l.to_socket
+            l.die()
+            autogen_mantis_node.outputs[output_name].connect(to_node, to_socket)
+            init_connections(l.from_node); init_dependencies(l.from_node)
+        all_mantis_nodes[autogen_mantis_node.signature]=autogen_mantis_node
 
 def parse_tree(base_tree, error_popups=False):
     from uuid import uuid4