Skip to content

Sliding lid

SlidingLid

SlidingLid(
    cap_lid_hole_radius,
    clearance,
    cap_height,
    cap_outer_thickness,
    lid_shoulder,
    cap_lid_hole_wall_thickness,
    lid_sliders,
    rotation=(0, 0, 0),
    align=(Align.CENTER, Align.CENTER, Align.MAX),
    mode=Mode.ADD,
)

Bases: BasePartObject

Creates a sliding lid

Source code in src/bd_tube_boxes/sliding_lid.py
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)