$fn=64; // --- PARAMETERS --- days = 7; comp_width = 22; comp_length = 32; comp_depth = 16; wall = 2; lid_clearance = 0.6; // Calculated dimensions total_x = days * comp_width + (days + 1) * wall; total_y = comp_length + 2 * wall + 4; total_z = comp_depth + wall + 3; labels = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]; // --- MAIN ASSEMBLY --- // Base organizer organizer_base(); // Sliding lid (placed next to the base for easy printing) translate([0, total_y + 15, 0]) lid(); // --- MODULES --- module organizer_base() { difference() { // Main body block cube([total_x, total_y, total_z]); // Compartments and Labels for(i = [0 : days - 1]) { // Compartment cutout (extended slightly in Z to ensure clean cut) translate([wall + i * (comp_width + wall), wall + 2, wall]) cube([comp_width, comp_length, total_z + 1]); // Engraved day labels at the bottom of each compartment translate([wall + i * (comp_width + wall) + comp_width / 2, wall + 2 + comp_length / 2, wall - 0.6]) linear_extrude(1) text(labels[i], size=comp_width*0.35, halign="center", valign="center", font="Arial:style=Bold"); } // Lid Track - Wide slot (for the lid body to slide in) // Starts at wall/2 to leave a solid stopper at the left end translate([wall / 2, wall, wall + comp_depth]) cube([total_x + 1, comp_length + 4, 1.6]); // Lid Track - Narrow slot (top opening) translate([wall / 2, wall + 2, wall + comp_depth + 1.5]) cube([total_x + 1, comp_length, total_z]); } } module lid() { lid_len = total_x - wall / 2 + 2; lid_width = comp_length + 4 - lid_clearance; lid_thick = 1.2; union() { // Lid main sliding sheet cube([lid_len, lid_width, lid_thick]); // Handle at the right end // Offset Y to match the base profile perfectly translate([lid_len, -wall - lid_clearance / 2, 0]) { cube([10, total_y, 3]); // Grip ridges on the handle for(j = [1 : 3]) { translate([j * 2.5 - 0.5, 0, 2.9]) cube([2, total_y, 1.6]); } } // Decorative Bone and Text on top of the lid translate([lid_len / 2, lid_width / 2, lid_thick - 0.1]) { linear_extrude(1.1) { union() { // Bone shape square([60, 16], center=true); translate([-30, 8]) circle(r=8); translate([-30, -8]) circle(r=8); translate([30, 8]) circle(r=8); translate([30, -8]) circle(r=8); } } // Raised text on the bone translate([0, 0, 1]) linear_extrude(1.1) text("PET MEDS", size=8, halign="center", valign="center", font="Arial:style=Bold"); } } }