[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