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$

1 Answer 1

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$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .