|  | @@ -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):
 | 
	
	
		
			
				|  | @@ -296,35 +297,38 @@ 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'))
 | 
	
		
			
				|  |  |      if InputNode is None: return # nothing to do here.
 | 
	
		
			
				|  |  | -    for output in InputNode.outputs:
 | 
	
		
			
				|  |  | +    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}",)
 |