1
$\begingroup$

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.

$\endgroup$
0
$\begingroup$

The geom parameter must be a list of edges and their verts, see:

Beveling edges with varying number of segments (preferably programatically)

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.