$fn = 64; // --- PARAMETERS --- rack_width = 160; // Total width of the rack rack_depth = 60; // Total depth (front to back) rack_height = 140; // Total height wall_thickness = 6; // Thickness of walls and base // Slot dimensions for holding brush handles slot_width = 12; // Width of the U-slots slot_depth = 35; // Depth of the U-slots num_slots = 6; // Number of brushes the rack can hold // Note: Recommended print orientation is laying flat on the back wall to avoid supports. union() { // Base Plate (Catches drips and provides stability) cube([rack_width, rack_depth, wall_thickness]); // Back Wall (Solid for rigidity and easy flat-printing) translate([0, rack_depth - wall_thickness, 0]) cube([rack_width, wall_thickness, rack_height]); // Left Side Panel cube([wall_thickness, rack_depth, rack_height]); // Right Side Panel translate([rack_width - wall_thickness, 0, 0]) cube([wall_thickness, rack_depth, rack_height]); // Top Slotted Holder translate([0, 0, rack_height - wall_thickness]) difference() { cube([rack_width, rack_depth, wall_thickness]); // Cut U-shaped slots for brushes slot_spacing = (rack_width - 2 * wall_thickness) / num_slots; for (i = [0 : num_slots - 1]) { slot_center_x = wall_thickness + (slot_spacing / 2) + (i * slot_spacing); translate([slot_center_x - slot_width / 2, -1, -1]) { // Straight entry path cube([slot_width, slot_depth + 1, wall_thickness + 2]); // Rounded resting point translate([slot_width / 2, slot_depth + 1, 0]) cylinder(h = wall_thickness + 2, d = slot_width); } } } }