[Bf-blender-cvs] [52ff44d02cb] functions: Validate more aspects of the node tree while syncing

Jacques Lucke noreply at git.blender.org
Fri Apr 5 12:29:20 CEST 2019


Commit: 52ff44d02cbb56b94010f69a032e009d6b713d0a
Author: Jacques Lucke
Date:   Fri Apr 5 12:10:30 2019 +0200
Branches: functions
https://developer.blender.org/rB52ff44d02cbb56b94010f69a032e009d6b713d0a

Validate more aspects of the node tree while syncing

===================================================================

M	release/scripts/startup/function_nodes/base.py
M	release/scripts/startup/function_nodes/declaration/base.py
M	release/scripts/startup/function_nodes/declaration/dynamic_list.py
M	release/scripts/startup/function_nodes/declaration/fixed_type.py
M	release/scripts/startup/function_nodes/declaration/pack_list.py
M	release/scripts/startup/function_nodes/declaration/tree_interface.py
M	release/scripts/startup/function_nodes/declaration/variadic.py
M	release/scripts/startup/function_nodes/sync.py

===================================================================

diff --git a/release/scripts/startup/function_nodes/base.py b/release/scripts/startup/function_nodes/base.py
index e56fdc3eedb..2b547584ab4 100644
--- a/release/scripts/startup/function_nodes/base.py
+++ b/release/scripts/startup/function_nodes/base.py
@@ -13,8 +13,7 @@ class BaseTree:
 
     def update(self):
         from . sync import sync_trees_and_dependent_trees
-        if self.name in bpy.data.node_groups:
-            sync_trees_and_dependent_trees({self})
+        sync_trees_and_dependent_trees({self})
 
 
 class SocketValueStates:
diff --git a/release/scripts/startup/function_nodes/declaration/base.py b/release/scripts/startup/function_nodes/declaration/base.py
index 807517b4d0f..75b15f99903 100644
--- a/release/scripts/startup/function_nodes/declaration/base.py
+++ b/release/scripts/startup/function_nodes/declaration/base.py
@@ -21,4 +21,16 @@ class SocketDeclBase:
         pass
 
     def get_socket_name(self, socket, index):
-        return socket.name
\ No newline at end of file
+        return socket.name
+
+    def _data_socket_test(self, socket, name, data_type, identifier):
+        from .. base import DataSocket
+        if not isinstance(socket, DataSocket):
+            return False
+        if socket.name != name:
+            return False
+        if socket.data_type != data_type:
+            return False
+        if socket.identifier != identifier:
+            return False
+        return True
\ No newline at end of file
diff --git a/release/scripts/startup/function_nodes/declaration/dynamic_list.py b/release/scripts/startup/function_nodes/declaration/dynamic_list.py
index 9378aab9826..bbc53f2a2bb 100644
--- a/release/scripts/startup/function_nodes/declaration/dynamic_list.py
+++ b/release/scripts/startup/function_nodes/declaration/dynamic_list.py
@@ -21,7 +21,8 @@ class ListSocketDecl(SocketDeclBase):
     def validate(self, sockets):
         if len(sockets) != 1:
             return False
-        return sockets[0].data_type == self.get_data_type()
+        return self._data_socket_test(sockets[0],
+            self.display_name, self.get_data_type(), self.identifier)
 
     def get_data_type(self):
         base_type = getattr(self.node, self.prop_name)
diff --git a/release/scripts/startup/function_nodes/declaration/fixed_type.py b/release/scripts/startup/function_nodes/declaration/fixed_type.py
index 849e99b04b0..2026aef2d39 100644
--- a/release/scripts/startup/function_nodes/declaration/fixed_type.py
+++ b/release/scripts/startup/function_nodes/declaration/fixed_type.py
@@ -18,7 +18,8 @@ class FixedSocketDecl(SocketDeclBase):
     def validate(self, sockets):
         if len(sockets) != 1:
             return False
-        return sockets[0].data_type == self.data_type
+        return self._data_socket_test(sockets[0],
+            self.display_name, self.data_type, self.identifier)
 
     def amount(self):
         return 1
