[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