From 39d93edb4d4dfa2332f15e9bb7866506044e348d Mon Sep 17 00:00:00 2001 From: Victor Doval <10011941+vicdoval@users.noreply.github.com> Date: Tue, 1 Oct 2019 09:08:56 +0200 Subject: [PATCH 1/6] added bbox_mk2 --- index.md | 2 +- nodes/analyzer/bbox_mk2.py | 154 +++++++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 nodes/analyzer/bbox_mk2.py diff --git a/index.md b/index.md index 8fabe131f..0f1b7a6b7 100644 --- a/index.md +++ b/index.md @@ -48,7 +48,7 @@ SvRegularSolid ## Analyzers - SvBBoxNode + SvBBoxNodeMk2 SvDiameterNode SvVolumeNode SvAreaNode diff --git a/nodes/analyzer/bbox_mk2.py b/nodes/analyzer/bbox_mk2.py new file mode 100644 index 000000000..2fa7a9707 --- /dev/null +++ b/nodes/analyzer/bbox_mk2.py @@ -0,0 +1,154 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +from itertools import product + +import bpy +from mathutils import Matrix + +from sverchok.node_tree import SverchCustomTreeNode +from sverchok.data_structure import dataCorrect + + +class SvBBoxNodeMk2(bpy.types.Node, SverchCustomTreeNode): + '''Bounding box''' + bl_idname = 'SvBBoxNodeMk2' + bl_label = 'Bounding box' + bl_icon = 'NONE' + sv_icon = 'SV_BOUNDING_BOX' + + def sv_init(self, context): + son = self.outputs.new + self.inputs.new('SvVerticesSocket', 'Vertices') + + son('SvVerticesSocket', 'Vertices') + son('SvStringsSocket', 'Edges') + son('SvVerticesSocket', 'Mean') + son('SvMatrixSocket', 'Center') + son('SvStringsSocket', 'Min X') + son('SvStringsSocket', 'Min Y') + son('SvStringsSocket', 'Min Z') + son('SvStringsSocket', 'Max X') + son('SvStringsSocket', 'Max Y') + son('SvStringsSocket', 'Max Z') + son('SvStringsSocket', 'Size X') + son('SvStringsSocket', 'Size Y') + son('SvStringsSocket', 'Size Z') + + def process(self): + if not self.inputs['Vertices'].is_linked: + return + if not any(s.is_linked for s in self.outputs): + return + has_mat_out = bool(self.outputs['Center'].is_linked) + has_mean = bool(self.outputs['Mean'].is_linked) + has_vert_out = bool(self.outputs['Vertices'].is_linked) + has_min_x_out = bool(self.outputs['Min X'].is_linked) + has_min_y_out = bool(self.outputs['Min Y'].is_linked) + has_min_z_out = bool(self.outputs['Min Z'].is_linked) + has_max_x_out = bool(self.outputs['Max X'].is_linked) + has_max_y_out = bool(self.outputs['Max Y'].is_linked) + has_max_z_out = bool(self.outputs['Max Z'].is_linked) + has_size_x_out = bool(self.outputs['Size X'].is_linked) + has_size_y_out = bool(self.outputs['Size Y'].is_linked) + has_size_z_out = bool(self.outputs['Size Z'].is_linked) + vert = self.inputs['Vertices'].sv_get(deepcopy=False) + vert = dataCorrect(vert, nominal_dept=2) + has_limits = any(s.is_linked for s in self.outputs[4:]) + if vert: + verts_out = [] + edges_out = [] + edges = [ + (0, 1), (1, 3), (3, 2), (2, 0), # bottom edges + (4, 5), (5, 7), (7, 6), (6, 4), # top edges + (0, 4), (1, 5), (2, 6), (3, 7) # sides + ] + mat_out = [] + mean_out = [] + min_vals = [[],[],[]] + max_vals = [[],[],[]] + size_vals = [[],[],[]] + + for v in vert: + if has_mat_out or has_vert_out or has_limits: + maxmin = list(zip(map(max, *v), map(min, *v))) + print(maxmin) + out = list(product(*reversed(maxmin))) + verts_out.append([l[::-1] for l in out[::-1]]) + edges_out.append(edges) + if has_mat_out: + center = [(u+v)*.5 for u, v in maxmin] + mat = Matrix.Translation(center) + scale = [(u-v) for u, v in maxmin] + for i, s in enumerate(scale): + mat[i][i] = s + mat_out.append(mat) + if has_mean: + avr = list(map(sum, zip(*v))) + avr = [n/len(v) for n in avr] + mean_out.append([avr]) + if has_limits: + # min_vals[0].append([maxmin[0][1]]) + # min_vals[1].append([maxmin[1][1]]) + # min_vals[2].append([maxmin[2][1]]) + # max_vals[0].append([maxmin[0][0]]) + # max_vals[1].append([maxmin[1][0]]) + # max_vals[2].append([maxmin[2][0]]) + for i in range(3): + min_vals[i].append([maxmin[i][1]]) + max_vals[i].append([maxmin[i][0]]) + size_vals[i].append([maxmin[i][0]-maxmin[i][1]]) + + if has_vert_out: + self.outputs['Vertices'].sv_set(verts_out) + + if self.outputs['Edges'].is_linked: + self.outputs['Edges'].sv_set(edges_out) + + if has_mean: + self.outputs['Mean'].sv_set(mean_out) + + if self.outputs['Center'].is_linked: + self.outputs['Center'].sv_set(mat_out) + + if has_min_x_out: + self.outputs['Min X'].sv_set(min_vals[0]) + if has_min_y_out: + self.outputs['Min Y'].sv_set(min_vals[1]) + if has_min_z_out: + self.outputs['Min Z'].sv_set(min_vals[2]) + if has_max_x_out: + self.outputs['Max X'].sv_set(max_vals[0]) + if has_max_y_out: + self.outputs['Max Y'].sv_set(max_vals[1]) + if has_max_z_out: + self.outputs['Max Z'].sv_set(max_vals[2]) + if has_size_x_out: + self.outputs['Size X'].sv_set(size_vals[0]) + if has_size_y_out: + self.outputs['Size Y'].sv_set(size_vals[1]) + if has_size_z_out: + self.outputs['Size Z'].sv_set(size_vals[2]) + + +def register(): + bpy.utils.register_class(SvBBoxNodeMk2) + + +def unregister(): + bpy.utils.unregister_class(SvBBoxNodeMk2) -- GitLab From 98ea633ff6fede6ee8aa5c5a3305f7bdfa147605 Mon Sep 17 00:00:00 2001 From: Victor Doval <10011941+vicdoval@users.noreply.github.com> Date: Wed, 2 Oct 2019 08:51:19 +0200 Subject: [PATCH 2/6] bboxMk2 compact UI --- docs/nodes/analyzers/bbox.rst | 47 ------------ docs/nodes/analyzers/bbox_mk2.rst | 72 ++++++++++++++++++ nodes/analyzer/bbox_mk2.py | 104 +++++++++++++------------- {nodes/analyzer => old_nodes}/bbox.py | 2 + 4 files changed, 128 insertions(+), 97 deletions(-) delete mode 100644 docs/nodes/analyzers/bbox.rst create mode 100644 docs/nodes/analyzers/bbox_mk2.rst rename {nodes/analyzer => old_nodes}/bbox.py (98%) diff --git a/docs/nodes/analyzers/bbox.rst b/docs/nodes/analyzers/bbox.rst deleted file mode 100644 index dbff10294..000000000 --- a/docs/nodes/analyzers/bbox.rst +++ /dev/null @@ -1,47 +0,0 @@ -Bounding Box -============ - -Functionality -------------- - -Generates a special ordered *bounding box* from incoming Vertices. - -Inputs ------- - -**Vertices**, or a nested list of vertices that represent separate objects. - -Outputs -------- - -+----------+-----------+----------------------------------------------------------------------------+ -| Output | Type | Description | -+==========+===========+============================================================================+ -| Vertices | Vectors | One or more sets of Bounding Box vertices. | -+----------+-----------+----------------------------------------------------------------------------+ -| Edges | Key Lists | One or more sets of Edges corresponding to the Vertices of the same index. | -+----------+-----------+----------------------------------------------------------------------------+ -| Mean | Vectors | Arithmetic averages of the incoming sets of vertices | -+----------+-----------+----------------------------------------------------------------------------+ -| Center | Matrix | Represents the *Center* of the bounding box; the average of its vertices | -+----------+-----------+----------------------------------------------------------------------------+ - - - -Examples --------- - -*Mean: Average of incoming set of Vertices* - -.. image:: https://cloud.githubusercontent.com/assets/619340/4186539/def83614-3761-11e4-9cb4-4f7d8a8608bb.PNG - :alt: BBox_Mean1.PNG - -*Center: Average of the Bounding Box* - -.. image:: https://cloud.githubusercontent.com/assets/619340/4186538/def29d62-3761-11e4-8069-b9544e2ad62a.PNG - :alt: BBox_Center3.PNG - -Notes ------ - -GitHub issue tracker `discussion about this node `_ diff --git a/docs/nodes/analyzers/bbox_mk2.rst b/docs/nodes/analyzers/bbox_mk2.rst new file mode 100644 index 000000000..543beeda6 --- /dev/null +++ b/docs/nodes/analyzers/bbox_mk2.rst @@ -0,0 +1,72 @@ +Bounding Box +============ + +Functionality +------------- + +Generates a special ordered *bounding box* from incoming Vertices. + +Inputs +------ + +**Vertices**, or a nested list of vertices that represent separate objects. + +Parameters +---------- + +Min, Max and Size: Chose which outputs you want the node to display + +Outputs +------- + ++----------+-----------+----------------------------------------------------------------------------+ +| Output | Type | Description | ++==========+===========+============================================================================+ +| Vertices | Vectors | One or more sets of Bounding Box vertices. | ++----------+-----------+----------------------------------------------------------------------------+ +| Edges | Key Lists | One or more sets of Edges corresponding to the Vertices of the same index. | ++----------+-----------+----------------------------------------------------------------------------+ +| Mean | Vectors | Arithmetic averages of the incoming sets of vertices | ++----------+-----------+----------------------------------------------------------------------------+ +| Center | Matrix | Represents the *Center* of the bounding box; the average of its vertices. | +| | | The scale of the matrix would make a box with size of 1 unit to match the | +| | | size the desired bounding box | ++----------+-----------+----------------------------------------------------------------------------+ +| Min X | Scalar | Minimum value on the X axis | ++----------+-----------+----------------------------------------------------------------------------+ +| Min Y | Scalar | Minimum value on the Y axis | ++----------+-----------+----------------------------------------------------------------------------+ +| Min Z | Scalar | Minimum value on the Z axis | ++----------+-----------+----------------------------------------------------------------------------+ +| Max X | Scalar | Maximum value on the X axis | ++----------+-----------+----------------------------------------------------------------------------+ +| Max Y | Scalar | Maximum value on the Y axis | ++----------+-----------+----------------------------------------------------------------------------+ +| Max Z | Scalar | Maximum value on the Z axis | ++----------+-----------+----------------------------------------------------------------------------+ +| Size X | Scalar | Size on the X axis | ++----------+-----------+----------------------------------------------------------------------------+ +| Size Y | Scalar | Size on the Y axis | ++----------+-----------+----------------------------------------------------------------------------+ +| Size Z | Scalar | Size on the Z axis | ++----------+-----------+----------------------------------------------------------------------------+ + + + +Examples +-------- + +*Mean: Average of incoming set of Vertices* + +.. image:: https://cloud.githubusercontent.com/assets/619340/4186539/def83614-3761-11e4-9cb4-4f7d8a8608bb.PNG + :alt: BBox_Mean1.PNG + +*Center: Average of the Bounding Box* + +.. image:: https://cloud.githubusercontent.com/assets/619340/4186538/def29d62-3761-11e4-8069-b9544e2ad62a.PNG + :alt: BBox_Center3.PNG + +Notes +----- + +GitHub issue tracker `discussion about this node `_ diff --git a/nodes/analyzer/bbox_mk2.py b/nodes/analyzer/bbox_mk2.py index 2fa7a9707..9ad5b7439 100644 --- a/nodes/analyzer/bbox_mk2.py +++ b/nodes/analyzer/bbox_mk2.py @@ -19,10 +19,11 @@ from itertools import product import bpy +from bpy.props import BoolVectorProperty from mathutils import Matrix from sverchok.node_tree import SverchCustomTreeNode -from sverchok.data_structure import dataCorrect +from sverchok.data_structure import dataCorrect, updateNode class SvBBoxNodeMk2(bpy.types.Node, SverchCustomTreeNode): @@ -31,6 +32,38 @@ class SvBBoxNodeMk2(bpy.types.Node, SverchCustomTreeNode): bl_label = 'Bounding box' bl_icon = 'NONE' sv_icon = 'SV_BOUNDING_BOX' + def update_sockets(self, context): + bools = [self.min_list, self.max_list, self.size_list] + for i in range(3): + for j in range(3): + hidden = self.outputs[4+j+3*i].hide_safe + if bools[i][j]: + if hidden: + self.outputs[4+j+3*i].hide_safe = False + else : + self.outputs[4+j+3*i].hide_safe = True + + updateNode(self, context) + + min_list: BoolVectorProperty( + name='Min', description="Show Minimum values sockets", size=3, update=update_sockets) + max_list: BoolVectorProperty( + name='Max', description="Show Maximun values sockets", size=3, update=update_sockets) + size_list: BoolVectorProperty( + name='Size', description="Show Size values sockets", size=3, update=update_sockets) + + + + def draw_buttons(self, context, layout): + col = layout.column(align=True) + titles = ["Min", "Max", "Size"] + prop = ['min_list', 'max_list', 'size_list'] + for i in range(3): + row = col.row(align=True) + row.label(text=titles[i]) + row2 = row.row(align=True) + for j in range(3): + row2 .prop(self, prop[i], index=j, text='XYZ'[j], toggle=True) def sv_init(self, context): son = self.outputs.new @@ -40,15 +73,12 @@ class SvBBoxNodeMk2(bpy.types.Node, SverchCustomTreeNode): son('SvStringsSocket', 'Edges') son('SvVerticesSocket', 'Mean') son('SvMatrixSocket', 'Center') - son('SvStringsSocket', 'Min X') - son('SvStringsSocket', 'Min Y') - son('SvStringsSocket', 'Min Z') - son('SvStringsSocket', 'Max X') - son('SvStringsSocket', 'Max Y') - son('SvStringsSocket', 'Max Z') - son('SvStringsSocket', 'Size X') - son('SvStringsSocket', 'Size Y') - son('SvStringsSocket', 'Size Z') + titles = ['Min', 'Max', 'Size'] + for j in range(3): + for i in range(3): + son('SvStringsSocket', titles[j] + ' ' + 'XYZ'[i] ) + + self.update_sockets(context) def process(self): if not self.inputs['Vertices'].is_linked: @@ -58,15 +88,7 @@ class SvBBoxNodeMk2(bpy.types.Node, SverchCustomTreeNode): has_mat_out = bool(self.outputs['Center'].is_linked) has_mean = bool(self.outputs['Mean'].is_linked) has_vert_out = bool(self.outputs['Vertices'].is_linked) - has_min_x_out = bool(self.outputs['Min X'].is_linked) - has_min_y_out = bool(self.outputs['Min Y'].is_linked) - has_min_z_out = bool(self.outputs['Min Z'].is_linked) - has_max_x_out = bool(self.outputs['Max X'].is_linked) - has_max_y_out = bool(self.outputs['Max Y'].is_linked) - has_max_z_out = bool(self.outputs['Max Z'].is_linked) - has_size_x_out = bool(self.outputs['Size X'].is_linked) - has_size_y_out = bool(self.outputs['Size Y'].is_linked) - has_size_z_out = bool(self.outputs['Size Z'].is_linked) + vert = self.inputs['Vertices'].sv_get(deepcopy=False) vert = dataCorrect(vert, nominal_dept=2) has_limits = any(s.is_linked for s in self.outputs[4:]) @@ -78,16 +100,17 @@ class SvBBoxNodeMk2(bpy.types.Node, SverchCustomTreeNode): (4, 5), (5, 7), (7, 6), (6, 4), # top edges (0, 4), (1, 5), (2, 6), (3, 7) # sides ] + mat_out = [] mean_out = [] - min_vals = [[],[],[]] - max_vals = [[],[],[]] - size_vals = [[],[],[]] + min_vals = [[], [], []] + max_vals = [[], [], []] + size_vals = [[], [], []] for v in vert: if has_mat_out or has_vert_out or has_limits: maxmin = list(zip(map(max, *v), map(min, *v))) - print(maxmin) + out = list(product(*reversed(maxmin))) verts_out.append([l[::-1] for l in out[::-1]]) edges_out.append(edges) @@ -95,24 +118,18 @@ class SvBBoxNodeMk2(bpy.types.Node, SverchCustomTreeNode): center = [(u+v)*.5 for u, v in maxmin] mat = Matrix.Translation(center) scale = [(u-v) for u, v in maxmin] - for i, s in enumerate(scale): - mat[i][i] = s + for i, sca in enumerate(scale): + mat[i][i] = sca mat_out.append(mat) if has_mean: avr = list(map(sum, zip(*v))) avr = [n/len(v) for n in avr] mean_out.append([avr]) if has_limits: - # min_vals[0].append([maxmin[0][1]]) - # min_vals[1].append([maxmin[1][1]]) - # min_vals[2].append([maxmin[2][1]]) - # max_vals[0].append([maxmin[0][0]]) - # max_vals[1].append([maxmin[1][0]]) - # max_vals[2].append([maxmin[2][0]]) for i in range(3): min_vals[i].append([maxmin[i][1]]) max_vals[i].append([maxmin[i][0]]) - size_vals[i].append([maxmin[i][0]-maxmin[i][1]]) + size_vals[i].append([maxmin[i][0] - maxmin[i][1]]) if has_vert_out: self.outputs['Vertices'].sv_set(verts_out) @@ -126,24 +143,11 @@ class SvBBoxNodeMk2(bpy.types.Node, SverchCustomTreeNode): if self.outputs['Center'].is_linked: self.outputs['Center'].sv_set(mat_out) - if has_min_x_out: - self.outputs['Min X'].sv_set(min_vals[0]) - if has_min_y_out: - self.outputs['Min Y'].sv_set(min_vals[1]) - if has_min_z_out: - self.outputs['Min Z'].sv_set(min_vals[2]) - if has_max_x_out: - self.outputs['Max X'].sv_set(max_vals[0]) - if has_max_y_out: - self.outputs['Max Y'].sv_set(max_vals[1]) - if has_max_z_out: - self.outputs['Max Z'].sv_set(max_vals[2]) - if has_size_x_out: - self.outputs['Size X'].sv_set(size_vals[0]) - if has_size_y_out: - self.outputs['Size Y'].sv_set(size_vals[1]) - if has_size_z_out: - self.outputs['Size Z'].sv_set(size_vals[2]) + vals = [min_vals, max_vals, size_vals] + for j in range(3): + for i, socket in enumerate(self.outputs[4+3*j:7+3*j]): + if socket.is_linked: + socket.sv_set(vals[j][i]) def register(): diff --git a/nodes/analyzer/bbox.py b/old_nodes/bbox.py similarity index 98% rename from nodes/analyzer/bbox.py rename to old_nodes/bbox.py index 6f0b5f392..89774cd9f 100644 --- a/nodes/analyzer/bbox.py +++ b/old_nodes/bbox.py @@ -32,6 +32,8 @@ class SvBBoxNode(bpy.types.Node, SverchCustomTreeNode): bl_icon = 'NONE' sv_icon = 'SV_BOUNDING_BOX' + replacement_nodes = [('SvBBoxNodeMk2', None, None)] + def sv_init(self, context): self.inputs.new('SvVerticesSocket', 'Vertices') -- GitLab From 7df0a6859cfaec893d4d8a206968c9319788e6e8 Mon Sep 17 00:00:00 2001 From: Victor Doval <10011941+vicdoval@users.noreply.github.com> Date: Thu, 3 Oct 2019 11:13:08 +0200 Subject: [PATCH 3/6] bbox mk2 added 2D mode --- nodes/analyzer/bbox_mk2.py | 51 +++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/nodes/analyzer/bbox_mk2.py b/nodes/analyzer/bbox_mk2.py index 9ad5b7439..242005604 100644 --- a/nodes/analyzer/bbox_mk2.py +++ b/nodes/analyzer/bbox_mk2.py @@ -19,7 +19,7 @@ from itertools import product import bpy -from bpy.props import BoolVectorProperty +from bpy.props import BoolVectorProperty, EnumProperty from mathutils import Matrix from sverchok.node_tree import SverchCustomTreeNode @@ -34,14 +34,16 @@ class SvBBoxNodeMk2(bpy.types.Node, SverchCustomTreeNode): sv_icon = 'SV_BOUNDING_BOX' def update_sockets(self, context): bools = [self.min_list, self.max_list, self.size_list] + dims = int(self.dimensions[0]) for i in range(3): for j in range(3): - hidden = self.outputs[4+j+3*i].hide_safe - if bools[i][j]: + out_index = 4 + j + 3*i + hidden = self.outputs[out_index].hide_safe + if bools[i][j] and j < dims: if hidden: - self.outputs[4+j+3*i].hide_safe = False - else : - self.outputs[4+j+3*i].hide_safe = True + self.outputs[out_index].hide_safe = False + else: + self.outputs[out_index].hide_safe = True updateNode(self, context) @@ -51,18 +53,27 @@ class SvBBoxNodeMk2(bpy.types.Node, SverchCustomTreeNode): name='Max', description="Show Maximun values sockets", size=3, update=update_sockets) size_list: BoolVectorProperty( name='Size', description="Show Size values sockets", size=3, update=update_sockets) + implentation_modes = [ + ("2D", "2D", "2D", 0), + ("3D", "3D", "3D", 1)] + dimensions: EnumProperty( + name='Implementation', items=implentation_modes, + description='Choose calculation method', + default="3D", update=update_sockets) def draw_buttons(self, context, layout): + layout .prop(self, 'dimensions', expand=True) col = layout.column(align=True) titles = ["Min", "Max", "Size"] prop = ['min_list', 'max_list', 'size_list'] + dims = int(self.dimensions[0]) for i in range(3): row = col.row(align=True) row.label(text=titles[i]) row2 = row.row(align=True) - for j in range(3): + for j in range(dims): row2 .prop(self, prop[i], index=j, text='XYZ'[j], toggle=True) def sv_init(self, context): @@ -106,27 +117,39 @@ class SvBBoxNodeMk2(bpy.types.Node, SverchCustomTreeNode): min_vals = [[], [], []] max_vals = [[], [], []] size_vals = [[], [], []] + to_2d = self.dimensions == '2D' + dims = int(self.dimensions[0]) for v in vert: if has_mat_out or has_vert_out or has_limits: maxmin = list(zip(map(max, *v), map(min, *v))) - out = list(product(*reversed(maxmin))) - verts_out.append([l[::-1] for l in out[::-1]]) - edges_out.append(edges) + v_out = [l[::-1] for l in out[::-1]] + if to_2d: + verts_out.append([[v[0], v[1], 0] for v in v_out[:4]]) + edges = edges[:4] + else: + verts_out.append(v_out) + edges_out.append(edges) + if has_mat_out: - center = [(u+v)*.5 for u, v in maxmin] + center = [(u+v)*.5 for u, v in maxmin[:dims]] + scale = [(u-v) for u, v in maxmin[:dims]] + if to_2d: + center += [0] + scale += [1] mat = Matrix.Translation(center) - scale = [(u-v) for u, v in maxmin] for i, sca in enumerate(scale): mat[i][i] = sca mat_out.append(mat) if has_mean: avr = list(map(sum, zip(*v))) - avr = [n/len(v) for n in avr] + avr = [n/len(v) for n in avr[:dims]] + if to_2d: + avr += [0] mean_out.append([avr]) if has_limits: - for i in range(3): + for i in range(dims): min_vals[i].append([maxmin[i][1]]) max_vals[i].append([maxmin[i][0]]) size_vals[i].append([maxmin[i][0] - maxmin[i][1]]) -- GitLab From a80e9667dd5068f0037f630ef2c6d75e05476a15 Mon Sep 17 00:00:00 2001 From: Victor Doval <10011941+vicdoval@users.noreply.github.com> Date: Thu, 3 Oct 2019 18:48:21 +0200 Subject: [PATCH 4/6] bbox mk2 2D mode to docs --- docs/nodes/analyzers/bbox_mk2.rst | 33 +++++++++++++++++++------------ 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/docs/nodes/analyzers/bbox_mk2.rst b/docs/nodes/analyzers/bbox_mk2.rst index 543beeda6..62ef86d91 100644 --- a/docs/nodes/analyzers/bbox_mk2.rst +++ b/docs/nodes/analyzers/bbox_mk2.rst @@ -14,7 +14,9 @@ Inputs Parameters ---------- -Min, Max and Size: Chose which outputs you want the node to display +2D / 3D: The 2D implementation works over the XY plane always outputting 0 in the Z coordinate, and instead of a box produces a rectangle. + +Min, Max and Size: Chose which outputs you want the node to display. Outputs ------- @@ -26,29 +28,29 @@ Outputs +----------+-----------+----------------------------------------------------------------------------+ | Edges | Key Lists | One or more sets of Edges corresponding to the Vertices of the same index. | +----------+-----------+----------------------------------------------------------------------------+ -| Mean | Vectors | Arithmetic averages of the incoming sets of vertices | +| Mean | Vectors | Arithmetic averages of the incoming sets of vertices. | +----------+-----------+----------------------------------------------------------------------------+ | Center | Matrix | Represents the *Center* of the bounding box; the average of its vertices. | | | | The scale of the matrix would make a box with size of 1 unit to match the | -| | | size the desired bounding box | +| | | size the desired bounding box. | +----------+-----------+----------------------------------------------------------------------------+ -| Min X | Scalar | Minimum value on the X axis | +| Min X | Scalar | Minimum value on the X axis. | +----------+-----------+----------------------------------------------------------------------------+ -| Min Y | Scalar | Minimum value on the Y axis | +| Min Y | Scalar | Minimum value on the Y axis. | +----------+-----------+----------------------------------------------------------------------------+ -| Min Z | Scalar | Minimum value on the Z axis | +| Min Z | Scalar | Minimum value on the Z axis. | +----------+-----------+----------------------------------------------------------------------------+ -| Max X | Scalar | Maximum value on the X axis | +| Max X | Scalar | Maximum value on the X axis. | +----------+-----------+----------------------------------------------------------------------------+ -| Max Y | Scalar | Maximum value on the Y axis | +| Max Y | Scalar | Maximum value on the Y axis. | +----------+-----------+----------------------------------------------------------------------------+ -| Max Z | Scalar | Maximum value on the Z axis | +| Max Z | Scalar | Maximum value on the Z axis. | +----------+-----------+----------------------------------------------------------------------------+ -| Size X | Scalar | Size on the X axis | +| Size X | Scalar | Size on the X axis. | +----------+-----------+----------------------------------------------------------------------------+ -| Size Y | Scalar | Size on the Y axis | +| Size Y | Scalar | Size on the Y axis. | +----------+-----------+----------------------------------------------------------------------------+ -| Size Z | Scalar | Size on the Z axis | +| Size Z | Scalar | Size on the Z axis. | +----------+-----------+----------------------------------------------------------------------------+ @@ -66,7 +68,12 @@ Examples .. image:: https://cloud.githubusercontent.com/assets/619340/4186538/def29d62-3761-11e4-8069-b9544e2ad62a.PNG :alt: BBox_Center3.PNG +*2D Mode: produces rectangles at z = 0* + +.. image:: https://user-images.githubusercontent.com/10011941/66115789-d1a9c300-e5d1-11e9-96d7-27b01db9a78d.png + :alt: Bounding_Box_2D_Sverchok_Procedural_Blender.PNG + Notes ----- -GitHub issue tracker `discussion about this node `_ +GitHub issue tracker discussion about this node `here `_ and `here ` -- GitLab From d6873a3116abe2dbcf030cf9cc731c53549d040b Mon Sep 17 00:00:00 2001 From: Victor Doval <10011941+vicdoval@users.noreply.github.com> Date: Thu, 3 Oct 2019 19:09:45 +0200 Subject: [PATCH 5/6] bbox mk2 refactoring --- nodes/analyzer/bbox_mk2.py | 50 ++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/nodes/analyzer/bbox_mk2.py b/nodes/analyzer/bbox_mk2.py index 242005604..0b485a165 100644 --- a/nodes/analyzer/bbox_mk2.py +++ b/nodes/analyzer/bbox_mk2.py @@ -52,7 +52,7 @@ class SvBBoxNodeMk2(bpy.types.Node, SverchCustomTreeNode): max_list: BoolVectorProperty( name='Max', description="Show Maximun values sockets", size=3, update=update_sockets) size_list: BoolVectorProperty( - name='Size', description="Show Size values sockets", size=3, update=update_sockets) + name='Size', description="Show Size values sockets", size=3, update=update_sockets) implentation_modes = [ ("2D", "2D", "2D", 0), ("3D", "3D", "3D", 1)] @@ -87,10 +87,28 @@ class SvBBoxNodeMk2(bpy.types.Node, SverchCustomTreeNode): titles = ['Min', 'Max', 'Size'] for j in range(3): for i in range(3): - son('SvStringsSocket', titles[j] + ' ' + 'XYZ'[i] ) + son('SvStringsSocket', titles[j] + ' ' + 'XYZ'[i]) self.update_sockets(context) + def generate_matrix(self, maxmin, dims, to_2d): + center = [(u+v)*.5 for u, v in maxmin[:dims]] + scale = [(u-v) for u, v in maxmin[:dims]] + if to_2d: + center += [0] + scale += [1] + mat = Matrix.Translation(center) + for i, sca in enumerate(scale): + mat[i][i] = sca + return mat + + def generate_mean(self, verts, dims, to_2d): + avr = list(map(sum, zip(*verts))) + avr = [n/len(verts) for n in avr[:dims]] + if to_2d: + avr += [0] + return [avr] + def process(self): if not self.inputs['Vertices'].is_linked: return @@ -100,10 +118,10 @@ class SvBBoxNodeMk2(bpy.types.Node, SverchCustomTreeNode): has_mean = bool(self.outputs['Mean'].is_linked) has_vert_out = bool(self.outputs['Vertices'].is_linked) - vert = self.inputs['Vertices'].sv_get(deepcopy=False) - vert = dataCorrect(vert, nominal_dept=2) + verts = self.inputs['Vertices'].sv_get(deepcopy=False) + verts = dataCorrect(verts, nominal_dept=2) has_limits = any(s.is_linked for s in self.outputs[4:]) - if vert: + if verts: verts_out = [] edges_out = [] edges = [ @@ -120,9 +138,9 @@ class SvBBoxNodeMk2(bpy.types.Node, SverchCustomTreeNode): to_2d = self.dimensions == '2D' dims = int(self.dimensions[0]) - for v in vert: + for vec in verts: if has_mat_out or has_vert_out or has_limits: - maxmin = list(zip(map(max, *v), map(min, *v))) + maxmin = list(zip(map(max, *vec), map(min, *vec))) out = list(product(*reversed(maxmin))) v_out = [l[::-1] for l in out[::-1]] if to_2d: @@ -133,21 +151,11 @@ class SvBBoxNodeMk2(bpy.types.Node, SverchCustomTreeNode): edges_out.append(edges) if has_mat_out: - center = [(u+v)*.5 for u, v in maxmin[:dims]] - scale = [(u-v) for u, v in maxmin[:dims]] - if to_2d: - center += [0] - scale += [1] - mat = Matrix.Translation(center) - for i, sca in enumerate(scale): - mat[i][i] = sca - mat_out.append(mat) + mat_out.append(self.generate_matrix(maxmin, dims, to_2d)) + if has_mean: - avr = list(map(sum, zip(*v))) - avr = [n/len(v) for n in avr[:dims]] - if to_2d: - avr += [0] - mean_out.append([avr]) + mean_out.append(self.generate_mean(v, dims, to_2d)) + if has_limits: for i in range(dims): min_vals[i].append([maxmin[i][1]]) -- GitLab From e119014105629e9afa042b315a82e61842d38119 Mon Sep 17 00:00:00 2001 From: Victor Doval <10011941+vicdoval@users.noreply.github.com> Date: Fri, 4 Oct 2019 15:22:31 +0200 Subject: [PATCH 6/6] bbox mk2 more refactoring --- nodes/analyzer/bbox_mk2.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nodes/analyzer/bbox_mk2.py b/nodes/analyzer/bbox_mk2.py index 0b485a165..0ea2c2ba5 100644 --- a/nodes/analyzer/bbox_mk2.py +++ b/nodes/analyzer/bbox_mk2.py @@ -54,8 +54,8 @@ class SvBBoxNodeMk2(bpy.types.Node, SverchCustomTreeNode): size_list: BoolVectorProperty( name='Size', description="Show Size values sockets", size=3, update=update_sockets) implentation_modes = [ - ("2D", "2D", "2D", 0), - ("3D", "3D", "3D", 1)] + ("2D", "2D", "Outputs Rectangle over XY plane", 0), + ("3D", "3D", "Outputs standard bounding box", 1)] dimensions: EnumProperty( name='Implementation', items=implentation_modes, description='Choose calculation method', @@ -141,6 +141,7 @@ class SvBBoxNodeMk2(bpy.types.Node, SverchCustomTreeNode): for vec in verts: if has_mat_out or has_vert_out or has_limits: maxmin = list(zip(map(max, *vec), map(min, *vec))) + if has_vert_out: out = list(product(*reversed(maxmin))) v_out = [l[::-1] for l in out[::-1]] if to_2d: -- GitLab