|
|
@@ -0,0 +1,222 @@
|
|
|
+import cadquery as cq
|
|
|
+from cadquery.occ_impl.exporters import *
|
|
|
+from ocp_vscode import show, show_object
|
|
|
+
|
|
|
+
|
|
|
+###### Angle param #####
|
|
|
+hole_diam = 5.1
|
|
|
+hole_dist = 50
|
|
|
+bar_width = 20
|
|
|
+two_bar_width = hole_dist + bar_width
|
|
|
+
|
|
|
+board_length = 64.5
|
|
|
+board_width = 28.7
|
|
|
+board_thick = 0.7
|
|
|
+
|
|
|
+lid = cq.importers.importStep(r"mill/Pi_housing/lid_smaller_holes.step")
|
|
|
+base = cq.importers.importStep(r"mill/Pi_housing/base_smaller_holes.step")
|
|
|
+
|
|
|
+slit_width = 3
|
|
|
+slit_offset = 1
|
|
|
+
|
|
|
+angle_thick = 3
|
|
|
+angle_width = 10
|
|
|
+angle_length = 30
|
|
|
+flap_length = 15
|
|
|
+shift = 5
|
|
|
+
|
|
|
+###### BL Touch Holder param #####
|
|
|
+extension_len = 25
|
|
|
+bl_holder_width = 26.2
|
|
|
+bl_holder_depth = 10.5 + angle_thick
|
|
|
+
|
|
|
+bl_hole_diam = 3.85
|
|
|
+bl_hole_dist = 21.4 - bl_hole_diam
|
|
|
+
|
|
|
+###### Cam Holder param #####
|
|
|
+lens_diam = 7.5
|
|
|
+lens_holder_width = 8.5
|
|
|
+lens_holder_thick = 2.9
|
|
|
+
|
|
|
+cam_dist = 30
|
|
|
+cam_angle = 45
|
|
|
+
|
|
|
+holder_length = 60
|
|
|
+holder_length_offset = 20
|
|
|
+holder_width = 12
|
|
|
+holder_thick = angle_thick
|
|
|
+
|
|
|
+edge_length = 10
|
|
|
+
|
|
|
+case_thick = 2
|
|
|
+case_air = 0.2
|
|
|
+cable_thick = 1
|
|
|
+case_fillet = 8
|
|
|
+
|
|
|
+holder_x = hole_dist/2-holder_length_offset
|
|
|
+holder_y = -10
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+###### Angle #####
|
|
|
+connector = (
|
|
|
+ base.faces(">Z").workplane(origin=(-hole_dist/2,0,shift))
|
|
|
+ .box(angle_width, angle_length, angle_thick, (True, False, False), combine=False)
|
|
|
+)
|
|
|
+connector = connector.faces(">Z").workplane().center(0, angle_width/2).circle(slit_width/2).cutThruAll()
|
|
|
+connector_shift = connector.translate((hole_dist+slit_offset,0,0))
|
|
|
+connector_bar = (
|
|
|
+ connector.faces(">X")
|
|
|
+ .workplane(centerOption="CenterOfBoundBox")
|
|
|
+ .center((angle_length-angle_width)/2,0)
|
|
|
+ .rect(angle_width, angle_thick, centered=(True, True))
|
|
|
+ .extrude(hole_dist)
|
|
|
+)
|
|
|
+connector_wide = (
|
|
|
+ connector.union(connector_bar).union(connector_shift)
|
|
|
+ .edges("<Y and |Z")
|
|
|
+ .fillet(4)
|
|
|
+)
|
|
|
+connector_wide = connector_wide.faces("|Y")[3].edges("|Z").fillet(5)
|
|
|
+
|
|
|
+actual_flap_length = flap_length + angle_thick
|
|
|
+flap = (
|
|
|
+ connector_wide.faces(">Y")
|
|
|
+ .workplane(centerOption="CenterOfBoundBox")
|
|
|
+ .center(0,-angle_thick/2)
|
|
|
+ .rect(hole_dist+angle_width+slit_offset,actual_flap_length, centered=(True,False))
|
|
|
+ .extrude(angle_thick, combine=False)
|
|
|
+)
|
|
|
+
|
|
|
+flap = (
|
|
|
+ flap.faces("<Y")
|
|
|
+ .workplane()
|
|
|
+ .center(hole_dist/2, actual_flap_length - hole_diam)
|
|
|
+ .circle(hole_diam/2)
|
|
|
+ .center(-hole_dist, 0)
|
|
|
+ .circle(hole_diam/2)
|
|
|
+ .cutThruAll()
|
|
|
+)
|
|
|
+
|
|
|
+
|
|
|
+flap = (
|
|
|
+ flap.faces(">X")
|
|
|
+ .workplane(centerOption="CenterOfBoundBox")
|
|
|
+ .rect(angle_thick, flap_length+angle_thick)
|
|
|
+ .extrude(extension_len)
|
|
|
+)
|
|
|
+
|
|
|
+holder_shift = bl_holder_width - flap_length - angle_thick
|
|
|
+bl_holder = (
|
|
|
+ flap.faces(">X")
|
|
|
+ .workplane(centerOption="CenterOfBoundBox")
|
|
|
+ .center(-angle_thick/2, holder_shift/2)
|
|
|
+ .rect(bl_holder_depth, bl_holder_width, centered=(False,True))
|
|
|
+ .extrude(angle_thick)
|
|
|
+ .faces(">X")
|
|
|
+ .workplane(centerOption="CenterOfBoundBox")
|
|
|
+ .center(0, -bl_hole_dist/2)
|
|
|
+ .circle(bl_hole_diam/2)
|
|
|
+ .center(0, bl_hole_dist)
|
|
|
+ .circle(bl_hole_diam/2)
|
|
|
+ .cutThruAll()
|
|
|
+ .faces("+Z")[0]
|
|
|
+ .edges(">X")
|
|
|
+ .chamfer(holder_shift-0.1, holder_shift*2)
|
|
|
+ .faces("<X")
|
|
|
+ .edges(">Z")
|
|
|
+ .fillet(3)
|
|
|
+ .faces(">Y")
|
|
|
+ .edges("|X")
|
|
|
+ .fillet(5)
|
|
|
+)
|
|
|
+
|
|
|
+angle = connector_wide.union(bl_holder)
|
|
|
+
|
|
|
+############
|
|
|
+
|
|
|
+
|
|
|
+###### CamHolder #####
|
|
|
+
|
|
|
+holder = (
|
|
|
+ base.faces(">Z").workplane()
|
|
|
+ .center(holder_x, holder_y)
|
|
|
+ .box(holder_length, holder_width, holder_thick, (False, True, False), combine=False)
|
|
|
+ .edges("|Z and <X and <Y ")
|
|
|
+ .fillet(4)
|
|
|
+)
|
|
|
+case_dim_x = lens_holder_width + case_thick + case_air
|
|
|
+case_dim_z = lens_holder_thick+case_air+case_thick
|
|
|
+case_dim_y = case_dim_x + holder_width/2 - holder_y
|
|
|
+cam_case = (
|
|
|
+ holder.faces(">Z").workplane()
|
|
|
+ .center(holder_length, -holder_width/2)
|
|
|
+ .box(case_dim_x*2, case_dim_y, case_dim_z, combine=False, centered=(True,False,False))
|
|
|
+)
|
|
|
+indside_width = lens_holder_width+case_air
|
|
|
+cam_case_inside = (
|
|
|
+ cam_case.faces(">Z").workplane(invert=True)
|
|
|
+ .center(-case_dim_x/2, -case_dim_y + case_dim_x/2)
|
|
|
+ .box(indside_width, indside_width, lens_holder_thick+case_air, combine=False, centered=(True,True,False))
|
|
|
+ .center(-1,0)
|
|
|
+ .box(indside_width, indside_width, cable_thick+case_air, centered=(True,True,False))
|
|
|
+) # Lens holder hole
|
|
|
+cam_case = (
|
|
|
+ cam_case.faces("<Z").workplane()
|
|
|
+ .center(-case_dim_x/2, -(case_dim_y - case_dim_x/2))
|
|
|
+ .cskHole(lens_diam, lens_diam*1.8, 120)
|
|
|
+) # Lens hole
|
|
|
+cam_case = cam_case.cut(cam_case_inside).edges("|Z and <X and <Y").fillet(case_fillet)
|
|
|
+cam_case = (
|
|
|
+ cam_case
|
|
|
+ .rotateAboutCenter((0,1,0), 270-cam_angle)
|
|
|
+ .translate((2,0,-6.5))
|
|
|
+)
|
|
|
+
|
|
|
+holder = (
|
|
|
+ holder.faces(">Y").workplane()
|
|
|
+ .rect(-holder_width,holder_thick, centered=(False,False))
|
|
|
+ .extrude(edge_length)
|
|
|
+ .faces(">Y")
|
|
|
+ .edges("|Z")
|
|
|
+ .fillet(5)
|
|
|
+)
|
|
|
+
|
|
|
+holder = (
|
|
|
+ holder.faces(">Z")
|
|
|
+ .workplane()
|
|
|
+ .center(holder_width/2, edge_length/2)
|
|
|
+ .circle(slit_width/2)
|
|
|
+ .cutThruAll()
|
|
|
+ .center(angle_length/2-slit_width/2, -edge_length)
|
|
|
+ .circle(slit_width/2)
|
|
|
+ .cutThruAll()
|
|
|
+)
|
|
|
+
|
|
|
+cam_case_lid = (
|
|
|
+ cam_case.faces(">(-1, 0, -1)").workplane(centerOption="CenterOfBoundBox")
|
|
|
+ .box(case_dim_y, case_dim_x*2, case_thick, combine=False, centered=(True, True, False))
|
|
|
+ .edges(">(1, -1, -1)").fillet(case_fillet)
|
|
|
+)
|
|
|
+cam_case_lid = cam_case_lid.cut(holder)
|
|
|
+
|
|
|
+holder = holder.union(cam_case)
|
|
|
+
|
|
|
+
|
|
|
+############
|
|
|
+
|
|
|
+show_object(lid)
|
|
|
+show_object(base)
|
|
|
+show_object(angle)
|
|
|
+show_object(holder)
|
|
|
+show_object(cam_case_lid)
|
|
|
+
|
|
|
+# export the box as a STEP file
|
|
|
+with open(r"mill/Pi_housing/pi_angle.step", "w") as fp:
|
|
|
+ cq.exporters.exportShape(angle, ExportTypes.STEP, fp)
|
|
|
+
|
|
|
+with open(r"mill/Pi_housing/cam_holder.step", "w") as fp:
|
|
|
+ cq.exporters.exportShape(holder, ExportTypes.STEP, fp)
|
|
|
+
|
|
|
+with open(r"mill/Pi_housing/cam_case_lid.step", "w") as fp:
|
|
|
+ cq.exporters.exportShape(cam_case_lid, ExportTypes.STEP, fp)
|