35 lines
1.0 KiB
Python
35 lines
1.0 KiB
Python
"""Generate a simple test STL (binary) — a unit cube centered at origin."""
|
|
import struct
|
|
|
|
vertices = [
|
|
(-1,-1,-1), (1,-1,-1), (1,1,-1), (-1,1,-1),
|
|
(-1,-1,1), (1,-1,1), (1,1,1), (-1,1,1),
|
|
]
|
|
|
|
faces = [
|
|
(0,2,1), (0,3,2), # bottom
|
|
(4,5,6), (4,6,7), # top
|
|
(0,1,5), (0,5,4), # front
|
|
(2,3,7), (2,7,6), # back
|
|
(0,4,7), (0,7,3), # left
|
|
(1,2,6), (1,6,5), # right
|
|
]
|
|
|
|
def normal(v0, v1, v2):
|
|
e1 = [v1[i]-v0[i] for i in range(3)]
|
|
e2 = [v2[i]-v0[i] for i in range(3)]
|
|
n = [e1[1]*e2[2]-e1[2]*e2[1], e1[2]*e2[0]-e1[0]*e2[2], e1[0]*e2[1]-e1[1]*e2[0]]
|
|
l = sum(x*x for x in n)**0.5
|
|
return [x/l for x in n] if l > 0 else [0,0,0]
|
|
|
|
with open("examples/cube.stl", "wb") as f:
|
|
f.write(b'\0' * 80)
|
|
f.write(struct.pack('<I', len(faces)))
|
|
for face in faces:
|
|
v = [vertices[i] for i in face]
|
|
n = normal(*v)
|
|
f.write(struct.pack('<3f', *n))
|
|
for vert in v:
|
|
f.write(struct.pack('<3f', *[float(x) for x in vert]))
|
|
f.write(struct.pack('<H', 0))
|