blob: 9a63306ddce81c7a43374ea908b53fc7f7784ac9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
import numpy as np
import string
import struct
from geometry import Mesh
import bz2
def mesh_from_stl(filename):
if filename.endswith('.bz2'):
f = bz2.BZ2File(filename)
else:
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):
if filename.endswith('.bz2'):
f = bz2.BZ2File(filename)
else:
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))
|