use f.area where possible over python function and use len(mface) over len(mface.v)
[blender.git] / release / scripts / ply_export.py
1 #!BPY
2
3 """
4 Name: 'PLY...'
5 Blender: 237
6 Group: 'Export'
7 Tooltip: 'Export to Stanford PLY format'
8 """
9
10 import Blender
11 import meshtools
12 import math
13
14 __author__ = "Bruce Merry"
15 __version__ = "0.9"
16 __bpydoc__ = """\
17 This script exports Stanford PLY files from Blender. It supports per-vertex
18 normals and per-face colours and texture coordinates.
19 """
20
21 # Copyright (C) 2004, 2005: Bruce Merry, bmerry@cs.uct.ac.za
22 #
23 # This program is free software; you can redistribute it and/or
24 # modify it under the terms of the GNU General Public License
25 # as published by the Free Software Foundation; either version 2
26 # of the License, or (at your option) any later version.
27 #
28 # This program is distributed in the hope that it will be useful,
29 # but WITHOUT ANY WARRANTY; without even the implied warranty of
30 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
31 # GNU General Public License for more details.
32 #
33 # You should have received a copy of the GNU General Public License
34 # along with this program; if not, write to the Free Software Foundation,
35 # Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
36
37 def file_callback(filename):
38         if filename.find('.ply', -4) < 0: filename += '.ply'
39         file = open(filename, "wb")
40         objects = Blender.Object.GetSelected()
41         obj = objects[0]
42         mesh = objects[0].data
43
44         have_uv = mesh.hasFaceUV()
45         have_col = meshtools.has_vertex_colors(mesh)
46         verts = [] # list of dictionaries
47         vdict = {} # (index, normal, uv) -> new index
48         for (i, f) in enumerate(mesh.faces):
49                 for (j, v) in enumerate(f.v):
50                         index = v.index
51                         key = index, tuple(v.no)
52                         vdata = {'position': v.co, 'normal': v.no}
53                         if have_uv:
54                                 vdata['uv'] = f.uv[j]
55                                 key = key + (tuple(f.uv[j]), )
56                         if have_col:
57                                 vdata['col'] = f.col[j]
58                                 key = key + ((f.col[j].r, f.col[j].g, f.col[j].b, f.col[j].a), )
59                         if not vdict.has_key(key):
60                                 vdict[key] = len(verts);
61                                 verts.append(vdata)
62                 if not i % 100 and meshtools.show_progress:
63                         Blender.Window.DrawProgressBar(float(i) / len(mesh.faces), "Organising vertices")
64
65         print >> file, "ply"
66         print >> file, "format ascii 1.0"
67         print >> file, "comment created by ply_export.py from Blender"
68         print >> file, "element vertex %d" % len(verts)
69         print >> file, "property float32 x"
70         print >> file, "property float32 y"
71         print >> file, "property float32 z"
72         print >> file, "property float32 nx"
73         print >> file, "property float32 ny"
74         print >> file, "property float32 nz"
75         if have_uv:
76                 print >> file, "property float32 s"
77                 print >> file, "property float32 t"
78         if have_col:
79                 print >> file, "property uint8 red"
80                 print >> file, "property uint8 green"
81                 print >> file, "property uint8 blue"
82         print >> file, "element face %d" % len(mesh.faces)
83         print >> file, "property list uint8 int32 vertex_indices"
84         print >> file, "end_header"
85
86         for (i, v) in enumerate(verts):
87                 print >> file, "%f %f %f %f %f %f" % (tuple(v['position']) + tuple(v['normal'])),
88                 if have_uv: print >> file, "%f %f" % tuple(v['uv']),
89                 if have_col: print >> file, "%u %u %u" % (v['col'].r, v['col'].g, v['col'].b),
90                 print >> file
91                 if not i % 100 and meshtools.show_progress:
92                         Blender.Window.DrawProgressBar(float(i) / len(verts), "Writing vertices")
93         for (i, f) in enumerate(mesh.faces):
94                 print >> file, "%d" % len(f.v),
95                 for j in range(len(f.v)):
96                         v = f.v[j]
97                         index = v.index
98                         key = index, tuple(v.no)
99                         if have_uv:
100                                 key = key + (tuple(f.uv[j]), )
101                         if have_col:
102                                 key = key + ((f.col[j].r, f.col[j].g, f.col[j].b, f.col[j].a), )
103                         print >> file, "%d" % vdict[key],
104                 print >> file
105                 if not i % 100 and meshtools.show_progress:
106                         Blender.Window.DrawProgressBar(float(i) / len(mesh.faces), "Writing faces")
107
108         Blender.Window.DrawProgressBar(1.0, '')  # clear progressbar
109         file.close()
110         message = "Successfully exported " + Blender.sys.basename(filename)
111         meshtools.print_boxed(message)
112
113 Blender.Window.FileSelector(file_callback, "PLY Export")