diff --git a/node_tree.py b/node_tree.py index 97be769efb7b3b291f32ab37a68ae2b6c4a29577..5354cc9a95bc04691cfee56ca43a4798750f6ec8 100644 --- a/node_tree.py +++ b/node_tree.py @@ -82,6 +82,10 @@ class SvLinkNewNodeInput(bpy.types.Operator): return {'FINISHED'} + + + + @contextmanager def throttle_tree_update(node): """ usage @@ -132,6 +136,35 @@ def throttled(func): return wrapper_update +def poll_node(func): + """ + this function is used to reject calls to node.update + + use as a decorator: + + from sverchok.node_tree import SverchCustomTreeNode, poll_node + + class node: + + + def sv_poll(self): + ... test here to return True, if you want to avoid executing the update + ... function too early. + ... usually something like : + ... if 'last_output' in self.outputs: return True + + @poll_node + def update(self): + ... stuff you do with a highly dynamic ui node + + + """ + def wrapper_node_update(self): + if not self.sv_poll(): + func(self) + + return wrapper_node_update + class SvNodeTreeCommon(object): ''' diff --git a/nodes/list_mutators/combinatorics.py b/nodes/list_mutators/combinatorics.py index 5911eb344f258a3ec2e0e1a96a669a6d78e61d38..918aaf17e8b922cdbcc6c86741a4251b7f76cd60 100644 --- a/nodes/list_mutators/combinatorics.py +++ b/nodes/list_mutators/combinatorics.py @@ -19,10 +19,10 @@ import bpy from bpy.props import IntProperty, EnumProperty -from sverchok.node_tree import SverchCustomTreeNode -from sverchok.data_structure import (match_long_repeat, updateNode) +from sverchok.node_tree import SverchCustomTreeNode, poll_node +from sverchok.data_structure import match_long_repeat, updateNode -from itertools import (product, permutations, combinations) +from itertools import product, permutations, combinations operations = { "PRODUCT": (10, lambda s, r: product(*s, repeat=r)), @@ -73,19 +73,21 @@ class SvCombinatoricsNode(bpy.types.Node, SverchCustomTreeNode): self.outputs.new('SvStringsSocket', "Result") self.update_operation(context) - - def update(self): - ''' Add/remove sockets as A-Z sockets are connected/disconnected ''' + + def sv_poll(self): if not 'Result' in self.outputs: - return + return True # not a multiple input operation ? => no need to update sockets if self.operation not in multiple_input_operations: - return + return True - inputs = self.inputs + @poll_node + def update(self): + ''' Add/remove sockets as A-Z sockets are connected/disconnected ''' # get all existing A-Z sockets (connected or not) + inputs = self.inputs inputs_AZ = list(filter(lambda s: s.name in ABC, inputs)) # last A-Z socket connected ? => add an empty A-Z socket at the end @@ -98,7 +100,7 @@ class SvCombinatoricsNode(bpy.types.Node, SverchCustomTreeNode): s = inputs_AZ[-1] inputs.remove(s) inputs_AZ.remove(s) - + def update_sockets(self): ''' Update sockets based on selected operation '''