[Bf-blender-cvs] [5cc1bbd6de5] functions: update tree automatically after changes

Jacques Lucke noreply at git.blender.org
Thu Mar 21 10:56:22 CET 2019


Commit: 5cc1bbd6de52f7e7e4eb292bef600d48b099fdaf
Author: Jacques Lucke
Date:   Thu Mar 21 10:39:57 2019 +0100
Branches: functions
https://developer.blender.org/rB5cc1bbd6de52f7e7e4eb292bef600d48b099fdaf

update tree automatically after changes

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

M	release/scripts/startup/function_nodes/base.py
M	release/scripts/startup/function_nodes/nodes/pack_list.py
M	release/scripts/startup/function_nodes/tree_panel.py
M	release/scripts/startup/function_nodes/update_sockets.py

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

diff --git a/release/scripts/startup/function_nodes/base.py b/release/scripts/startup/function_nodes/base.py
index 7bade2e64a3..4b02555228e 100644
--- a/release/scripts/startup/function_nodes/base.py
+++ b/release/scripts/startup/function_nodes/base.py
@@ -11,6 +11,11 @@ class BaseTree:
         else:
             self.links.new(b, a)
 
+    def update(self):
+        from . update_sockets import update_function_trees
+        update_function_trees()
+
+
 class FunctionNodeTree(bpy.types.NodeTree, BaseTree):
     bl_idname = "FunctionNodeTree"
     bl_icon = "MOD_DATA_TRANSFER"
@@ -70,11 +75,18 @@ _storage_per_node = {}
 
 class BaseNode:
     def init(self, context):
-        inputs, outputs = self.get_sockets()
-        for decl in inputs:
-            decl.build(self, self.inputs)
-        for decl in outputs:
-            decl.build(self, self.outputs)
+        from . update_sockets import managed_update
+        with managed_update():
+            inputs, outputs = self.get_sockets()
+            for decl in inputs:
+                decl.build(self, self.inputs)
+            for decl in outputs:
+                decl.build(self, self.outputs)
+
+    def refresh(self, context=None):
+        from . update_sockets import update_function_trees
+        self.rebuild_and_try_keep_state()
+        update_function_trees()
 
     def rebuild_and_try_keep_state(self):
         state = self._get_state()
@@ -82,15 +94,20 @@ class BaseNode:
         self._try_set_state(state)
 
     def rebuild(self):
+        from . update_sockets import managed_update
+
         self.storage.store_socket_states()
-        self.inputs.clear()
-        self.outputs.clear()
-
-        inputs, outputs = self.get_sockets()
-        for decl in inputs:
-            decl.build(self, self.inputs)
-        for decl in outputs:
-            decl.build(self, self.outputs)
+
+        with managed_update():
+            self.inputs.clear()
+            self.outputs.clear()
+
+            inputs, outputs = self.get_sockets()
+            for decl in inputs:
+                decl.build(self, self.inputs)
+            for decl in outputs:
+                decl.build(self, self.outputs)
+
         self.storage.set_current_declaration(inputs, outputs)
         self.storage.try_restore_socket_states()
 
diff --git a/release/scripts/startup/function_nodes/nodes/pack_list.py b/release/scripts/startup/function_nodes/nodes/pack_list.py
index bed85288b7b..2dae7cca11a 100644
--- a/release/scripts/startup/function_nodes/nodes/pack_list.py
+++ b/release/scripts/startup/function_nodes/nodes/pack_list.py
@@ -8,7 +8,7 @@ class PackListNode(bpy.types.Node, FunctionNode):
     bl_idname = "fn_PackListNode"
     bl_label = "Pack List"
 
-    active_type: StringProperty(default="Float")
+    active_type: StringProperty(default="Float", update=FunctionNode.refresh)
     variadic: PackListDecl.Property()
 
     def get_sockets(self):
@@ -22,5 +22,4 @@ class PackListNode(bpy.types.Node, FunctionNode):
         self.invoke_type_selection(layout, "set_type", "Change Type", mode="BASE")
 
     def set_type(self, data_type):
-        self.active_type = data_type
-        self.rebuild_and_try_keep_state()
\ No newline at end of file
+        self.active_type = data_type
\ No newline at end of file
diff --git a/release/scripts/startup/function_nodes/tree_panel.py b/release/scripts/startup/function_nodes/tree_panel.py
index 3ebb4040091..6457fc86131 100644
--- a/release/scripts/startup/function_nodes/tree_panel.py
+++ b/release/scripts/startup/function_nodes/tree_panel.py
@@ -15,4 +15,3 @@ class TreePanel(bpy.types.Panel):
 
     def draw(self, context):
         layout = self.layout
-        layout.operator("fn.update_function_tree")
diff --git a/release/scripts/startup/function_nodes/update_sockets.py b/release/scripts/startup/function_nodes/update_sockets.py
index c013104d225..1b9c323c0d3 100644
--- a/release/scripts/startup/function_nodes/update_sockets.py
+++ b/release/scripts/startup/function_nodes/update_sockets.py
@@ -1,8 +1,9 @@
 import bpy
-from . base import FunctionNode, DataSocket
+from . base import FunctionNode, DataSocket, FunctionNodeTree
 from collections import defaultdict
 from . sockets import type_infos, OperatorSocket, DataSocket
 from pprint import pprint
+from contextlib import contextmanager
 
 from . socket_decl import (
     FixedSocketDecl,
@@ -11,17 +12,33 @@ from . socket_decl import (
     AnyVariadicDecl,
 )
 
-class UpdateFunctionTreeOperator(bpy.types.Operator):
-    bl_idname = "fn.update_function_tree"
-    bl_label = "Update Function Tree"
-    bl_description = "Execute socket operators and run inferencer"
-
-    def execute(self, context):
-        tree = context.space_data.node_tree
-        run_socket_operators(tree)
-        inference_decisions(tree)
-        remove_invalid_links(tree)
-        return {'FINISHED'}
+_managed_update_depth = 0
+
+ at contextmanager
+def managed_update():
+    global _managed_update_depth
+    try:
+        _managed_update_depth += 1
+        yield
+    finally:
+        _managed_update_depth -= 1
+
+def is_managed_update():
+    return _managed_update_depth > 0
+
+def update_function_trees():
+    if is_managed_update():
+        return
+
+    with managed_update():
+        for tree in bpy.data.node_groups:
+            if isinstance(tree, FunctionNodeTree):
+                update_function_tree(tree)
+
+def update_function_tree(tree):
+    run_socket_operators(tree)
+    inference_decisions(tree)
+    remove_invalid_links(tree)
 
 
 # Socket Operators



More information about the Bf-blender-cvs mailing list