package main import ( "encoding/binary" "math" "os" ) // --- STL Types and Helpers --- type Point struct { X, Y, Z float64 } func WriteSTL(filename string, triangles [][3]Point) error { f, err := os.Create(filename) if err != nil { return err } defer f.Close() header := make([]byte, 80) copy(header, "Generated by pcb-to-stencil") if _, err := f.Write(header); err != nil { return err } count := uint32(len(triangles)) if err := binary.Write(f, binary.LittleEndian, count); err != nil { return err } buf := make([]byte, 50) for _, t := range triangles { binary.LittleEndian.PutUint32(buf[0:4], math.Float32bits(0)) binary.LittleEndian.PutUint32(buf[4:8], math.Float32bits(0)) binary.LittleEndian.PutUint32(buf[8:12], math.Float32bits(0)) binary.LittleEndian.PutUint32(buf[12:16], math.Float32bits(float32(t[0].X))) binary.LittleEndian.PutUint32(buf[16:20], math.Float32bits(float32(t[0].Y))) binary.LittleEndian.PutUint32(buf[20:24], math.Float32bits(float32(t[0].Z))) binary.LittleEndian.PutUint32(buf[24:28], math.Float32bits(float32(t[1].X))) binary.LittleEndian.PutUint32(buf[28:32], math.Float32bits(float32(t[1].Y))) binary.LittleEndian.PutUint32(buf[32:36], math.Float32bits(float32(t[1].Z))) binary.LittleEndian.PutUint32(buf[36:40], math.Float32bits(float32(t[2].X))) binary.LittleEndian.PutUint32(buf[40:44], math.Float32bits(float32(t[2].Y))) binary.LittleEndian.PutUint32(buf[44:48], math.Float32bits(float32(t[2].Z))) binary.LittleEndian.PutUint16(buf[48:50], 0) if _, err := f.Write(buf); err != nil { return err } } return nil } func AddBox(triangles *[][3]Point, x, y, w, h, zHeight float64) { x0, y0 := x, y x1, y1 := x+w, y+h z0, z1 := 0.0, zHeight p000 := Point{x0, y0, z0} p100 := Point{x1, y0, z0} p110 := Point{x1, y1, z0} p010 := Point{x0, y1, z0} p001 := Point{x0, y0, z1} p101 := Point{x1, y0, z1} p111 := Point{x1, y1, z1} p011 := Point{x0, y1, z1} addQuad := func(a, b, c, d Point) { *triangles = append(*triangles, [3]Point{a, b, c}) *triangles = append(*triangles, [3]Point{c, d, a}) } addQuad(p000, p010, p110, p100) // Bottom addQuad(p101, p111, p011, p001) // Top addQuad(p000, p100, p101, p001) // Front addQuad(p100, p110, p111, p101) // Right addQuad(p110, p010, p011, p111) // Back addQuad(p010, p000, p001, p011) // Left }