Skip to main content
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Bumped by Community user
Source Link
Carel
  • 247
  • 1
  • 11

BMesh and Bevel

I'm trying to perform a bevel operation using the bmesh API. My script either crashes blender, with the error message EXCEPTION_ACCESS_VIOLATION, or it doesn't do anything, with the 'new' geometry being {'face':[]}. To make it crash I pass the edges to the geom argument, pass it the verts causes nothing to happen. Has anyone managed to use bevel successfully before.

import bpy
import bmesh
from math      import *
from mathutils import *

AXES = {'X' : Vector((1,0,0)),
        'Y' : Vector((0,1,0)),
        'Z' : Vector((0,0,1))}

def selectPlane(bm, normal = 'z', location = Vector((0,0,0)), feature = 'verts', tolerance = 0.1) : # bpy.context.active_object.location
    normal = normal if isinstance(normal, Vector) else AXES[normal.upper()]
    if isinstance(feature, list) :
       return {key : planeSelect(bm, normal, feature, location, tolerance) for key in feature}
    else : 
       return {'verts' : [vert for vert in bm.verts if abs(vert.co.__sub__(location).dot(normal)) < tolerance],
               'edges' : [], 
               'faces' : []}[feature]

def selectCylinder(bm, radius = 1, normal = 'z', feature = 'verts', location = Vector((0,0,0)), tolerance = 0.1) :
    normal = normal if isinstance(normal, Vector) else AXES[normal.upper()]
    projxn = lambda vector : vector - vector.project(normal)
    if isinstance(feature, list) :
       return {key : selectCylinder(bm, radius, feature, location, tolerance) for key in feature}
    else : 
       return {'verts' : [vert for vert in bm.verts if abs(projxn(vert.co.__sub__(location)).length - radius) < tolerance],
               'edges' : [edge for edge in bm.edges if all([abs(projxn(vert.co.__sub__(location)).length - radius) < tolerance for vert in edge.verts])], 
               'faces' : []}[feature]

me = bpy.data.meshes.new("Temp")
ob = bpy.data.objects.new("Temp", me)
bm = bmesh.new()
diameter = 20
length   = 20
matrix   = Matrix.Identity(4)
ge = bmesh.ops.create_cone(bm, cap_ends  = True,
                               cap_tris  = True,
                               segments  = 12,
                               diameter1 = diameter,
                               diameter2 = diameter,
                               depth     = length,
                               matrix    = matrix)
go = selectCylinder(bm, radius = diameter, feature = 'edges')
ug = selectPlane(bm, location = Vector((0, 0,  length/2)))
lg = selectPlane(bm, location = Vector((0, 0, -length/2)))
es = [edge for edge in go if all([vert in ug for vert in edge.verts])]
vs = list(set([vert for edge in es for vert in edge.verts]))
print('#'*5)
print(go)
print(es)
ge = bmesh.ops.bevel(bm, geom   = vs, # list(set([vert for edge in es for vert in edge.verts])),
                         offset = 2)
print('>'*5)
print(ge)
bm.to_mesh(me)
bm.free()
me.update()
bpy.context.scene.objects.link(ob)

The selectCylinder and selectPlane methods are there to select the appropriate vertices and edges but for the rest it's just bmesh operations.

1
2