$fn = 64; // --- Parameters --- projection = 25; // Total projection from wall width = 12; // Width of the hook thickness = 5; // Thickness of the backplate and arm hook_inner_r = 6; // Inner radius of the hook curve hook_outer_r = hook_inner_r + thickness; backplate_top = 40; // Height above the arm backplate_bottom = -15; // Depth below the arm hole_dia = 4; // Screw hole diameter cs_dia = 8; // Countersink diameter fillet_r = 4; // Corner fillet radius // --- 3D Model --- difference() { // Main Body linear_extrude(height = width) { union() { // Backplate main body translate([0, backplate_bottom + thickness/2]) square([thickness, backplate_top - backplate_bottom - thickness]); // Backplate rounded ends translate([thickness/2, backplate_top - thickness/2]) circle(d=thickness); translate([thickness/2, backplate_bottom + thickness/2]) circle(d=thickness); // Straight arm arm_length = projection - hook_outer_r; square([arm_length, thickness]); // Curved hook part translate([arm_length, hook_outer_r]) { difference() { circle(r=hook_outer_r); circle(r=hook_inner_r); // Remove left half to form the hook translate([-hook_outer_r-1, -hook_outer_r-1]) square([hook_outer_r+1, hook_outer_r*2+2]); } } // Rounded tip for the hook translate([arm_length, hook_outer_r + hook_inner_r + thickness/2]) circle(d=thickness); // Top internal fillet (tension support) translate([thickness, thickness]) difference() { square([fillet_r, fillet_r]); translate([fillet_r, fillet_r]) circle(r=fillet_r); } // Bottom internal fillet (compression support) translate([thickness, 0]) difference() { translate([0, -fillet_r]) square([fillet_r, fillet_r]); translate([fillet_r, -fillet_r]) circle(r=fillet_r); } } } // Top Screw Hole translate([-1, backplate_top - 8, width/2]) rotate([0, 90, 0]) cylinder(d=hole_dia, h=thickness+2); // Top Countersink translate([thickness - 2, backplate_top - 8, width/2]) rotate([0, 90, 0]) cylinder(d1=hole_dia, d2=cs_dia, h=2.01); // Bottom Screw Hole translate([-1, backplate_bottom + 8, width/2]) rotate([0, 90, 0]) cylinder(d=hole_dia, h=thickness+2); // Bottom Countersink translate([thickness - 2, backplate_bottom + 8, width/2]) rotate([0, 90, 0]) cylinder(d1=hole_dia, d2=cs_dia, h=2.01); }