[#21237] RAW triangle file importer

ported by Aurel W (aurel)

made adjustments to have this as a package in the extensions directory since this format isnt commonly used for interchanging data but still useful at times.
This commit is contained in:
2010-02-22 13:21:09 +00:00
parent 4ef1fd1078
commit d524f46335
3 changed files with 307 additions and 0 deletions

View File

@@ -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()

View File

@@ -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:<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.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

View File

@@ -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:<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 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