25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

128 satır
3.1KB

  1. package main
  2. import (
  3. "git.wtrh.nl/3D-models/objects"
  4. "github.com/deadsy/sdfx/render"
  5. "github.com/deadsy/sdfx/sdf"
  6. "math"
  7. )
  8. type Button struct {
  9. Size float64 // diameter of button
  10. Thickness float64 // height of button
  11. HoleSpacing float64 // Broadest cross length of thread holes.
  12. Curve float64 // Depth of the curve
  13. }
  14. type DoveTail struct {
  15. Size sdf.V3
  16. Angle float64
  17. }
  18. var flange_h = 1.0
  19. var flange_w = 2.0
  20. var cloth_offset = 1.0
  21. var doveTail = DoveTail{
  22. Size: sdf.V3{X: 10, Y: 8, Z: 2},
  23. Angle: sdf.Pi/10,
  24. }
  25. func ButtonHolder3D(b *Button) (holder sdf.SDF3, err error) {
  26. cylinderTickness := flange_h+cloth_offset+b.Curve
  27. holder, err = sdf.Cylinder3D(cylinderTickness,b.Size/2+flange_w,0.0)
  28. if err != nil {
  29. return
  30. }
  31. negative, err := buttonNegative(b)
  32. if err != nil {
  33. return
  34. }
  35. holder = sdf.Transform3D(holder, sdf.Translate3d(sdf.V3{0,0,cylinderTickness/2}))
  36. negative = sdf.Transform3D(negative, sdf.Translate3d(sdf.V3{0,0,cloth_offset}))
  37. negative2, err := wireNegative(b)
  38. if err != nil {
  39. return
  40. }
  41. negative = sdf.Union3D(negative2,negative)
  42. holder = sdf.Difference3D(holder,negative)
  43. return
  44. }
  45. func buttonNegative(b *Button) (negative sdf.SDF3, err error) {
  46. h := (math.Pow(b.Size/2,2)/b.Curve - b.Curve)/2
  47. s1, err := sdf.Sphere3D(h)
  48. if err != nil {
  49. return
  50. }
  51. s1 = sdf.Transform3D(s1, sdf.Translate3d(sdf.V3{0,0,h}))
  52. c1, err := sdf.Cylinder3D(h,b.Size/2,0.0)
  53. if err != nil {
  54. return
  55. }
  56. c1 = sdf.Transform3D(c1, sdf.Translate3d(sdf.V3{0,0,h/2}))
  57. negative = sdf.Intersect3D(s1,c1)
  58. return
  59. }
  60. func wireNegative(b *Button) (negative sdf.SDF3, err error) {
  61. size := sdf.V3{X: b.HoleSpacing/2, Y: b.HoleSpacing/2, Z: 20}.MulScalar(math.Sqrt(2))
  62. b1, err := sdf.Box3D(size,1.5)
  63. if err != nil {
  64. return
  65. }
  66. b1 = sdf.Transform3D(b1,sdf.RotateZ(sdf.Pi/4))
  67. b1 = sdf.Elongate3D(b1,sdf.V3{X:b.Size,Y: 0, Z: 0})
  68. negative = sdf.Transform3D(b1,sdf.Translate3d(sdf.V3{-b.Size/2,0,0}))
  69. return
  70. }
  71. func dovetail(size sdf.V3, angle float64, offset float64) (tail sdf.SDF3, err error) {
  72. tail, err = sdf.Box3D(size, 0.0)
  73. a1 := sdf.V3{X: 0, Y: size.Y/2+offset, Z:-size.Z/2}
  74. a2 := sdf.V3{X: 0, Y: -size.Y/2+offset, Z:-size.Z/2}
  75. n1 := sdf.V3{Y: -math.Cos(angle), X: 0, Z: -math.Sin(angle)}
  76. n2 := sdf.V3{Y: math.Cos(angle), X: 0, Z: -math.Sin(angle)}
  77. tail = sdf.Cut3D(tail, a1, n1)
  78. tail = sdf.Cut3D(tail, a2, n2)
  79. //bottomSize := sdf.V2{X: doveTail.Size.X, Y: doveTail.Size.Y}
  80. //b2d := sdf.Box2D(bottomSize,0)
  81. //topSize := bottomSize.Add(sdf.V2{X:0, Y: doveTail.Size.Z * math.Tan(doveTail.Angle) * 2})
  82. //t2d := sdf.Box2D(topSize,0)
  83. //tail, err = sdf.Loft3D(b2d, t2d, doveTail.Size.Z,0)
  84. return
  85. }
  86. func main() {
  87. k := objects.BoxParams{
  88. Size: sdf.V3{100,100,100},
  89. Wall: 3,
  90. BottomTopRatio: 1,
  91. Margin: 0.1,
  92. Taper: 0.1,
  93. ClosingHeight: 4,
  94. CornerRadius: 3,
  95. }
  96. box, err := objects.BottomBox3D(&k)
  97. if err != nil {
  98. return
  99. }
  100. render.RenderSTL(box, 300, "out.stl")
  101. b := Button{
  102. Size: 18,
  103. Curve: 1.2,
  104. HoleSpacing: 8.5,
  105. }
  106. holder, err := ButtonHolder3D(&b)
  107. if err != nil {
  108. return
  109. }
  110. render.RenderSTL(holder, 300, "holder.stl")
  111. negative, err := wireNegative(&b)
  112. if err != nil {
  113. return
  114. }
  115. render.RenderSTL(negative, 300, "negative.stl")
  116. return
  117. }