Update to ply export, give nice messages to the user rather then throwing errors at the user.

Export mesh data with modifiers and objects matrix applied. export not only mesh data but text, nurbs etc (thanks to BPYMesh getMeshFromObject)

Small updates to ply import, dont set the TEX of a face (no pink faces anymore)
This commit is contained in:
Campbell Barton 2006-07-03 03:22:48 +00:00
parent 6c4a0d7769
commit e70610ab1e
3 changed files with 122 additions and 90 deletions

@ -1,9 +1,8 @@
import Blender
#from BPyMesh_redux import redux # seperated because of its size.
#from BPyMesh_redux import redux # seperated because of its size.
import BPyMesh_redux
reload(BPyMesh_redux)
redux= BPyMesh_redux.redux
from BPyMesh_redux import redux # seperated because of its size.
#import BPyMesh_redux
#reload(BPyMesh_redux)
#redux= BPyMesh_redux.redux
# python 2.3 has no reversed() iterator. this will only work on lists and tuples
try:

@ -1,15 +1,14 @@
#!BPY
"""
Name: 'PLY...'
Blender: 237
Name: 'Stanford PLY (*.ply)...'
Blender: 241
Group: 'Export'
Tooltip: 'Export to Stanford PLY format'
Tooltip: 'Export active object to Stanford PLY format'
"""
import Blender
import meshtools
import math
import BPyMesh
__author__ = "Bruce Merry"
__version__ = "0.9"
@ -34,80 +33,101 @@ normals and per-face colours and texture coordinates.
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
def file_callback(filename):
if filename.find('.ply', -4) < 0: filename += '.ply'
file = open(filename, "wb")
objects = Blender.Object.GetSelected()
obj = objects[0]
mesh = objects[0].data
# Vector rounding se we can use as keys
def rvec3d(v): return round(v.x, 6), round(v.y, 6), round(v.z, 6)
def rvec2d(v): return round(v.x, 6), round(v.y, 6)
def rcol(c): return c.r, c.g, c.b
have_uv = mesh.hasFaceUV()
have_col = meshtools.has_vertex_colors(mesh)
def file_callback(filename):
if not filename.lower().endswith('.ply'):
filename += '.ply'
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)
have_uv = mesh.faceUV
verts = [] # list of dictionaries
vdict = {} # (index, normal, uv) -> new index
for (i, f) in enumerate(mesh.faces):
for (j, v) in enumerate(f.v):
for i, f in enumerate(mesh.faces):
f_col= f.col
f_uv= f.uv
for j, v in enumerate(f.v):
index = v.index
key = index, tuple(v.no)
vdata = {'position': v.co, 'normal': v.no}
if have_uv:
vdata['uv'] = f.uv[j]
key = key + (tuple(f.uv[j]), )
if have_col:
vdata['col'] = f.col[j]
key = key + ((f.col[j].r, f.col[j].g, f.col[j].b, f.col[j].a), )
vdata = v.co, v.no
uv= f_uv[j]
col= f_col[j]
vdata = v.co, v.no, uv, col
key = index, rvec3d(v.no), rcol(col), rvec2d(uv)
else:
vdata = v.co, v.no
key = index, rvec3d(v.no)
if not vdict.has_key(key):
vdict[key] = len(verts);
verts.append(vdata)
if not i % 100 and meshtools.show_progress:
Blender.Window.DrawProgressBar(float(i) / len(mesh.faces), "Organising vertices")
file.write('ply\n')
file.write('format ascii 1.0\n')
file.write('Created by Blender3D %s - www.blender.org, source file: %s\n' % (Blender.Get('version'), Blender.Get('filename').split('/')[-1].split('\\')[-1] ))
file.write('element vertex %d\n' % len(verts))
file.write('property float32 x\n')
file.write('property float32 y\n')
file.write('property float32 z\n')
file.write('property float32 nx\n')
file.write('property float32 ny\n')
file.write('property float32 nz\n')
print >> file, "ply"
print >> file, "format ascii 1.0"
print >> file, "comment created by ply_export.py from Blender"
print >> file, "element vertex %d" % len(verts)
print >> file, "property float32 x"
print >> file, "property float32 y"
print >> file, "property float32 z"
print >> file, "property float32 nx"
print >> file, "property float32 ny"
print >> file, "property float32 nz"
if have_uv:
print >> file, "property float32 s"
print >> file, "property float32 t"
if have_col:
print >> file, "property uint8 red"
print >> file, "property uint8 green"
print >> file, "property uint8 blue"
print >> file, "element face %d" % len(mesh.faces)
print >> file, "property list uint8 int32 vertex_indices"
print >> file, "end_header"
file.write('property float32 s\n')
file.write('property float32 t\n')
file.write('property uint8 red\n')
file.write('property uint8 green\n')
file.write('property uint8 blue\n')
file.write('element face %d\n' % len(mesh.faces))
file.write('property list uint8 int32 vertex_indices\n')
file.write('end_header\n')
for i, v in enumerate(verts):
file.write('%.6f %.6f %.6f ' % tuple(v[0])) # co
file.write('%.6f %.6f %.6f ' % tuple(v[1])) # no
if have_uv:
file.write('%.6f %.6f %u %u %u' % (v[2].x, v[2].y, v[3].r, v[3].g, v[3].b)) # uv/col
file.write('\n')
for (i, v) in enumerate(verts):
print >> file, "%f %f %f %f %f %f" % (tuple(v['position']) + tuple(v['normal'])),
if have_uv: print >> file, "%f %f" % tuple(v['uv']),
if have_col: print >> file, "%u %u %u" % (v['col'].r, v['col'].g, v['col'].b),
print >> file
if not i % 100 and meshtools.show_progress:
Blender.Window.DrawProgressBar(float(i) / len(verts), "Writing vertices")
for (i, f) in enumerate(mesh.faces):
print >> file, "%d" % len(f.v),
for j in range(len(f.v)):
v = f.v[j]
file.write('%d ' % len(f))
f_col= f.col
f_uv= f.uv
for j, v in enumerate(f.v):
index = v.index
key = index, tuple(v.no)
if have_uv:
key = key + (tuple(f.uv[j]), )
if have_col:
key = key + ((f.col[j].r, f.col[j].g, f.col[j].b, f.col[j].a), )
print >> file, "%d" % vdict[key],
print >> file
if not i % 100 and meshtools.show_progress:
Blender.Window.DrawProgressBar(float(i) / len(mesh.faces), "Writing faces")
uv= f_uv[j]
col= f_col[j]
key = index, rvec3d(v.no), rcol(col), rvec2d(uv)
else:
key = index, rvec3d(v.no)
Blender.Window.DrawProgressBar(1.0, '') # clear progressbar
file.write('%d ' % vdict[key])
file.write('\n')
file.close()
message = "Successfully exported " + Blender.sys.basename(filename)
meshtools.print_boxed(message)
Blender.Window.FileSelector(file_callback, "PLY Export")
Blender.Window.FileSelector(file_callback, 'PLY Export', Blender.sys.makename(ext='.ply'))

