Scripts:
[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
33 # +---------------------------------------------------------+
34 # | Copyright (c) 2002 Anthony D'Agostino                   |
35 # | http://www.redrival.com/scorpius                        |
36 # | scorpius@netzero.com                                    |
37 # | February 3, 2001                                        |
38 # | Released under the Blender Artistic Licence (BAL)       |
39 # | Import Export Suite v0.5                                |
40 # +---------------------------------------------------------+
41 # | Read and write Object File Format (*.off)               |
42 # +---------------------------------------------------------+
43
44 import Blender, mod_meshtools
45 #import time
46
47 # =============================
48 # ====== Read OFF Format ======
49 # =============================
50 def read(filename):
51         #start = time.clock()
52         file = open(filename, "rb")
53
54         verts = []
55         faces = []
56         uv = []
57
58         # === OFF Header ===
59         offheader = file.readline()
60         numverts, numfaces, null = file.readline().split()
61         numverts = int(numverts)
62         numfaces = int(numfaces)
63         if offheader.find('ST') >= 0:
64                 has_uv = True
65         else:
66                 has_uv = False
67
68         # === Vertex List ===
69         for i in range(numverts):
70                 if not i%100 and mod_meshtools.show_progress:
71                         Blender.Window.DrawProgressBar(float(i)/numverts, "Reading Verts")
72                 if has_uv:
73                         x, y, z, u, v = map(float, file.readline().split())
74                         uv.append((u, v))
75                 else:
76                         x, y, z = map(float, file.readline().split())
77                 verts.append((x, y, z))
78
79         # === Face List ===
80         for i in range(numfaces):
81                 if not i%100 and mod_meshtools.show_progress:
82                         Blender.Window.DrawProgressBar(float(i)/numfaces, "Reading Faces")
83                 line = file.readline().split()
84                 numfaceverts = len(line)-1
85                 facev = []
86                 for j in range(numfaceverts):
87                         index = int(line[j+1])
88                         facev.append(index)
89                 facev.reverse()
90                 faces.append(facev)
91
92         objname = Blender.sys.splitext(Blender.sys.basename(filename))[0]
93
94         mod_meshtools.create_mesh(verts, faces, objname, faces, uv)
95         Blender.Window.DrawProgressBar(1.0, '')  # clear progressbar
96         file.close()
97         #end = time.clock()
98         #seconds = " in %.2f %s" % (end-start, "seconds")
99         message = "Successfully imported " + Blender.sys.basename(filename)# + seconds
100         mod_meshtools.print_boxed(message)
101
102 def fs_callback(filename):
103         read(filename)
104
105 Blender.Window.FileSelector(fs_callback, "Import OFF")