simple add mesh operator template.
[blender.git] / release / scripts / templates / operator_mesh_add.py
1 import bpy
2
3
4 def add_box(width, height, depth):
5     """
6     This function takes inputs and returns vertex and face arrays.
7     no actual mesh data creation is done here.
8     """
9
10     vertices = [1.0, 1.0, -1.0,
11                 1.0, -1.0, -1.0,
12                 -1.0, -1.0, -1.0,
13                 -1.0, 1.0, -1.0,
14                 1.0, 1.0, 1.0,
15                 1.0, -1.0, 1.0,
16                 -1.0, -1.0, 1.0,
17                 -1.0, 1.0, 1.0,
18                 ]
19
20     faces = [0, 1, 2, 3,
21              4, 7, 6, 5,
22              0, 4, 5, 1,
23              1, 5, 6, 2,
24              2, 6, 7, 3,
25              4, 0, 3, 7,
26             ]
27
28     # apply size
29     for i in range(0, len(vertices), 3):
30         vertices[i] *= width
31         vertices[i + 1] *= depth
32         vertices[i + 2] *= height
33
34     return vertices, faces
35
36
37 from bpy.props import *
38
39
40 class AddBox(bpy.types.Operator):
41     '''Add a simple box mesh'''
42     bl_idname = "mesh.primitive_box_add"
43     bl_label = "Add Box"
44     bl_options = {'REGISTER', 'UNDO'}
45
46     width = FloatProperty(name="Width",
47             description="Box Width",
48             default=1.0, min=0.01, max=100.0)
49
50     height = FloatProperty(name="Height",
51             description="Box Height",
52             default=1.0, min=0.01, max=100.0)
53
54     depth = FloatProperty(name="Depth",
55             description="Box Depth",
56             default=1.0, min=0.01, max=100.0)
57
58     # generic transform props
59     view_align = BoolProperty(name="Align to View",
60             default=False)
61     location = FloatVectorProperty(name="Location")
62     rotation = FloatVectorProperty(name="Rotation")
63
64     def execute(self, context):
65
66         verts_loc, faces = add_box(self.width,
67                                      self.height,
68                                      self.depth,
69                                      )
70
71         mesh = bpy.data.meshes.new("Box")
72
73         mesh.vertices.add(len(verts_loc) // 3)
74         mesh.faces.add(len(faces) // 4)
75
76         mesh.vertices.foreach_set("co", verts_loc)
77         mesh.faces.foreach_set("vertices_raw", faces)
78         mesh.update()
79
80         # add the mesh as an object into the scene with this utility module
81         import add_object_utils
82         add_object_utils.object_data_add(context, mesh, operator=self)
83
84         return {'FINISHED'}
85
86
87 def menu_func(self, context):
88     self.layout.operator(AddBox.bl_idname, icon='MESH_CUBE')
89
90
91 def register():
92     bpy.types.INFO_MT_mesh_add.append(menu_func)
93
94
95 def unregister():
96     bpy.types.INFO_MT_mesh_add.remove(menu_func)
97
98 if __name__ == "__main__":
99     bpy.ops.mesh.primitive_box_add()