$fn = 64; // --- Parameters --- width = 15; // Width of the hook (Z-axis thickness) base_height = 70; // Height of the wall plate base_thickness = 6; // Thickness of the wall plate projection = 50; // Total projection from wall hook_thickness = 8; // Thickness of the hook arm hook_radius = 12; // Inner radius of the hook curve hole_dia = 4.5; // Screw hole diameter hole_head_dia = 8.5; // Screw head diameter // --- Calculated values --- r_out = hook_radius + hook_thickness; hook_center_x = projection - r_out; hook_center_y = hook_thickness + hook_radius; // Best printed on its side for maximum strength difference() { // Main Hook Body linear_extrude(height = width) { union() { // Wall plate with rounded top hull() { square([base_thickness, base_height - base_thickness / 2]); translate([base_thickness / 2, base_height - base_thickness / 2]) circle(d = base_thickness); } // Bottom arm extending outwards square([hook_center_x, hook_thickness]); // Fillet for structural reinforcement translate([base_thickness, hook_thickness]) { difference() { square([12, 12]); translate([12, 12]) circle(r = 12); } } // The curved hook part translate([hook_center_x, hook_center_y]) { difference() { circle(r = r_out); circle(r = hook_radius); // Cut off the left half to form the J-shape translate([-r_out, -r_out]) square([r_out, r_out * 2]); } // Rounded tip translate([0, hook_radius + hook_thickness / 2]) circle(d = hook_thickness); } } } // Screw holes (positioned above the hook tip for clear screwdriver access) // Top hole screw_hole(base_height - 10); // Bottom hole screw_hole(base_height - 25); } // Module for countersunk screw holes module screw_hole(y_pos) { translate([0, y_pos, width / 2]) { rotate([0, 90, 0]) { // Main shaft translate([0, 0, -1]) cylinder(h = base_thickness + 2, d = hole_dia); // Countersink translate([0, 0, base_thickness - 2.5]) cylinder(h = 2.51, d1 = hole_dia, d2 = hole_head_dia); // Head clearance translate([0, 0, base_thickness]) cylinder(h = projection, d = hole_head_dia); } } }