def __init__(
self,
cap_lid_hole_radius: float,
clearance: float,
cap_height: float,
cap_outer_thickness: float,
lid_shoulder: float,
cap_lid_hole_wall_thickness: float,
lid_sliders: int,
rotation: RotationLike = (0, 0, 0),
align: Align | tuple[Align, Align, Align] = (
Align.CENTER,
Align.CENTER,
Align.MAX,
),
mode: Mode = Mode.ADD,
):
"""
Creates a sliding lid
"""
lid_radius = cap_lid_hole_radius - clearance
solid = Solid.make_cylinder(lid_radius, cap_height)
solid += (
Location((0, 0, cap_height - cap_outer_thickness)) *
Solid.make_cylinder(lid_radius + lid_shoulder, cap_outer_thickness)
) # fmt: off
grip_sk = Circle(cap_lid_hole_radius - cap_lid_hole_wall_thickness)
grip_sk -= Rectangle(lid_shoulder * 2, cap_lid_hole_radius * 2 + 2)
grip = extrude(grip_sk, cap_height)
solid -= Location((0, 0, cap_lid_hole_wall_thickness)) * grip
solid = chamfer(solid.edges().filter_by(GeomType.CIRCLE).sort_by(Axis.Z)[4], lid_shoulder - 0.01)
slide_h = (lid_shoulder - clearance) * 2
slide_z = cap_height - slide_h - (cap_outer_thickness + lid_shoulder + clearance)
slide = Location((0, 0, slide_z)) * Solid.make_cylinder(
radius=cap_lid_hole_radius + lid_shoulder - clearance, height=slide_h, angle=(360 / lid_sliders / 3) - 2
)
edges = slide.edges().filter_by(GeomType.CIRCLE).sort_by(SortBy.LENGTH)[:2]
slide = chamfer(edges, slide_h / 2 - 0.01)
slide -= Solid.make_cylinder(lid_radius, cap_height)
# Bottom chamfer
solid = chamfer(solid.edges().sort_by(Axis.Z)[0], lid_shoulder)
# Grip chamfer
solid = chamfer(solid.wires().filter_by(Plane.XY).sort_by(SortBy.LENGTH)[0:4].edges(), cap_outer_thickness / 2)
for i in range(lid_sliders):
solid += Rotation(Z=i * 360 / lid_sliders) * slide
return super().__init__(part=solid, rotation=rotation, align=tuplify(align, 3), mode=mode)