diff options
Diffstat (limited to 'io_mesh_raw')
-rw-r--r-- | io_mesh_raw/__init__.py | 69 | ||||
-rw-r--r-- | io_mesh_raw/export_raw.py | 112 | ||||
-rw-r--r-- | io_mesh_raw/import_raw.py | 143 |
3 files changed, 324 insertions, 0 deletions
diff --git a/io_mesh_raw/__init__.py b/io_mesh_raw/__init__.py new file mode 100644 index 00000000..d52a5808 --- /dev/null +++ b/io_mesh_raw/__init__.py @@ -0,0 +1,69 @@ +# ##### 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 ##### + +bl_addon_info = { + "name": "Raw mesh", + "author": "Anthony D,Agostino (Scorpius), Aurel Wildfellner", + "version": (0,2), + "blender": (2, 5, 3), + "api": 31667, + "location": "File > Import/Export > Raw faces ", + "description": "Import Raw Faces (.raw format)", + "warning": "", + "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.5/Py/"\ + "Scripts/File_I-O/Raw_Mesh_IO", + "tracker_url": "https://projects.blender.org/tracker/index.php?"\ + "func=detail&aid=21733&group_id=153&atid=469", + "category": "Import/Export"} + +import bpy + + +try: + init_data + + reload(import_raw) + reload(export_raw) +except: + from io_mesh_raw import import_raw + from io_mesh_raw import export_raw + +init_data = True + +def menu_import(self, context): + from io_mesh_raw import import_raw + self.layout.operator(import_raw.RawImporter.bl_idname, text="Raw Faces (.raw)").filepath = "*.raw" + + +def menu_export(self, context): + from io_mesh_raw import export_raw + import os + default_path = os.path.splitext(bpy.data.filepath)[0] + ".raw" + self.layout.operator(export_raw.RawExporter.bl_idname, text="Raw Faces (.raw)").filepath = default_path + + +def register(): + bpy.types.INFO_MT_file_import.append(menu_import) + bpy.types.INFO_MT_file_export.append(menu_export) + +def unregister(): + 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..59881564 --- /dev/null +++ b/io_mesh_raw/export_raw.py @@ -0,0 +1,112 @@ +# ##### 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:<br> + 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.vertices_raw: + fv.append(matrix * mesh.vertices[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(filepath, applyMods, triangulate): + faces = [] + for obj in bpy.context.selected_objects: + if obj.type == 'MESH': + matrix = obj.matrix_world + + if (applyMods): + me = obj.create_mesh(bpy.context.scene, 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(filepath, "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" + + filepath = StringProperty(name="File Path", description="Filepath used for exporting the RAW file", maxlen= 1024, default= "") + 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.filepath, self.apply_modifiers, self.triangulate) + return {'FINISHED'} + + def invoke(self, context, event): + wm = context.window_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..1cbf0a31 --- /dev/null +++ b/io_mesh_raw/import_raw.py @@ -0,0 +1,143 @@ +# ##### 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:<br> + Execute this script from the "File->Import" menu and choose a Raw file to +open. + +Notes:<br> + 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 io_utils 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_tot = 0 + + for f in faces: + for i, v in enumerate(f): + index = coords.get(v) + + if index is None: + index = coords[v] = index_tot + index_tot += 1 + verts.append(v) + + fi[i] = index + + mesh = bpy.data.meshes.new(objName) + mesh.vertices.add(len(verts)) + mesh.faces.add(len(faces)) + mesh.vertices.foreach_set("co", unpack_list(verts)) + mesh.faces.foreach_set("vertices_raw", unpack_face_list(faces)) + + return mesh + + +def addMeshObj(mesh, objName): + scn = bpy.context.scene + + for o in scn.objects: + o.select = False + + mesh.update() + nobj = bpy.data.objects.new(objName, mesh) + scn.objects.link(nobj) + nobj.select = 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" + + filepath = StringProperty(name="File Path", description="Filepath used for importing the RAW file", maxlen=1024, default="") + filename = StringProperty(name="File Name", description="Name of the file.") + + def execute(self, context): + + #convert the filename to an object name + objName = bpy.path.display_name(self.filename) + + mesh = readMesh(self.filepath, objName) + addMeshObj(mesh, objName) + + return {'FINISHED'} + + def invoke(self, context, event): + wm = context.window_manager + wm.add_fileselect(self) + return {'RUNNING_MODAL'} + +# package manages registering |