Cord/examples/gen_test_stl.py

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))