$fn = 64; // --- Parameters --- holder_width = 140; holder_depth = 110; holder_height = 90; wall_thickness = 3; num_slots = 5; // Rail mount parameters (Generic / ArtArsenal style) mount_width = 100; mount_depth = 14; mount_height = 25; // --- Calculated Variables --- slot_width = (holder_width - (wall_thickness * (num_slots + 1))) / num_slots; // --- Main Assembly --- union() { // Base plate cube([holder_width, holder_depth, wall_thickness]); // Back plate cube([holder_width, wall_thickness, holder_height]); // Front lip to secure palettes translate([0, holder_depth - wall_thickness, 0]) cube([holder_width, wall_thickness, holder_height * 0.25]); // Dividers for (i = [0 : num_slots]) { translate([i * (slot_width + wall_thickness), 0, 0]) { rotate([90, 0, 90]) linear_extrude(wall_thickness) { polygon([ [0, 0], [holder_depth, 0], [holder_depth, holder_height * 0.25], [wall_thickness, holder_height], [0, holder_height] ]); } } } // Wall Rail Mount (Rear Hook) // Shifted slightly into the backplate (+0.1) for a manifold union translate([(holder_width - mount_width) / 2, -mount_depth + 0.1, holder_height - mount_height - 10]) { difference() { // Main mount block cube([mount_width, mount_depth, mount_height]); // Cutout channel for the rail translate([-1, 5, -1]) cube([mount_width + 2, mount_depth, mount_height - 7]); // Angled entry chamfer for easy hooking translate([-1, 5, -1]) rotate([-45, 0, 0]) cube([mount_width + 2, 12, 12]); } } }