package main import ( "log" "github.com/deadsy/sdfx/render" "github.com/deadsy/sdfx/render/dc" "github.com/deadsy/sdfx/sdf" v2 "github.com/deadsy/sdfx/vec/v2" v3 "github.com/deadsy/sdfx/vec/v3" ) func main() { render.ToSTL(screenCover(), 300, "screenCover.stl", dc.NewDualContouringDefault()) render.ToSTL(picoAdapter(), 300, "picoAdapter.stl", dc.NewDualContouringDefault()) } func picoAdapter() sdf.SDF3 { // body base2D := sdf.Box2D(v2.Vec{X: 78.9, Y: 39.7}, 0) hole2D, _ := sdf.Circle2D(4.9 / 2) holes2D := make([]sdf.SDF2, 4) holesXOffset, holesYOffset := 4.7, 3.8 holes2D[0] = sdf.Transform2D(hole2D, sdf.Translate2d(v2.Vec{X: base2D.BoundingBox().Max.X - holesXOffset, Y: base2D.BoundingBox().Max.Y - holesYOffset})) holes2D[1] = sdf.Transform2D(hole2D, sdf.Translate2d(v2.Vec{X: -base2D.BoundingBox().Max.X - (-holesXOffset), Y: base2D.BoundingBox().Max.Y - holesYOffset})) holes2D[2] = sdf.Transform2D(hole2D, sdf.Translate2d(v2.Vec{X: -base2D.BoundingBox().Max.X - (-holesXOffset), Y: -base2D.BoundingBox().Max.Y - (-holesYOffset)})) holes2D[3] = sdf.Transform2D(hole2D, sdf.Translate2d(v2.Vec{X: base2D.BoundingBox().Max.X - holesXOffset, Y: -base2D.BoundingBox().Max.Y - (-holesYOffset)})) screwHoles2D := sdf.Union2D(holes2D...) base2D = sdf.Difference2D(base2D, screwHoles2D) // pico pegs m2Diameter := 2.0 innerCircle, _ := sdf.Circle2D(m2Diameter / 2) outerCircle, _ := sdf.Circle2D(m2Diameter * 2 / 2) peg2D := sdf.Difference2D(outerCircle, innerCircle) pegs2D := make([]sdf.SDF2, 6) pegsXDistance, pegsYDistance := 47.0, 11.40 pegs2D[0] = sdf.Transform2D(peg2D, sdf.Translate2d(v2.Vec{X: pegsXDistance / 2, Y: pegsYDistance / 2})) pegs2D[1] = sdf.Transform2D(peg2D, sdf.Translate2d(v2.Vec{X: -pegsXDistance / 2, Y: pegsYDistance / 2})) pegs2D[2] = sdf.Transform2D(peg2D, sdf.Translate2d(v2.Vec{X: -pegsXDistance / 2, Y: -pegsYDistance / 2})) pegs2D[3] = sdf.Transform2D(peg2D, sdf.Translate2d(v2.Vec{X: pegsXDistance / 2, Y: -pegsYDistance / 2})) mount2D := sdf.Union2D(pegs2D...) // extrude baseZ, pegsZ := 1.6, 3.0 base := sdf.Extrude3D(base2D, baseZ) mount := sdf.Extrude3D(mount2D, pegsZ) mount = sdf.Transform3D(mount, sdf.Translate3d(v3.Vec{X: 0, Y: 0, Z: baseZ/2 + pegsZ/2})) return sdf.Union3D(base, mount) } func screenCover() sdf.SDF3 { // cover z := 2.2 holeX, holeY := 32.4, 19.2 // -0.2 for clearance screenX, screenY := 23.744, 12.864 // screen V/A holderOffsetX, holderOffsetY := 1.75, 2.0 hole := sdf.Box2D(v2.Vec{X: holeX, Y: holeY}, 0) screen := sdf.Box2D(v2.Vec{X: screenX, Y: screenY}, 0) body2D := sdf.Difference2D(hole, screen) body := sdf.Extrude3D(body2D, z) lrEdge2D := sdf.Box2D(v2.Vec{X: (holeX - screenX) / 1.5, Y: holeY - 1.4}, 1) lrEdge := sdf.Extrude3D(lrEdge2D, z/2) lrEdges := make([]sdf.SDF3, 2) lrEdges[0] = sdf.Transform3D(lrEdge, sdf.Translate3d(v3.Vec{X: -holeX/2 - (-(holeX - screenX) / 6), Y: 1.4 / 2, Z: z / 2})) lrEdges[1] = sdf.Transform3D(lrEdge, sdf.Translate3d(v3.Vec{X: holeX/2 - ((holeX - screenX) / 6), Y: 1.4 / 2, Z: z / 2})) tbEdge2D := sdf.Box2D(v2.Vec{X: holeX, Y: (holeY - screenY) / 2}, 0) tbEdge := sdf.Extrude3D(tbEdge2D, z/2) tbEdges := make([]sdf.SDF3, 2) tbEdges[0] = sdf.Transform3D(tbEdge, sdf.Translate3d(v3.Vec{X: 0, Y: -holeY/2 - (-(holeY - screenY) / 4), Z: z / 2})) tbEdges[1] = sdf.Transform3D(tbEdge, sdf.Translate3d(v3.Vec{X: 0, Y: holeY/2 - ((holeY - screenY) / 4), Z: z / 2})) body = sdf.Union3D(body, lrEdges[0], lrEdges[1], tbEdges[0], tbEdges[1]) body = sdf.Transform3D(body, sdf.RotateX(sdf.DtoR(180))) // screen mounting m2HoleDiameter := 2.0 PCBHoleX, PCBHoleY := 23.5, 23.8 m2Hole, _ := sdf.Circle2D(m2HoleDiameter / 2) m2Holes := sdf.Union2D( sdf.Transform2D(m2Hole, sdf.Translate2d(v2.Vec{X: PCBHoleX / 2, Y: PCBHoleY / 2})), sdf.Transform2D(m2Hole, sdf.Translate2d(v2.Vec{X: PCBHoleX / 2, Y: -PCBHoleY / 2})), sdf.Transform2D(m2Hole, sdf.Translate2d(v2.Vec{X: -PCBHoleX / 2, Y: -PCBHoleY / 2})), sdf.Transform2D(m2Hole, sdf.Translate2d(v2.Vec{X: -PCBHoleX / 2, Y: PCBHoleY / 2})), ) // screen mount pegs m2PegFrame2D, _ := sdf.Circle2D(m2HoleDiameter) m2PegFrames2D := sdf.Union2D( sdf.Transform2D(m2PegFrame2D, sdf.Translate2d(v2.Vec{X: PCBHoleX / 2, Y: -PCBHoleY / 2})), sdf.Transform2D(m2PegFrame2D, sdf.Translate2d(v2.Vec{X: -PCBHoleX / 2, Y: -PCBHoleY / 2})), ) m2Pegs2D := sdf.Difference2D(m2PegFrames2D, m2Holes) m2Pegs := sdf.Extrude3D(m2Pegs2D, z) m2Pegs = sdf.Transform3D(m2Pegs, sdf.Translate3d(v3.Vec{X: 0, Y: 1.5, Z: z})) body = sdf.Union3D(body, m2Pegs) // peg attachers pegHolder, err := sdf.Box3D(v3.Vec{X: 2, Y: holeY / 2, Z: z}, 0) if err != nil { log.Printf("Model error.\n") } pegHolders := sdf.Union3D( sdf.Transform3D(pegHolder, sdf.Translate3d(v3.Vec{X: (holeX / 2) - holderOffsetX, Y: -holeY/2 + holderOffsetY, Z: z})), sdf.Transform3D(pegHolder, sdf.Translate3d(v3.Vec{X: (-holeX / 2) - (-holderOffsetX), Y: -holeY/2 + holderOffsetY, Z: z})), ) body = sdf.Union3D(body, pegHolders) return body }