$fn = 64; // --- Parameters --- card_width = 41; card_length = 63; tolerance = 3; // Clearance for easy card insertion and sleeves wall = 2.5; // Outer wall thickness base_t = 3; // Base floor thickness tray_h = 35; // Total height of the tray tilt_angle = 6; // Angle to tilt cards backward stack_lip = 2; // Height of the bottom stacking lip stack_tol = 0.4; // Clearance for modular stacking // --- Calculated Dimensions --- in_w = card_width + tolerance; in_l = card_length + tolerance; out_w = in_w + wall * 2; out_l = in_l + wall * 2; // --- Main Model --- union() { difference() { // Main outer body cube([out_w, out_l, tray_h]); // Inner card cavity translate([wall, wall, base_t]) cube([in_w, in_l, tray_h]); // Front thumb cutout translate([out_w / 2, 0, base_t + 15]) { translate([0, 0, tray_h / 2]) cube([24, wall * 4, tray_h], center = true); rotate([90, 0, 0]) cylinder(h = wall * 4, d = 24, center = true); } // Left finger cutout translate([0, out_l / 2, base_t + 16]) { translate([0, 0, tray_h / 2]) cube([wall * 4, 30, tray_h], center = true); rotate([0, 90, 0]) cylinder(h = wall * 4, d = 30, center = true); } // Right finger cutout translate([out_w, out_l / 2, base_t + 16]) { translate([0, 0, tray_h / 2]) cube([wall * 4, 30, tray_h], center = true); rotate([0, 90, 0]) cylinder(h = wall * 4, d = 30, center = true); } } // Internal wedge to tilt cards backward translate([wall, wall, base_t]) hull() { cube([in_w, in_l, 0.01]); cube([in_w, 0.01, in_l * tan(tilt_angle)]); } // Bottom stacking lip translate([wall + stack_tol, wall + stack_tol, -stack_lip]) cube([in_w - stack_tol * 2, in_l - stack_tol * 2, stack_lip + 0.01]); }