import bpy, bmesh, struct def write_some_data(context, filepath, use_some_setting): f = open(filepath, "wb") bm = bmesh.new() bm.from_object(context.active_object, context.scene) bmesh.ops.triangulate(bm, faces = bm.faces) for face in bm.faces: for loop in face.loops: f.write(struct.pack("3f", loop.vert.co.x, loop.vert.co.z, -loop.vert.co.y)) f.close() return {'FINISHED'} # ExportHelper is a helper class, defines filename and # invoke() function which calls the file selector. from bpy_extras.io_utils import ExportHelper from bpy.props import StringProperty, BoolProperty, EnumProperty from bpy.types import Operator class ExportSomeData(Operator, ExportHelper): """This appears in the tooltip of the operator and in the generated docs""" bl_idname = "export_trimesh.some_data" # important since its how bpy.ops.import_test.some_data is constructed bl_label = "Export Triangle Mesh" # ExportHelper mixin class uses this filename_ext = ".phys" filter_glob = StringProperty( default="*.phys", options={'HIDDEN'}, maxlen=255, # Max internal buffer length, longer would be clamped. ) # List of operator properties, the attributes will be assigned # to the class instance from the operator settings before calling. use_setting = BoolProperty( name="Example Boolean", description="Example Tooltip", default=True, ) type = EnumProperty( name="Example Enum", description="Choose between two items", items=(('OPT_A', "First Option", "Description one"), ('OPT_B', "Second Option", "Description two")), default='OPT_A', ) def execute(self, context): return write_some_data(context, self.filepath, self.use_setting) # Only needed if you want to add into a dynamic menu def menu_func_export(self, context): self.layout.operator(ExportSomeData.bl_idname, text="Export Raw Triangle Mesh") def register(): bpy.utils.register_class(ExportSomeData) bpy.types.INFO_MT_file_export.append(menu_func_export) def unregister(): bpy.utils.unregister_class(ExportSomeData) bpy.types.INFO_MT_file_export.remove(menu_func_export) if __name__ == "__main__": register()