$fn = 64; // --- PARAMETERS --- num_wrenches = 14; // 6mm to 19mm start_size = 6; // Smallest wrench size slot_angle = 45; // Angle of the slots (degrees) base_width = 50; // Depth of the organizer (Y axis) base_height = 25; // Height of the organizer (Z axis) floor_thickness = 3; // Thickness of the base floor under the wrenches // Slot width ranges from ~3.5mm (for 6mm wrench) to ~8.0mm (for 19mm wrench) function slot_width(i) = 3.5 + (i / (num_wrenches - 1)) * 4.5; // X position of each slot (quadratic progression to accommodate larger wrench heads) function x_pos(i) = 15 + (i * 10) + (i * i * 0.45); total_length = x_pos(num_wrenches - 1) + 20; // --- GEOMETRY --- difference() { // Main base block cube([total_length, base_width, base_height]); for(i = [0 : num_wrenches - 1]) { // Wrench slot cutouts translate([x_pos(i), base_width / 2, floor_thickness]) rotate([0, 0, slot_angle]) translate([-slot_width(i) / 2, -base_width * 1.5, 0]) cube([slot_width(i), base_width * 3, base_height + 1]); // Wrench size labels (embossed into the front face) translate([x_pos(i), 1.5, base_height / 2 + 2]) rotate([90, 0, 0]) linear_extrude(2) text( str(start_size + i), size = 6, font = "Arial:style=Bold", halign = "center", valign = "center" ); } // Chamfer the top-front edge for better visibility of labels and easier insertion translate([-1, 0, base_height]) rotate([45, 0, 0]) cube([total_length + 2, 12, 12], center = true); // Chamfer the top-back edge for symmetry translate([-1, base_width, base_height]) rotate([45, 0, 0]) cube([total_length + 2, 12, 12], center = true); }