Pip-Boy inspired phone holder built around the PINE64 PinePhone
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

163 lines
4.7 KiB

  1. include <export.scad>
  2. //export=MODEL_PLATFORM_HARNESS;
  3. //export=MODEL_PLATFORM_STRAP;
  4. // dependency: https://github.com/revarbat/BOSL
  5. include <BOSL/constants.scad>
  6. use <BOSL/transforms.scad>
  7. use <BOSL/shapes.scad>
  8. use <BOSL/masks.scad>
  9. use <BOSL/sliders.scad>
  10. use <specs_platform.scad>
  11. use <specs_strap.scad>
  12. use <common.scad>
  13. use <strap_common.scad>
  14. use <platform_common.scad>
  15. // DEBUG:
  16. //validation = 1;
  17. //xray = 1;
  18. // PROP >>
  19. module prop_arm() {
  20. $fn=$preview ? 10 : 30;
  21. arm_size=[200, 55, 40];
  22. color("gray")
  23. down(arm_size.z/2) {
  24. cuboid(arm_size, fillet=16, edges=EDGES_X_ALL);
  25. left(arm_size.x*0.6) scale([1, 1, 0.8]) yrot(90) cylinder(d1=arm_size.y*1.4, d2=arm_size.y*0.95, h=arm_size.x/2);
  26. }
  27. }
  28. module model_prop_arm() {
  29. if (is_not_export()) down(3) prop_arm();
  30. }
  31. // <<<
  32. // Blocks:
  33. module lock_pin(groove) {
  34. slack=groove
  35. ?[1, 0.5, 0.3]
  36. :[0, 0, 0];
  37. pin_size=get_platform_lock_pin_size();
  38. size=vec_sum(pin_size, slack);
  39. down(size.z/2)
  40. translate([slack.x/2, slack.y/2, slack.z/2])
  41. xrot(-4) zrot(-90) right_triangle([size.y, size.x, size.z]);
  42. }
  43. module lock_arm() {
  44. size=get_platform_lock_arm_size();
  45. down(get_platform_top_size().z) back(size.y/2) right(size.x/2) cube(size, center=true);
  46. joiner_size=[get_platform_lock_pin_size().x, size.y, get_platform_top_size().z];
  47. translate([joiner_size.x/2, joiner_size.y/2, -joiner_size.z/2 + size.z/2]) cube(joiner_size, center=true);
  48. }
  49. module lock_mechanism_button(groove=false) {
  50. button_size=groove
  51. ?[10,5]
  52. :[7,4.5];
  53. size=[button_size.x, get_platform_wall()*7, button_size.y];
  54. translate([get_platform_lock_pin_size().x*1.5, -get_platform_size().y/2+size.y*1.3, -get_platform_size().z/2])
  55. cube(size, center=true);
  56. }
  57. module lock_buttons_cutout() {
  58. module cutout_side(groove) {
  59. translate(get_platform_lock_pin_pos()) lock_mechanism_button(groove=true);
  60. }
  61. cutout_side();
  62. scale([1, -1, 1]) cutout_side();
  63. }
  64. module lock_mechanism() {
  65. lock_pin(groove=false);
  66. lock_arm();
  67. lock_mechanism_button();
  68. }
  69. module lock_socket() {
  70. pin_size=get_platform_lock_pin_size();
  71. size=[pin_size.x, pin_size.y, pin_size.z];
  72. module socket_connector() {
  73. conn_size=[pin_size.x+4, get_platform_wall()*3, get_platform_top_size().z];
  74. up(pin_size.z/2) fwd(pin_size.y+conn_size.y/2) right(pin_size.x/2) {
  75. prismoid(size1=[conn_size.x, conn_size.y], size2=[conn_size.x, conn_size.y-2], shift=[0, -1], h=conn_size.z/2);
  76. down(conn_size.z/4) cube([conn_size.x, conn_size.y, conn_size.z/2], center=true);
  77. }
  78. }
  79. down(pin_size.z)
  80. translate(get_platform_lock_pin_pos()) {
  81. fwd(pin_size.y) scale([1, -1, -1]) lock_pin();
  82. socket_connector();
  83. }
  84. }
  85. module platform_locks_pins() {
  86. platform_size=get_platform_size();
  87. lock_pin_size=get_platform_lock_pin_size();
  88. module lock_side(groove) {
  89. translate(get_platform_lock_pin_pos()) lock_mechanism();
  90. }
  91. lock_side();
  92. scale([1, -1, 1]) lock_side();
  93. }
  94. module platform_locks_sockets() {
  95. lock_socket();
  96. scale([1, -1, 1]) lock_socket();
  97. }
  98. module platform(base) {
  99. size=get_platform_size();
  100. base_size=size;
  101. wall=get_platform_wall();
  102. top_size=get_platform_top_size();
  103. top=!base;
  104. module base_platform() {
  105. module base_platform_core() {
  106. braced_thinning_wall(h=size.y, l=size.x, thick=size.z, wall=0, strut=wall, orient=ORIENT_X_90);
  107. }
  108. difference() {
  109. base_platform_core();
  110. translate(get_platform_top_pos()) down(top_size.z/2) prismoid(size1=[top_size.x,top_size.y], size2=[base_size.x-2,base_size.y-2], h=top_size.z);
  111. lock_buttons_cutout();
  112. }
  113. }
  114. module top_platform() {
  115. up((base_size.z-top_size.z)/2)
  116. braced_thinning_wall(h=top_size.y, l=top_size.x, thick=top_size.z, wall=0, strut=wall/4, orient=ORIENT_X_90);
  117. }
  118. module strap_connectors() {
  119. //down(size.z/2)
  120. foreach_platform_strap_connector() {
  121. link_connector_pin();
  122. }
  123. }
  124. color(top?"Olive":"YellowGreen")
  125. if (base) {
  126. base_platform();
  127. platform_locks_pins();
  128. strap_connectors();
  129. } else {
  130. top_platform();
  131. platform_locks_sockets();
  132. }
  133. }
  134. // Models:
  135. module model_platform_harness() {
  136. platform(base=false);
  137. }
  138. module model_platform_strap() {
  139. platform(base=true);
  140. }
  141. // Export:
  142. difference() {
  143. union() {
  144. if (is_model(MODEL_PLATFORM_HARNESS)) model_platform_harness();
  145. if (is_model(MODEL_PLATFORM_STRAP)) model_platform_strap();
  146. //if (is_model(MODEL_DEMO)) model_prop_arm();
  147. }
  148. // xray:
  149. //left(500+5) cube([1000, 1000, 1000], center=true);
  150. }