This is in case you wanted pyramid of separate objects *linked "share the same data" or not:
- run the script
- select an object
- hit space type "pyramid" select "create a pyramid"
- setup the options through the tool shelf

the script :
import bpy
from bpy.props import IntProperty,FloatProperty,BoolProperty
class Pyramid(bpy.types.Operator):
"""Add a simple box mesh"""
bl_idname = "object.pyramid"
bl_label = "Create a Pyramid"
bl_options = {'REGISTER', 'UNDO'}
steps = IntProperty(name="Steps",description="Number of items to create",min=1, max=100, default=1 )
Z_offset = FloatProperty(name="Z Offset",description="Z offset",min=-100.0, max=100.0, default=2.0 )
dX = FloatProperty(name="X increment",description="X increment",min=-100.0, max=100.0, default=2.0 )
dY = FloatProperty(name="Y increment",description="Y increment",min=-100.0, max=100.0, default=2.0 )
linked = BoolProperty(name="Linked",description="created objects are linked to the original",default =False)
apply_t = BoolProperty(name="Apply Transform",description="apply object transform",default =False)
def execute(self, context):
steps = self.steps
Z_offset = self.Z_offset
dX = self.dX
dY = self.dY
linked = self.linked
apply_t=self.apply_t
for x in range(0, steps):
if linked :
bpy.ops.object.duplicate_move_linked()
else :
bpy.ops.object.duplicate()
bpy.context.object.dimensions[0] += dX
bpy.ops.transform.translate( value =(0,0,Z_offset))
bpy.context.object.dimensions[1] += dY
if apply_t and not linked:
bpy.ops.object.transform_apply(scale =True)
return {'FINISHED'}
def register():
bpy.utils.register_class(Pyramid)
def unregister():
bpy.utils.unregister_class(Pyramid)
if __name__ == "__main__":
register()