$fn=64; // --- Parameters --- dispenser_width = 75; // Inner width for the tape dispenser dispenser_length = 160; // Inner length for the tape dispenser wall_t = 4; // Standard wall thickness lip_h = 15; // Height of the retaining side/front lip back_h = 50; // Backplate height above tray drop_h = 70; // Backplate drop below tray for support gussets hook_depth = 12; // Depth of the wall rail hook hook_drop = 15; // Downward extension of the hook hook_t = 6; // Thickness of the hook elements overall_width = dispenser_width + (wall_t * 2); module tape_dispenser_bracket() { difference() { union() { // Main Tray Bottom cube([overall_width, dispenser_length + wall_t, wall_t]); // Left Side Wall cube([wall_t, dispenser_length + wall_t, lip_h + wall_t]); // Right Side Wall translate([overall_width - wall_t, 0, 0]) cube([wall_t, dispenser_length + wall_t, lip_h + wall_t]); // Front Retaining Lip translate([0, dispenser_length, 0]) cube([overall_width, wall_t, lip_h + wall_t]); // Backplate translate([0, -wall_t, -drop_h]) cube([overall_width, wall_t, back_h + drop_h + wall_t]); // Left Support Gusset translate([wall_t, 0, 0]) gusset(wall_t, dispenser_length * 0.65, drop_h); // Right Support Gusset translate([overall_width - wall_t * 2, 0, 0]) gusset(wall_t, dispenser_length * 0.65, drop_h); // Top Rail Hook (ArtArsenal / Cleat style) translate([0, -wall_t - hook_depth, back_h - hook_t]) cube([overall_width, hook_depth, hook_t]); hull() { translate([0, -wall_t - hook_depth, back_h - hook_t]) cube([overall_width, hook_t, hook_t]); translate([0, -wall_t - hook_depth, back_h - hook_drop]) cube([overall_width, 2, 2]); // Tapered point for easy insertion } // Bottom Wall Standoff / Spacer translate([0, -wall_t - hook_depth + hook_t, -drop_h]) cube([overall_width, hook_depth - hook_t, hook_t]); } // Weight-saving and aesthetic cutout in the tray bottom translate([wall_t + 12, 15, -1]) cube([dispenser_width - 24, dispenser_length - 30, wall_t + 2]); } } module gusset(t, d, h) { hull() { // Vertical strip against the backplate translate([0, 0, -h]) cube([t, 0.1, h]); // Horizontal strip under the tray translate([0, 0, 0]) cube([t, d, 0.1]); } } // Render the model tape_dispenser_bracket();