pi_cam_housing.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. import cadquery as cq
  2. from cadquery.occ_impl.exporters import *
  3. from ocp_vscode import show, show_object
  4. ###### Angle param #####
  5. hole_diam = 5.1
  6. hole_dist = 50
  7. bar_width = 20
  8. two_bar_width = hole_dist + bar_width
  9. board_length = 64.5
  10. board_width = 28.7
  11. board_thick = 0.7
  12. lid = cq.importers.importStep(r"mill/Pi_housing/lid_smaller_holes.step")
  13. base = cq.importers.importStep(r"mill/Pi_housing/base_smaller_holes.step")
  14. slit_width = 3
  15. slit_offset = 1
  16. angle_thick = 3
  17. angle_width = 10
  18. angle_length = 30
  19. flap_length = 15
  20. shift = 5
  21. ###### BL Touch Holder param #####
  22. extension_len = 25
  23. bl_holder_width = 26.2
  24. bl_holder_depth = 10.5 + angle_thick
  25. bl_hole_diam = 3.85
  26. bl_hole_dist = 21.4 - bl_hole_diam
  27. ###### Cam Holder param #####
  28. lens_diam = 7.5
  29. lens_holder_width = 8.5
  30. lens_holder_thick = 2.9
  31. cam_dist = 30
  32. cam_angle = 45
  33. holder_length = 60
  34. holder_length_offset = 20
  35. holder_width = 12
  36. holder_thick = angle_thick
  37. edge_length = 10
  38. case_thick = 2
  39. case_air = 0.2
  40. cable_thick = 1
  41. case_fillet = 8
  42. holder_x = hole_dist/2-holder_length_offset
  43. holder_y = -10
  44. ###### Angle #####
  45. connector = (
  46. base.faces(">Z").workplane(origin=(-hole_dist/2,0,shift))
  47. .box(angle_width, angle_length, angle_thick, (True, False, False), combine=False)
  48. )
  49. connector = connector.faces(">Z").workplane().center(0, angle_width/2).circle(slit_width/2).cutThruAll()
  50. connector_shift = connector.translate((hole_dist+slit_offset,0,0))
  51. connector_bar = (
  52. connector.faces(">X")
  53. .workplane(centerOption="CenterOfBoundBox")
  54. .center((angle_length-angle_width)/2,0)
  55. .rect(angle_width, angle_thick, centered=(True, True))
  56. .extrude(hole_dist)
  57. )
  58. connector_wide = (
  59. connector.union(connector_bar).union(connector_shift)
  60. .edges("<Y and |Z")
  61. .fillet(4)
  62. )
  63. connector_wide = connector_wide.faces("|Y")[3].edges("|Z").fillet(5)
  64. actual_flap_length = flap_length + angle_thick
  65. flap = (
  66. connector_wide.faces(">Y")
  67. .workplane(centerOption="CenterOfBoundBox")
  68. .center(0,-angle_thick/2)
  69. .rect(hole_dist+angle_width+slit_offset,actual_flap_length, centered=(True,False))
  70. .extrude(angle_thick, combine=False)
  71. )
  72. flap = (
  73. flap.faces("<Y")
  74. .workplane()
  75. .center(hole_dist/2, actual_flap_length - hole_diam)
  76. .circle(hole_diam/2)
  77. .center(-hole_dist, 0)
  78. .circle(hole_diam/2)
  79. .cutThruAll()
  80. )
  81. flap = (
  82. flap.faces(">X")
  83. .workplane(centerOption="CenterOfBoundBox")
  84. .rect(angle_thick, flap_length+angle_thick)
  85. .extrude(extension_len)
  86. )
  87. holder_shift = bl_holder_width - flap_length - angle_thick
  88. bl_holder = (
  89. flap.faces(">X")
  90. .workplane(centerOption="CenterOfBoundBox")
  91. .center(-angle_thick/2, holder_shift/2)
  92. .rect(bl_holder_depth, bl_holder_width, centered=(False,True))
  93. .extrude(angle_thick)
  94. .faces(">X")
  95. .workplane(centerOption="CenterOfBoundBox")
  96. .center(0, -bl_hole_dist/2)
  97. .circle(bl_hole_diam/2)
  98. .center(0, bl_hole_dist)
  99. .circle(bl_hole_diam/2)
  100. .cutThruAll()
  101. .faces("+Z")[0]
  102. .edges(">X")
  103. .chamfer(holder_shift-0.1, holder_shift*2)
  104. .faces("<X")
  105. .edges(">Z")
  106. .fillet(3)
  107. .faces(">Y")
  108. .edges("|X")
  109. .fillet(5)
  110. )
  111. angle = connector_wide.union(bl_holder)
  112. ############
  113. ###### CamHolder #####
  114. holder = (
  115. base.faces(">Z").workplane()
  116. .center(holder_x, holder_y)
  117. .box(holder_length, holder_width, holder_thick, (False, True, False), combine=False)
  118. .edges("|Z and <X and <Y ")
  119. .fillet(4)
  120. )
  121. case_dim_x = lens_holder_width + case_thick + case_air
  122. case_dim_z = lens_holder_thick+case_air+case_thick
  123. case_dim_y = case_dim_x + holder_width/2 - holder_y
  124. cam_case = (
  125. holder.faces(">Z").workplane()
  126. .center(holder_length, -holder_width/2)
  127. .box(case_dim_x*2, case_dim_y, case_dim_z, combine=False, centered=(True,False,False))
  128. )
  129. indside_width = lens_holder_width+case_air
  130. cam_case_inside = (
  131. cam_case.faces(">Z").workplane(invert=True)
  132. .center(-case_dim_x/2, -case_dim_y + case_dim_x/2)
  133. .box(indside_width, indside_width, lens_holder_thick+case_air, combine=False, centered=(True,True,False))
  134. .center(-1,0)
  135. .box(indside_width, indside_width, cable_thick+case_air, centered=(True,True,False))
  136. ) # Lens holder hole
  137. cam_case = (
  138. cam_case.faces("<Z").workplane()
  139. .center(-case_dim_x/2, -(case_dim_y - case_dim_x/2))
  140. .cskHole(lens_diam, lens_diam*1.8, 120)
  141. ) # Lens hole
  142. cam_case = cam_case.cut(cam_case_inside).edges("|Z and <X and <Y").fillet(case_fillet)
  143. cam_case = (
  144. cam_case
  145. .rotateAboutCenter((0,1,0), 270-cam_angle)
  146. .translate((2,0,-6.5))
  147. )
  148. holder = (
  149. holder.faces(">Y").workplane()
  150. .rect(-holder_width,holder_thick, centered=(False,False))
  151. .extrude(edge_length)
  152. .faces(">Y")
  153. .edges("|Z")
  154. .fillet(5)
  155. )
  156. holder = (
  157. holder.faces(">Z")
  158. .workplane()
  159. .center(holder_width/2, edge_length/2)
  160. .circle(slit_width/2)
  161. .cutThruAll()
  162. .center(angle_length/2-slit_width/2, -edge_length)
  163. .circle(slit_width/2)
  164. .cutThruAll()
  165. )
  166. cam_case_lid = (
  167. cam_case.faces(">(-1, 0, -1)").workplane(centerOption="CenterOfBoundBox")
  168. .box(case_dim_y, case_dim_x*2, case_thick, combine=False, centered=(True, True, False))
  169. .edges(">(1, -1, -1)").fillet(case_fillet)
  170. )
  171. cam_case_lid = cam_case_lid.cut(holder)
  172. holder = holder.union(cam_case)
  173. ############
  174. show_object(lid)
  175. show_object(base)
  176. show_object(angle)
  177. show_object(holder)
  178. show_object(cam_case_lid)
  179. # export the box as a STEP file
  180. with open(r"mill/Pi_housing/pi_angle.step", "w") as fp:
  181. cq.exporters.exportShape(angle, ExportTypes.STEP, fp)
  182. with open(r"mill/Pi_housing/cam_holder.step", "w") as fp:
  183. cq.exporters.exportShape(holder, ExportTypes.STEP, fp)
  184. with open(r"mill/Pi_housing/cam_case_lid.step", "w") as fp:
  185. cq.exporters.exportShape(cam_case_lid, ExportTypes.STEP, fp)