summaryrefslogtreecommitdiff
path: root/stl.py
diff options
context:
space:
mode:
Diffstat (limited to 'stl.py')
-rw-r--r--stl.py81
1 files changed, 81 insertions, 0 deletions
diff --git a/stl.py b/stl.py
new file mode 100644
index 0000000..f88c3fa
--- /dev/null
+++ b/stl.py
@@ -0,0 +1,81 @@
+import numpy as np
+import string
+import struct
+from geometry import Mesh
+
+def mesh_from_stl(filename):
+ f = open(filename)
+ buf = f.read(200)
+ f.close()
+
+ for char in buf:
+ if char not in string.printable:
+ return mesh_from_binary_stl(filename)
+
+ return mesh_from_ascii_stl(filename)
+
+def mesh_from_ascii_stl(filename):
+ f = open(filename)
+
+ vertices = []
+ triangles = []
+ vertex_map = {}
+
+ while True:
+ line = f.readline()
+
+ if line == '':
+ break
+
+ if not line.strip().startswith('vertex'):
+ continue
+
+ triangle = [None]*3
+ for i in range(3):
+ vertex = tuple([float(s) for s in line.strip().split()[1:]])
+
+ if vertex not in vertex_map:
+ vertices.append(vertex)
+ vertex_map[vertex] = len(vertices) - 1
+
+ triangle[i] = vertex_map[vertex]
+
+ if i < 3:
+ line = f.readline()
+
+ triangles.append(triangle)
+
+ f.close()
+
+ return Mesh(np.array(vertices), np.array(triangles, dtype=np.uint32))
+
+def mesh_from_binary_stl(filename):
+ f = open(filename)
+
+ vertices = []
+ triangles = []
+ vertex_map = {}
+
+ f.read(80)
+ ntriangles = struct.unpack('<I', f.read(4))[0]
+
+ for i in range(ntriangles):
+ normal = tuple(struct.unpack('<fff', f.read(12)))
+
+ triangle = [None]*3
+ for j in range(3):
+ vertex = tuple(struct.unpack('<fff', f.read(12)))
+
+ if vertex not in vertex_map:
+ vertices.append(vertex)
+ vertex_map[vertex] = len(vertices) - 1
+
+ triangle[j] = vertex_map[vertex]
+
+ triangles.append(triangle)
+
+ f.read(2)
+
+ f.close()
+
+ return Mesh(np.array(vertices), np.array(triangles, dtype=np.uint32))