headphones_holder.scad 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. include <../config/headphones_holder.scad>
  2. module headphones_holder_hanger_object() {
  3. height = headphones_holder_height;
  4. depth = headphones_holder_depth;
  5. leg_depth = headphones_holder_leg_depth;
  6. leg_width = headphones_holder_leg_width;
  7. leg_thickness = headphones_holder_leg_thickness;
  8. blocker_size = headphones_hanger_blocker_size;
  9. module hanger() {
  10. module main() {
  11. size = [
  12. blocker_size,
  13. leg_depth * 1.5,
  14. blocker_size
  15. ];
  16. cube(size, center = true);
  17. }
  18. module headphones() {
  19. size = [
  20. blocker_size,
  21. blocker_size * 2,
  22. blocker_size / 2
  23. ];
  24. translate([0, 0, blocker_size / 4]) {
  25. cube(size, center = true);
  26. }
  27. }
  28. render() {
  29. difference() {
  30. main();
  31. headphones();
  32. }
  33. }
  34. }
  35. hanger();
  36. }
  37. module headphones_holder_leg_object() {
  38. height = headphones_holder_height;
  39. depth = headphones_holder_depth;
  40. leg_depth = headphones_holder_leg_depth;
  41. leg_width = headphones_holder_leg_width;
  42. leg_thickness = headphones_holder_leg_thickness;
  43. blocker_size = headphones_hanger_blocker_size;
  44. module legs_shape() {
  45. module single_leg(splited = false) {
  46. module point(x, y, squared = false) {
  47. translate([x, y]) {
  48. if (squared) {
  49. square(leg_width, center = true);
  50. } else {
  51. circle(r = leg_width / 2);
  52. }
  53. }
  54. }
  55. move_x = leg_depth / 2 - leg_width / 2;
  56. move_y = leg_depth / 2 - leg_width / 2;
  57. union() {
  58. hull() {
  59. point(-move_x, move_y, squared = !splited);
  60. point(move_x, move_y, squared = splited);
  61. }
  62. hull() {
  63. if (splited) {
  64. point(-move_x, move_y, squared = false);
  65. point(-move_x, -move_y, squared = false);
  66. } else {
  67. point(move_x, move_y, squared = false);
  68. point(move_x, -move_y, squared = false);
  69. }
  70. }
  71. }
  72. }
  73. translate([-leg_depth / 2, 0]) {
  74. single_leg(splited = true);
  75. }
  76. translate([leg_depth / 2, 0]) {
  77. single_leg();
  78. }
  79. }
  80. module legs_object() {
  81. linear_extrude(height = leg_thickness, center = false) {
  82. legs_shape();
  83. }
  84. }
  85. module frame_object() {
  86. precission = 1 / $fn;
  87. module end_shape(x, y, z, top = false) {
  88. translate([x, y, z - precission * (top ? 1 : -1)]) {
  89. width = leg_width * (top ? 1 : 2);
  90. depth = leg_width;
  91. height = precission;
  92. cube([width, depth, height], center = true);
  93. }
  94. }
  95. move_y_bottom = leg_depth / 2 - leg_width / 2;
  96. move_y_top = move_y_bottom + depth;
  97. hull() {
  98. end_shape(0, move_y_bottom, 0, top = false);
  99. end_shape(0, move_y_top, height + depth, top = true);
  100. }
  101. hull() {
  102. end_shape(0, move_y_top, height + depth, top = true);
  103. end_shape(0, move_y_top, height + depth + blocker_size, top = true);
  104. }
  105. }
  106. legs_object();
  107. translate([0, 0, leg_thickness]) {
  108. frame_object();
  109. }
  110. }
  111. module headphones_holder_object() {
  112. height = headphones_holder_height;
  113. depth = headphones_holder_depth;
  114. leg_depth = headphones_holder_leg_depth;
  115. leg_width = headphones_holder_leg_width;
  116. leg_thickness = headphones_holder_leg_thickness;
  117. blocker_size = headphones_hanger_blocker_size;
  118. color("#444444") {
  119. render() {
  120. headphones_holder_leg_object();
  121. }
  122. }
  123. hanger_z = leg_thickness + height + depth + blocker_size / 2;
  124. color("#999999") {
  125. render() {
  126. translate([0, 0, hanger_z]) {
  127. headphones_holder_hanger_object();
  128. }
  129. }
  130. }
  131. }