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 @@

Class variables

-
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'}>
@@ -3506,11 +3506,11 @@

Class variables

-
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'}>
@@ -3518,7 +3518,7 @@

Class variables

-
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'}>
diff --git a/apidocs/sverchok/core/sockets.html b/apidocs/sverchok/core/sockets.html index 193cc0c762..5455dd3a5b 100644 --- a/apidocs/sverchok/core/sockets.html +++ b/apidocs/sverchok/core/sockets.html @@ -1931,7 +1931,7 @@

Subclasses

Class variables

-
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'}>
@@ -2097,7 +2097,7 @@

Class variables

-
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'}>
@@ -2194,7 +2194,7 @@

Class variables

-
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'}>
@@ -2334,7 +2334,7 @@

Class variables

-
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'}>
@@ -2910,11 +2910,11 @@

Class variables

-
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'}>
@@ -3020,7 +3020,7 @@

Class variables

-
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'}>
@@ -3260,7 +3260,7 @@

Class variables

-
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'}>
@@ -3731,7 +3731,7 @@

Class variables

-
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'}>
@@ -3954,11 +3954,11 @@

Class variables

-
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'}>
@@ -4234,7 +4234,7 @@

Class variables

-
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'}>
@@ -5691,27 +5691,27 @@

Class variables

-
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'}>
@@ -6431,11 +6431,11 @@

Class variables

-
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'}>
@@ -6451,7 +6451,7 @@

Class variables

-
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'}>
@@ -6826,7 +6826,7 @@

Class variables

-
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'}>
@@ -7320,7 +7320,7 @@

Class variables

-
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'}>
@@ -7396,7 +7396,7 @@

Class variables

-
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'}>
@@ -7693,7 +7693,7 @@

Class variables

-
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'}>
diff --git a/apidocs/sverchok/node_tree.html b/apidocs/sverchok/node_tree.html index f79dc69e40..7cc561c69f 100644 --- a/apidocs/sverchok/node_tree.html +++ b/apidocs/sverchok/node_tree.html @@ -1607,11 +1607,11 @@

Subclasses

Class variables

-
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'}>
@@ -1895,11 +1895,11 @@

Class variables

effect not all nodes but only those which have property 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 @@

