angle.scad 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. include <../config/global.scad>
  2. include <../config/angle.scad>
  3. function angle_top_holes_space()
  4. = angle_holes_space;
  5. function angle_bottom_holes_space()
  6. = angle_holes_space + angle_margin * 2;
  7. function angle_width()
  8. = max(angle_top_holes_space(), angle_bottom_holes_space())
  9. + angle_margin * 2
  10. + angle_thickness * 2;
  11. function angle_outside_depth()
  12. = angle_depth
  13. + angle_thickness;
  14. module angle_cutoff(top = false, only_holes = false) {
  15. module holes() {
  16. move
  17. = top
  18. ? angle_top_holes_space() / 2
  19. : angle_bottom_holes_space() / 2;
  20. translate([-move, 0]) {
  21. circle(d = angle_hole_diameter);
  22. }
  23. translate([move, 0]) {
  24. circle(d = angle_hole_diameter);
  25. }
  26. }
  27. module supports() {
  28. move
  29. = angle_width() / 2
  30. - angle_thickness / 2;
  31. translate([-move, 0]) {
  32. square([angle_thickness, angle_depth], center = true);
  33. }
  34. translate([move, 0]) {
  35. square([angle_thickness, angle_depth], center = true);
  36. }
  37. }
  38. holes();
  39. if (!only_holes) {
  40. supports();
  41. }
  42. }
  43. module angle_object() {
  44. module cross_section(hulled = false) {
  45. module corner(move_x = 0, move_y = 0) {
  46. translate([move_x, move_y]) {
  47. circle(d = angle_thickness);
  48. }
  49. }
  50. module base() {
  51. move = angle_depth / 2;
  52. hull() {
  53. corner(-move, move);
  54. corner(move, move);
  55. }
  56. hull() {
  57. corner(-move, move);
  58. corner(-move, -move);
  59. }
  60. }
  61. if (hulled) {
  62. hull() {
  63. base();
  64. }
  65. } else {
  66. base ();
  67. }
  68. }
  69. module base_object() {
  70. module center() {
  71. height
  72. = angle_width()
  73. - angle_thickness * 2;
  74. linear_extrude(height = height, center = true) {
  75. cross_section(hulled = false);
  76. }
  77. }
  78. module support() {
  79. height = angle_thickness;
  80. linear_extrude(height = height, center = true) {
  81. cross_section(hulled = true);
  82. }
  83. }
  84. module full() {
  85. center();
  86. move
  87. = angle_width() / 2
  88. - angle_thickness / 2;
  89. translate([0, 0, move]) {
  90. support();
  91. }
  92. translate([0, 0, -move]) {
  93. support();
  94. }
  95. }
  96. rotate([270, 0, 90]) {
  97. full();
  98. }
  99. }
  100. module holes() {
  101. height = angle_outside_depth();
  102. move = angle_thickness / 2;
  103. translate([0, move, 0]) {
  104. linear_extrude(height = height, center = true) {
  105. angle_cutoff(top = true, only_holes = true);
  106. }
  107. }
  108. translate([0, 0, move]) {
  109. rotate([90, 0, 0]) {
  110. linear_extrude(height = height, center = true) {
  111. angle_cutoff(top = false, only_holes = true);
  112. }
  113. }
  114. }
  115. }
  116. color("#AABBCC") {
  117. render() {
  118. correction_y
  119. = angle_outside_depth() / 2
  120. - angle_depth / 2;
  121. correction_z
  122. = angle_outside_depth() / 2
  123. - angle_depth / 2;
  124. translate([0, correction_y, correction_z]) {
  125. difference() {
  126. base_object();
  127. holes();
  128. }
  129. }
  130. }
  131. }
  132. }