blob: a3efae50b8694522cda504e49ea3cd9684ce7427 (
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
import numpy as np
import string
import struct
class Mesh(object):
def __init__(self, vertices, triangles):
vertices = np.asarray(vertices, dtype=float)
triangles = np.asarray(triangles, dtype=int)
if len(vertices.shape) != 2 or vertices.shape[1] != 3:
raise ValueError('shape mismatch')
if len(triangles.shape) != 2 or triangles.shape[1] != 3:
raise ValueError('shape mismatch')
if (triangles < 0).any():
raise ValueError('indices in `triangles` must be positive.')
if (triangles >= len(vertices)).any():
raise ValueError('indices in `triangles` must be less than the '
'length of the vertex array.')
self.vertices = vertices
self.triangles = triangles
def build(self):
return self.vertices[self.triangles]
def __getitem__(self, key):
return self.vertices[self.triangles[key]]
def __len__(self):
return len(self.triangles)
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):
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))
|