2 Commits 244aab3f34 ... f6989ae85d

Tác giả SHA1 Thông báo Ngày
  Joseph Brandenburg f6989ae85d Fix: make default values work with more socket types 3 tuần trước cách đây
  Joseph Brandenburg 36fee533bb Fix: interface panel doesn't have an identifier 3 tuần trước cách đây
1 tập tin đã thay đổi với 30 bổ sung24 xóa
  1. 30 24
      readtree.py

+ 30 - 24
readtree.py

@@ -45,7 +45,8 @@ def reroute_links_grpout(nc, all_nc):
     if (nc_to := all_nc.get( ( *nc.signature[:-1],) )):
         grp_node_reroute_common(nc, nc_to, all_nc)
     else:
-        raise RuntimeError("error leaving a node group (maybe you are running the tree from inside a node group?)")
+        prOrange(f"WARN: unconnected outputs from a node group "
+                 "(maybe you are running the tree from inside a node group?)")
 
 # FIXME I don't think these signatures are unique.
 def insert_lazy_parents(nc):
@@ -295,34 +296,39 @@ def get_schema_length_dependencies(node, all_nodes={}):
 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:
+    if InputNode is None: return # nothing to do here.
+    ui_node = InputNode.prototype
+
+    for i, output in enumerate(InputNode.outputs):
+        ui_output = ui_node.outputs[i] # I need this for the error messages to make sense
+        assert ui_output.identifier == output.name, "Cannot find UI Socket for Default Value"
         for interface_item in base_tree.interface.items_tree:
+            if interface_item.item_type == 'PANEL': continue
             if interface_item.identifier == output.name: break
         else:
-            raise RuntimeError(f"Default value {output.name} does not exist in {base_tree.name} ")
+            raise RuntimeError(f"Default value {ui_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} ")
+            raise RuntimeError(f"Cannot get default value for {ui_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} ")
+        from bpy.types import bpy_prop_array
+        from mathutils import Vector
+        val_type = None
+        if hasattr(ui_output, 'default_value'):
+            val_type = type(ui_output.default_value) # why tf can't I match/case here?
+        if val_type is bool: default_value = interface_item.default_bool
+        elif val_type is int: default_value = interface_item.default_int
+        elif val_type is float: default_value = interface_item.default_float
+        elif val_type is Vector: default_value = interface_item.default_vector
+        elif val_type is str: default_value = interface_item.default_string
+        elif val_type is bpy_prop_array: default_value = interface_item.default_bool_vector
+        elif interface_item.bl_socket_idname == "xFormSocket":
+            if interface_item.default_xForm == 'ARMATURE':
+                default_value = 'MANTIS_DEFAULT_ARMATURE'
+            else:
+                raise RuntimeError(f"No xForm connected for {ui_output.name} in {base_tree.name}.")
+        
+        else:
+            raise RuntimeError(f"Cannot get default value for {ui_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}",)