From a41c78f84ff793201129f103a6c0c38b117b9340 Mon Sep 17 00:00:00 2001 From: zeffii Date: Thu, 8 Jan 2015 22:48:09 +0100 Subject: [PATCH] test restruct --- nodes/modifier_make/offset.py | 95 +++++++++++++++++++---------------- 1 file changed, 53 insertions(+), 42 deletions(-) diff --git a/nodes/modifier_make/offset.py b/nodes/modifier_make/offset.py index bdb508dd8..abf424c67 100644 --- a/nodes/modifier_make/offset.py +++ b/nodes/modifier_make/offset.py @@ -22,10 +22,11 @@ from bpy.props import BoolProperty, StringProperty, IntProperty, FloatProperty import bmesh from sverchok.utils.sv_bmesh_utils import bmesh_from_pydata from sverchok.node_tree import SverchCustomTreeNode -from sverchok.data_structure import (changable_sockets, multi_socket, - fullList, dataCorrect, updateNode, - SvSetSocketAnyType, SvGetSocketAnyType, - Vector_generate) +from sverchok.data_structure import ( + changable_sockets, multi_socket, + fullList, dataCorrect, updateNode, + SvSetSocketAnyType, SvGetSocketAnyType, + Vector_generate) from mathutils import Vector, Matrix from math import tan, sin, cos, degrees, radians @@ -35,17 +36,19 @@ class SvOffsetNode(bpy.types.Node, SverchCustomTreeNode): bl_idname = 'SvOffsetNode' bl_label = 'Offset Node' bl_icon = 'OUTLINER_OB_EMPTY' - - offset = FloatProperty(name='offset', description='distance of offset', - default=0.04, - options={'ANIMATABLE'}, update=updateNode) - nsides = IntProperty(name='nsides', description='number of sides', - default=1, min=1, max=64, - options={'ANIMATABLE'}, update=updateNode) - radius = FloatProperty(name='redius', description='radius of inset', - default=0.04, min=0.0001, - options={'ANIMATABLE'}, update=updateNode) - + + offset = FloatProperty( + name='offset', description='distance of offset', + default=0.04, + options={'ANIMATABLE'}, update=updateNode) + nsides = IntProperty( + name='nsides', description='number of sides', + default=1, min=1, max=64, + options={'ANIMATABLE'}, update=updateNode) + radius = FloatProperty( + name='redius', description='radius of inset', + default=0.04, min=0.0001, + options={'ANIMATABLE'}, update=updateNode) def draw_buttons(self, context, layout): pass @@ -62,7 +65,7 @@ class SvOffsetNode(bpy.types.Node, SverchCustomTreeNode): self.outputs.new('StringsSocket', "InPols", "InPols") def process(self): - + if self.outputs['Vers'].links and self.inputs['Vers'].links: vertices = Vector_generate(SvGetSocketAnyType(self, self.inputs['Vers'])) faces = SvGetSocketAnyType(self, self.inputs['Pols']) @@ -82,7 +85,7 @@ class SvOffsetNode(bpy.types.Node, SverchCustomTreeNode): bme = bmesh_from_pydata(verts_obj, [], faces_obj) geom_in = bme.verts[:]+bme.edges[:]+bme.faces[:] bmesh.ops.recalc_face_normals(bme, faces=bme.faces[:]) - list_0 = [ f.index for f in bme.faces ] + list_0 = [f.index for f in bme.faces] # calculation itself result = \ self.Offset_pols(bme, list_0, offset, radius, nsides, verlen) @@ -98,28 +101,27 @@ class SvOffsetNode(bpy.types.Node, SverchCustomTreeNode): SvSetSocketAnyType(self, 'OutPols', outo) if self.outputs['InPols'].links: SvSetSocketAnyType(self, 'InPols', outn) - - + # ################# # part from ofset operator in extra tools # that in own place based completely on addon by zmj100 - # in russian is called "Круговая порука", Various artists + # in russian is called "Круговая порука", Various artists # ################# - + def a_rot(self, ang, rp, axis, q): return (Matrix.Rotation(ang, 3, axis) * (q - rp)) + rp # ################# # opp - offset amount # n_ - number of sides - # adj1 - radius + # adj1 - radius # en0 - corner type bmesh or triangle, we need bmesh opt0 # kp - keep face, not delete it. # ################# - + def Offset_pols(self, bme, list_0, offset, radius, n_, verlen): - list_del = [] # to delete old shape polygons + list_del = [] # to delete old shape polygons for q, fi in enumerate(list_0): adj1 = radius[q] opp = offset[q] @@ -133,9 +135,9 @@ class SvOffsetNode(bpy.types.Node, SverchCustomTreeNode): n = len(list_2) for i in range(n): dict_0[i] = [] - p = (bme.verts[ list_2[i] ].co).copy() - p1 = (bme.verts[ list_2[(i - 1) % n] ].co).copy() - p2 = (bme.verts[ list_2[(i + 1) % n] ].co).copy() + p = (bme.verts[list_2[i]].co).copy() + p1 = (bme.verts[list_2[(i - 1) % n]].co).copy() + p2 = (bme.verts[list_2[(i + 1) % n]].co).copy() dict_0[i].append(bme.verts[list_2[i]]) vec1 = p - p1 vec2 = p - p2 @@ -143,13 +145,14 @@ class SvOffsetNode(bpy.types.Node, SverchCustomTreeNode): adj = opp / tan(ang * 0.5) h = (adj ** 2 + opp ** 2) ** 0.5 if round(degrees(ang)) == 180 or round(degrees(ang)) == 0.0: - p6 = self.a_rot(radians(90), p, vec1, p - \ - ((f.normal).normalized() * opp)) + p6 = self.a_rot( + radians(90), p, vec1, p - ((f.normal).normalized() * opp)) list_1.append(p6) else: - p6 = self.a_rot(-radians(90), p, ((p - (vec1.normalized() * adj)) - \ - (p - (vec2.normalized() * adj))), p - \ - ((f.normal).normalized() * h)) + p6 = self.a_rot( + -radians(90), p, + ((p - (vec1.normalized() * adj)) - (p - (vec2.normalized() * adj))), + p - ((f.normal).normalized() * h)) list_1.append(p6) list_2 = [] @@ -164,6 +167,9 @@ class SvOffsetNode(bpy.types.Node, SverchCustomTreeNode): if round(degrees(ang_)) == 180 or round(degrees(ang_)) == 0.0: bme.verts.new(q) bme.verts.index_update() + if hasattr(bme.verts, "ensure_lookup_table"): + bme.verts.ensure_lookup_table() + list_2.append(bme.verts[-1]) dict_0[j].append(bme.verts[-1]) else: @@ -184,35 +190,43 @@ class SvOffsetNode(bpy.types.Node, SverchCustomTreeNode): vec4_ = rp_ - q4 rot_ang = vec3_.angle(vec4_) list_3 = [] - + for o in range(n_ + 1): q5 = self.a_rot((rot_ang * o / n_), rp_, axis_, q4) bme.verts.new(q5) bme.verts.index_update() + if hasattr(bme.verts, "ensure_lookup_table"): + bme.verts.ensure_lookup_table() + dict_0[j].append(bme.verts[-1]) list_3.append(bme.verts[-1]) list_3.reverse() list_2.extend(list_3) - # if kp == True: #not solved bme.faces.new(list_2) - bme.faces.index_update() + # bme.faces.index_update() + if hasattr(bme.faces, "ensure_lookup_table"): + bme.faces.ensure_lookup_table() bme.faces[-1].select_set(1) n2_ = len(dict_0) for o in range(n2_): list_a = dict_0[o] list_b = dict_0[(o + 1) % n2_] - bme.faces.new( [ list_a[0], list_b[0], list_b[-1], list_a[1] ] ) + bme.faces.new([list_a[0], list_b[0], list_b[-1], list_a[1]]) bme.faces.index_update() - + # keeping triangulation of polygons commented #if en0 == 'opt0': for k in dict_0: if len(dict_0[k]) > 2: bme.faces.new(dict_0[k]) bme.faces.index_update() + + if hasattr(bme.faces, "ensure_lookup_table"): + # print('yep') + bme.faces.ensure_lookup_table() #if en0 == 'opt1': # for k_ in dict_0: # q_ = dict_0[k_][0] @@ -225,11 +239,11 @@ class SvOffsetNode(bpy.types.Node, SverchCustomTreeNode): del_ = [bme.faces.remove(f) for f in list_del] del del_ # i think, it deletes doubling faces - + # remove doubles bmesh.ops.remove_doubles(bme, dist=0.0001) # if radius 0 than cleaning loose - + # from Linus Yng solidify example edges = [] faces = [] @@ -252,8 +266,6 @@ class SvOffsetNode(bpy.types.Node, SverchCustomTreeNode): return (verts, edges, faces, newpols) - - def register(): bpy.utils.register_class(SvOffsetNode) @@ -263,4 +275,3 @@ def unregister(): if __name__ == '__main__': register() - -- GitLab