diff --git a/apidocs/sverchok/core/node_group.html b/apidocs/sverchok/core/node_group.html index 50dc4871d7..7e33daa48b 100644 --- a/apidocs/sverchok/core/node_group.html +++ b/apidocs/sverchok/core/node_group.html @@ -2567,7 +2567,7 @@
var tree_name : <_PropertyDeferred, , {'items': SearchGroupTree.available_trees() at 0x7f9eded299d0>, 'attr': 'tree_name'}>
var tree_name : <_PropertyDeferred, , {'items': SearchGroupTree.available_trees() at 0x7f8b667e28b0>, 'attr': 'tree_name'}>
var group_tree : <_PropertyDeferred, , {'type': SvGroupTree'>, 'poll': SvGroupTreeNode.nested_tree_filter() at 0x7f9eded32550>, 'update': SvGroupTreeNode.update_group_tree() at 0x7f9eded325e0>, 'attr': 'group_tree'}>
var group_tree : <_PropertyDeferred, , {'type': SvGroupTree'>, 'poll': SvGroupTreeNode.nested_tree_filter() at 0x7f8b667c0430>, 'update': SvGroupTreeNode.update_group_tree() at 0x7f8b667c04c0>, 'attr': 'group_tree'}>
var is_active : <_PropertyDeferred, , {'name': 'Live', 'description': 'Update realtime if active', 'default': True, 'update': SvGroupTreeNode. at 0x7f9eded32700>, 'attr': 'is_active'}>
var is_active : <_PropertyDeferred, , {'name': 'Live', 'description': 'Update realtime if active', 'default': True, 'update': SvGroupTreeNode. at 0x7f8b667c05e0>, 'attr': 'is_active'}>
var show : <_PropertyDeferred, , {'default': True, 'description': 'On/off viewer nodes inside', 'update': SvGroupTreeNode.switch_viewers() at 0x7f9eded32790>, 'attr': 'show'}>
var show : <_PropertyDeferred, , {'default': True, 'description': 'On/off viewer nodes inside', 'update': SvGroupTreeNode.switch_viewers() at 0x7f8b667c0670>, 'attr': 'show'}>
var domain : <_PropertyDeferred, , {'items': [('POINT', 'Point', ''), ('EDGE', 'Edge', ''), ('FACE', 'Face', ''), ('CORNER', 'Face Corner', '')], 'update': process_from_socket() at 0x7f9ededac0d0>, 'attr': 'domain'}>
var domain : <_PropertyDeferred, , {'items': [('POINT', 'Point', ''), ('EDGE', 'Edge', ''), ('FACE', 'Face', ''), ('CORNER', 'Face Corner', '')], 'update': process_from_socket() at 0x7f8b667a4f70>, 'attr': 'domain'}>
var default_property : <_PropertyDeferred, , {'name': 'Collection', 'type': , 'update': process_from_socket() at 0x7f9ededac0d0>, 'attr': 'default_value'}>
var default_property : <_PropertyDeferred, , {'name': 'Collection', 'type': , 'update': process_from_socket() at 0x7f8b667a4f70>, 'attr': 'default_value'}>
var default_property : <_PropertyDeferred, , {'default': (0, 0, 0, 1), 'size': 4, 'subtype': 'COLOR', 'min': 0, 'max': 1, 'update': process_from_socket() at 0x7f9ededac0d0>, 'attr': 'default_value'}>
var default_property : <_PropertyDeferred, , {'default': (0, 0, 0, 1), 'size': 4, 'subtype': 'COLOR', 'min': 0, 'max': 1, 'update': process_from_socket() at 0x7f8b667a4f70>, 'attr': 'default_value'}>
var reparametrize : <_PropertyDeferred, , {'name': 'Reparametrize', 'default': False, 'update': process_from_socket() at 0x7f9ededac0d0>, 'attr': 'reparametrize'}>
var reparametrize : <_PropertyDeferred, , {'name': 'Reparametrize', 'default': False, 'update': process_from_socket() at 0x7f8b667a4f70>, 'attr': 'reparametrize'}>
var depth : <_PropertyDeferred, , {'description': 'Depth exposed to the formula', 'update': process_from_socket() at 0x7f9ededac0d0>, 'default': 1, 'min': 1, 'attr': 'depth'}>
var depth : <_PropertyDeferred, , {'description': 'Depth exposed to the formula', 'update': process_from_socket() at 0x7f8b667a4f70>, 'default': 1, 'min': 1, 'attr': 'depth'}>
var transform : <_PropertyDeferred, , {'description': 'Transform before exposing to the formula', 'items': [('As_is', 'As is', '', 0), ('Vector', 'Vector', '', 1), ('Array', 'Array', '', 2), ('Set', 'Set', '', 3), ('String', 'String', '', 4)], 'update': SvFormulaSocket.update_depth() at 0x7f9eded93dc0>, 'attr': 'transform'}>
var transform : <_PropertyDeferred, , {'description': 'Transform before exposing to the formula', 'items': [('As_is', 'As is', '', 0), ('Vector', 'Vector', '', 1), ('Array', 'Array', '', 2), ('Set', 'Set', '', 3), ('String', 'String', '', 4)], 'update': SvFormulaSocket.update_depth() at 0x7f8b667bcca0>, 'attr': 'transform'}>
var default_property : <_PropertyDeferred, , {'name': 'Image', 'type': , 'update': process_from_socket() at 0x7f9ededac0d0>, 'attr': 'default_value'}>
var default_property : <_PropertyDeferred, , {'name': 'Image', 'type': , 'update': process_from_socket() at 0x7f8b667a4f70>, 'attr': 'default_value'}>
var option : <_PropertyDeferred, , {'name': 'Action', 'description': 'Action to be executed', 'items': SvInputLinkMenuOp.get_items() at 0x7f9eded973a0>, 'attr': 'option'}>
var option : <_PropertyDeferred, , {'name': 'Action', 'description': 'Action to be executed', 'items': SvInputLinkMenuOp.get_items() at 0x7f8b667d5280>, 'attr': 'option'}>
var default_property : <_PropertyDeferred, , {'name': 'Material', 'type': , 'update': process_from_socket() at 0x7f9ededac0d0>, 'attr': 'default_value'}>
var default_property : <_PropertyDeferred, , {'name': 'Material', 'type': , 'update': process_from_socket() at 0x7f8b667a4f70>, 'attr': 'default_value'}>
var object_ref : <_PropertyDeferred, , {'update': process_from_socket() at 0x7f9ededac0d0>, 'attr': 'object_ref'}>
var object_ref : <_PropertyDeferred, , {'update': process_from_socket() at 0x7f8b667a4f70>, 'attr': 'object_ref'}>
var object_ref_pointer : <_PropertyDeferred, , {'name': 'Object Reference', 'poll': SvObjectSocket.filter_kinds() at 0x7f9eded93c10>, 'type': , 'update': process_from_socket() at 0x7f9ededac0d0>, 'attr': 'object_ref_pointer'}>
var object_ref_pointer : <_PropertyDeferred, , {'name': 'Object Reference', 'poll': SvObjectSocket.filter_kinds() at 0x7f8b667bcaf0>, 'type': , 'update': process_from_socket() at 0x7f8b667a4f70>, 'attr': 'object_ref_pointer'}>
var default_property : <_PropertyDeferred, , {'default': (1, 0, 0, 0), 'size': 4, 'subtype': 'QUATERNION', 'update': process_from_socket() at 0x7f9ededac0d0>, 'attr': 'default_value'}>
var default_property : <_PropertyDeferred, , {'default': (1, 0, 0, 0), 'size': 4, 'subtype': 'QUATERNION', 'update': process_from_socket() at 0x7f8b667a4f70>, 'attr': 'default_value'}>
var use_flatten : <_PropertyDeferred, , {'name': 'Flatten', 'default': False, 'update': SvSocketProcessing.update_flatten_flag() at 0x7f9eded83820>, 'attr': 'use_flatten'}>
var use_flatten : <_PropertyDeferred, , {'name': 'Flatten', 'default': False, 'update': SvSocketProcessing.update_flatten_flag() at 0x7f8b667be700>, 'attr': 'use_flatten'}>
var use_flatten_topology : <_PropertyDeferred, , {'name': 'Flatten Topology', 'default': False, 'update': process_from_socket() at 0x7f9ededac0d0>, 'attr': 'use_flatten_topology'}>
var use_flatten_topology : <_PropertyDeferred, , {'name': 'Flatten Topology', 'default': False, 'update': process_from_socket() at 0x7f8b667a4f70>, 'attr': 'use_flatten_topology'}>
var use_graft : <_PropertyDeferred, , {'name': 'Graft', 'default': False, 'update': process_from_socket() at 0x7f9ededac0d0>, 'attr': 'use_graft'}>
var use_graft : <_PropertyDeferred, , {'name': 'Graft', 'default': False, 'update': process_from_socket() at 0x7f8b667a4f70>, 'attr': 'use_graft'}>
var use_simplify : <_PropertyDeferred, , {'name': 'Simplify', 'default': False, 'update': SvSocketProcessing.update_simplify_flag() at 0x7f9eded838b0>, 'attr': 'use_simplify'}>
var use_simplify : <_PropertyDeferred, , {'name': 'Simplify', 'default': False, 'update': SvSocketProcessing.update_simplify_flag() at 0x7f8b667be790>, 'attr': 'use_simplify'}>
var use_unwrap : <_PropertyDeferred, , {'name': 'Unwrap', 'default': False, 'update': SvSocketProcessing.update_unwrap_flag() at 0x7f9eded83700>, 'attr': 'use_unwrap'}>
var use_unwrap : <_PropertyDeferred, , {'name': 'Unwrap', 'default': False, 'update': SvSocketProcessing.update_unwrap_flag() at 0x7f8b667be5e0>, 'attr': 'use_unwrap'}>
var use_wrap : <_PropertyDeferred, , {'name': 'Wrap', 'default': False, 'update': SvSocketProcessing.update_wrap_flag() at 0x7f9eded83790>, 'attr': 'use_wrap'}>
var use_wrap : <_PropertyDeferred, , {'name': 'Wrap', 'default': False, 'update': SvSocketProcessing.update_wrap_flag() at 0x7f8b667be670>, 'attr': 'use_wrap'}>
var default_float_property : <_PropertyDeferred, , {'update': process_from_socket() at 0x7f9ededac0d0>, 'attr': 'default_float_property'}>
var default_float_property : <_PropertyDeferred, , {'update': process_from_socket() at 0x7f8b667a4f70>, 'attr': 'default_float_property'}>
var default_int_property : <_PropertyDeferred, , {'update': process_from_socket() at 0x7f9ededac0d0>, 'attr': 'default_int_property'}>
var default_int_property : <_PropertyDeferred, , {'update': process_from_socket() at 0x7f8b667a4f70>, 'attr': 'default_int_property'}>
var use_graft_2 : <_PropertyDeferred, , {'name': 'Graft Topology', 'default': False, 'update': process_from_socket() at 0x7f9ededac0d0>, 'attr': 'use_graft_2'}>
var use_graft_2 : <_PropertyDeferred, , {'name': 'Graft Topology', 'default': False, 'update': process_from_socket() at 0x7f8b667a4f70>, 'attr': 'use_graft_2'}>
var default_type : <_PropertyDeferred, , {'items': [('float', 'float', ''), ('int', 'int', '')], 'update': update_interface() at 0x7f9eded833a0>, 'attr': 'default_type'}>
var default_type : <_PropertyDeferred, , {'items': [('float', 'float', ''), ('int', 'int', '')], 'update': update_interface() at 0x7f8b667be280>, 'attr': 'default_type'}>
var default_property : <_PropertyDeferred, , {'update': process_from_socket() at 0x7f9ededac0d0>, 'attr': 'default_value'}>
var default_property : <_PropertyDeferred, , {'update': process_from_socket() at 0x7f8b667a4f70>, 'attr': 'default_value'}>
var default_property : <_PropertyDeferred, , {'name': 'Texture', 'type': , 'update': process_from_socket() at 0x7f9ededac0d0>, 'attr': 'default_value'}>
var default_property : <_PropertyDeferred, , {'name': 'Texture', 'type': , 'update': process_from_socket() at 0x7f8b667a4f70>, 'attr': 'default_value'}>
var prop : <_PropertyDeferred, , {'default': (0, 0, 0), 'size': 3, 'update': process_from_socket() at 0x7f9ededac0d0>, 'attr': 'prop'}>
var prop : <_PropertyDeferred, , {'default': (0, 0, 0), 'size': 3, 'update': process_from_socket() at 0x7f8b667a4f70>, 'attr': 'prop'}>
var show_time_mode : <_PropertyDeferred, , {'items': [('Per node', 'Per node', ''), ('Cumulative', 'Cumulative', '')], 'options': set(), 'update': SvNodeTreeCommon. at 0x7f9ededfdc10>, 'description': 'Mode of showing node update timings', 'attr': 'show_time_mode'}>
var show_time_mode : <_PropertyDeferred, , {'items': [('Per node', 'Per node', ''), ('Cumulative', 'Cumulative', '')], 'options': set(), 'update': SvNodeTreeCommon. at 0x7f8b66c1eaf0>, 'description': 'Mode of showing node update timings', 'attr': 'show_time_mode'}>
var sv_show_time_nodes : <_PropertyDeferred, , {'name': 'Node times', 'default': False, 'options': set(), 'update': SvNodeTreeCommon. at 0x7f9ededfdb80>, 'attr': 'sv_show_time_nodes'}>
var sv_show_time_nodes : <_PropertyDeferred, , {'name': 'Node times', 'default': False, 'options': set(), 'update': SvNodeTreeCommon. at 0x7f8b66c1ea60>, 'attr': 'sv_show_time_nodes'}>
UpdateNodes.is_animatable
enabled.
-var sv_draft : <_PropertyDeferred, , {'name': 'Draft', 'description': 'Draft (simplified processing) mode', 'default': False, 'update': SverchCustomTree.on_draft_mode_changed() at 0x7f9ededa7040>, 'options': set(), 'attr': 'sv_draft'}>
var sv_draft : <_PropertyDeferred, , {'name': 'Draft', 'description': 'Draft (simplified processing) mode', 'default': False, 'update': SverchCustomTree.on_draft_mode_changed() at 0x7f8b66c1eee0>, 'options': set(), 'attr': 'sv_draft'}>
Draft mode replaces selected properties of certain nodes with smaller values to lighten cpu load.
var sv_process : <_PropertyDeferred, , {'name': 'Process', 'default': True, 'description': 'Update upon tree and node property changes', 'update': SverchCustomTree. at 0x7f9ededa70d0>, 'options': set(), 'attr': 'sv_process'}>
var sv_process : <_PropertyDeferred, , {'name': 'Process', 'default': True, 'description': 'Update upon tree and node property changes', 'update': SverchCustomTree. at 0x7f8b66c1ef70>, 'options': set(), 'attr': 'sv_process'}>
If enabled it means that the tree will be evaluated upon changes in its topology, changes in node properties or scene changes made by user. @@ -1920,7 +1920,7 @@
var sv_show : <_PropertyDeferred, , {'name': 'Show', 'default': True, 'description': 'Show this layout', 'update': SverchCustomTree.turn_off_ng() at 0x7f9ededfdf70>, 'options': set(), 'attr': 'sv_show'}>
var sv_show : <_PropertyDeferred, , {'name': 'Show', 'default': True, 'description': 'Show this layout', 'update': SverchCustomTree.turn_off_ng() at 0x7f8b66c1ee50>, 'options': set(), 'attr': 'sv_show'}>
See `SverchCustomTree.turn_off_ng
var is_animatable : <_PropertyDeferred, , {'name': 'Animate Node', 'description': 'Update Node on frame change', 'default': True, 'update': UpdateNodes. at 0x7f9ededa75e0>, 'attr': 'is_animatable'}>
var is_animatable : <_PropertyDeferred, , {'name': 'Animate Node', 'description': 'Update Node on frame change', 'default': True, 'update': UpdateNodes. at 0x7f8b667a34c0>, 'attr': 'is_animatable'}>
A switch for user to make a node to update on frame changes in a scene.
Use UpdateNodes.is_animation_dependent
to display the option in node UI.
SverchCustomTreeNode.sv_draw_buttons()
.
var is_interactive : <_PropertyDeferred, , {'default': True, 'description': 'Update node upon changes in the scene', 'update': UpdateNodes.update_interactive_mode() at 0x7f9ededa74c0>, 'name': 'Interactive', 'attr': 'is_interactive'}>
var is_interactive : <_PropertyDeferred, , {'default': True, 'description': 'Update node upon changes in the scene', 'update': UpdateNodes.update_interactive_mode() at 0x7f8b667a33a0>, 'name': 'Interactive', 'attr': 'is_interactive'}>
When this option is on arbitrary changes in scene will update this node. Those changes can be: @@ -3665,7 +3666,7 @@
⚠️ There is no sense to override this property
var refresh : <_PropertyDeferred, , {'name': 'Update Node', 'description': 'Update Node', 'update': UpdateNodes.refresh_node() at 0x7f9ededa7550>, 'attr': 'refresh'}>
var refresh : <_PropertyDeferred, , {'name': 'Update Node', 'description': 'Update Node', 'update': UpdateNodes.refresh_node() at 0x7f8b667a3430>, 'attr': 'refresh'}>
See UpdateNodes.refresh_node()
.
-def solve_ex(self, problem_types={'UNDERDETERMINED', 'WELLDETERMINED', 'OVERDETERMINED'}, implementation='NATIVE', logger=None)
+def solve_ex(self, problem_types={'UNDERDETERMINED', 'OVERDETERMINED', 'WELLDETERMINED'}, implementation='NATIVE', logger=None)
var bgColor : <_PropertyDeferred, , {'name': 'Background', 'default': (0.06, 0.06, 0.06, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'bgColor'}>
var bgColor : <_PropertyDeferred, , {'name': 'Background', 'default': (0.06, 0.06, 0.06, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'bgColor'}>
var braceColor : <_PropertyDeferred, , {'name': 'Braces', 'default': (0.4, 0.5, 0.7, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'braceColor'}>
var braceColor : <_PropertyDeferred, , {'name': 'Braces', 'default': (0.4, 0.5, 0.7, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'braceColor'}>
var bracketColor : <_PropertyDeferred, , {'name': 'Brackets color', 'default': (0.65, 0.68, 0.7, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'bracketColor'}>
var bracketColor : <_PropertyDeferred, , {'name': 'Brackets color', 'default': (0.65, 0.68, 0.7, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'bracketColor'}>
var commentColor : <_PropertyDeferred, , {'name': 'Comments', 'default': (0.49, 0.49, 0.49, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'commentColor'}>
var commentColor : <_PropertyDeferred, , {'name': 'Comments', 'default': (0.49, 0.49, 0.49, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'commentColor'}>
var equalsColor : <_PropertyDeferred, , {'name': 'Equals', 'default': (0.9, 0.7, 0.6, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'equalsColor'}>
var equalsColor : <_PropertyDeferred, , {'name': 'Equals', 'default': (0.9, 0.7, 0.6, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'equalsColor'}>
var local_scale : <_PropertyDeferred, , {'default': 0.6, 'min': 0.2, 'name': 'scale', 'update': LexMixin. at 0x7f9ed6978d30>, 'attr': 'local_scale'}>
var local_scale : <_PropertyDeferred, , {'default': 0.6, 'min': 0.2, 'name': 'scale', 'update': LexMixin. at 0x7f8b662ff820>, 'attr': 'local_scale'}>
var name1Color : <_PropertyDeferred, , {'name': 'name1 color', 'default': (0.83, 0.91, 1.0, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'name1Color'}>
var name1Color : <_PropertyDeferred, , {'name': 'name1 color', 'default': (0.83, 0.91, 1.0, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'name1Color'}>
var name2Color : <_PropertyDeferred, , {'name': 'Main syntax', 'default': (0.9, 0.01, 0.02, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'name2Color'}>
var name2Color : <_PropertyDeferred, , {'name': 'Main syntax', 'default': (0.9, 0.01, 0.02, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'name2Color'}>
var name3Color : <_PropertyDeferred, , {'name': 'Bool etc,..', 'default': (0.3, 0.9, 0.4, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'name3Color'}>
var name3Color : <_PropertyDeferred, , {'name': 'Bool etc,..', 'default': (0.3, 0.9, 0.4, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'name3Color'}>
var numberColor : <_PropertyDeferred, , {'name': 'number color', 'default': (0.08, 0.7, 0.98, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'numberColor'}>
var numberColor : <_PropertyDeferred, , {'name': 'number color', 'default': (0.08, 0.7, 0.98, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'numberColor'}>
var opColor : <_PropertyDeferred, , {'name': 'Operators', 'default': (1.0, 0.18, 0.0, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'opColor'}>
var opColor : <_PropertyDeferred, , {'name': 'Operators', 'default': (1.0, 0.18, 0.0, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'opColor'}>
var parenColor : <_PropertyDeferred, , {'name': 'parenthesis', 'default': (0.7, 0.07, 0.01, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'parenColor'}>
var parenColor : <_PropertyDeferred, , {'name': 'parenthesis', 'default': (0.7, 0.07, 0.01, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'parenColor'}>
var qualifierColor : <_PropertyDeferred, , {'name': 'Qualifiers', 'default': (0.18, 0.77, 0.01, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'qualifierColor'}>
var qualifierColor : <_PropertyDeferred, , {'name': 'Qualifiers', 'default': (0.18, 0.77, 0.01, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'qualifierColor'}>
var stringColor : <_PropertyDeferred, , {'name': 'Strings', 'default': (0.96, 0.85, 0.0, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'stringColor'}>
var stringColor : <_PropertyDeferred, , {'name': 'Strings', 'default': (0.96, 0.85, 0.0, 1.0), 'size': 4, 'min': 0, 'max': 1, 'update': , 'subtype': 'COLOR', 'attr': 'stringColor'}>
var render_objects : <_PropertyDeferred, , {'default': True, 'description': 'Show / hide objects for render engines', 'update': BlenderObjects.render_objects_update() at 0x7f9ede763dc0>, 'attr': 'render_objects'}>
var render_objects : <_PropertyDeferred, , {'default': True, 'description': 'Show / hide objects for render engines', 'update': BlenderObjects.render_objects_update() at 0x7f8b66449c10>, 'attr': 'render_objects'}>
var selectable_objects : <_PropertyDeferred, , {'default': True, 'description': 'Make objects selectable / unselectable', 'update': BlenderObjects.selectable_objects_update() at 0x7f9ede763d30>, 'attr': 'selectable_objects'}>
var selectable_objects : <_PropertyDeferred, , {'default': True, 'description': 'Make objects selectable / unselectable', 'update': BlenderObjects.selectable_objects_update() at 0x7f8b66449b80>, 'attr': 'selectable_objects'}>
var show_objects : <_PropertyDeferred, , {'default': True, 'description': 'Show / hide objects in viewport', 'update': BlenderObjects.show_objects_update() at 0x7f9ede763e50>, 'attr': 'show_objects'}>
var show_objects : <_PropertyDeferred, , {'default': True, 'description': 'Show / hide objects in viewport', 'update': BlenderObjects.show_objects_update() at 0x7f8b66449ca0>, 'attr': 'show_objects'}>
var base_data_name : <_PropertyDeferred, , {'default': 'Alpha', 'description': 'stores the mesh name found in the object, this mesh is instanced', 'update': , 'attr': 'base_data_name'}>
var base_data_name : <_PropertyDeferred, , {'default': 'Alpha', 'description': 'stores the mesh name found in the object, this mesh is instanced', 'update': , 'attr': 'base_data_name'}>
var is_active : <_PropertyDeferred, , {'name': 'Live', 'default': True, 'update': , 'description': 'When enabled this will process incoming data', 'attr': 'is_active'}>
var is_active : <_PropertyDeferred, , {'name': 'Live', 'default': True, 'update': , 'description': 'When enabled this will process incoming data', 'attr': 'is_active'}>
var base_data_name : <_PropertyDeferred, , {'default': 'Alpha', 'description': 'stores the mesh name found in the object, this mesh is instanced', 'update': , 'attr': 'base_data_name'}>
var base_data_name : <_PropertyDeferred, , {'default': 'Alpha', 'description': 'stores the mesh name found in the object, this mesh is instanced', 'update': , 'attr': 'base_data_name'}>
var collection : <_PropertyDeferred, , {'type': , 'update': , 'description': 'Collection where to put objects', 'attr': 'collection'}>
var collection : <_PropertyDeferred, , {'type': , 'update': , 'description': 'Collection where to put objects', 'attr': 'collection'}>
var is_active : <_PropertyDeferred, , {'name': 'Live', 'default': True, 'update': , 'description': 'When enabled this will process incoming data', 'attr': 'is_active'}>
var is_active : <_PropertyDeferred, , {'name': 'Live', 'default': True, 'update': , 'description': 'When enabled this will process incoming data', 'attr': 'is_active'}>
var list_match : <_PropertyDeferred, , {'name': 'List Match', 'description': 'Behavior on different list lengths', 'items': [('SHORT', 'Short', 'Match shortest List', 1), ('CYCLE', 'Cycle', 'Match longest List by cycling', 2), ('REPEAT', 'Repeat Last', 'Match longest List by repeating last item', 3)], 'default': 'REPEAT', 'update': , 'attr': 'list_match'}>
var list_match : <_PropertyDeferred, , {'name': 'List Match', 'description': 'Behavior on different list lengths', 'items': [('SHORT', 'Short', 'Match shortest List', 1), ('CYCLE', 'Cycle', 'Match longest List by cycling', 2), ('REPEAT', 'Repeat Last', 'Match longest List by repeating last item', 3)], 'default': 'REPEAT', 'update': , 'attr': 'list_match'}>
var draw_3dpanel : <_PropertyDeferred, , {'name': 'To 3D Panel', 'description': 'Show this node in 3D panel', 'default': False, 'update': Show3DProperties. at 0x7f9edeb404c0>, 'attr': 'draw_3dpanel'}>
var draw_3dpanel : <_PropertyDeferred, , {'name': 'To 3D Panel', 'description': 'Show this node in 3D panel', 'default': False, 'update': Show3DProperties. at 0x7f8b665d58b0>, 'attr': 'draw_3dpanel'}>
var my_enum : <_PropertyDeferred, , {'items': item_cb() at 0x7f9edea02dc0>, 'attr': 'my_enum'}>
var my_enum : <_PropertyDeferred, , {'items': item_cb() at 0x7f8b66496280>, 'attr': 'my_enum'}>
sverchok.utils.sv_bmesh_utils
sverchok.utils.sv_bmesh_utils
+def calc_center_mass_bmesh(center_mode, mesh_vertices, mesh_edges, mesh_faces, mass_of_vertices=None, object_density=None, skip_test_volume_are_closed=False, quad_mode='BEAUTY', ngon_mode='BEAUTY')
+
Calculate center of mass for single mesh.
+https://github.com/nortikin/sverchok/assets/14288520/e432b5c0-35e5-432b-8c9f-798f58b71f13
def calc_center_mass_bmesh(center_mode, mesh_vertices, mesh_edges, mesh_faces, mass_of_vertices=None, object_density=None, skip_test_volume_are_closed=False, quad_mode="BEAUTY", ngon_mode="BEAUTY"):
+ '''
+ Calculate center of mass for single mesh.
+
+ Input:
+ - center_mode=['VERTICES', 'EDGES', 'FACES', 'VOLUMES']
+ - mesh_vertices = [[x1,y1,z1],[x2,y2,z2],...] (float) - vertices of mesh
+ - mesh_edges = [[0,1],[1,2],[2,3],...] (int) - indixes of verts (edges)
+ - mesh_faces = [[0,1,2],[1,2,3,4,...], ...] - indixes of verts (faces)
+ - mass_of_vertices = [ [ 1.1, 1.0, 5.2, 0.2,...] ] - mass of every vert in mesh. Extrapolate a last value to the all vertices
+ - object_density = [1.2] - density of volume. If center_mode is EDGES or FACES then mass of objects are proportional to length or area.
+ - skip_test_volume_are_closed - (only for volume node) If you know that volume are close then you can speed up performance if you set this parameter to True. False - force test mesh are closed.
+ - quad_mode [BEAUTY, FIXED, ALTERNATE, SHORT_EDGE], ngon_mode [BEAUTY, EAR_CLIP] - modes for triangulation if mesh has faces with 4 and more vertices (for center_mode FACES of VOLUMES only)
+
+ Output:
+
+ - result_mask - True/False. If False then another output params are None
+ - result_vertices, result_edges, result_polygons - result mesh (source mesh or triangulated mesh)
+ - result_center_mass_mesh - center of mass of mesh
+ - result_mass_mesh - mass of mesh
+ - result_size_mesh - for VERTICES - count vertices, for EDGES - length of edges, for FACES - area of mesh, for VOLUMES - volume of mesh
+
+ Example:
+ https://github.com/nortikin/sverchok/assets/14288520/e432b5c0-35e5-432b-8c9f-798f58b71f13
+ '''
+ result_mask = result_vertices_I = result_edges_I = result_polygons_I = result_center_mass_mesh_I = result_mass_mesh_I = result_size_mesh_I = None
+
+ vertices_I, edges_I, faces_I, mass_of_vertices_I, density_I = mesh_vertices, mesh_edges, mesh_faces, mass_of_vertices, object_density
+
+ if mass_of_vertices_I is None:
+ mass_of_vertices_I=[1]
+ if density_I is None:
+ density_I=[1]
+
+ if len(vertices_I)==0:
+ # skip mesh if no vertices at all:
+ result_mask = False
+
+ if center_mode=='VERTICES':
+
+ if len(vertices_I)==0:
+ result_mask = False
+ else:
+ result_mask = True
+ result_vertices_I = vertices_I
+ result_edges_I = edges_I
+ result_polygons_I = faces_I
+
+ # shrink or extend list of mass if list of mass is not equals list of verts:
+ mass_of_vertices_I_shrinked = mass_of_vertices_I[:len(vertices_I)]
+ mass_of_vertices_I_np1 = np.append( mass_of_vertices_I_shrinked, np.full( (len(vertices_I)-len(mass_of_vertices_I_shrinked)), mass_of_vertices_I_shrinked[-1]) )
+ vertices_I_np = np.array(vertices_I)
+ mass_of_vertices_I_np2 = np.array([mass_of_vertices_I_np1])
+ mass_I = mass_of_vertices_I_np2.sum()
+ center_mass_mesh_I_np = (vertices_I_np * mass_of_vertices_I_np2.T).sum(axis=0) / mass_I
+
+ result_center_mass_mesh_I = center_mass_mesh_I_np.tolist()
+ result_mass_mesh_I = mass_I
+ result_size_mesh_I = vertices_I_np.shape[0] # Count of vertices
+
+ elif center_mode=='EDGES':
+
+ old_edges = np.array(edges_I)
+ if old_edges.size==0:
+ # skip mesh if no edges at all:
+ result_mask = False
+ else:
+ result_mask = True
+ verts_I = np.array(vertices_I)
+
+ # Do not triangulate mesh for 'EDGE' mode
+ result_vertices_I = vertices_I
+ result_edges_I = edges_I
+ result_polygons_I = faces_I
+
+ segment_I = verts_I[old_edges]
+ distances_I = np.linalg.norm(segment_I[:,1]-segment_I[:,0], axis=1)
+ length_I = distances_I.sum()
+ segment_center_I = segment_I.sum(axis=1) / 2.0
+ center_mass_mesh_I_np = (segment_center_I * distances_I[np.newaxis].T).sum(axis=0) / length_I
+ mass_I = length_I * density_I[0]
+
+ result_center_mass_mesh_I = center_mass_mesh_I_np.tolist()
+ result_mass_mesh_I = mass_I
+ result_size_mesh_I = length_I
+
+ elif center_mode=='FACES':
+
+ faces_I_np = np.array(faces_I)
+ if faces_I_np.size==0:
+ # skip mesh if no faces at all:
+ result_mask = False
+ else:
+ result_mask = True
+
+ # test if some polygons are not tris:
+ if max(map(len, faces_I_np))>3:
+ # triangulate mesh for 'FACES' mode
+ bm_I = bmesh_from_pydata(vertices_I, edges_I, faces_I, markup_face_data=True, normal_update=True)
+ b_faces = []
+ for face in bm_I.faces:
+ b_faces.append(face)
+ res = bmesh.ops.triangulate(
+ bm_I, faces=b_faces, quad_method=quad_mode, ngon_method=ngon_mode
+ )
+ new_vertices_I, new_edges_I, new_faces_I = pydata_from_bmesh(bm_I)
+ bm_I.free()
+ else:
+ new_vertices_I,new_edges_I,new_faces_I = vertices_I, edges_I, faces_I
+
+ result_vertices_I = new_vertices_I
+ result_edges_I = new_edges_I
+ result_polygons_I = new_faces_I
+
+ verts_I_np = np.array(new_vertices_I)
+ faces_I_np = np.array(new_faces_I)
+ tris_I_np = verts_I_np[faces_I_np]
+ areases_I = np.linalg.norm(np.cross(tris_I_np[:,1]-tris_I_np[:,0], tris_I_np[:,2]-tris_I_np[:,0]) / 2.0, axis=1)
+ area_I = areases_I.sum()
+ tris_centers_I = tris_I_np.sum(axis=1) / 3.0
+ center_mass_mesh_I_np = (tris_centers_I * areases_I[np.newaxis].T).sum(axis=0) / area_I
+ mass_I = area_I * density_I[0]
+
+ result_center_mass_mesh_I = center_mass_mesh_I_np.tolist()
+ result_mass_mesh_I = mass_I
+ result_size_mesh_I = area_I
+
+ elif center_mode=='VOLUMES':
+
+ faces_I_np = np.array(faces_I)
+ if faces_I_np.size==0:
+ # skip mesh if no faces at all:
+ result_mask = False
+ else:
+ do_calc = False
+ if max(map(len, faces_I_np))==3 and skip_test_volume_are_closed==True:
+ new_vertices_I, new_edges_I, new_faces_I = vertices_I, edges_I, faces_I
+ do_calc = True
+ else:
+ # triangulate mesh
+ bm_I = bmesh_from_pydata(vertices_I, edges_I, faces_I, markup_face_data=True, normal_update=True)
+ # test if all edges are contiguous (https://docs.blender.org/api/current/bmesh.types.html#bmesh.types.BMEdge.is_contiguous)
+ # then volume is closed:
+ for edge in bm_I.edges:
+ if edge.is_contiguous==False:
+ do_calc = False
+ break
+ else:
+ do_calc = True
+ # test if some polygons are not tris:
+ if max(map(len, faces_I_np))>3:
+ b_faces = []
+ for face in bm_I.faces:
+ b_faces.append(face)
+
+ res = bmesh.ops.triangulate(
+ bm_I, faces=b_faces, quad_method=quad_mode, ngon_method=ngon_mode
+ )
+ new_vertices_I, new_edges_I, new_faces_I = pydata_from_bmesh(bm_I)
+ else:
+ new_vertices_I, new_edges_I, new_faces_I = vertices_I, edges_I, faces_I
+ bm_I.free()
+
+ if do_calc==False:
+ result_mask = False
+ else:
+ result_mask = True
+ result_vertices_I = new_vertices_I
+ result_edges_I = new_edges_I
+ result_polygons_I = new_faces_I
+
+ verts_I = np.array(new_vertices_I)
+ faces_I = np.array(new_faces_I)
+ tris_I = verts_I[faces_I]
+ # to precise calc move all mesh to median point
+ tris_I_median = np.median(tris_I, axis=(0,1))
+ tris_I_delta = tris_I-tris_I_median
+ signed_volumes_I = np_dot(tris_I_delta[:,0], np.cross(tris_I_delta[:,1], tris_I_delta[:,2]))
+ volume_I = signed_volumes_I.sum()
+ tetra_centers_I = tris_I_delta.sum(axis=1) / 4.0
+ center_mass_mesh_I_np = (tetra_centers_I * signed_volumes_I[np.newaxis].T).sum(axis=0) / volume_I + tris_I_median
+ mass_I = volume_I * density_I[0]
+
+ result_center_mass_mesh_I = center_mass_mesh_I_np.tolist()
+ result_mass_mesh_I = mass_I
+ result_size_mesh_I = volume_I
+ else:
+ raise Exception(f'calc_center_of_mesh: param \'center_mode\'={center_mode} must be in [\'VERTICES\', \'EDGES\', \'FACES\', \'VOLUMES\']')
+
+ return result_mask, result_vertices_I, result_edges_I, result_polygons_I, result_center_mass_mesh_I, result_mass_mesh_I, result_size_mesh_I
+
def diamond_mesh(bm)
bmesh_from_edit_mesh
bmesh_from_pydata
bmesh_join
calc_center_mass_bmesh
diamond_mesh
dual_mesh
edge_data_from_bmesh_edges
var activate : <_PropertyDeferred, , {'name': 'activate', 'description': 'When enabled this will process incoming data', 'default': True, 'update': , 'attr': 'activate'}>
var activate : <_PropertyDeferred, , {'name': 'activate', 'description': 'When enabled this will process incoming data', 'default': True, 'update': , 'attr': 'activate'}>
var basedata_name : <_PropertyDeferred, , {'name': 'basedata name', 'default': 'Alpha', 'description': 'which base name the object and data will use', 'update': , 'attr': 'basedata_name'}>
var basedata_name : <_PropertyDeferred, , {'name': 'basedata name', 'default': 'Alpha', 'description': 'which base name the object and data will use', 'update': , 'attr': 'basedata_name'}>
var custom_collection_name : <_PropertyDeferred, , {'name': 'collection name', 'update': , 'description': 'custom collection name, will default to the basename of the node first', 'attr': 'custom_collection_name'}>
var custom_collection_name : <_PropertyDeferred, , {'name': 'collection name', 'update': , 'description': 'custom collection name, will default to the basename of the node first', 'attr': 'custom_collection_name'}>
var layer_choice : <_PropertyDeferred, , {'subtype': 'LAYER', 'size': 20, 'name': 'Layer Choice', 'update': SvObjHelper.layer_updateNode() at 0x7f9ede758af0>, 'description': 'This sets which layer objects are placed on', 'get': SvObjHelper.g() at 0x7f9ede7589d0>, 'set': SvObjHelper.s() at 0x7f9ede758a60>, 'attr': 'layer_choice'}>
var layer_choice : <_PropertyDeferred, , {'subtype': 'LAYER', 'size': 20, 'name': 'Layer Choice', 'update': SvObjHelper.layer_updateNode() at 0x7f8b663fc8b0>, 'description': 'This sets which layer objects are placed on', 'get': SvObjHelper.g() at 0x7f8b663fc790>, 'set': SvObjHelper.s() at 0x7f8b663fc820>, 'attr': 'layer_choice'}>
var material_pointer : <_PropertyDeferred, , {'type': , 'poll': SvObjHelper. at 0x7f9ede758ee0>, 'update': , 'attr': 'material_pointer'}>
var material_pointer : <_PropertyDeferred, , {'type': , 'poll': SvObjHelper. at 0x7f8b663fcca0>, 'update': , 'attr': 'material_pointer'}>
var parent_to_empty : <_PropertyDeferred, , {'name': 'parent to empty', 'default': False, 'update': , 'attr': 'parent_to_empty'}>
var parent_to_empty : <_PropertyDeferred, , {'name': 'parent to empty', 'default': False, 'update': , 'attr': 'parent_to_empty'}>
var show_wire : <_PropertyDeferred, , {'name': 'show wire', 'update': , 'attr': 'show_wire'}>
var show_wire : <_PropertyDeferred, , {'name': 'show wire', 'update': , 'attr': 'show_wire'}>
var use_smooth : <_PropertyDeferred, , {'name': 'use smooth', 'default': True, 'update': , 'attr': 'use_smooth'}>
var use_smooth : <_PropertyDeferred, , {'name': 'use smooth', 'default': True, 'update': , 'attr': 'use_smooth'}>
var angle_units : <_PropertyDeferred, , {'name': 'Angle Units', 'description': 'Angle units (Radians/Degrees/Unities)', 'default': 'DEG', 'items': [('RAD', 'Radians', 'Radians (0-2pi)', '', 0), ('DEG', 'Degrees', 'Degrees (0.0-360.0)', '', 1), ('UNI', 'Unities', 'Unities (0.0-1.0)', '', 2)], 'update': SvAngleHelper.update_angle_units() at 0x7f9edeb4e700>, 'attr': 'angle_units'}>
var angle_units : <_PropertyDeferred, , {'name': 'Angle Units', 'description': 'Angle units (Radians/Degrees/Unities)', 'default': 'DEG', 'items': [('RAD', 'Radians', 'Radians (0-2pi)', '', 0), ('DEG', 'Degrees', 'Degrees (0.0-360.0)', '', 1), ('UNI', 'Unities', 'Unities (0.0-1.0)', '', 2)], 'update': SvAngleHelper.update_angle_units() at 0x7f8b666bf8b0>, 'attr': 'angle_units'}>
var euler_order : <_PropertyDeferred, , {'name': 'Euler Order', 'description': 'Order of the Euler rotations', 'default': 'XYZ', 'items': [('XYZ', 'XYZ', '', 0), ('XZY', 'XZY', '', 1), ('YXZ', 'YXZ', '', 2), ('YZX', 'YZX', '', 3), ('ZXY', 'ZXY', '', 4), ('ZYX', 'ZYX', '', 5)], 'update': , 'attr': 'euler_order'}>
var euler_order : <_PropertyDeferred, , {'name': 'Euler Order', 'description': 'Order of the Euler rotations', 'default': 'XYZ', 'items': [('XYZ', 'XYZ', '', 0), ('XZY', 'XZY', '', 1), ('YXZ', 'YXZ', '', 2), ('YZX', 'YZX', '', 3), ('ZXY', 'ZXY', '', 4), ('ZYX', 'ZYX', '', 5)], 'update': , 'attr': 'euler_order'}>
sverchok.utils.voronoi3d
sverchok.utils.voronoi3d
sverchok.utils.voronoi3d
sverchok.utils.voronoi3d
sverchok.utils.voronoi3d
sverchok.utils.voronoi3d
-def voronoi_on_mesh(verts, faces, sites, thickness, spacing=0.0, clip_inner=True, clip_outer=True, do_clip=True, clipping=1.0, mode='REGIONS', normal_update=False, precision=1e-08)
+def voronoi_on_mesh(verts, faces, sites, thickness, spacing=0.0, clip_inner=True, clip_outer=True, do_clip=True, clipping=1.0, mode='REGIONS', normal_update=False, precision=1e-08, mask=[])
-def voronoi_on_mesh_bmesh(verts, faces, n_orig_sites, sites, spacing=0.0, mode='VOLUME', normal_update=False, precision=1e-08)
+def voronoi_on_mesh_bmesh(verts, faces, n_orig_sites, sites, spacing=0.0, mode='VOLUME', normal_update=False, precision=1e-08, mask=[])
def voronoi_on_mesh_bmesh(verts, faces, n_orig_sites, sites, spacing=0.0, mode='VOLUME', normal_update = False, precision=1e-8):
+def voronoi_on_mesh_bmesh(verts, faces, n_orig_sites, sites, spacing=0.0, mode='VOLUME', normal_update = False, precision=1e-8, mask=[]):
def get_sites_delaunay_params(delaunay, n_orig_sites):
result = defaultdict(list)
@@ -1754,18 +1795,40 @@ Functions
edges_out = []
faces_out = []
- # https://github.com/nortikin/sverchok/pull/4952
- # http://www.qhull.org/html/qdelaun.htm
- # http://www.qhull.org/html/qh-optc.htm
- # https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.Delaunay.html
- # Convert sites to 4D
- np_sites = np.array([(s[0], s[1], s[2], 0) for s in sites], dtype=np.float32)
- # Add 3D tetraedre to the 4D with W=1
- np_sites = np.append(np_sites, [[0.0, 0.0, 0.0, 1],
- [1.0, 0.0, 0.0, 1],
- [0.0, 1.0, 0.0, 1],
- [0.0, 0.0, 1.0, 1],
- ], axis=0)
+ are_sites_plane = True # plane or line
+ if len(sites)>=4:
+ # select random sites to test are they are tethraeder or 3D?
+ # If this thethod get wrong answer then not optimal method will be used.
+ list_sites_for_test_plane = random.sample( range(0, len(sites)), 4)
+ v0 = Vector(sites[list_sites_for_test_plane[0]])
+ v1 = Vector(sites[list_sites_for_test_plane[1]])-v0
+ v2 = Vector(sites[list_sites_for_test_plane[2]])-v0
+ v3 = Vector(sites[list_sites_for_test_plane[3]])-v0
+ cross1_v1_v2 = np.cross(v1, v2)
+ cross2_v1_v3 = np.cross(v1, v3)
+ cross12 = np.cross(cross1_v1_v2, cross2_v1_v3)
+
+ res_norm = np.linalg.norm(cross12,ord=1)
+ if res_norm>0.1:
+ are_sites_plane = False
+ else:
+ are_sites_plane = True
+
+ if are_sites_plane:
+ # https://github.com/nortikin/sverchok/pull/4952
+ # http://www.qhull.org/html/qdelaun.htm
+ # http://www.qhull.org/html/qh-optc.htm
+ # https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.Delaunay.html
+ # Convert sites to 4D
+ np_sites = np.array([(s[0], s[1], s[2], 0) for s in sites], dtype=np.float32)
+ # Add 3D tetraedre to the 4D with W=1
+ np_sites = np.append(np_sites, [[0.0, 0.0, 0.0, 1],
+ [1.0, 0.0, 0.0, 1],
+ [0.0, 1.0, 0.0, 1],
+ [0.0, 0.0, 1.0, 1],
+ ], axis=0)
+ else:
+ np_sites = np.array([(s[0], s[1], s[2]) for s in sites], dtype=np.float32)
delaunay = Delaunay(np.array(np_sites, dtype=np.float32))
sites_delaunay_params = get_sites_delaunay_params(delaunay, n_orig_sites)
@@ -1780,17 +1843,28 @@ Functions
# using for precalc unneeded bisects
bbox_aligned, *_ = bounding_box_aligned(verts)
+ # Extend mask if it is less len of sites
+ if len(mask)==0:
+ # if len of mask is 0 then use all sites
+ mask = [True] * ( len(sites)-len(mask) )
+ else:
+ # else extend mask by false and do not use sites that are not in the mask
+ mask = mask[:]+[False]*(len(sites)-len(mask) if len(mask)<=len(sites) else 0)
+
start_mesh = bmesh_from_pydata(verts, [], faces, normal_update=False)
used_sites_idx = []
+ used_sites_verts = []
for site_idx in range(len(sites)):
- cell = cut_cell(start_mesh, sites_delaunay_params, site_idx, spacing[site_idx], center_of_mass, bbox_aligned)
- if cell is not None:
- new_verts, new_edges, new_faces = cell
- if new_verts:
- verts_out.append(new_verts)
- edges_out.append(new_edges)
- faces_out.append(new_faces)
- used_sites_idx.append( site_idx )
+ if(mask[site_idx]):
+ cell = cut_cell(start_mesh, sites_delaunay_params, site_idx, spacing[site_idx], center_of_mass, bbox_aligned)
+ if cell is not None:
+ new_verts, new_edges, new_faces = cell
+ if new_verts:
+ verts_out.append(new_verts)
+ edges_out.append(new_edges)
+ faces_out.append(new_faces)
+ used_sites_idx.append( site_idx )
+ used_sites_verts.append( sites[site_idx] )
start_mesh.clear() # remember to clear empty geometry
start_mesh.free()
@@ -1799,8 +1873,9 @@ Functions
# bisects - count of bisects in cut_cell
# unb - unpredicted erased mesh (bbox_aligned cannot make predicted results)
# sites - count of sites in process
+ # mask - mask of sites that uset to the result. Empty list all sites uset to result.
# print( f"bisects: {num_bisect: 4d}, unb={num_unpredicted_erased: 4d}, sites={len(sites)}")
- return verts_out, edges_out, faces_out, used_sites_idx
+ return verts_out, edges_out, faces_out, used_sites_idx, used_sites_verts
diff --git a/generated.txt b/generated.txt
index 5a9cd96655..38ec7090c3 100644
--- a/generated.txt
+++ b/generated.txt
@@ -1 +1 @@
-Sat Apr 6 11:02:37 UTC 2024
+Sat Apr 6 13:21:16 UTC 2024