This looks cool and all, but it's beveled in the wrong direction. How can I flip the direction it bevels, so it looks more like a rounded cube, rather than a rounded plus-sign?
import bpy
import bmesh
from bpy.props import (
BoolProperty,
BoolVectorProperty,
FloatProperty,
FloatVectorProperty,
IntProperty,
)
#Returns all edges parallel to x-axis:
def get_x_parallel_edges(bm):
#The returned list of edges:
e_list = []
#Look for all the edges that
#run parallel to the x-axis:
for f in bm.faces:
for e in f.edges:
#Rename the coords:
ey0 = e.verts[0].co.y
ey1 = e.verts[1].co.y
ez0 = e.verts[0].co.z
ez1 = e.verts[1].co.z
#Check them:
if ey0 == ey1 and ez0 == ez1:
#Check for duplicates:
is_duplicate = False
for el in e_list:
if el == e:
is_duplicate = True
if not is_duplicate:
e_list += [e]
return e_list
#Break a list of edges
#into a list of verts:
def get_v_from_e(edges):
#The returned list of verts:
v_list = []
#Break apart the edges into verts:
for e in edges:
for v in e.verts:
#Check for duplicates:
is_duplicate = False
for vl in v_list:
if vl == v:
is_duplicate = True
if not is_duplicate:
v_list += [v]
return v_list
class AddBevCube(bpy.types.Operator):
bl_idname = "mesh.primitive_bev_cube_add"
bl_label = "Add Beveled Cube"
bl_options = {'REGISTER', 'UNDO'}
length = FloatProperty(
name="Length",
description="Box Length",
min=0.01, max=100.0,
default=4.0,
)
width = FloatProperty(
name="Width",
description="Box Width",
min=0.01, max=100.0,
default=3.0,
)
height = FloatProperty(
name="Height",
description="Box Height",
min=0.01, max=100.0,
default=2.0,
)
bev_seg = IntProperty(
name="Segments",
description="Bevel Segments",
min=1, max=100,
default=3,
)
bev_offset = FloatProperty(
name="Offset",
description="Bevel Offset",
min=0.01, max=100.0,
default=0.125,
)
def execute(self, context):
#Rename the variables:
l = self.length
w = self.width
h = self.height
seg = self.bev_seg
b_offset = self.bev_offset
#Make the cube object stuff:
mesh = bpy.data.meshes.new("cube")
cube_obj = bpy.data.objects.new("Cube_Obj", mesh)
scene = bpy.context.scene
scene.objects.link(cube_obj)
bm = bmesh.new()
#Add the cube:
bmesh.ops.create_cube(bm, size=0.5)
#Apply size:
bmesh.ops.scale(bm, vec=(l, w, h))
#First, get the verts and edges:
e_geom = get_x_parallel_edges(bm)
v_geom = get_v_from_e(e_geom)
#Now bevel:
bmesh.ops.bevel(bm,
geom=v_geom[:] + e_geom[:],
offset=b_offset,
offset_type=0,
segments=seg,
clamp_overlap=True)
bm.to_mesh(mesh)
mesh.update()
return {'FINISHED'}
def menu_func(self, context):
self.layout.operator(AddBevCube.bl_idname, icon='MESH_CUBE')
def register():
bpy.utils.register_class(AddBevCube)
bpy.types.INFO_MT_mesh_add.append(menu_func)
def unregister():
bpy.utils.unregister_class(AddBevCube)
bpy.types.INFO_MT_mesh_add.remove(menu_func)
if __name__ == "__main__":
register()
