|
- package main
-
- import (
- "git.wtrh.nl/3D-models/objects"
- "github.com/deadsy/sdfx/render"
- "github.com/deadsy/sdfx/sdf"
- "math"
- )
-
- type Button struct {
- Size float64 // diameter of button
- Thickness float64 // height of button
- HoleSpacing float64 // Broadest cross length of thread holes.
- Curve float64 // Depth of the curve
- }
-
- type DoveTail struct {
- Size sdf.V3
- Angle float64
- }
-
- var flange_h = 1.0
- var flange_w = 2.0
- var cloth_offset = 1.0
-
- var doveTail = DoveTail{
- Size: sdf.V3{X: 10, Y: 8, Z: 2},
- Angle: sdf.Pi/10,
- }
-
- func ButtonHolder3D(b *Button) (holder sdf.SDF3, err error) {
- cylinderTickness := flange_h+cloth_offset+b.Curve
- holder, err = sdf.Cylinder3D(cylinderTickness,b.Size/2+flange_w,0.0)
- if err != nil {
- return
- }
- negative, err := buttonNegative(b)
- if err != nil {
- return
- }
- holder = sdf.Transform3D(holder, sdf.Translate3d(sdf.V3{0,0,cylinderTickness/2}))
- negative = sdf.Transform3D(negative, sdf.Translate3d(sdf.V3{0,0,cloth_offset}))
- negative2, err := wireNegative(b)
- if err != nil {
- return
- }
- negative = sdf.Union3D(negative2,negative)
- holder = sdf.Difference3D(holder,negative)
- return
- }
-
- func buttonNegative(b *Button) (negative sdf.SDF3, err error) {
- h := (math.Pow(b.Size/2,2)/b.Curve - b.Curve)/2
- s1, err := sdf.Sphere3D(h)
- if err != nil {
- return
- }
- s1 = sdf.Transform3D(s1, sdf.Translate3d(sdf.V3{0,0,h}))
- c1, err := sdf.Cylinder3D(h,b.Size/2,0.0)
- if err != nil {
- return
- }
- c1 = sdf.Transform3D(c1, sdf.Translate3d(sdf.V3{0,0,h/2}))
- negative = sdf.Intersect3D(s1,c1)
- return
- }
-
- func wireNegative(b *Button) (negative sdf.SDF3, err error) {
- size := sdf.V3{X: b.HoleSpacing/2, Y: b.HoleSpacing/2, Z: 20}.MulScalar(math.Sqrt(2))
- b1, err := sdf.Box3D(size,1.5)
- if err != nil {
- return
- }
- b1 = sdf.Transform3D(b1,sdf.RotateZ(sdf.Pi/4))
- b1 = sdf.Elongate3D(b1,sdf.V3{X:b.Size,Y: 0, Z: 0})
- negative = sdf.Transform3D(b1,sdf.Translate3d(sdf.V3{-b.Size/2,0,0}))
- return
- }
-
- func dovetail(size sdf.V3, angle float64, offset float64) (tail sdf.SDF3, err error) {
- tail, err = sdf.Box3D(size, 0.0)
- a1 := sdf.V3{X: 0, Y: size.Y/2+offset, Z:-size.Z/2}
- a2 := sdf.V3{X: 0, Y: -size.Y/2+offset, Z:-size.Z/2}
- n1 := sdf.V3{Y: -math.Cos(angle), X: 0, Z: -math.Sin(angle)}
- n2 := sdf.V3{Y: math.Cos(angle), X: 0, Z: -math.Sin(angle)}
- tail = sdf.Cut3D(tail, a1, n1)
- tail = sdf.Cut3D(tail, a2, n2)
- //bottomSize := sdf.V2{X: doveTail.Size.X, Y: doveTail.Size.Y}
- //b2d := sdf.Box2D(bottomSize,0)
- //topSize := bottomSize.Add(sdf.V2{X:0, Y: doveTail.Size.Z * math.Tan(doveTail.Angle) * 2})
- //t2d := sdf.Box2D(topSize,0)
- //tail, err = sdf.Loft3D(b2d, t2d, doveTail.Size.Z,0)
- return
- }
-
- func main() {
- k := objects.BoxParams{
- Size: sdf.V3{100,100,100},
- Wall: 3,
- BottomTopRatio: 1,
- Margin: 0.1,
- Taper: 0.1,
- ClosingHeight: 4,
- CornerRadius: 3,
- }
- box, err := objects.BottomBox3D(&k)
- if err != nil {
- return
- }
- render.RenderSTL(box, 300, "out.stl")
- b := Button{
- Size: 18,
- Curve: 1.2,
- HoleSpacing: 8.5,
- }
-
- holder, err := ButtonHolder3D(&b)
- if err != nil {
- return
- }
- render.RenderSTL(holder, 300, "holder.stl")
- negative, err := wireNegative(&b)
- if err != nil {
- return
- }
- render.RenderSTL(negative, 300, "negative.stl")
- return
- }
|