chiark / gitweb /
Add proper copyright statements.
[cura.git] / Cura / util / meshLoaders / stl.py
1 __copyright__ = "Copyright (C) 2013 David Braam - Released under terms of the AGPLv3 License"
2 from __future__ import absolute_import
3
4 import sys
5 import os
6 import struct
7 import time
8
9 from Cura.util import mesh
10
11 def _loadAscii(m, f):
12         cnt = 0
13         for lines in f:
14                 for line in lines.split('\r'):
15                         if 'vertex' in line:
16                                 cnt += 1
17         m._prepareFaceCount(int(cnt) / 3)
18         f.seek(5, os.SEEK_SET)
19         cnt = 0
20         data = [None,None,None]
21         for lines in f:
22                 for line in lines.split('\r'):
23                         if 'vertex' in line:
24                                 data[cnt] = line.split()[1:]
25                                 cnt += 1
26                                 if cnt == 3:
27                                         m._addFace(float(data[0][0]), float(data[0][1]), float(data[0][2]), float(data[1][0]), float(data[1][1]), float(data[1][2]), float(data[2][0]), float(data[2][1]), float(data[2][2]))
28                                         cnt = 0
29
30 def _loadBinary(m, f):
31         #Skip the header
32         f.read(80-5)
33         faceCount = struct.unpack('<I', f.read(4))[0]
34         m._prepareFaceCount(faceCount)
35         for idx in xrange(0, faceCount):
36                 data = struct.unpack("<ffffffffffffH", f.read(50))
37                 m._addFace(data[3], data[4], data[5], data[6], data[7], data[8], data[9], data[10], data[11])
38
39 def loadScene(filename):
40         obj = mesh.printableObject()
41         m = obj._addMesh()
42
43         f = open(filename, "rb")
44         if f.read(5).lower() == "solid":
45                 _loadAscii(m, f)
46                 if m.vertexCount < 3:
47                         f.seek(5, os.SEEK_SET)
48                         _loadBinary(m, f)
49         else:
50                 _loadBinary(m, f)
51         f.close()
52         obj._postProcessAfterLoad()
53         return [obj]
54
55 def saveScene(filename, objects):
56         f = open(filename, 'wb')
57         #Write the STL binary header. This can contain any info, except for "SOLID" at the start.
58         f.write(("CURA BINARY STL EXPORT. " + time.strftime('%a %d %b %Y %H:%M:%S')).ljust(80, '\000'))
59
60         vertexCount = 0
61         for obj in objects:
62                 for m in obj._meshList:
63                         vertexCount += m.vertexCount
64
65         #Next follow 4 binary bytes containing the amount of faces, and then the face information.
66         f.write(struct.pack("<I", int(vertexCount / 3)))
67         for obj in objects:
68                 for m in obj._meshList:
69                         vertexes = m.getTransformedVertexes(True)
70                         for idx in xrange(0, m.vertexCount, 3):
71                                 v1 = vertexes[idx]
72                                 v2 = vertexes[idx+1]
73                                 v3 = vertexes[idx+2]
74                                 f.write(struct.pack("<fff", 0.0, 0.0, 0.0))
75                                 f.write(struct.pack("<fff", v1[0], v1[1], v1[2]))
76                                 f.write(struct.pack("<fff", v2[0], v2[1], v2[2]))
77                                 f.write(struct.pack("<fff", v3[0], v3[1], v3[2]))
78                                 f.write(struct.pack("<H", 0))
79         f.close()