Pip-Boy inspired phone holder built around the PINE64 PinePhone
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

107 linhas
3.2 KiB

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