Also move align items into the enum call as there is no need to have this accessible from the class.
127 lines
2.7 KiB
Python
127 lines
2.7 KiB
Python
import bpy
|
|
import bmesh
|
|
from bpy_extras.object_utils import AddObjectHelper
|
|
|
|
|
|
def add_box(width, height, depth):
|
|
"""
|
|
This function takes inputs and returns vertex and face arrays.
|
|
no actual mesh data creation is done here.
|
|
"""
|
|
|
|
verts = [
|
|
(+1.0, +1.0, -1.0),
|
|
(+1.0, -1.0, -1.0),
|
|
(-1.0, -1.0, -1.0),
|
|
(-1.0, +1.0, -1.0),
|
|
(+1.0, +1.0, +1.0),
|
|
(+1.0, -1.0, +1.0),
|
|
(-1.0, -1.0, +1.0),
|
|
(-1.0, +1.0, +1.0),
|
|
]
|
|
|
|
faces = [
|
|
(0, 1, 2, 3),
|
|
(4, 7, 6, 5),
|
|
(0, 4, 5, 1),
|
|
(1, 5, 6, 2),
|
|
(2, 6, 7, 3),
|
|
(4, 0, 3, 7),
|
|
]
|
|
|
|
# apply size
|
|
for i, v in enumerate(verts):
|
|
verts[i] = v[0] * width, v[1] * depth, v[2] * height
|
|
|
|
return verts, faces
|
|
|
|
|
|
from bpy.props import (
|
|
BoolProperty,
|
|
BoolVectorProperty,
|
|
EnumProperty,
|
|
FloatProperty,
|
|
FloatVectorProperty,
|
|
)
|
|
|
|
|
|
class AddBox(bpy.types.Operator, AddObjectHelper):
|
|
"""Add a simple box mesh"""
|
|
bl_idname = "mesh.primitive_box_add"
|
|
bl_label = "Add Box"
|
|
bl_options = {'REGISTER', 'UNDO'}
|
|
|
|
width: FloatProperty(
|
|
name="Width",
|
|
description="Box Width",
|
|
min=0.01, max=100.0,
|
|
default=1.0,
|
|
)
|
|
height: FloatProperty(
|
|
name="Height",
|
|
description="Box Height",
|
|
min=0.01, max=100.0,
|
|
default=1.0,
|
|
)
|
|
depth: FloatProperty(
|
|
name="Depth",
|
|
description="Box Depth",
|
|
min=0.01, max=100.0,
|
|
default=1.0,
|
|
)
|
|
layers: BoolVectorProperty(
|
|
name="Layers",
|
|
description="Object Layers",
|
|
size=20,
|
|
options={'HIDDEN', 'SKIP_SAVE'},
|
|
)
|
|
|
|
def execute(self, context):
|
|
|
|
verts_loc, faces = add_box(
|
|
self.width,
|
|
self.height,
|
|
self.depth,
|
|
)
|
|
|
|
mesh = bpy.data.meshes.new("Box")
|
|
|
|
bm = bmesh.new()
|
|
|
|
for v_co in verts_loc:
|
|
bm.verts.new(v_co)
|
|
|
|
bm.verts.ensure_lookup_table()
|
|
for f_idx in faces:
|
|
bm.faces.new([bm.verts[i] for i in f_idx])
|
|
|
|
bm.to_mesh(mesh)
|
|
mesh.update()
|
|
|
|
# add the mesh as an object into the scene with this utility module
|
|
from bpy_extras import object_utils
|
|
object_utils.object_data_add(context, mesh, operator=self)
|
|
|
|
return {'FINISHED'}
|
|
|
|
|
|
def menu_func(self, context):
|
|
self.layout.operator(AddBox.bl_idname, icon='MESH_CUBE')
|
|
|
|
|
|
def register():
|
|
bpy.utils.register_class(AddBox)
|
|
bpy.types.VIEW3D_MT_mesh_add.append(menu_func)
|
|
|
|
|
|
def unregister():
|
|
bpy.utils.unregister_class(AddBox)
|
|
bpy.types.VIEW3D_MT_mesh_add.remove(menu_func)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
register()
|
|
|
|
# test call
|
|
bpy.ops.mesh.primitive_box_add()
|