| 
									
										
										
										
											2011-01-12 17:29:54 +00:00
										 |  |  | import bpy | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def add_box(width, height, depth): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     This function takes inputs and returns vertex and face arrays. | 
					
						
							|  |  |  |     no actual mesh data creation is done here. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     vertices = [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 in range(0, len(vertices), 3): | 
					
						
							|  |  |  |         vertices[i] *= width | 
					
						
							|  |  |  |         vertices[i + 1] *= depth | 
					
						
							|  |  |  |         vertices[i + 2] *= height | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return vertices, faces | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-27 15:25:24 +00:00
										 |  |  | from bpy.props import FloatProperty, BoolProperty, FloatVectorProperty | 
					
						
							| 
									
										
										
										
											2011-01-12 17:29:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AddBox(bpy.types.Operator): | 
					
						
							|  |  |  |     '''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", | 
					
						
							|  |  |  |             default=1.0, min=0.01, max=100.0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     height = FloatProperty(name="Height", | 
					
						
							|  |  |  |             description="Box Height", | 
					
						
							|  |  |  |             default=1.0, min=0.01, max=100.0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     depth = FloatProperty(name="Depth", | 
					
						
							|  |  |  |             description="Box Depth", | 
					
						
							|  |  |  |             default=1.0, min=0.01, max=100.0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # generic transform props | 
					
						
							|  |  |  |     view_align = BoolProperty(name="Align to View", | 
					
						
							|  |  |  |             default=False) | 
					
						
							| 
									
										
										
										
											2011-01-24 15:25:03 +00:00
										 |  |  |     location = FloatVectorProperty(name="Location", | 
					
						
							|  |  |  |             subtype='TRANSLATION') | 
					
						
							|  |  |  |     rotation = FloatVectorProperty(name="Rotation", | 
					
						
							|  |  |  |             subtype='EULER') | 
					
						
							| 
									
										
										
										
											2011-01-12 17:29:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def execute(self, context): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         verts_loc, faces = add_box(self.width, | 
					
						
							|  |  |  |                                      self.height, | 
					
						
							|  |  |  |                                      self.depth, | 
					
						
							|  |  |  |                                      ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         mesh = bpy.data.meshes.new("Box") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         mesh.vertices.add(len(verts_loc) // 3) | 
					
						
							|  |  |  |         mesh.faces.add(len(faces) // 4) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         mesh.vertices.foreach_set("co", verts_loc) | 
					
						
							|  |  |  |         mesh.faces.foreach_set("vertices_raw", faces) | 
					
						
							| 
									
										
										
										
											2011-02-08 21:32:26 +00:00
										 |  |  |         mesh.update() | 
					
						
							| 
									
										
										
										
											2011-01-12 17:29:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # add the mesh as an object into the scene with this utility module | 
					
						
							| 
									
										
										
										
											2011-05-16 07:51:02 +00:00
										 |  |  |         from bpy_extras import object_utils | 
					
						
							|  |  |  |         object_utils.object_data_add(context, mesh, operator=self) | 
					
						
							| 
									
										
										
										
											2011-01-12 17:29:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return {'FINISHED'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def menu_func(self, context): | 
					
						
							|  |  |  |     self.layout.operator(AddBox.bl_idname, icon='MESH_CUBE') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def register(): | 
					
						
							| 
									
										
										
										
											2011-02-12 08:04:32 +00:00
										 |  |  |     bpy.utils.register_class(AddBox) | 
					
						
							| 
									
										
										
										
											2011-01-12 17:29:54 +00:00
										 |  |  |     bpy.types.INFO_MT_mesh_add.append(menu_func) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def unregister(): | 
					
						
							| 
									
										
										
										
											2011-02-12 08:04:32 +00:00
										 |  |  |     bpy.utils.unregister_class(AddBox) | 
					
						
							| 
									
										
										
										
											2011-01-12 17:29:54 +00:00
										 |  |  |     bpy.types.INFO_MT_mesh_add.remove(menu_func) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							| 
									
										
										
										
											2011-02-12 08:04:32 +00:00
										 |  |  |     register() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # test call | 
					
						
							| 
									
										
										
										
											2011-01-12 17:29:54 +00:00
										 |  |  |     bpy.ops.mesh.primitive_box_add() |