Explorar el Código

fix: Versioning fails because of invalid socket

not sure why the socket was invalid, that sounds BAD, but anyhow
the new relink code removes such sockets from the socket map
and now versioning does each node in a try/except block for extra safety

eventually I need to override the versioning system with something
a lot more bulletproof since it is starting to show its weaknesses
Joseph Brandenburg hace 3 meses
padre
commit
0eaf761c19
Se han modificado 3 ficheros con 80 adiciones y 63 borrados
  1. 69 61
      __init__.py
  2. 1 1
      blender_manifest.toml
  3. 10 1
      utilities.py

+ 69 - 61
__init__.py

@@ -17,7 +17,7 @@ from .utilities import prRed
 
 MANTIS_VERSION_MAJOR=0
 MANTIS_VERSION_MINOR=11
-MANTIS_VERSION_SUB=19
+MANTIS_VERSION_SUB=20
 
 classLists = [module.TellClasses() for module in [
  link_definitions,
@@ -264,68 +264,76 @@ versioning_node_tasks = [
 ]
 
 
-def do_version_update(node_tree):
+def node_version_update(node_tree, node):
     from .base_definitions import NODES_REMOVED, SOCKETS_REMOVED, SOCKETS_RENAMED, SOCKETS_ADDED
-    for n in node_tree.nodes:
-        rename_jobs = []
-
-        if n.bl_idname in NODES_REMOVED:
-            print(f"INFO: removing node {n.name} of type {n.bl_idname} because it has been deprecated.")
-            n.inputs.remove(socket)
+    rename_jobs = []
+    if node.bl_idname in NODES_REMOVED:
+        print(f"INFO: removing node {node.name} of type {node.bl_idname} because it has been deprecated.")
+        node.inputs.remove(socket)
+        return
+    for i, socket in enumerate(node.inputs.values()):
+        if (node.bl_idname, socket.identifier) in SOCKETS_REMOVED:
+            print(f"INFO: removing socket {socket.identifier} of node {node.name} of type {node.bl_idname} because it has been deprecated.")
+            node.inputs.remove(socket)
+        for old_class, old_bl_idname, old_name, new_bl_idname, new_name, multi in SOCKETS_RENAMED:
+            if (node.bl_idname == old_class and socket.bl_idname == old_bl_idname and socket.name == old_name):
+                rename_jobs.append((socket, i, new_bl_idname, new_name, multi))
+    for i, socket in enumerate(node.outputs.values()):
+        if (node.bl_idname, socket.identifier) in SOCKETS_REMOVED:
+            print(f"INFO: removing socket {socket.identifier} of node {node.name} of type {node.bl_idname} because it has been deprecated.")
+            node.outputs.remove(socket)
+        for old_class, old_bl_idname, old_name, new_bl_idname, new_name, multi in SOCKETS_RENAMED:
+            if (node.bl_idname == old_class and socket.bl_idname == old_bl_idname and socket.name == old_name):
+                rename_jobs.append((socket, i, new_bl_idname, new_name, multi))
+
+    for bl_idname, in_out, socket_type, socket_name, index, use_multi_input, default_val in SOCKETS_ADDED:
+        if node.bl_idname != bl_idname:
             continue
-        for i, socket in enumerate(n.inputs.values()):
-            if (n.bl_idname, socket.identifier) in SOCKETS_REMOVED:
-                print(f"INFO: removing socket {socket.identifier} of node {n.name} of type {n.bl_idname} because it has been deprecated.")
-                n.inputs.remove(socket)
-            for old_class, old_bl_idname, old_name, new_bl_idname, new_name, multi in SOCKETS_RENAMED:
-                if (n.bl_idname == old_class and socket.bl_idname == old_bl_idname and socket.name == old_name):
-                    rename_jobs.append((socket, i, new_bl_idname, new_name, multi))
-        for i, socket in enumerate(n.outputs.values()):
-            if (n.bl_idname, socket.identifier) in SOCKETS_REMOVED:
-                print(f"INFO: removing socket {socket.identifier} of node {n.name} of type {n.bl_idname} because it has been deprecated.")
-                n.outputs.remove(socket)
-            for old_class, old_bl_idname, old_name, new_bl_idname, new_name, multi in SOCKETS_RENAMED:
-                if (n.bl_idname == old_class and socket.bl_idname == old_bl_idname and socket.name == old_name):
-                    rename_jobs.append((socket, i, new_bl_idname, new_name, multi))
-
-        for bl_idname, in_out, socket_type, socket_name, index, use_multi_input, default_val in SOCKETS_ADDED:
-            if n.bl_idname != bl_idname:
-                continue
-            if in_out == 'INPUT' and n.inputs.get(socket_name) is None:
-                print(f"INFO: adding socket \"{socket_name}\" of type {socket_type} to node {n.name} of type {n.bl_idname}.")
-                s = n.inputs.new(socket_type, socket_name, use_multi_input=use_multi_input)
-                try:
-                    s.default_value = default_val
-                except AttributeError:
-                    pass # the socket is read-only
-                n.inputs.move(len(n.inputs)-1, index)
-        socket_map = None
-        if rename_jobs:
-            from .utilities import get_socket_maps
-            socket_maps = get_socket_maps(n)
-        for socket, socket_index, new_bl_idname, new_name, multi in rename_jobs:
-            old_id = socket.identifier
-            print (f"Renaming socket {socket.identifier} to {new_name} in node {n.name}")
-            from .utilities import do_relink
-            if socket.is_output:
-                index = 1
-                in_out = "OUTPUT"
-                n.outputs.remove(socket)
-                s = n.outputs.new(new_bl_idname, new_name, identifier=new_name, use_multi_input=multi)
-                n.outputs.move(len(n.outputs)-1, socket_index)
-                socket_map = socket_maps[1]
-            else:
-                index = 0
-                in_out = "INPUT"
-                n.inputs.remove(socket)
-                s = n.inputs.new(new_bl_idname, new_name, identifier=new_name, use_multi_input=multi)
-                n.inputs.move(len(n.inputs)-1, socket_index)
-                socket_map = socket_maps[0]
-            socket_map[new_name] = socket_map[old_id]
-            if new_name != old_id: del socket_map[old_id] # sometimes rename just changes the socket type or multi
-            do_relink(n, s, socket_map)
-        for bl_idname, task in versioning_node_tasks:
-            if n.bl_idname in bl_idname: task(n)
+        if in_out == 'INPUT' and node.inputs.get(socket_name) is None:
+            print(f"INFO: adding socket \"{socket_name}\" of type {socket_type} to node {node.name} of type {node.bl_idname}.")
+            s = node.inputs.new(socket_type, socket_name, use_multi_input=use_multi_input)
+            try:
+                s.default_value = default_val
+            except AttributeError:
+                pass # the socket is read-only
+            node.inputs.move(len(node.inputs)-1, index)
+    socket_map = None
+    if rename_jobs:
+        from .utilities import get_socket_maps
+        socket_maps = get_socket_maps(node)
+    for socket, socket_index, new_bl_idname, new_name, multi in rename_jobs:
+        old_id = socket.identifier
+        print (f"Renaming socket {socket.identifier} to {new_name} in node {node.name}")
+        from .utilities import do_relink
+        if socket.is_output:
+            index = 1
+            in_out = "OUTPUT"
+            node.outputs.remove(socket)
+            s = node.outputs.new(new_bl_idname, new_name, identifier=new_name, use_multi_input=multi)
+            node.outputs.move(len(node.outputs)-1, socket_index)
+            socket_map = socket_maps[1]
+        else:
+            index = 0
+            in_out = "INPUT"
+            node.inputs.remove(socket)
+            s = node.inputs.new(new_bl_idname, new_name, identifier=new_name, use_multi_input=multi)
+            node.inputs.move(len(node.inputs)-1, socket_index)
+            socket_map = socket_maps[0]
+        socket_map[new_name] = socket_map[old_id]
+        if new_name != old_id: del socket_map[old_id] # sometimes rename just changes the socket type or multi
+        do_relink(node, s, socket_map)
+    for bl_idname, task in versioning_node_tasks:
+        if node.bl_idname in bl_idname: task(node)
+
+
+def do_version_update(node_tree):
+    for node in node_tree.nodes:
+        try:
+            node_version_update(node_tree, node)
+        except Exception as e:
+            prRed(f"Error updating version in node: {node_tree.name}::{node.name}; see error:")
+            print(e)
+            pass
     # increment the version at the end
     node_tree.mantis_version[0] = MANTIS_VERSION_MAJOR
     node_tree.mantis_version[1] = MANTIS_VERSION_MINOR

+ 1 - 1
blender_manifest.toml

@@ -3,7 +3,7 @@ schema_version = "1.0.0"
 # Example of manifest file for a Blender extension
 # Change the values according to your extension
 id = "mantis"
-version = "0.11.19"
+version = "0.11.20"
 name = "Mantis"
 tagline = "Mantis is a rigging nodes toolkit"
 maintainer = "Nodespaghetti <josephbburg@protonmail.com>"

+ 10 - 1
utilities.py

@@ -112,7 +112,16 @@ def get_socket_maps(node, force=False):
                         other_sockets.append(l.to_node)
                     else:
                         other_sockets.append(getattr(l, linked_socket))
-                map[sock.identifier]= other_sockets
+                from bpy.types import NodeSocket
+                keep_sockets=[]
+                for other_socket in other_sockets.copy():
+                    if isinstance(other_socket, NodeSocket) and \
+                        other_socket.bl_idname == 'NodeSocketUndefined':
+                            continue # this one is bad
+                    keep_sockets.append(other_socket)
+                # if len(keep_sockets) == 0:
+                #     keep_sockets = None
+                map[sock.identifier]= keep_sockets
             elif hasattr(sock, "default_value"):
                 if sock.get("default_value") is not None:
                     val = sock['default_value']