$fn=64; // --- Parameters --- hook_width = 15; // Width of the hook (extrusion depth) base_height = 60; // Height of the wall plate base_thick = 5; // Thickness of the wall plate hook_length = 45; // Total extension from the wall hook_thick = 8; // Thickness of the hook arm lip_height = 12; // Height of the front retaining lip hole_dia = 4.5; // Screw hole diameter (clearance for #8 or #10 screw) hole_spacing = 40; // Distance between screw holes cs_depth = 3; // Countersink depth module hook_profile() { // Wall plate with a flat back and rounded front edges r = base_thick / 2; translate([-base_thick, -base_height/2]) square([r, base_height]); hull() { translate([-r, -base_height/2 + r]) circle(r=r); translate([-r, base_height/2 - r]) circle(r=r); } // Contoured hook arm (saddle shape for wrench handle) hull() { // Shifted slightly left (-0.1) to ensure manifold overlap with the base plate translate([hook_thick/2 - 0.1, 0]) circle(d=hook_thick); translate([hook_length * 0.4, -hook_thick * 0.8]) circle(d=hook_thick); } // Upturned retaining lip hull() { translate([hook_length * 0.4, -hook_thick * 0.8]) circle(d=hook_thick); translate([hook_length - hook_thick/2, lip_height]) circle(d=hook_thick); } } // Positioned to lay flat on the print bed for optimal strength and support-free printing translate([0, 0, hook_width/2]) difference() { // Extrude the 2D profile into 3D linear_extrude(height=hook_width, center=true) hook_profile(); // Mounting holes for (y = [-hole_spacing/2, hole_spacing/2]) { translate([-base_thick - 1, y, 0]) rotate([0, 90, 0]) { // Main clearance hole cylinder(d=hole_dia, h=base_thick + 2); // 45-degree countersink (prints cleanly in horizontal orientation) translate([0, 0, base_thick + 1 - cs_depth]) cylinder(d1=hole_dia, d2=hole_dia + 2*cs_depth, h=cs_depth + 0.1); } } }