$fn=64; // --- Parameters --- bin_width = 100; bin_depth = 70; bin_height = 80; wall_thickness = 2.5; corner_radius = 5; // Rail hook parameters (designed for standard wall rails/cleats) hook_width = 60; hook_height = 20; hook_depth = 12; hook_thickness = 4; // --- Modules --- module rounded_box(w, d, h, r) { hull() { translate([r, r, 0]) cylinder(r=r, h=h); translate([w-r, r, 0]) cylinder(r=r, h=h); translate([r, d-r, 0]) cylinder(r=r, h=h); translate([w-r, d-r, 0]) cylinder(r=r, h=h); } } // --- Main Geometry --- union() { // Main Storage Bin difference() { // Outer shell rounded_box(bin_width, bin_depth, bin_height, corner_radius); // Inner cavity (shifted up and thinner to leave walls and floor) translate([wall_thickness, wall_thickness, wall_thickness]) rounded_box( bin_width - 2*wall_thickness, bin_depth - 2*wall_thickness, bin_height, // Extra height ensures clean cut at the top max(0.1, corner_radius - wall_thickness) ); } // Rail Hook (Back side, top aligned) // Note: May require supports when 3D printing depending on orientation translate([(bin_width - hook_width)/2, bin_depth - 0.1, bin_height - hook_height]) { rotate([90, 0, 90]) { linear_extrude(hook_width) { polygon([ [-0.1, hook_height], [hook_depth, hook_height], [hook_depth, 0], [hook_depth - hook_thickness, 0], [hook_depth - hook_thickness, hook_height - hook_thickness], [-0.1, hook_height - hook_thickness] ]); } } } // Lower standoff to keep bin perfectly vertical against the wall translate([(bin_width - hook_width)/2, bin_depth - 0.1, 10]) { cube([hook_width, hook_depth - hook_thickness + 0.1, hook_thickness]); } }