diff --git a/hjklbox/hjklbox b/hjklbox/hjklbox index 5ac2c4b..fd52318 100755 Binary files a/hjklbox/hjklbox and b/hjklbox/hjklbox differ diff --git a/hjklbox/main.go b/hjklbox/main.go index 049b35a..f4139ab 100644 --- a/hjklbox/main.go +++ b/hjklbox/main.go @@ -14,8 +14,8 @@ func main() { bottom := bottom() render.RenderDXF(hjkl, 300, "hjkl.dxf") render.RenderDXF(sdf.Difference2D(buttons, buttonMounts), 300, "buttons.dxf") + render.RenderSTLSlow(top, 1200, "top.stl") render.RenderSTLSlow(bottom, 1200, "bottom.stl") render.RenderSTLSlow(plate, 1200, "plate.stl") - render.RenderSTLSlow(top, 1200, "top.stl") } diff --git a/hjklbox/plate.go b/hjklbox/plate.go index f500cef..aa9f63a 100644 --- a/hjklbox/plate.go +++ b/hjklbox/plate.go @@ -3,14 +3,17 @@ package main import "github.com/deadsy/sdfx/sdf" const ( - PLATE_THICKNESS = 2.825 - TOP_THICKNESS = 3.175 // 1/8th inch for possible thin acrylic top - BOTTOM_THICKNESS = 16 - PLATE_THICKNESS - TOP_THICKNESS - PLATE_WIDTH = 218 - PLATE_HEIGHT = 130 - TOLERANCE = 8 - CABLE_HEAD_HEIGHT = 6 - CABLE_HEAD_WIDTH = 10 + PLATE_THICKNESS = 2.825 + TOP_THICKNESS = 3.175 // 1/8th inch for possible thin acrylic top + BOTTOM_THICKNESS = 16 - PLATE_THICKNESS - TOP_THICKNESS + PLATE_WIDTH = 218 + PLATE_HEIGHT = 130 + TOLERANCE = 8 + CABLE_HEAD_HEIGHT = 6 + CABLE_HEAD_WIDTH = 10 + USB_DAUGHTERBOARD_HEIGHT = 12.6 + USB_DAUGHTERBOARD_LENGTH = 21.4 + USB_DAUGHTERBOARD_THICKNESS = 4.7 // includes usb jack ) func plate() sdf.SDF3 { @@ -39,7 +42,9 @@ func plate() sdf.SDF3 { func top() sdf.SDF3 { top2D := sdf.Box2D(sdf.V2{X: PLATE_WIDTH, Y: PLATE_HEIGHT}, 5) - hjkl := hjkl() + hjkl := buttonRow() + hjkl = sdf.Box2D(sdf.V2{X: hjkl.BoundingBox().Max.X*2 + 2, Y: hjkl.BoundingBox().Max.Y*2 + 2}, 1) + hjkl = sdf.Transform2D(hjkl, sdf.Rotate2d(sdf.DtoR(30))) hjkl = sdf.Transform2D(hjkl, sdf.Translate2d(sdf.V2{X: top2D.BoundingBox().Max.X / 2, Y: top2D.BoundingBox().Max.Y / 6})) top2D = sdf.Difference2D(top2D, hjkl) @@ -48,9 +53,12 @@ func top() sdf.SDF3 { top2D = sdf.Difference2D(top2D, buttons) buttonRow := buttonRow() + buttonRow = sdf.Box2D(sdf.V2{X: buttonRow.BoundingBox().Max.X*2 + 2, Y: buttonRow.BoundingBox().Max.Y*2 + 2}, 1) buttonRow = sdf.Transform2D(buttonRow, sdf.Translate2d(sdf.V2{X: top2D.BoundingBox().Max.X / 2, Y: top2D.BoundingBox().Max.Y / 1.25})) top2D = sdf.Difference2D(top2D, buttonRow) + // hjkl := buttonRow + corners := cornerHoles(top2D, screwHole()) top2D = sdf.Difference2D(top2D, corners) @@ -70,8 +78,19 @@ func bottom() sdf.SDF3 { cornerScrews := cornerHoles(bottom2D, screwHole()) bottom2D = sdf.Union2D(bottom2D, cornerScrewHolders) bottom2D = sdf.Difference2D(bottom2D, cornerScrews) + cavity2D = sdf.Difference2D(cavity2D, cornerScrewHolders) - peg, _ := sdf.Circle2D(2.4 / 2) // M2 screw + pegHole, _ := sdf.Circle2D(2.4 / 2) // M2 screw + pegHoles := make([]sdf.SDF2, 4) + for i := range pegHoles { + pegHoles[i] = pegHole + } + pegHoles[0] = sdf.Transform2D(pegHoles[0], sdf.Translate2d(sdf.V2{X: 48.26 / 2, Y: 11.4 / 2})) //pico mounting hole spacing + pegHoles[1] = sdf.Transform2D(pegHoles[1], sdf.Translate2d(sdf.V2{X: 48.26 / 2, Y: -11.4 / 2})) //pico mounting hole spacing + pegHoles[2] = sdf.Transform2D(pegHoles[2], sdf.Translate2d(sdf.V2{X: -48.26 / 2, Y: -11.4 / 2})) //pico mounting hole spacing + pegHoles[3] = sdf.Transform2D(pegHoles[3], sdf.Translate2d(sdf.V2{X: -48.26 / 2, Y: 11.4 / 2})) //pico mounting hole spacing + + peg, _ := sdf.Circle2D(2.4) // M2 screw pegs := make([]sdf.SDF2, 4) for i := range pegs { pegs[i] = peg @@ -80,13 +99,41 @@ func bottom() sdf.SDF3 { pegs[1] = sdf.Transform2D(pegs[1], sdf.Translate2d(sdf.V2{X: 48.26 / 2, Y: -11.4 / 2})) //pico mounting hole spacing pegs[2] = sdf.Transform2D(pegs[2], sdf.Translate2d(sdf.V2{X: -48.26 / 2, Y: -11.4 / 2})) //pico mounting hole spacing pegs[3] = sdf.Transform2D(pegs[3], sdf.Translate2d(sdf.V2{X: -48.26 / 2, Y: 11.4 / 2})) //pico mounting hole spacing - mount := sdf.Union2D(pegs...) - mount = sdf.Transform2D(mount, sdf.Translate2d(sdf.V2{X: bottom2D.BoundingBox().Max.X / 2, Y: -bottom2D.BoundingBox().Max.X / 3})) - bottom2D = sdf.Union2D(bottom2D, mount) + + mount2D := sdf.Union2D(pegs...) + mountingHoles2D := sdf.Union2D(pegHoles...) + mount2D = sdf.Difference2D(mount2D, mountingHoles2D) + mount2D = sdf.Transform2D(mount2D, sdf.Translate2d(sdf.V2{X: bottom2D.BoundingBox().Max.X / 2, Y: -bottom2D.BoundingBox().Max.X / 3})) + mount := sdf.Extrude3D(mount2D, 4) // M2x4mm screw holes + // bottom2D = sdf.Union2D(bottom2D, mount) + bottom := sdf.Extrude3D(bottom2D, BOTTOM_THICKNESS) + bottom = sdf.Union3D(bottom, mount) + + cavity2D = sdf.Elongate2D(cavity2D, sdf.V2{X: 1, Y: 1}) floor := sdf.Extrude3D(cavity2D, PLATE_THICKNESS) - floor = sdf.Transform3D(floor, sdf.Translate3d(sdf.V3{X: 0, Y: 0, Z: -(bottom.BoundingBox().Max.Z/2 + floor.BoundingBox().Max.Z/2)})) - return sdf.Union3D(bottom, floor) + floor = sdf.Transform3D(floor, sdf.Translate3d(sdf.V3{X: 0, Y: 0, Z: -(bottom.BoundingBox().Max.Z*2+floor.BoundingBox().Max.Z*2)/4 - 0.50})) + bottom = sdf.Union3D(bottom, floor) + + cableHole2D := sdf.Box2D(sdf.V2{X: CABLE_HEAD_WIDTH, Y: CABLE_HEAD_HEIGHT}, 0) + cableHole := sdf.Extrude3D(cableHole2D, TOLERANCE) + cableHole = sdf.Transform3D(cableHole, sdf.RotateX(sdf.DtoR(90))) + cableHole = sdf.Transform3D(cableHole, sdf.Translate3d(sdf.V3{X: 0, Y: (bottom.BoundingBox().Max.Y + cableHole.BoundingBox().Max.Y) - cableHole.BoundingBox().Max.Y*2, Z: cableHole.BoundingBox().Max.Z / 3})) + bottom = sdf.Difference3D(bottom, cableHole) + + usbCutout, _ := sdf.Box3D(sdf.V3{X: USB_DAUGHTERBOARD_LENGTH, Y: USB_DAUGHTERBOARD_HEIGHT, Z: USB_DAUGHTERBOARD_THICKNESS}, 0) + usbCutout = sdf.Transform3D(usbCutout, sdf.Translate3d(sdf.V3{X: 0, Y: (floor.BoundingBox().Max.Y + usbCutout.BoundingBox().Max.Y) - usbCutout.BoundingBox().Max.Y*2 + 2.6, Z: 0})) // 5 for m3x5 screw + bottom = sdf.Difference3D(bottom, usbCutout) + /* + usbCutoutPeg2D, _ := sdf.Circle2D(3 / 2) // m3 hole + usbCutoutPeg := sdf.Extrude3D(usbCutoutPeg2D, 1.5) // thickness of daughtboard pcb + + usbCutoutPeg = sdf.Transform3D(usbCutoutPeg, sdf.Translate3d(sdf.V3{X: 7.7, Y: (floor.BoundingBox().Max.Y + usbCutoutPeg.BoundingBox().Max.Y) - usbCutoutPeg.BoundingBox().Max.Y*2, Z: -usbCutoutPeg.BoundingBox().Max.Z * 2})) + usbCutoutPeg2 := sdf.Transform3D(usbCutoutPeg, sdf.Translate3d(sdf.V3{X: -15.4, Y: 0, Z: 0})) + + bottom = sdf.Union3D(bottom, usbCutoutPeg, usbCutoutPeg2) + */ + return bottom } func cornerHoles(input, hole sdf.SDF2) sdf.SDF2 {