浏览代码

Fix: fail to import node groups because interface not set

Previously, I attempted to sort the node trees as I import them based on their depth. There were bugs because the way I was sorting them was not robust, thus I am opting to set up each node group 's interface before trying to process the import. This solves the problem of NodeGroup's with the wrong number of inputs.
Joseph Brandenburg 8 月之前
父节点
当前提交
55ea63696b
共有 1 个文件被更改,包括 26 次插入31 次删除
  1. 26 31
      i_o.py

+ 26 - 31
i_o.py

@@ -421,32 +421,25 @@ def do_import_from_file(filepath, context):
 
 def do_import(data, context):
     trees = []
-    
-    for tree_name, tree_data in data.items():
-        print ("Importing sub-graph: %s with %s nodes" % (wrapGreen(tree_name), wrapPurple(len(tree_data[2]))) )
-        # print (tree_data)
+    tree_sock_id_maps = {}
 
+    # First: init the interface of the node graph
+    for tree_name, tree_data in data.items():
         tree_info = tree_data[0]
         tree_in_out = tree_data[1]
-        nodes = tree_data[2]
-        links = tree_data[3]
-        
-        parent_me = []
 
-        # need to make a new tree:
-        #
-        # first, try to get it:
+        # need to make a new tree; first, try to get it:
         tree = bpy.data.node_groups.get(tree_info["name"])
         if tree is None:
             tree = bpy.data.node_groups.new(tree_info["name"], tree_info["bl_idname"])
         tree.nodes.clear(); tree.links.clear(); tree.interface.clear()
         # this may be a bad bad thing to do without some kind of warning TODO TODO
-
         tree.is_executing = True
         tree.do_live_update = False
         trees.append(tree)
-
-        tree_sock_id_map={}
+        
+        tree_sock_id_map = {}
+        tree_sock_id_maps[tree.name] = tree_sock_id_map
         
         interface_parent_me = {}
 
@@ -470,20 +463,31 @@ def do_import(data, context):
                                     tree.interface.items_tree.get(panel),
                                     index,
                                     )
-        for k,v in tree_sock_id_map.items():
-            prRed(k,v)
-        # at this point, the identifiers may not match
-        # so we have to map them back
+    # Now go and do nodes and links
+    for tree_name, tree_data in data.items():
+        print ("Importing sub-graph: %s with %s nodes" % (wrapGreen(tree_name), wrapPurple(len(tree_data[2]))) )
+
+        tree_info = tree_data[0]
+        nodes = tree_data[2]
+        links = tree_data[3]
+        
+        parent_me = []
+
+        tree = bpy.data.node_groups.get(tree_info["name"])
+
+        tree.is_executing = True
+        tree.do_live_update = False
+        trees.append(tree)
+
+        tree_sock_id_map=tree_sock_id_maps[tree.name]
+        
+        interface_parent_me = {}
         
 #        from mantis.utilities import prRed, prWhite, prOrange, prGreen
         for name, propslist in nodes.items():
             n = tree.nodes.new(propslist["bl_idname"])
             if propslist["bl_idname"] in ["DeformerMorphTargetDeform"]:
                 n.inputs.remove(n.inputs[1]) # get rid of the wildcard
-            # prPurple(n.bl_idname)
-
-            # if propslist["bl_idname"] in ["MantisNodeGroup"]:
-            #     n.node_tree = bpy.data.node_groups[propslist["node_tree"]]
 
             if n.bl_idname in [ "SchemaArrayInput",
                                 "SchemaArrayInputGet",
@@ -495,13 +499,10 @@ def do_import(data, context):
                 n.update()
 
             
-            in_group_node = False
             if sub_tree := propslist.get("node_tree"):
-                in_group_node = True
                 n.node_tree = bpy.data.node_groups.get(sub_tree)
                 from .base_definitions import node_group_update
                 node_group_update(n, force = True)
-            #
 
             for i, (s_id, s_val) in enumerate(propslist["sockets"].items()):
                 try:
@@ -509,13 +510,8 @@ def do_import(data, context):
                         # try:
                         if n.bl_idname == "MantisSchemaGroup":
                             socket = n.outputs.new(s_val["bl_idname"], s_val["name"], identifier=s_id)
-                        elif n.bl_idname in ["NodeGroupInput"]:
-                            pass
                         else:
                             socket = n.outputs[int(s_val["index"])]
-                        # except Exception as e:
-                        #     prRed(n.name, s_id)
-                        #     raise e
                     else:
                         if s_val["index"] >= len(n.inputs):
                             if n.bl_idname == "UtilityDriver":
@@ -561,7 +557,6 @@ def do_import(data, context):
 #                       prRed("Not Found: %s" % (s_id))
 #                       prOrange(propslist["sockets"][s_id])
 #                       socket = fix_custom_parameter(n, propslist["sockets"][s_id]
-                
                 for s_p, s_v in s_val.items():
                     if s_p not in ["default_value"]:
                         if s_p == "search_prop" and n.bl_idname == 'UtilityMetaRig':