updated raw import/export nice error messages, optimized with LC's removed meshtools depencancy, use Mesh instead of NMesh

This commit is contained in:
Campbell Barton 2006-07-06 19:02:22 +00:00
parent 96c6457b26
commit e8d39a3ca3
2 changed files with 88 additions and 72 deletions

@ -1,8 +1,8 @@
#!BPY
"""
Name: 'Raw Triangle (.raw)...'
Blender: 232
Name: 'Raw Faces (.raw)...'
Blender: 242
Group: 'Export'
Tooltip: 'Export selected mesh to Raw Triangle Format (.raw)'
"""
@ -53,49 +53,48 @@ Usage:<br>
#
# ***** END GPL LICENCE BLOCK *****
import Blender, meshtools
import sys
#import time
import Blender
import BPyMesh
# =================================
# === Write RAW Triangle Format ===
# =================================
def write(filename):
#start = time.clock()
start = Blender.sys.time()
if not filename.lower().endswith('.raw'):
filename += '.raw'
scn= Blender.Scene.GetCurrent()
object= scn.getActiveObject()
if not object:
Blender.Draw.PupMenu('Error%t|Select 1 active object')
return
file = open(filename, 'wb')
mesh = BPyMesh.getMeshFromObject(object, None, True, False, scn)
if not mesh:
Blender.Draw.PupMenu('Error%t|Could not get mesh data from active object')
return
mesh.transform(object.matrixWorld)
file = open(filename, "wb")
objects = Blender.Object.GetSelected()
objname = objects[0].name
meshname = objects[0].data.name
mesh = Blender.NMesh.GetRaw(meshname)
obj = Blender.Object.Get(objname)
std=sys.stdout
sys.stdout=file
for face in mesh.faces:
if len(face.v) == 3: # triangle
v1, v2, v3 = face.v
faceverts = tuple(v1.co) + tuple(v2.co) + tuple(v3.co)
print "% f % f % f % f % f % f % f % f % f" % faceverts
else: # quadrilateral
v1, v2, v3, v4 = face.v
faceverts1 = tuple(v1.co) + tuple(v2.co) + tuple(v3.co)
faceverts2 = tuple(v3.co) + tuple(v4.co) + tuple(v1.co)
print "% f % f % f % f % f % f % f % f % f" % faceverts1
print "% f % f % f % f % f % f % f % f % f" % faceverts2
sys.stdout=std
Blender.Window.DrawProgressBar(1.0, '') # clear progressbar
for f in mesh.faces:
for v in f.v:
file.write('%.6f %.6f %.6f ' % tuple(v.co))
file.write('\n')
file.close()
#end = time.clock()
#seconds = " in %.2f %s" % (end-start, "seconds")
message = "Successfully exported " + Blender.sys.basename(filename)# + seconds
meshtools.print_boxed(message)
end = Blender.sys.time()
message = 'Successfully exported "%s" in %.4f seconds' % ( Blender.sys.basename(filename), end-start)
print message
def fs_callback(filename):
if filename.find('.raw', -4) <= 0: filename += '.raw'
write(filename)
Blender.Window.FileSelector(fs_callback, "Export Raw")
def main():
Blender.Window.FileSelector(write, 'RAW Export', Blender.sys.makename(ext='.raw'))
if __name__=='__main__':
main()

@ -1,8 +1,8 @@
#!BPY
"""
Name: 'Raw Triangle (.raw)...'
Blender: 232
Name: 'Raw Faces (.raw)...'
Blender: 242
Group: 'Import'
Tooltip: 'Import Raw Triangle File Format (.raw)'
"""
@ -59,50 +59,67 @@ tolerance.
#
# ***** END GPL LICENCE BLOCK *****
import Blender, meshtools
#import time
import Blender
# ================================
# === Read RAW Triangle Format ===
# ================================
def read(filename):
#start = time.clock()
t = Blender.sys.time()
file = open(filename, "rb")
# Collect data from RAW format
faces = []
for line in file.readlines():
try:
f1, f2, f3, f4, f5, f6, f7, f8, f9 = map(float, line.split())
faces.append([(f1, f2, f3), (f4, f5, f6), (f7, f8, f9)])
except: # Quad
f1, f2, f3, f4, f5, f6, f7, f8, f9, A, B, C = map(float, line.split())
faces.append([(f1, f2, f3), (f4, f5, f6), (f7, f8, f9), (A, B, C)])
def line_to_face(line):
# Each triplet is an xyz float
line_split= map(float, line.split())
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)]
if 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)]
faces = [ line_to_face(line) for line in file.readlines()]
file.close()
# Generate verts and faces lists, without duplicates
verts = []
coords = {}
index = 0
for i in range(len(faces)):
for j in range(len(faces[i])):
vertex = faces[i][j]
if not coords.has_key(vertex):
coords[vertex] = index
index += 1
verts.append(vertex)
faces[i][j] = coords[vertex]
for f in faces:
if f: # Line might be blank
for i, v in enumerate(f):
try:
f[i]= coords[v]
except:
f[i]= coords[v] = index
index += 1
verts.append(v)
me= Blender.Mesh.New()
me.verts.extend(verts)
me.faces.extend(faces)
objname = Blender.sys.splitext(Blender.sys.basename(filename))[0]
scn= Blender.Scene.GetCurrent()
for obj in scn.getChildren():
obj.sel= 0
me.name= objname
ob= Blender.Object.New('Mesh', objname)
ob.link(me)
scn.link(ob)
ob.sel= 1
ob.Layers= scn.Layers
Blender.Redraw()
print 'Successfully imported "%s" in %.4f seconds' % (Blender.sys.basename(filename), Blender.sys.time()-t)
meshtools.create_mesh(verts, faces, objname)
Blender.Window.DrawProgressBar(1.0, '') # clear progressbar
file.close()
#end = time.clock()
#seconds = " in %.2f %s" % (end-start, "seconds")
message = "Successfully imported " + Blender.sys.basename(filename)# + seconds
meshtools.print_boxed(message)
def fs_callback(filename):
read(filename)
def main():
Blender.Window.FileSelector(read, 'RAW Import', Blender.sys.makename(ext='.raw'))
Blender.Window.FileSelector(fs_callback, "Import Raw")
if __name__=='__main__':
main()