$fn = 64; // --- PARAMETERS --- plate_length = 160; plate_width = 45; plate_thickness = 6; corner_radius = 5; hook_spacing = 50; hook_base_r = 7; hook_tip_r = 5; hook_z_ext = 15; // Straight outward extension from plate hook_y_up = 25; // Upward curve distance hook_z_up = 25; // Outward angle for support-free 45-deg printing hook_y_offset = -5; // Shift hooks down slightly for visual balance hole_dist = 68; // Distance from center for mounting holes hole_d1 = 4.5; // Screw shaft diameter (M4 clearance) hole_d2 = 9.0; // Screw head diameter // --- MODULES --- module rounded_plate() { hull() { for(x = [-plate_length/2 + corner_radius, plate_length/2 - corner_radius]) { for(y = [-plate_width/2 + corner_radius, plate_width/2 - corner_radius]) { translate([x, y, 0]) cylinder(r=corner_radius, h=plate_thickness); } } } } module screw_hole() { // Screw shaft clearance translate([0, 0, -1]) cylinder(d=hole_d1, h=plate_thickness + 2); // Countersink for screw head translate([0, 0, plate_thickness - (hole_d2 - hole_d1)/2]) cylinder(d1=hole_d1, d2=hole_d2, h=(hole_d2 - hole_d1)/2 + 0.1); // Top clearance translate([0, 0, plate_thickness]) cylinder(d=hole_d2, h=10); } module single_hook() { // Main outward pillar hull() { cylinder(r=hook_base_r, h=plate_thickness); translate([0, 0, hook_z_ext]) sphere(r=hook_base_r); } // Angled upward hook (45 degrees ensures no supports needed) hull() { translate([0, 0, hook_z_ext]) sphere(r=hook_base_r); translate([0, hook_y_up, hook_z_ext + hook_z_up]) sphere(r=hook_tip_r); } } // --- MAIN ASSEMBLY --- difference() { union() { // Base plate rounded_plate(); // 3 Matching Hooks for(x = [-hook_spacing, 0, hook_spacing]) { translate([x, hook_y_offset, 0]) single_hook(); } } // Mounting holes translate([-hole_dist, 0, 0]) screw_hole(); translate([hole_dist, 0, 0]) screw_hole(); }