[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