forked from mmmutah/craftmesher
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstl_binary2ascii.py
83 lines (64 loc) · 2.3 KB
/
stl_binary2ascii.py
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
import struct
import argparse
def unpack (f, sig, l, fb):
s = f.read (l)
fb.append(s)
return struct.unpack(sig, s)
def read_triangle(f,normals,points,triangles,bytecount,fb):
n = unpack(f,"<3f", 12, fb)
p1 = unpack(f,"<3f", 12, fb)
p2 = unpack(f,"<3f", 12, fb)
p3 = unpack(f,"<3f", 12, fb)
b = unpack(f,"<h", 2, fb)
normals.append(n)
l = len(points)
points.append(p1)
points.append(p2)
points.append(p3)
triangles.append((l, l+1, l+2))
bytecount.append(b[0])
def read_length(f):
length = struct.unpack("@i", f.read(4))
return length[0]
def read_header(f):
f.seek(f.tell()+80)
def write_as_ascii(outfilename,normals,points,triangles,bytecount,fb):
f = open(outfilename, "w")
f.write ("solid\n")
for n in range(len(triangles)):
f.write (" facet normal {} {} {}\n".format(normals[n][0],normals[n][1],normals[n][2]))
f.write (" outer loop\n")
f.write (" vertex {} {} {}\n".format(points[triangles[n][0]][0],points[triangles[n][0]][1],points[triangles[n][0]][2]))
f.write (" vertex {} {} {}\n".format(points[triangles[n][1]][0],points[triangles[n][1]][1],points[triangles[n][1]][2]))
f.write (" vertex {} {} {}\n".format(points[triangles[n][2]][0],points[triangles[n][2]][1],points[triangles[n][2]][2]))
f.write (" endloop\n")
f.write (" endfacet\n")
f.write ("endsolid\n")
f.close()
def convert(filename):
normals = []
points = []
triangles = []
bytecount = []
fb = [] # debug list
infilename = filename
outfilename = 'ascii' + filename
try:
f = open ( infilename, "rb")
read_header(f)
l = read_length(f)
try:
while True:
read_triangle(f,normals,points,triangles,bytecount,fb)
except Exception as e:
mm = 0
write_as_ascii(outfilename,normals,points,triangles,bytecount,fb)
except Exception as e:
print(e)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Process the job name.')
parser.add_argument('-j', action="store")
args, unknown = parser.parse_known_args()
jobname = str(args.j)
print(jobname)
convert(jobname)