@ -1,8 +1,8 @@
#!BPY
"""
Name: 'PLY...'
Blender: 237
Name: 'Stanford PLY (*.ply)...'
Blender: 241
Group: 'Import'
Tip: 'Import a Stanford PLY file'
"""
@ -202,6 +202,7 @@ def read(filename):
file.close()
return (obj_spec, obj);
def add_face(vertices, varr, indices, uvindices, colindices):
face = Blender.NMesh.Face([varr[i] for i in indices])
for index in indices:
@ -209,9 +210,11 @@ def add_face(vertices, varr, indices, uvindices, colindices):
if uvindices:
face.uv.append((vertex[uvindices[0]], 1.0 - vertex[uvindices[1]]))
face.mode &= ~Blender.NMesh.FaceModes.TEX
if colindices:
if not uvindices: face.uv.append((0, 0)) # Force faceUV
face.col.append(Blender.NMesh.Col(vertex[colindices[0]], vertex[colindices[1]], vertex[colindices[2]], 255))
face.mode &= ~Blender.NMesh.FaceModes.TEX
return face
def filesel_callback(filename):
@ -274,19 +277,29 @@ def filesel_callback(filename):
del obj # Reclaim memory
'''
if noindices:
normals = 1
else:
normals = 0
'''
objname = Blender.sys.splitext(Blender.sys.basename(filename))[0]
if not meshtools.overwrite_mesh_name:
objname = meshtools.versioned_name(objname)
Blender.NMesh.PutRaw(mesh, objname, not normals)
Blender.Object.GetSelected()[0].name = objname
scn= Blender.Scene.GetCurrent()
for obj in scn.getChildren():
obj.sel= 0
obj= Blender.Object.New('Mesh', objname)
mesh.name= objname
obj.link(mesh)
scn.link(obj)
obj.sel= 1
obj.Layers= scn.Layers
Blender.Redraw()
Blender.Window.DrawProgressBar(1.0, '')
message = 'Successfully imported ' + Blender.sys.basename(filename) + ' ' + str(Blender.sys.time()-t)
meshtools.print_boxed(message)
Blender.Window.FileSelector(filesel_callback, 'Import PLY')
Blender.Window.FileSelector(filesel_callback, 'Import PLY', Blender.sys.makename(ext='.ply'))