$fn = 64; // --- Parameters --- hook_width = 15; // Width of the hook base_height = 60; // Total height of the wall plate base_thickness = 9; // Thickness of the wall plate hook_out = 35; // How far the hook extends from the wall hook_up = 35; // Height of the hook tip hook_radius = 4.5; // Rounding radius (determines hook thickness) screw_dia = 4.5; // Diameter of the mounting screw screw_head_dia = 9.0; // Diameter of the screw head screw_head_depth = 4; // Depth of the countersink // The model is rotated and translated to lie flat on its side. // This is the optimal orientation for 3D printing strength (layer lines run along the hook) // and allows printing completely without supports. translate([0, 0, hook_width / 2]) rotate([0, 90, 0]) { difference() { // Main Hook Body union() { // Base Plate hull() { translate([0, base_height - hook_radius, base_thickness - hook_radius]) rotate([0, 90, 0]) cylinder(r=hook_radius, h=hook_width, center=true); translate([0, hook_radius, base_thickness - hook_radius]) rotate([0, 90, 0]) cylinder(r=hook_radius, h=hook_width, center=true); // Ensure the back is filled before making it perfectly flat translate([0, base_height / 2, 0.5]) cube([hook_width, base_height, 1], center=true); } // Hook Arm (Lower sweeping segment) hull() { translate([0, hook_radius, base_thickness - hook_radius]) rotate([0, 90, 0]) cylinder(r=hook_radius, h=hook_width, center=true); translate([0, 15, 25]) rotate([0, 90, 0]) cylinder(r=hook_radius, h=hook_width, center=true); } // Hook Arm (Upper catching segment) hull() { translate([0, 15, 25]) rotate([0, 90, 0]) cylinder(r=hook_radius, h=hook_width, center=true); translate([0, hook_up, hook_out]) rotate([0, 90, 0]) cylinder(r=hook_radius, h=hook_width, center=true); } } // Flat back cutoff to ensure absolute flush mounting against the wall translate([0, base_height / 2, -5]) cube([hook_width + 2, base_height + 20, 10], center=true); // Countersunk Screw Hole translate([0, base_height - 12, 0]) { // Screw shaft cylinder(d=screw_dia, h=base_thickness * 3, center=true); // Countersink translate([0, 0, base_thickness - screw_head_depth]) cylinder(d1=screw_dia, d2=screw_head_dia, h=screw_head_depth + 0.1); // Clearance above the screw head translate([0, 0, base_thickness]) cylinder(d=screw_head_dia, h=20); } } }