arcade/f300-build/main.go

128 lines
4.9 KiB
Go

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
}