[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [1898] contrib/py/scripts/addons/ mesh_bevel: Upgrade for Mesh_Bevel.
Brendon Murphy
meta.androcto1 at gmail.com
Sat May 7 12:13:08 CEST 2011
Revision: 1898
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=1898
Author: meta-androcto
Date: 2011-05-07 10:13:07 +0000 (Sat, 07 May 2011)
Log Message:
-----------
Upgrade for Mesh_Bevel.
Updated to correct version. New modules & __init__ file.
Fixes many reported bugs & errors.
Thanks to Mont29 for the upgrade :)
Thanks to chromoly for the script.
Modified Paths:
--------------
contrib/py/scripts/addons/mesh_bevel/__init__.py
Added Paths:
-----------
contrib/py/scripts/addons/mesh_bevel/va/
contrib/py/scripts/addons/mesh_bevel/va/__init__.py
contrib/py/scripts/addons/mesh_bevel/va/gl.py
contrib/py/scripts/addons/mesh_bevel/va/math.py
contrib/py/scripts/addons/mesh_bevel/va/mesh.py
contrib/py/scripts/addons/mesh_bevel/va/utils.py
contrib/py/scripts/addons/mesh_bevel/va/view.py
Removed Paths:
-------------
contrib/py/scripts/addons/mesh_bevel/bevel.py
contrib/py/scripts/addons/mesh_bevel/va.py
Modified: contrib/py/scripts/addons/mesh_bevel/__init__.py
===================================================================
--- contrib/py/scripts/addons/mesh_bevel/__init__.py 2011-05-07 02:59:24 UTC (rev 1897)
+++ contrib/py/scripts/addons/mesh_bevel/__init__.py 2011-05-07 10:13:07 UTC (rev 1898)
@@ -1,3 +1,5 @@
+# -*- coding: utf-8 -*-
+
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
@@ -16,39 +18,1044 @@
#
# ##### END GPL LICENSE BLOCK #####
+# version updated 07/05/2011 by mont29
+
bl_info = {
'name': 'Bevel',
'author': 'chromoly',
- 'version': (0, 3),
+ 'version': (0, 4),
'blender': (2, 5, 7),
- 'api': 36090,
- 'location': 'View3D > EditMode > Specials (W Key)',
- 'warning': "Buggy",
- 'wiki_url': 'http://wiki.blender.org/index.php/Extensions:2.5/Py/'\
- 'Scripts/Modeling/Bevel',
- 'tracker_url': "http://projects.blender.org/tracker/index.php?"\
- "func=detail&aid=23563",
+ 'api': 36505,
+ 'location': 'View3D > EditMode > Specials',
+ 'url': '',
'category': 'Mesh'}
-if "bpy" in locals():
- import imp
- imp.reload(bevel)
-else:
- from . import bevel
+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
+#geo = mathutils.geometry
+#import va.vaold
+#from va.vaold import *
+from .va.mesh import vert_vert_dict, key_edge_dict_old, edge_face_dict, vert_face_dict, vert_edge_dict, keypath
+from .va.utils import Null, the_other, axis_angle_to_quat
+
+
+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 fill(verts):
+ """
+ This creates faces (with as much quads as possible) out of the given list of vertices.
+ It assumes that list is a loop, hence using two first and last verts for face one, etc.
+ """
+ nbr = len(verts) - 1
+ faces = []
+ i = nbr
+ while 1:
+ if i-1 > nbr - (i-1):
+ faces.append([verts[nbr-i], verts[nbr-i+1], verts[i-1], verts[i]])
+ i -= 1
+ continue
+ if i-1 == nbr - (i-1):
+ faces.append([verts[nbr-i], verts[i-1], verts[i]])
+ break
+ return faces
+
+def bevel(ob, follow, beveltype):
+ 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_old(me, sel=0)
+
+ bevelverts = []
+ bevelvertindex = len(me.vertices)
+ bevelfaces = bfaces = []
+ bevelfaces_material = bfmats = []
+ # ekparallel: 既存の辺からbevelされた辺を参照。面を張る為にkeyをsortedしない
+ 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
+ # flag作り2
+ 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 beveltype == '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).normalized()
+ 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.normalized()
+ #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.normalized()
+ vrb = vrb.normalized()
+ 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