From 8a15dd8eb8c0ca6724eaf00e9ba1d10bfbb4db95 Mon Sep 17 00:00:00 2001 From: Durman Date: Thu, 9 Nov 2017 14:26:48 +0400 Subject: [PATCH 1/2] Update extrude_separate.py If will add vector to scale socket you can control scale per axises. --- nodes/modifier_change/extrude_separate.py | 39 ++++++++++++++++++++--- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/nodes/modifier_change/extrude_separate.py b/nodes/modifier_change/extrude_separate.py index 47cadc500..47d875802 100644 --- a/nodes/modifier_change/extrude_separate.py +++ b/nodes/modifier_change/extrude_separate.py @@ -18,13 +18,14 @@ from mathutils import Matrix, Vector #from math import copysign +from math import pi import bpy from bpy.props import IntProperty, FloatProperty import bmesh.ops from sverchok.node_tree import SverchCustomTreeNode -from sverchok.data_structure import updateNode, match_long_repeat, fullList +from sverchok.data_structure import updateNode, match_long_repeat, fullList, Matrix_generate from sverchok.utils.sv_bmesh_utils import bmesh_from_pydata, pydata_from_bmesh def Matrix_degenerate(ms): @@ -76,6 +77,15 @@ class SvExtrudeSeparateNode(bpy.types.Node, SverchCustomTreeNode): result_faces = [] result_extruded_faces = [] result_other_faces = [] + + #check scale's socket input + vector_in = False + if self.inputs['Scale'].is_linked: + socket = self.inputs['Scale'] + other = socket.other + if other.bl_idname == 'VerticesSocket': + print('connected a Vector Socket') + vector_in = True meshes = match_long_repeat([vertices_s, edges_s, faces_s, masks_s, heights_s, scales_s]) @@ -93,13 +103,34 @@ class SvExtrudeSeparateNode(bpy.types.Node, SverchCustomTreeNode): for face, mask, height, scale in zip(extruded_faces, masks, heights, scales): if not mask: continue + + #preparing matrix + normal = face.normal + if normal[0] == 0 and normal[1] == 0 and normal[2] >= 0: m_r = Matrix() + elif normal[0] == 0 and normal[1] == 0 and normal[2] < 0: m_r = Matrix.Rotation(pi,4,'X') + else: + z_axis = normal + x_axis = (Vector((z_axis[1] * -1, z_axis[0], 0))).normalized() + y_axis = (z_axis.cross(x_axis)).normalized() + + m_r = Matrix_generate([[(x_axis[0], y_axis[0], z_axis[0], 0.0), + (x_axis[1], y_axis[1], z_axis[1], 0.0), + (x_axis[2], y_axis[2], z_axis[2], 0.0), + (0.0, 0.0, 0.0, 1.0)]])[0] + dr = face.normal * height center = face.calc_center_median() translation = Matrix.Translation(center) - rotation = face.normal.rotation_difference((0,0,1)).to_matrix().to_4x4() + #rotation = face.normal.rotation_difference((0,0,1)).to_matrix().to_4x4() #rotation = autorotate(z, face.normal).inverted() - m = translation * rotation - bmesh.ops.scale(bm, vec=(scale, scale, scale), space=m.inverted(), verts=face.verts) + m = (translation * m_r).inverted() + + if vector_in: + vec = scale + else: + vec = (scale, scale, scale) + + bmesh.ops.scale(bm, vec=vec, space=m, verts=face.verts) bmesh.ops.translate(bm, verts=face.verts, vec=dr) new_extruded_faces.append([v.index for v in face.verts]) -- GitLab From a48d8b3893b634866d74439abaee4cd19d95b9ad Mon Sep 17 00:00:00 2001 From: Durman Date: Fri, 10 Nov 2017 09:56:10 +0400 Subject: [PATCH 2/2] Update extrude_separate.py improved code --- nodes/modifier_change/extrude_separate.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/nodes/modifier_change/extrude_separate.py b/nodes/modifier_change/extrude_separate.py index 47d875802..fa89f9471 100644 --- a/nodes/modifier_change/extrude_separate.py +++ b/nodes/modifier_change/extrude_separate.py @@ -25,7 +25,7 @@ from bpy.props import IntProperty, FloatProperty import bmesh.ops from sverchok.node_tree import SverchCustomTreeNode -from sverchok.data_structure import updateNode, match_long_repeat, fullList, Matrix_generate +from sverchok.data_structure import updateNode, match_long_repeat, fullList from sverchok.utils.sv_bmesh_utils import bmesh_from_pydata, pydata_from_bmesh def Matrix_degenerate(ms): @@ -113,10 +113,7 @@ class SvExtrudeSeparateNode(bpy.types.Node, SverchCustomTreeNode): x_axis = (Vector((z_axis[1] * -1, z_axis[0], 0))).normalized() y_axis = (z_axis.cross(x_axis)).normalized() - m_r = Matrix_generate([[(x_axis[0], y_axis[0], z_axis[0], 0.0), - (x_axis[1], y_axis[1], z_axis[1], 0.0), - (x_axis[2], y_axis[2], z_axis[2], 0.0), - (0.0, 0.0, 0.0, 1.0)]])[0] + m_r = Matrix(list([*zip(x_axis[:], y_axis[:], z_axis[:])])).to_4x4() dr = face.normal * height center = face.calc_center_median() @@ -125,10 +122,7 @@ class SvExtrudeSeparateNode(bpy.types.Node, SverchCustomTreeNode): #rotation = autorotate(z, face.normal).inverted() m = (translation * m_r).inverted() - if vector_in: - vec = scale - else: - vec = (scale, scale, scale) + vec = scale if vector_in else (scale, scale, scale) bmesh.ops.scale(bm, vec=vec, space=m, verts=face.verts) bmesh.ops.translate(bm, verts=face.verts, vec=dr) -- GitLab