chiark / gitweb /
9b1323a294237880f6e61ca31d1f95b4d2ba76ea
[cura.git] / Cura / util / stl.py
1 from __future__ import absolute_import
2 import __init__
3
4 import sys
5 import math
6 import re
7 import os
8 import struct
9
10 from util import util3d
11
12 class stlFace():
13         def __init__(self, v0, v1, v2):
14                 self.v = [v0, v1, v2]
15
16 class stlModel():
17         def __init__(self):
18                 self.faces = []
19                 self.vertexes = []
20
21         def load(self, filename):
22                 f = open(filename, "rb")
23                 if f.read(6).lower() == "solid ":
24                         self._loadAscii(f)
25                         if len(self.faces) < 1:
26                                 f.seek(6, os.SEEK_SET)
27                                 self._loadBinary(f)
28                 else:
29                         self._loadBinary(f)
30                 f.close()
31                 
32                 self._createOrigonalVertexCopy()
33         
34         def _loadAscii(self, f):
35                 cnt = 0
36                 for line in f:
37                         if 'vertex' in line:
38                                 data = line.split()
39                                 if cnt == 0:
40                                         v0 = util3d.Vector3(float(data[1]), float(data[2]), float(data[3]))
41                                         cnt = 1
42                                 elif cnt == 1:
43                                         v1 = util3d.Vector3(float(data[1]), float(data[2]), float(data[3]))
44                                         cnt = 2
45                                 elif cnt == 2:
46                                         v2 = util3d.Vector3(float(data[1]), float(data[2]), float(data[3]))
47                                         self.faces.append(stlFace(v0, v1, v2))
48                                         self.vertexes.append(v0)
49                                         self.vertexes.append(v1)
50                                         self.vertexes.append(v2)
51                                         cnt = 0
52
53         def _loadBinary(self, f):
54                 #Skip the header
55                 f.read(80-6)
56                 faceCount = struct.unpack('<I', f.read(4))[0]
57                 for idx in xrange(0, faceCount):
58                         data = struct.unpack("<ffffffffffffH", f.read(50))
59                         v0 = util3d.Vector3(data[3], data[4], data[5])
60                         v1 = util3d.Vector3(data[6], data[7], data[8])
61                         v2 = util3d.Vector3(data[9], data[10], data[11])
62                         self.faces.append(stlFace(v0, v1, v2))
63                         self.vertexes.append(v0)
64                         self.vertexes.append(v1)
65                         self.vertexes.append(v2)
66
67         def _createOrigonalVertexCopy(self):
68                 self.origonalVertexes = list(self.vertexes)
69                 for i in xrange(0, len(self.origonalVertexes)):
70                         self.origonalVertexes[i] = self.origonalVertexes[i].copy()
71                 self.getMinimumZ()
72
73         def getMinimumZ(self):
74                 minv = self.vertexes[0].copy()
75                 maxv = self.vertexes[0].copy()
76                 for v in self.vertexes:
77                         minv.x = min(minv.x, v.x)
78                         minv.y = min(minv.y, v.y)
79                         minv.z = min(minv.z, v.z)
80                         maxv.x = max(maxv.x, v.x)
81                         maxv.y = max(maxv.y, v.y)
82                         maxv.z = max(maxv.z, v.z)
83                 self.min = minv
84                 self.max = maxv
85                 self.size = maxv - minv
86                 return self.min.z
87         
88         def getMaximum(self):
89                 return self.max
90         def getMinimum(self):
91                 return self.min
92         def getSize(self):
93                 return self.size
94
95 if __name__ == '__main__':
96         for filename in sys.argv[1:]:
97                 stlModel().load(filename)
98