Class variables

  • etc.
  • -
    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

    @@ -2367,6 +2367,7 @@

    Subclasses

  • sverchok.nodes.analyzer.steiner_ellipse.SvSteinerEllipseNode
  • sverchok.nodes.analyzer.volume.SvVolumeNodeMK2
  • sverchok.nodes.analyzer.wave_paint.SvWavePainterNode
  • +
  • sverchok.nodes.analyzer.weighted_vector_sum.SvWeightedVectorSumNode
  • sverchok.nodes.color.color_in_mk1.SvColorsInNodeMK1
  • sverchok.nodes.color.color_input.SvColorInputNode
  • sverchok.nodes.color.color_mix.SvColorMixNode
  • @@ -2809,7 +2810,7 @@

    Subclasses

  • sverchok.nodes.spatial.random_points_on_mesh.SvRandomPointsOnMesh
  • sverchok.nodes.spatial.voronoi3d.SvExVoronoi3DNode
  • sverchok.nodes.spatial.voronoi_2d.Voronoi2DNode
  • -
  • sverchok.nodes.spatial.voronoi_on_mesh_mk2.SvVoronoiOnMeshNodeMK2
  • +
  • sverchok.nodes.spatial.voronoi_on_mesh_mk2.SvVoronoiOnMeshNodeMK3
  • sverchok.nodes.spatial.voronoi_on_solid_mk2.SvVoronoiOnSolidNodeMK2
  • sverchok.nodes.spatial.voronoi_on_surface.SvVoronoiOnSurfaceNode
  • sverchok.nodes.spatial.voronoi_sphere.SvExVoronoiSphereNode
  • @@ -3624,7 +3625,7 @@

    Subclasses

    Class variables

    -
    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.

    @@ -3635,7 +3636,7 @@

    Class variables

    Also the node should use SverchCustomTreeNode.sv_draw_buttons().

    image

    -
    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 @@

    Class variables

    ⚠️ 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().

    image

    diff --git a/apidocs/sverchok/utils/curve/nurbs_solver.html b/apidocs/sverchok/utils/curve/nurbs_solver.html index 351ca6e0b2..2881007a15 100644 --- a/apidocs/sverchok/utils/curve/nurbs_solver.html +++ b/apidocs/sverchok/utils/curve/nurbs_solver.html @@ -2643,7 +2643,7 @@

    Methods

    -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)
    diff --git a/apidocs/sverchok/utils/nodes_mixins/console_mixin.html b/apidocs/sverchok/utils/nodes_mixins/console_mixin.html index 40dfdde0dd..0ee1d8974b 100644 --- a/apidocs/sverchok/utils/nodes_mixins/console_mixin.html +++ b/apidocs/sverchok/utils/nodes_mixins/console_mixin.html @@ -518,19 +518,19 @@

    Subclasses

    Class variables

    -
    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'}>
    @@ -538,23 +538,23 @@

    Class variables

    -
    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'}>
    @@ -562,23 +562,23 @@

    Class variables

    -
    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'}>
    diff --git a/apidocs/sverchok/utils/nodes_mixins/generating_objects.html b/apidocs/sverchok/utils/nodes_mixins/generating_objects.html index ebbae77ed4..d27628186d 100644 --- a/apidocs/sverchok/utils/nodes_mixins/generating_objects.html +++ b/apidocs/sverchok/utils/nodes_mixins/generating_objects.html @@ -867,15 +867,15 @@

    Class variables

    -
    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'}>
    @@ -2579,11 +2579,11 @@

    Subclasses

    Class variables

    -
    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'}>
    @@ -2862,15 +2862,15 @@

    Subclasses

    Class variables

    -
    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'}>
    diff --git a/apidocs/sverchok/utils/nodes_mixins/recursive_nodes.html b/apidocs/sverchok/utils/nodes_mixins/recursive_nodes.html index 16775440f6..55e39720ad 100644 --- a/apidocs/sverchok/utils/nodes_mixins/recursive_nodes.html +++ b/apidocs/sverchok/utils/nodes_mixins/recursive_nodes.html @@ -472,6 +472,7 @@

    Subclasses

  • sverchok.nodes.analyzer.mesh_select_mk2.SvMeshSelectNodeMk2
  • sverchok.nodes.analyzer.nearest_point_on_mesh.SvNearestPointOnMeshNode
  • sverchok.nodes.analyzer.normals_mk2.SvGetNormalsNodeMk2
  • +
  • sverchok.nodes.analyzer.weighted_vector_sum.SvWeightedVectorSumNode
  • sverchok.nodes.generator.icosphere.SvIcosphereNode
  • sverchok.nodes.matrix.matrix_out_mk2.SvMatrixOutNodeMK2
  • sverchok.nodes.modifier_change.extrude_edges_mk2.SvExtrudeEdgesNodeMk2
  • @@ -492,7 +493,7 @@

    Class variables

    -
    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'}>
    diff --git a/apidocs/sverchok/utils/nodes_mixins/show_3d_properties.html b/apidocs/sverchok/utils/nodes_mixins/show_3d_properties.html index 4f2be5d215..a1deeaba1e 100644 --- a/apidocs/sverchok/utils/nodes_mixins/show_3d_properties.html +++ b/apidocs/sverchok/utils/nodes_mixins/show_3d_properties.html @@ -277,7 +277,7 @@

    Subclasses

    Class variables

    -
    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'}>
    diff --git a/apidocs/sverchok/utils/snlite_script_searcher.html b/apidocs/sverchok/utils/snlite_script_searcher.html index 259f530ed3..21374c3f1c 100644 --- a/apidocs/sverchok/utils/snlite_script_searcher.html +++ b/apidocs/sverchok/utils/snlite_script_searcher.html @@ -225,7 +225,7 @@

    Class variables

    -
    var my_enum : <_PropertyDeferred, , {'items': item_cb() at 0x7f9edea02dc0>, 'attr': 'my_enum'}>
    +
    var my_enum : <_PropertyDeferred, , {'items': item_cb() at 0x7f8b66496280>, 'attr': 'my_enum'}>
    diff --git a/apidocs/sverchok/utils/sv_bmesh_utils.html b/apidocs/sverchok/utils/sv_bmesh_utils.html index d1632c3049..fccb760082 100644 --- a/apidocs/sverchok/utils/sv_bmesh_utils.html +++ b/apidocs/sverchok/utils/sv_bmesh_utils.html @@ -58,6 +58,7 @@

    Module sverchok.utils.sv_bmesh_utils

    from sverchok.data_structure import zip_long_repeat, has_element from sverchok.utils.sv_logging import sv_logger +from sverchok.utils.math import np_dot @contextmanager def empty_bmesh(use_operators=True): @@ -939,7 +940,198 @@

    Module sverchok.utils.sv_bmesh_utils

    bmesh.ops.recalc_face_normals(bm, faces=bm.faces) verts, edges, faces = pydata_from_bmesh(bm) bm.free() - return verts, edges, faces + return verts, edges, faces + +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
    @@ -1235,6 +1427,228 @@

    Functions

    return bm
    +
    +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

    +
    + +Expand source code + +
    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)
    @@ -2201,6 +2615,7 @@

    Index

  • bmesh_from_edit_mesh
  • bmesh_from_pydata
  • bmesh_join
  • +
  • calc_center_mass_bmesh
  • diamond_mesh
  • dual_mesh
  • edge_data_from_bmesh_edges
  • diff --git a/apidocs/sverchok/utils/sv_obj_helper.html b/apidocs/sverchok/utils/sv_obj_helper.html index e3e2c2c63d..ac40924cfd 100644 --- a/apidocs/sverchok/utils/sv_obj_helper.html +++ b/apidocs/sverchok/utils/sv_obj_helper.html @@ -888,15 +888,15 @@

    Subclasses

    Class variables

    -
    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'}>
    @@ -904,7 +904,7 @@

    Class variables

    -
    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'}>
    @@ -912,7 +912,7 @@

    Class variables

    -
    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'}>
    @@ -936,15 +936,15 @@

    Class variables

    -
    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'}>
    diff --git a/apidocs/sverchok/utils/sv_transform_helper.html b/apidocs/sverchok/utils/sv_transform_helper.html index 1521d1347e..8e86a2e854 100644 --- a/apidocs/sverchok/utils/sv_transform_helper.html +++ b/apidocs/sverchok/utils/sv_transform_helper.html @@ -345,11 +345,11 @@

    Subclasses

    Class variables

    -
    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'}>
    diff --git a/apidocs/sverchok/utils/voronoi3d.html b/apidocs/sverchok/utils/voronoi3d.html index 731a6ab842..e1cbdc9d90 100644 --- a/apidocs/sverchok/utils/voronoi3d.html +++ b/apidocs/sverchok/utils/voronoi3d.html @@ -51,6 +51,7 @@

    Module sverchok.utils.voronoi3d

    import bpy import bmesh +import random from mathutils import Vector from mathutils.bvhtree import BVHTree @@ -264,7 +265,7 @@

    Module sverchok.utils.voronoi3d

    return np.array(projections) # see additional info https://github.com/nortikin/sverchok/pull/4948 -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) @@ -419,18 +420,40 @@

    Module sverchok.utils.voronoi3d

    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) @@ -445,17 +468,28 @@

    Module sverchok.utils.voronoi3d

    # 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() @@ -464,14 +498,18 @@

    Module sverchok.utils.voronoi3d

    # 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 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-8): + precision = 1e-8, + mask = [] + ): + bvh = BVHTree.FromPolygons(verts, faces) npoints = len(sites) @@ -499,10 +537,10 @@

    Module sverchok.utils.voronoi3d

    else: # VOLUME, SURFACE all_points = sites[:] - verts, edges, faces, used_sites_idx = voronoi_on_mesh_bmesh(verts, faces, len(sites), all_points, + verts, edges, faces, used_sites_idx, used_sites_verts = voronoi_on_mesh_bmesh(verts, faces, len(sites), all_points, spacing = spacing, mode = mode, normal_update = normal_update, - precision = precision) - return verts, edges, faces, used_sites_idx + precision = precision, mask=mask) + return verts, edges, faces, used_sites_idx, used_sites_verts def project_solid_normals(shell, pts, thickness, add_plus=True, add_minus=True, predicate_plus=None, predicate_minus=None): k = 0.5*thickness @@ -1544,7 +1582,7 @@

    Functions

    -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=[])
    @@ -1556,7 +1594,10 @@

    Functions

    spacing = 0.0, clip_inner=True, clip_outer=True, do_clip=True, clipping=1.0, mode = 'REGIONS', normal_update=False, - precision = 1e-8): + precision = 1e-8, + mask = [] + ): + bvh = BVHTree.FromPolygons(verts, faces) npoints = len(sites) @@ -1584,14 +1625,14 @@

    Functions

    else: # VOLUME, SURFACE all_points = sites[:] - verts, edges, faces, used_sites_idx = voronoi_on_mesh_bmesh(verts, faces, len(sites), all_points, + verts, edges, faces, used_sites_idx, used_sites_verts = voronoi_on_mesh_bmesh(verts, faces, len(sites), all_points, spacing = spacing, mode = mode, normal_update = normal_update, - precision = precision) - return verts, edges, faces, used_sites_idx + precision = precision, mask=mask) + return verts, edges, faces, used_sites_idx, used_sites_verts
    -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=[])
    @@ -1599,7 +1640,7 @@

    Functions

    Expand source code -
    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