Final merge of HEAD (bf-blender) into the orange branch.
[blender.git] / release / scripts / off_export.py
1 #!BPY
2
3 """
4 Name: 'DEC Object File Format (.off)...'
5 Blender: 232
6 Group: 'Export'
7 Tooltip: 'Export selected mesh to DEC Object File Format (*.off)'
8 """
9
10 __author__ = "Anthony D'Agostino (Scorpius)"
11 __url__ = ("blender", "elysiun",
12 "Author's homepage, http://www.redrival.com/scorpius")
13 __version__ = "Part of IOSuite 0.5"
14
15 __bpydoc__ = """\
16 This script exports meshes to DEC Object File Format.
17
18 The DEC (Digital Equipment Corporation) OFF format is very old and
19 almost identical to Wavefront's OBJ. I wrote this so I could get my huge
20 meshes into Moonlight Atelier. (DXF can also be used but the file size
21 is five times larger than OFF!) Blender/Moonlight users might find this
22 script to be very useful.
23
24 Usage:<br>
25         Select meshes to be exported and run this script from "File->Export" menu.
26
27 Notes:<br>
28         Only exports a single selected mesh.
29 """
30
31 # +---------------------------------------------------------+
32 # | Copyright (c) 2002 Anthony D'Agostino                   |
33 # | http://www.redrival.com/scorpius                        |
34 # | scorpius@netzero.com                                    |
35 # | February 3, 2001                                        |
36 # | Released under the Blender Artistic Licence (BAL)       |
37 # | Import Export Suite v0.5                                |
38 # +---------------------------------------------------------+
39 # | Read and write Object File Format (*.off)               |
40 # +---------------------------------------------------------+
41
42 import Blender, meshtools
43 #import time
44
45 # ==============================
46 # ====== Write OFF Format ======
47 # ==============================
48 def write(filename):
49         #start = time.clock()
50         file = open(filename, "wb")
51
52         objects = Blender.Object.GetSelected()
53         objname = objects[0].name
54         meshname = objects[0].data.name
55         mesh = Blender.NMesh.GetRaw(meshname)
56         #mesh = Blender.NMesh.GetRawFromObject(meshname)        # for SubSurf
57         obj = Blender.Object.Get(objname)
58
59         # === OFF Header ===
60         file.write("OFF\n")
61         file.write("%d %d %d\n" % (len(mesh.verts), len(mesh.faces), 0))
62
63         # === Vertex List ===
64         for i in range(len(mesh.verts)):
65                 if not i%100 and meshtools.show_progress:
66                         Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Writing Verts")
67                 x, y, z = mesh.verts[i].co
68                 file.write("%f %f %f\n" % (x, y, z))
69
70         # === Face List ===
71         for i in range(len(mesh.faces)):
72                 if not i%100 and meshtools.show_progress:
73                         Blender.Window.DrawProgressBar(float(i)/len(mesh.faces), "Writing Faces")
74                 file.write(`len(mesh.faces[i].v)`+' ')
75                 mesh.faces[i].v.reverse()
76                 for j in range(len(mesh.faces[i].v)):
77                         file.write(`mesh.faces[i].v[j].index`+' ')
78                 file.write("\n")
79
80
81         Blender.Window.DrawProgressBar(1.0, '')  # clear progressbar
82         file.close()
83         #end = time.clock()
84         #seconds = " in %.2f %s" % (end-start, "seconds")
85         message = "Successfully exported " + Blender.sys.basename(filename)# + seconds
86         meshtools.print_boxed(message)
87
88 def fs_callback(filename):
89         if filename.find('.off', -4) <= 0: filename += '.off'
90         write(filename)
91
92 Blender.Window.FileSelector(fs_callback, "Export OFF")