$fn = 64; // --- Parametric Variables --- cols = 5; // Number of sizes (#4, #6, #8, #10, #12) rows = 4; // Number of compartments per size (for different lengths) comp_w = 30; // Compartment width (mm) comp_l = 40; // Compartment length (mm) comp_d = 20; // Compartment depth (mm) wall = 2.5; // Wall thickness (mm) base = 2.0; // Bottom thickness (mm) lip_y = 15; // Front lip size for labels (mm) corner_r = 3; // Corner radius for smooth edges (mm) // --- Calculated Dimensions --- total_w = cols * comp_w + (cols + 1) * wall; total_l = rows * comp_l + (rows + 1) * wall + lip_y; total_h = comp_d + base; labels = ["#4", "#6", "#8", "#10", "#12"]; // --- Modules --- // Generates a rounded rectangular block for hollowing out compartments module rounded_compartment(w, l, h, r) { hull() { translate([r, r, 0]) cylinder(r=r, h=h); translate([w-r, r, 0]) cylinder(r=r, h=h); translate([r, l-r, 0]) cylinder(r=r, h=h); translate([w-r, l-r, 0]) cylinder(r=r, h=h); } } // --- Main Object --- difference() { // Main Body (Rounded Outer Box) translate([corner_r, corner_r, 0]) hull() { cylinder(r=corner_r, h=total_h); translate([total_w - 2*corner_r, 0, 0]) cylinder(r=corner_r, h=total_h); translate([0, total_l - 2*corner_r, 0]) cylinder(r=corner_r, h=total_h); translate([total_w - 2*corner_r, total_l - 2*corner_r, 0]) cylinder(r=corner_r, h=total_h); } // Subtracted Compartments for(c = [0 : cols - 1]) { for(r = [0 : rows - 1]) { x_pos = wall + c * (comp_w + wall); y_pos = lip_y + wall + r * (comp_l + wall); z_pos = base; translate([x_pos, y_pos, z_pos]) rounded_compartment(comp_w, comp_l, comp_d + 1, corner_r); } } // Debossed Labels on the front lip for(c = [0 : cols - 1]) { x_pos = wall + c * (comp_w + wall) + (comp_w / 2); y_pos = lip_y / 2 + (wall / 2); translate([x_pos, y_pos, total_h - 1]) linear_extrude(2) text(labels[c], size=7, halign="center", valign="center"); } }