$fn=64; // --- Parameters --- // Backplate dimensions plate_width = 60; plate_height = 75; plate_thick = 8; corner_radius = 5; // Mounting holes (Vertical alignment for single wall stud) hole_spacing = 50; hole_dia = 5.2; screw_head_dia = 10.5; // Hook arms arm_gap = 32; // Gap for hammer handle arm_width = 14; // Horizontal thickness of each arm arm_length = 50; // Protrusion from wall arm_base_height = 25; // Vertical thickness at the wall arm_tip_height = 12; // Vertical thickness at the tip lip_height = 10; // Height of the retaining lip arm_slope = 3; // Upward slope of the arms // --- Main Assembly --- // Rotated to lay flat on the backplate for support-free 3D printing rotate([-90, 0, 0]) { difference() { union() { backplate(); // Left Arm translate([-(arm_gap/2 + arm_width/2), plate_thick, 0]) arm(); // Right Arm translate([(arm_gap/2 + arm_width/2), plate_thick, 0]) arm(); } holes(); } } // --- Modules --- module backplate() { // Positioned so the back is at Y=0 and front is at Y=plate_thick translate([0, plate_thick/2, 0]) rotate([90, 0, 0]) hull() { for (x = [-plate_width/2 + corner_radius, plate_width/2 - corner_radius]) { for (z = [-plate_height/2 + corner_radius, plate_height/2 - corner_radius]) { translate([x, z, -plate_thick/2]) cylinder(r=corner_radius, h=plate_thick); } } } } module arm() { tip_z = (arm_base_height - arm_tip_height) / 2 + arm_slope; tip_y = arm_length - arm_tip_height/2; // Main arm protrusion hull() { // Base at the backplate translate([0, 0, 0]) cube([arm_width, 0.1, arm_base_height], center=true); // Tip of the arm translate([0, tip_y, tip_z]) rotate([0, 90, 0]) cylinder(d=arm_tip_height, h=arm_width, center=true); } // Retaining lip at the end // Angled at 45 degrees to allow support-free 3D printing hull() { // Tip of the arm translate([0, tip_y, tip_z]) rotate([0, 90, 0]) cylinder(d=arm_tip_height, h=arm_width, center=true); // Upward and forward lip translate([0, tip_y + lip_height, tip_z + lip_height]) rotate([0, 90, 0]) cylinder(d=arm_tip_height * 0.5, h=arm_width, center=true); } } module holes() { // Vertical mounting holes with countersinks for (z = [-hole_spacing/2, hole_spacing/2]) { // Thru hole translate([0, -1, z]) rotate([-90, 0, 0]) cylinder(d=hole_dia, h=plate_thick + 2); // Countersink translate([0, plate_thick - 3, z]) rotate([-90, 0, 0]) cylinder(d1=hole_dia, d2=screw_head_dia, h=3.1); } }