Pip-Boy inspired phone holder built around the PINE64 PinePhone
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.

130 satır
4.2 KiB

  1. links_count=6;
  2. include_terminal=true;
  3. //validation=1;
  4. VALIDATE_INTERSECTION=1;
  5. //xray=1;
  6. use <BOSL/transforms.scad>
  7. use <BOSL/shapes.scad>
  8. include <BOSL/constants.scad>
  9. function get_link_segment_size() = [15, 30, 5];
  10. function get_link_pin_diameter() = 2;
  11. function get_link_socket_slack() = [1, 4, 1];
  12. function get_link_joiner_arm_size() = [get_link_segment_size().x - 2, 3, segment_size.z];
  13. function get_link_socket_size() = [get_link_segment_size().z,
  14. get_link_segment_size().y - get_link_joiner_arm_size().y*2,
  15. get_link_segment_size().z];
  16. echo("===============================");
  17. echo(str("Strap length: ", (links_count * get_link_segment_size().x), " mm"));
  18. echo("===============================");
  19. assert(get_link_segment_size().x >= 10, "Link segment is too short.");
  20. assert(get_link_segment_size().z >= (get_link_pin_diameter() + get_link_socket_slack().z + 1), "Link segment is too thin.");
  21. module link(terminal=false) {
  22. segment_size=get_link_segment_size();
  23. module pin() {
  24. h=segment_size.y;
  25. d=get_link_pin_diameter();
  26. back(h/2) xrot(90) cylinder(h=h, d=d, $fn=$preview ? 10 : 30);
  27. }
  28. module pin_socket_area() {
  29. h=segment_size.y-get_link_socket_slack().y;
  30. d=segment_size.z;
  31. back(h/2) xrot(90) cylinder(h=h, d=d, $fn=$preview ? 10 : 30);
  32. }
  33. module pin_socket() {
  34. difference() {
  35. pin_socket_area();
  36. scaleup = [
  37. ((get_link_pin_diameter() + get_link_socket_slack().x) / get_link_pin_diameter()),
  38. ((get_link_pin_diameter() + get_link_socket_slack().y) / get_link_pin_diameter()),
  39. ((get_link_pin_diameter() + get_link_socket_slack().z) / get_link_pin_diameter())
  40. ];
  41. scale(scaleup) pin();
  42. }
  43. }
  44. module joiner() {
  45. gap=2;
  46. arm_size=get_link_joiner_arm_size();
  47. module arm() {
  48. fwd(segment_size.y/2 + arm_size.y/2 - 1) right(arm_size.x/2 - 1) cuboid(arm_size, fillet=1, edges=EDGES_FRONT + EDGES_Y_ALL);
  49. }
  50. module armFront() {
  51. arm();
  52. }
  53. module armBack() {
  54. scale([1, -1, 1]) arm();
  55. }
  56. module armJoiner() {
  57. joiner_size=[arm_size.x-get_link_socket_size().x, segment_size.y, segment_size.z];
  58. right(joiner_size.x/2 + get_link_socket_size().x/2 + gap) cuboid(joiner_size, fillet=1, edges=EDGES_Z_ALL + EDGES_BOTTOM);
  59. }
  60. module socketJoiner() {
  61. joiner_size=[segment_size.x-get_link_socket_size().x+get_link_socket_size().x*0.2,
  62. segment_size.y-4,
  63. segment_size.z];
  64. difference() {
  65. right(joiner_size.x/2 + 4.5) cuboid(joiner_size, fillet=1, edges=EDGES_Z_ALL + EDGES_BOTTOM);
  66. right(segment_size.x) scale([1, 2, 1]) pin_socket_area();
  67. }
  68. }
  69. module terminalArm() {
  70. left(5) {
  71. shift=arm_size.x - get_link_pin_diameter();
  72. right(segment_size.x + shift + gap/2) pin();
  73. right(segment_size.x + gap/2) {
  74. armFront();
  75. armBack();
  76. }
  77. right(arm_size.x - get_link_socket_size().x + gap) armJoiner();
  78. }
  79. }
  80. armFront();
  81. armBack();
  82. armJoiner();
  83. if (terminal) {
  84. terminalArm();
  85. } else {
  86. socketJoiner();
  87. }
  88. }
  89. pin();
  90. joiner();
  91. if (!terminal) {
  92. right(segment_size.x) pin_socket();
  93. }
  94. }
  95. segment_size=get_link_segment_size();
  96. if (!is_undef(validation)) {
  97. if (validation==VALIDATE_INTERSECTION) {
  98. intersection() {
  99. right(0*segment_size.x) link();
  100. right(1*segment_size.x) link();
  101. }
  102. intersection() {
  103. right(1*segment_size.x) link();
  104. right(2*segment_size.x) link();
  105. }
  106. }
  107. } else if (!is_undef(xray)) {
  108. intersection() {
  109. cube([1000, 1000, 1000]);
  110. for (i = [0:links_count-1]) {
  111. right(i*segment_size.x) link();
  112. }
  113. }
  114. } else {
  115. for (i = [0:links_count-1]) {
  116. terminal=(i==links_count-1) && include_terminal;
  117. right(i*segment_size.x) link(terminal=terminal);
  118. }
  119. }