$fn = 64; // --- Parameters --- card_w = 86; // Width of the card card_h = 54; // Height of the card card_t = 1.0; // Thickness of the card slot wall = 2.0; // Wall thickness track_h = 14.0; // Height of the slider track section track_depth = 9.0; // Depth of the track section tol = 0.4; // Tolerance for sliding fit // Render both parts side-by-side for easy printing card_holder(); translate([card_w + 2*wall + 10, 0, 0]) slider(); module card_holder() { union() { // Track section (bottom) difference() { cube([card_w + 2*wall, track_h, track_depth]); // Diamond track slot translate([-1, track_h/2, 5]) rotate([0, 90, 0]) cylinder(h=card_w + 2*wall + 2, d=7, $fn=4); // Track slot opening translate([-1, track_h/2 - 1.5, 5]) cube([card_w + 2*wall + 2, 3, 5]); } // Card holder section (top) translate([0, track_h, 0]) difference() { cube([card_w + 2*wall, card_h, wall*2 + card_t]); // Card slot (open at top) translate([wall, 0, wall]) cube([card_w, card_h + 1, card_t]); // Front viewing window translate([wall + 4, 4, wall + card_t]) cube([card_w - 8, card_h + 1, wall + 1]); // Thumb notch for easy card removal translate([card_w/2 + wall, card_h, 0]) cylinder(r=12, h=20, center=true); } } } module slider() { slider_w = 12; knob_y = track_h - 2; knob_z = 3; neck_y = 3 - tol*2; neck_z = 4.5; diamond_d = 7 - tol*2; union() { // Main knob cube([slider_w, knob_y, knob_z]); // Raised pointer indicator (points towards card when flipped and inserted) translate([slider_w/2 - 1.5, 1, knob_z]) cube([3, knob_y/2 - 1, 1.5]); // Grip ridges translate([slider_w/2 - 4, knob_y - 3.5, knob_z]) cube([8, 1.5, 1]); translate([slider_w/2 - 4, knob_y - 6.5, knob_z]) cube([8, 1.5, 1]); // Neck translate([0, (knob_y - neck_y)/2, knob_z]) cube([slider_w, neck_y, neck_z]); // Diamond rail guide translate([0, knob_y/2, knob_z + neck_z]) rotate([0, 90, 0]) cylinder(h=slider_w, d=diamond_d, $fn=4); } }