[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