\ No newline at end of file
diff --git a/release/scripts/startup/function_nodes/declaration/pack_list.py b/release/scripts/startup/function_nodes/declaration/pack_list.py
index 1c8418c38e5..fad91e2ea4b 100644
--- a/release/scripts/startup/function_nodes/declaration/pack_list.py
+++ b/release/scripts/startup/function_nodes/declaration/pack_list.py
@@ -41,14 +41,10 @@ class PackListDecl(SocketDeclBase):
             return False
 
         for socket, item in zip(sockets[:-1], collection):
-            if item.state == "BASE":
-                if socket.data_type != self.base_type:
-                    return False
-            elif item.state == "LIST":
-                if socket.data_type != self.list_type:
-                    return False
-            else:
-                assert False
+            data_type = self.base_type if item.state == "BASE" else self.list_type
+            identifier = item.identifier_prefix + self.identifier_suffix
+            if not self._data_socket_test(socket, "", data_type, identifier):
+                return False
 
         if sockets[-1].bl_idname != "fn_OperatorSocket":
             return False
diff --git a/release/scripts/startup/function_nodes/declaration/tree_interface.py b/release/scripts/startup/function_nodes/declaration/tree_interface.py
index 9b1a4be5e2f..9baa9a8fd45 100644
--- a/release/scripts/startup/function_nodes/declaration/tree_interface.py
+++ b/release/scripts/startup/function_nodes/declaration/tree_interface.py
@@ -48,9 +48,8 @@ class TreeInterfaceDecl(SocketDeclBase):
             return False
 
         for param, socket in zip(params, sockets):
-            if param.data_type != socket.data_type:
-                return False
-            if param.name != socket.name:
+            identifier = self.identifier + param.identifier
+            if not self._data_socket_test(socket, param.name, param.data_type, identifier):
                 return False
 
         return True
@@ -61,9 +60,8 @@ class TreeInterfaceDecl(SocketDeclBase):
             return False
 
         for param, socket in zip(params, sockets):
-            if param.data_type != socket.data_type:
-                return False
-            if param.name != socket.name:
+            identifier = self.identifier + param.identifier
+            if not self._data_socket_test(socket, param.name, param.data_type, identifier):
                 return False
 
         return True
diff --git a/release/scripts/startup/function_nodes/declaration/variadic.py b/release/scripts/startup/function_nodes/declaration/variadic.py
index ccc53ae433a..12ba8840f4d 100644
--- a/release/scripts/startup/function_nodes/declaration/variadic.py
+++ b/release/scripts/startup/function_nodes/declaration/variadic.py
@@ -31,12 +31,15 @@ class AnyVariadicDecl(SocketDeclBase):
     def validate(self, sockets):
         if len(sockets) != self.amount():
             return False
-        collection = self.get_collection()
-        for item, socket in zip(collection, sockets[:-1]):
-            if item.data_type != socket.data_type:
+
+        for item, socket in zip(self.get_collection(), sockets[:-1]):
+            identifier = item.identifier_prefix + self.identifier_suffix
+            if not self._data_socket_test(socket, item.name, item.data_type, identifier):
                 return False
+
         if not isinstance(sockets[-1], OperatorSocket):
             return False
+
         return True
 
     def draw_socket(self, layout, socket, index):
diff --git a/release/scripts/startup/function_nodes/sync.py b/release/scripts/startup/function_nodes/sync.py
index 1650b2ff00a..0fe623cb10b 100644
--- a/release/scripts/startup/function_nodes/sync.py
+++ b/release/scripts/startup/function_nodes/sync.py
@@ -56,6 +56,11 @@ def skip_syncing():
 ############################################
 
 def iter_trees_to_sync_in_order(trees):
+    stored_tree_ids = {id(tree) for tree in bpy.data.node_groups}
+    if any(id(tree) not in stored_tree_ids for tree in trees):
+        # can happen after undo or on load
+        return
+
     dependency_graph = build_tree_dependency_graph()
     all_trees_to_sync = dependency_graph.reachable(trees)
     trees_in_sync_order = dependency_graph.toposort_partial(all_trees_to_sync)



More information about the Bf-blender-cvs mailing list