use f.area where possible over python function and use len(mface) over len(mface.v)
[blender.git] / release / scripts / off_import.py
1 #!BPY
2
3 """
4 Name: 'DEC Object File Format (.off)...'
5 Blender: 232
6 Group: 'Import'
7 Tooltip: 'Import 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 imports DEC Object File Format files to Blender.
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         Execute this script from the "File->Import" menu and choose an OFF file to
26 open.
27
28 Notes:<br>
29         UV Coordinate support has been added.
30 """
31
32 # $Id:
33 #
34 # +---------------------------------------------------------+
35 # | Copyright (c) 2002 Anthony D'Agostino                   |
36 # | http://www.redrival.com/scorpius                        |
37 # | scorpius@netzero.com                                    |
38 # | February 3, 2001                                        |
39 # | Read and write Object File Format (*.off)               |
40 # +---------------------------------------------------------+
41
42 # ***** BEGIN GPL LICENSE BLOCK *****
43 #
44 # This program is free software; you can redistribute it and/or
45 # modify it under the terms of the GNU General Public License
46 # as published by the Free Software Foundation; either version 2
47 # of the License, or (at your option) any later version.
48 #
49 # This program is distributed in the hope that it will be useful,
50 # but WITHOUT ANY WARRANTY; without even the implied warranty of
51 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
52 # GNU General Public License for more details.
53 #
54 # You should have received a copy of the GNU General Public License
55 # along with this program; if not, write to the Free Software Foundation,
56 # Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
57 #
58 # ***** END GPL LICENCE BLOCK *****
59
60 import Blender, meshtools
61 #import time
62
63 # =============================
64 # ====== Read OFF Format ======
65 # =============================
66 def read(filename):
67         #start = time.clock()
68         file = open(filename, "rb")
69
70         verts = []
71         faces = []
72         uv = []
73
74         # === OFF Header ===
75         offheader = file.readline()
76         numverts, numfaces, null = file.readline().split()
77         numverts = int(numverts)
78         numfaces = int(numfaces)
79         if offheader.find('ST') >= 0:
80                 has_uv = True
81         else:
82                 has_uv = False
83
84         # === Vertex List ===
85         for i in range(numverts):
86                 if not i%100 and meshtools.show_progress:
87                         Blender.Window.DrawProgressBar(float(i)/numverts, "Reading Verts")
88                 if has_uv:
89                         x, y, z, u, v = map(float, file.readline().split())
90                         uv.append((u, v))
91                 else:
92                         x, y, z = map(float, file.readline().split())
93                 verts.append((x, y, z))
94
95         # === Face List ===
96         for i in range(numfaces):
97                 if not i%100 and meshtools.show_progress:
98                         Blender.Window.DrawProgressBar(float(i)/numfaces, "Reading Faces")
99                 line = file.readline().split()
100                 numfaceverts = len(line)-1
101                 facev = []
102                 for j in range(numfaceverts):
103                         index = int(line[j+1])
104                         facev.append(index)
105                 facev.reverse()
106                 faces.append(facev)
107
108         objname = Blender.sys.splitext(Blender.sys.basename(filename))[0]
109
110         meshtools.create_mesh(verts, faces, objname, faces, uv)
111         Blender.Window.DrawProgressBar(1.0, '')  # clear progressbar
112         file.close()
113         #end = time.clock()
114         #seconds = " in %.2f %s" % (end-start, "seconds")
115         message = "Successfully imported " + Blender.sys.basename(filename)# + seconds
116         meshtools.print_boxed(message)
117
118 def fs_callback(filename):
119         read(filename)
120
121 Blender.Window.FileSelector(fs_callback, "Import OFF")