$fn=64; // --- Parameters --- token_diameter = 25.0; // Diameter of the tokens token_thickness = 2.0; // Thickness of a single token tokens_per_slot = 15; // Number of tokens per compartment num_slots = 4; // Number of compartments wall_thickness = 2.5; // Thickness of outer and dividing walls base_thickness = 2.0; // Thickness of the bottom base finger_notch_width = 14.0; // Width of the vertical finger cutout // --- Calculated Dimensions --- well_dia = token_diameter + 1.0; // +1mm for tolerance well_rad = well_dia / 2; well_depth = (token_thickness * tokens_per_slot) + 2.0; holder_length = (well_dia * num_slots) + (wall_thickness * (num_slots + 1)); holder_width = well_dia + (wall_thickness * 2); holder_height = well_depth + base_thickness; // --- Model --- difference() { // Main body block cube([holder_length, holder_width, holder_height]); // Subtract compartments and finger cutouts for (i = [0 : num_slots - 1]) { // Center X position for the current slot x_pos = wall_thickness + well_rad + (i * (well_dia + wall_thickness)); y_pos = holder_width / 2; // Cylindrical well for stacking tokens translate([x_pos, y_pos, base_thickness]) cylinder(h = well_depth + 1, r = well_rad); // Vertical finger notch for easy grabbing/pinching translate([x_pos - (finger_notch_width / 2), -1, base_thickness]) cube([finger_notch_width, holder_width + 2, well_depth + 1]); } }