1
+ # UINT8[80] – Header - 80 bytes
2
+ # UINT32 – Number of triangles - 4 bytes
3
+ # foreach triangle - 50 bytes:
4
+ # REAL32[3] – Normal vector - 12 bytes
5
+ # REAL32[3] – Vertex 1 - 12 bytes
6
+ # REAL32[3] – Vertex 2 - 12 bytes
7
+ # REAL32[3] – Vertex 3 - 12 bytes
8
+ # UINT16 – Attribute byte count - 2 bytes
9
+ # end
10
+
11
+ from vpython import *
12
+ import struct
13
+ from collections import namedtuple
14
+ import numpy as np
15
+
16
+ Ctypes = namedtuple ('Ctype' , ['fmt' , 'size' ])
17
+
18
+ Ctype_names = ['char' , 'signed char' , 'unsigned char' , '_Bool' , 'short' , \
19
+ 'unsigned short' , 'int' , 'unsigned int' , 'long' , 'unsigned long' ,\
20
+ 'long long' , 'unsigned long long' , 'float' , 'double' , 'char[]' ]
21
+ Ctype_sizes = [1 , 1 , 1 , 1 , 2 ,\
22
+ 2 , 4 , 4 , 4 , 4 ,\
23
+ 8 , 8 , 4 , 8 , - 1 ]
24
+ Ctype_formats = ['c' , 'b' , 'B' , '?' , 'h' ,\
25
+ 'H' , 'i' , 'I' , 'l' , 'L' ,\
26
+ 'q' , 'Q' , 'f' , 'd' , 's' ]
27
+
28
+ Ctype_dict = {}
29
+ for i , name in enumerate (Ctype_names ):
30
+ Ctype_dict [name ] = Ctypes (Ctype_formats [i ], Ctype_sizes [i ])
31
+
32
+ def binary_reader (fid , Ctype , ** opts ):
33
+ assert Ctype in Ctype_dict , "Ctype not found in Ctype_dict"
34
+ if Ctype == 'char[]' :
35
+ string = []
36
+ for ch in range (opts ['size' ]):
37
+ char = struct .unpack (Ctype_dict ['char' ].fmt , fid .read (Ctype_dict ['char' ].size ))[0 ]
38
+ if chr (0 ).encode ('utf-8' ) not in char :
39
+ string .append (char .decode ('utf-8' ))
40
+ else :
41
+ string .append (' ' )
42
+ return '' .join (string )
43
+
44
+ if Ctype == 'char' :
45
+ return ord (struct .unpack (Ctype_dict [Ctype ].fmt , fid .read (Ctype_dict [Ctype ].size ))[0 ].decode ('utf-8' ))
46
+ return struct .unpack (Ctype_dict [Ctype ].fmt , fid .read (Ctype_dict [Ctype ].size ))[0 ]
47
+
48
+ def stl_to_triangles (filename ):
49
+ with open (filename , "rb" ) as f :
50
+ header = binary_reader (f ,'char[]' , size = 80 )
51
+ numOfTri = binary_reader (f ,'unsigned int' )
52
+
53
+ print (header )
54
+ print (numOfTri )
55
+
56
+ tris = []
57
+
58
+ for i in range (numOfTri ):
59
+ vs = []
60
+ x1 , x2 , x3 = binary_reader (f ,'float' ), binary_reader (f ,'float' ), binary_reader (f ,'float' )
61
+ N = vec (x1 , x2 , x3 )
62
+
63
+ x1 , x2 , x3 = binary_reader (f ,'float' ), binary_reader (f ,'float' ), binary_reader (f ,'float' )
64
+ p1 = vertex (pos = vec (x1 , x2 , x3 ), normal = N , color = color .white )
65
+ vs .append (p1 )
66
+
67
+ x1 , x2 , x3 = binary_reader (f ,'float' ), binary_reader (f ,'float' ), binary_reader (f ,'float' )
68
+ p2 = vertex (pos = vec (x1 , x2 , x3 ), normal = N , color = color .white )
69
+ vs .append (p2 )
70
+
71
+ x1 , x2 , x3 = binary_reader (f ,'float' ), binary_reader (f ,'float' ), binary_reader (f ,'float' )
72
+ p3 = vertex (pos = vec (x1 , x2 , x3 ), normal = N , color = color .white )
73
+ vs .append (p3 )
74
+
75
+ attr = binary_reader (f ,'unsigned short' )
76
+ tris .append (triangle (vs = vs ))
77
+
78
+ return compound (tris )
79
+
80
+ if __name__ == '__main__' :
81
+ filename = r"\convert_stl\Part1_bin.stl" # update this file
82
+ man = stl_to_triangles (filename )
83
+ man .color = color .orange
84
+
85
+
86
+
0 commit comments