[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [1080] contrib/py/scripts/addons: Added bevel tool to contrib/py/scripts/addons/mesh_bevel

Brendon Murphy meta.androcto1 at gmail.com
Sun Sep 26 03:07:00 CEST 2010


Revision: 1080
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-extensions&revision=1080
Author:   meta-androcto
Date:     2010-09-26 03:06:59 +0200 (Sun, 26 Sep 2010)

Log Message:
-----------
Added bevel tool to contrib/py/scripts/addons/mesh_bevel
this script returns the Bevel Tool to the 'W' key menu in edit mode.

Added Paths:
-----------
    contrib/py/scripts/addons/mesh_bevel/
    contrib/py/scripts/addons/mesh_bevel/__init__.py
    contrib/py/scripts/addons/mesh_bevel/bevel.py
    contrib/py/scripts/addons/mesh_bevel/va.py

Added: contrib/py/scripts/addons/mesh_bevel/__init__.py
===================================================================
--- contrib/py/scripts/addons/mesh_bevel/__init__.py	                        (rev 0)
+++ contrib/py/scripts/addons/mesh_bevel/__init__.py	2010-09-26 01:06:59 UTC (rev 1080)
@@ -0,0 +1,51 @@
+# ##### 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 #####
+
+bl_addon_info = {
+    'name': 'Bevel',
+    'author': 'chromoly',
+    'version': (0, 2),
+    'blender': (2, 5, 3),
+    'api': 32116,
+    'location': 'View3D > EditMode > Specials',
+    'wiki_url': '',
+    'category': 'Mesh'}
+
+import bpy
+
+try:
+    init_data
+
+    reload(bevel)
+except:
+    from mesh_bevel import bevel
+
+init_data = True
+
+def menu_func(self, context): 
+    from mesh_bevel import bevel
+    self.layout.operator(bevel.Bevel.bl_idname, text="Bevel")
+
+def register():
+    bpy.types.VIEW3D_MT_edit_mesh_specials.append(menu_func)
+
+def unregister():
+    bpy.types.VIEW3D_MT_edit_mesh_specials.remove(menu_func)
+
+if __name__ == '__main__':
+    register()

Added: contrib/py/scripts/addons/mesh_bevel/bevel.py
===================================================================
--- contrib/py/scripts/addons/mesh_bevel/bevel.py	                        (rev 0)
+++ contrib/py/scripts/addons/mesh_bevel/bevel.py	2010-09-26 01:06:59 UTC (rev 1080)
@@ -0,0 +1,954 @@
+# -*- coding: utf-8 -*-
+
+import math
+from functools import reduce
+
+import bpy
+from bpy.props import *
+from bpy import context
+import mathutils as Math
+from mathutils import Matrix, Vector, Quaternion
+import geometry as geo
+
+import mesh_bevel.va
+from mesh_bevel.va import *
+
+SMALL_NUMBER = 1E-8
+
+VERT = 1
+EDGE = 2
+FACE = 4
+DELETE = 8
+MIX = 16 # 
+
+
+class BVert():
+    def __init__(self, vec=None, co=None, vi=None, i=None, eai=None, fi=None):
+        self.vec = vec # relative
+        self.co = co # absolute
+        self.i = i
+        self.vi = vi
+        self.eai = eai # along
+        self.fi = fi
+        self.ebi = None # bevel
+        self.eb2i = None # bevel (in f2)
+        self.f2i = None
+        self.f = 0 # flag
+
+def bevel(ob, follow, type):
+    me = ob.data
+
+    # dict
+    vvdict = vert_vert_dict(me, sel=0)
+    vedict = vert_edge_dict(me, sel=0)
+    vfdict = vert_face_dict(me, sel=0)
+    efdict = edge_face_dict(me, sel=0)
+    kedict = key_edge_dict(me, sel=0)
+
+    bevelverts = []
+    bevelvertindex = len(me.vertices)
+    bevelfaces = bfaces = []
+    bevelfaces_material = bfmats = []
+    # ekparallel: bevelkeysorted
+    ekparallel = [[] for e in me.edges]
+    vvparallel = [set() for v in me.vertices]
+
+    #
+    '''vevparallel = {v.index:{kedict[key]:None for key in vedict[v.index]} \
+                   for v in me.vertices}
+    '''
+    vevparallel = {}
+    for v in me.vertices:
+        if not v.hide:
+            evdict = {}
+            for key in vedict[v.index]:
+                evdict[kedict[key]] = None
+            vevparallel[v.index] = evdict
+    # bevel
+    vkparallel = {v.index:[] for v in me.vertices}
+
+    vertflags = [0 for v in me.vertices]
+    #edgeflags = [e.index for e in me.edges]
+    faceflags = [0 for f in me.faces]
+
+    # flag
+    for i in range(len(me.vertices)):
+        # hidden
+        if me.vertices[i].hide:
+            continue
+        tmp = [0, 0]
+        for key in vedict[i]:
+            if len(efdict[key]) == 0:
+                tmp[0] += 1
+            else:
+                tmp[1] += 1
+        if sum(tmp) == 0:
+            vertflags[i] |= VERT
+        elif tmp[0] >= 1 and tmp[1] == 0:
+            vertflags[i] |= EDGE
+        elif tmp[0] == 0 and tmp[1] >= 1:
+            vertflags[i] |= FACE
+        else:
+            vertflags[i] |= MIX
+    # flag2
+    for e in me.edges:
+        if e.key in efdict:
+            if len(efdict[e.key]) > 2:
+                vertflags[e.key[0]] |= MIX
+                vertflags[e.key[1]] |= MIX
+
+    # Face
+    for face in me.faces:
+        if face.hide:
+            continue
+
+        findex = face.index
+        material = face.material_index
+
+        vcor = {i:[] for i in face.vertices} #  correspond
+        vflags = {i:0 for i in face.vertices}
+
+        edge_keys = face.edge_keys
+
+        # ?
+        fverts = list(face.vertices)
+        for vindex in fverts:
+            vert = me.vertices[vindex]
+
+            if not vert.select:
+                continue
+            if vertflags[vindex] & MIX:
+                continue
+
+            # 
+            #connected_edges = [me.edges[kedict[key]] for key in edge_keys
+            #                   if key in vedict[vindex]]
+            connected_edges = [key for key in edge_keys if vindex in key]
+            if connected_edges == [edge_keys[0], edge_keys[-1]]:
+                connected_edges.reverse()
+            #if edge_keys.index(connected_edges[0]) == 0 and \
+            #   edge_keys.index(connected_edges[1]) == len(edge_keys) - 1:
+            #    connected_edges.reverse()
+            e1, e2 = [me.edges[kedict[key]] for key in connected_edges]
+
+            key1 = e1.key
+            key2 = e2.key
+            v1i = the_other(key1, vindex)
+            v2i = the_other(key2, vindex)
+            va0 = vert.co
+            va1 = me.vertices[v1i].co # edge1
+            va2 = me.vertices[v2i].co # edge2
+            vac = face.center
+            vr01 = va1 - va0
+            vr02 = va2 - va0
+            vr0c = vac - va0
+
+            if type == 'vert':
+                vflags[vindex] = VERT
+            elif e1.select and e2.select:
+                tmp = [len(efdict[e1.key]), len(efdict[e2.key])]
+                if tmp[0] == 1 and tmp[1] == 1:
+                    vflags[vindex] = VERT
+                elif tmp[0] == 2 and tmp[1] == 1:
+                    ea, eb, vra, vrb = e2, e1, vr02, vr01
+                    vflags[vindex] = EDGE
+                elif tmp[0] == 1 and tmp[1] == 2:
+                    ea, eb, vra, vrb = e1, e2, vr01, vr02
+                    vflags[vindex] = EDGE
+                else:
+                    vflags[vindex] = FACE
+            elif not e1.select and not e2.select:
+                vflags[vindex] = VERT
+            else:
+                eb = e1 if e1.select else e2
+                if len(efdict[eb.key]) == 1:
+                    vflags[vindex] = VERT
+                else:
+                    vflags[vindex] = EDGE
+                    if e1.select:
+                        ea, eb, vra, vrb = e2, e1, vr02, vr01
+                    else:
+                        ea, eb, vra, vrb = e1, e2, vr01, vr02
+
+            if vflags[vindex] == FACE:
+                # 
+                # 180
+                vr010c_cross = vr01.cross(vr0c).normalize()
+                angle = vr01.angle(vr02)
+                q = axis_angle_to_quat(vr010c_cross, angle / 2)
+                v = vr01 * q
+                v.normalize()
+                if angle > SMALL_NUMBER:
+                    s = math.sin(angle / 2)
+                    v *= 1.0 / s
+                else:
+                    v = Vector((0, 0, 0))
+                #co = va0 + v # absolute coordinate
+                co = va0.copy()
+
+                bevelvert = BVert(v, co, bevelvertindex,
+                                  vindex, e1.index, findex)# e1, e2
+                bevelvert.ebi = e2.index
+                bevelvert.f = FACE
+                bevelverts.append(bevelvert)
+                vcor[vindex].append(bevelvert.vi) # == bevelvertindex
+                #vflags[vindex] = FACE
+                bevelvertindex += 1
+            elif vflags[vindex] == VERT:
+                # 
+                # 
+                for ea, eb, v in [(e1, e2, vr01), (e2, e1, vr02)]:
+                    vei = vevparallel[vindex][ea.index]
+                    if not vei:
+                        v = v.copy().normalize()
+                        #co = va0 + v
+                        co = va0.copy()
+                        bevelvert = BVert(v, co, bevelvertindex,
+                                          vindex, ea.index, findex)
+                        bevelvert.ebi = eb.index # bevel
+                        bevelvert.f = VERT
+                        bevelverts.append(bevelvert)
+                        vevparallel[vindex][ea.index] = bevelvert.vi
+                        bevelvertindex += 1
+                    else:
+                        bevelvert = bevelverts[vei - len(me.vertices)]
+                        bevelvert.eb2i = eb.index
+                        bevelvert.f2i = findex
+                    vcor[vindex].append(bevelvert.vi)
+                #vflags[vindex] = VERT
+            else:
+                # 
+                # 
+                '''
+                if e1.select:
+                    ea, eb, vra, vrb = e2, e1, vr02, vr01
+                else:
+                    ea, eb, vra, vrb = e1, e2, vr01, vr02
+                '''
+                vra = vra.copy().normalize()
+                vrb = vrb.copy().normalize()
+                angle = vra.angle(vrb)
+                if angle > SMALL_NUMBER:
+                    v = vra / math.sin(angle)
+                    #co = va0 + v
+                else:
+                    v = Vector((0, 0, 0))
+                co = va0.copy()
+
+                vei = vevparallel[vindex][ea.index]
+                if not vei:
+                    bevelvert = BVert(v, co, bevelvertindex,
+                                      vindex, ea.index, findex)
+                    bevelvert.ebi = eb.index # bevel
+                    bevelvert.f = EDGE
+                    bevelverts.append(bevelvert)
+                    vevparallel[vindex][ea.index] = bevelvert.vi
+                    bevelvertindex += 1

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list