db614f3a74c6f3ea4767c6aed96ffa796fc80d52
[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             subtype='TRANSLATION')
63     rotation = FloatVectorProperty(name="Rotation",
64             subtype='EULER')
65
66     def execute(self, context):
67
68         verts_loc, faces = add_box(self.width,
69                                      self.height,
70                                      self.depth,
71                                      )
72
73         mesh = bpy.data.meshes.new("Box")
74
75         mesh.vertices.add(len(verts_loc) // 3)
76         mesh.faces.add(len(faces) // 4)
77
78         mesh.vertices.foreach_set("co", verts_loc)
79         mesh.faces.foreach_set("vertices_raw", faces)
80         mesh.update()
81
82         # add the mesh as an object into the scene with this utility module
83         import add_object_utils
84         add_object_utils.object_data_add(context, mesh, operator=self)
85
86         return {'FINISHED'}
87
88
89 def menu_func(self, context):
90     self.layout.operator(AddBox.bl_idname, icon='MESH_CUBE')
91
92
93 def register():
94     bpy.types.INFO_MT_mesh_add.append(menu_func)
95
96
97 def unregister():
98     bpy.types.INFO_MT_mesh_add.remove(menu_func)
99
100 if __name__ == "__main__":
101     bpy.ops.mesh.primitive_box_add()