From 79d89af92401a7db16d4e0c86c6126d603eaef1b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 3 Mar 2010 07:51:37 +0000 Subject: moving scripts from blender to bf-extensions --- io_mesh_raw/__init__.py | 51 +++++++++++++++++ io_mesh_raw/export_raw.py | 114 +++++++++++++++++++++++++++++++++++++ io_mesh_raw/import_raw.py | 142 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 307 insertions(+) create mode 100644 io_mesh_raw/__init__.py create mode 100644 io_mesh_raw/export_raw.py create mode 100644 io_mesh_raw/import_raw.py (limited to 'io_mesh_raw') diff --git a/io_mesh_raw/__init__.py b/io_mesh_raw/__init__.py new file mode 100644 index 00000000..a7f38ad6 --- /dev/null +++ b/io_mesh_raw/__init__.py @@ -0,0 +1,51 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# blender 1 line description +"Raw Mesh IO (File > Import/Export > Raw Faces (.raw))" + +import bpy + + +def menu_import(self, context): + from io_mesh_raw import import_raw + self.layout.operator(import_raw.RawImporter.bl_idname, text="Raw Faces (.raw)").path = "*.raw" + + +def menu_export(self, context): + from io_mesh_raw import export_raw + default_path = bpy.data.filename.replace(".blend", ".raw") + self.layout.operator(export_raw.RawExporter.bl_idname, text="Raw Faces (.raw)").path = default_path + + +def register(): + from io_mesh_raw import import_raw, export_raw + bpy.types.register(import_raw.RawImporter) + bpy.types.register(export_raw.RawExporter) + bpy.types.INFO_MT_file_import.append(menu_import) + bpy.types.INFO_MT_file_export.append(menu_export) + +def unregister(): + from io_mesh_raw import import_raw, export_raw + bpy.types.unregister(import_raw.RawImporter) + bpy.types.unregister(export_raw.RawExporter) + bpy.types.INFO_MT_file_import.remove(menu_import) + bpy.types.INFO_MT_file_export.remove(menu_export) + +if __name__ == "__main__": + register() diff --git a/io_mesh_raw/export_raw.py b/io_mesh_raw/export_raw.py new file mode 100644 index 00000000..e94e26bb --- /dev/null +++ b/io_mesh_raw/export_raw.py @@ -0,0 +1,114 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +__author__ = ["Aurel Wildfellner"] +__version__ = '0.2' +__bpydoc__ = """\ +This script exports a Mesh to a RAW triangle format file. + +The raw triangle format is very simple; it has no verts or faces lists. +It's just a simple ascii text file with the vertices of each triangle +listed on each line. In addition, also quads can be exported as a line +of 12 values (this was the default before blender 2.5). Now default +settings will triangulate the mesh. + +Usage:
+ Execute this script from the "File->Export" menu. You can select +whether modifiers should be applied and if the mesh is triangulated. + +""" + +import bpy + + +def faceToTriangles(face): + triangles = [] + if (len(face) == 4): #quad + triangles.append( [ face[0], face[1], face[2] ] ) + triangles.append( [ face[2], face[3], face[0] ] ) + else: + triangles.append(face) + + return triangles + + +def faceValues(face, mesh, matrix): + fv = [] + for verti in face.verts_raw: + fv.append(matrix * mesh.verts[verti].co) + return fv + + +def faceToLine(face): + line = "" + for v in face: + line += str(v[0]) + " " + str(v[1]) + " " + str(v[2]) + " " + return line[:-1] + "\n" + + +def export_raw(path, applyMods, triangulate): + faces = [] + for obj in bpy.context.selected_objects: + if obj.type == 'MESH': + matrix = obj.matrix + + if (applyMods): + me = obj.create_mesh(True, "PREVIEW") + else: + me = obj.data + + for face in me.faces: + fv = faceValues(face, me, matrix) + if triangulate: + faces.extend(faceToTriangles(fv)) + else: + faces.append(fv) + + # write the faces to a file + file = open(path, "w") + for face in faces: + file.write(faceToLine(face)) + file.close() + + +from bpy.props import * + + +class RawExporter(bpy.types.Operator): + '''Save Raw triangle mesh data''' + bl_idname = "export_mesh.raw" + bl_label = "Export RAW" + + path = StringProperty(name="File Path", description="File path used for exporting the RAW file", maxlen= 1024, default= "") + filename = StringProperty(name="File Name", description="Name of the file.") + directory = StringProperty(name="Directory", description="Directory of the file.") + check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'}) + + apply_modifiers = BoolProperty(name="Apply Modifiers", description="Use transformed mesh data from each object", default=True) + triangulate = BoolProperty(name="Triangulate", description="Triangulate quads.", default=True) + + def execute(self, context): + export_raw(self.properties.path, self.properties.apply_modifiers, self.properties.triangulate) + return {'FINISHED'} + + def invoke(self, context, event): + wm = context.manager + wm.add_fileselect(self) + return {'RUNNING_MODAL'} + +# package manages registering diff --git a/io_mesh_raw/import_raw.py b/io_mesh_raw/import_raw.py new file mode 100644 index 00000000..fc1bddc7 --- /dev/null +++ b/io_mesh_raw/import_raw.py @@ -0,0 +1,142 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +__author__ = ["Anthony D'Agostino (Scorpius)", "Aurel Wildfellner"] +__version__ = '0.2' +__bpydoc__ = """\ +This script imports Raw Triangle File format files to Blender. + +The raw triangle format is very simple; it has no verts or faces lists. +It's just a simple ascii text file with the vertices of each triangle +listed on each line. In addition, a line with 12 values will be +imported as a quad. This may be in conflict with some other +applications, which use a raw format, but this is how it was +implemented back in blender 2.42. + +Usage:
+ Execute this script from the "File->Import" menu and choose a Raw file to +open. + +Notes:
+ Generates the standard verts and faces lists, but without duplicate +verts. Only *exact* duplicates are removed, there is no way to specify a +tolerance. +""" + + + +import bpy + +# move those to a utility modul +from import_scene_obj import unpack_face_list, unpack_list # TODO, make generic + + +def readMesh(filename, objName): + file = open(filename, "rb") + + def line_to_face(line): + # Each triplet is an xyz float + line_split = [] + try: + line_split = list(map(float, line.split())) + except: + return None + + if len(line_split) == 9: # Tri + f1, f2, f3, f4, f5, f6, f7, f8, f9 = line_split + return [(f1, f2, f3), (f4, f5, f6), (f7, f8, f9)] + elif len(line_split) == 12: # Quad + f1, f2, f3, f4, f5, f6, f7, f8, f9, A, B, C = line_split + return [(f1, f2, f3), (f4, f5, f6), (f7, f8, f9), (A, B, C)] + else: + return None + + + faces = [] + for line in file.readlines(): + face = line_to_face(line) + if face: + faces.append(face) + + file.close() + + # Generate verts and faces lists, without duplicates + verts = [] + coords = {} + index = 0 + + for f in faces: + for i, v in enumerate(f): + try: + f[i] = coords[v] + except: + f[i] = coords[v] = index + index += 1 + verts.append(v) + + mesh = bpy.data.meshes.new(objName) + mesh.add_geometry(int(len(verts)), 0, int(len(faces))) + mesh.verts.foreach_set("co", unpack_list(verts)) + mesh.faces.foreach_set("verts_raw", unpack_face_list(faces)) + mesh.faces.foreach_set("smooth", [False] * len(mesh.faces)) + + return mesh + + +def addMeshObj(mesh, objName): + scn = bpy.context.scene + + for o in scn.objects: + o.selected = False + + mesh.update() + nobj = bpy.data.objects.new(objName, mesh) + scn.objects.link(nobj) + nobj.selected = True + + if scn.objects.active == None or scn.objects.active.mode == 'OBJECT': + scn.objects.active = nobj + + +from bpy.props import * + +class RawImporter(bpy.types.Operator): + '''Load Raw triangle mesh data''' + bl_idname = "import_mesh.raw" + bl_label = "Import RAW" + + path = StringProperty(name="File Path", description="File path used for importing the RAW file", maxlen=1024, default="") + filename = StringProperty(name="File Name", description="Name of the file.") + directory = StringProperty(name="Directory", description="Directory of the file.") + + def execute(self, context): + + #convert the filename to an object name + objName = bpy.utils.display_name(self.properties.filename) + + mesh = readMesh(self.properties.path, objName) + addMeshObj(mesh, objName) + + return {'FINISHED'} + + def invoke(self, context, event): + wm = context.manager + wm.add_fileselect(self) + return {'RUNNING_MODAL'} + +# package manages registering -- cgit v1.2.3