$fn=64; // --- Parameters --- bp_width = 45; // Backplate width bp_height = 60; // Backplate height bp_thick = 5; // Backplate thickness corner_radius = 5; // Backplate corner radius prong_spacing = 18; // Gap between prongs (accommodates pliers hinge) prong_width = 8; // Width of each prong prong_length = 45; // Outward extension from the wall prong_lift = 14; // Upward curve at the tip prong_drop = -4; // Downward dip to create a resting saddle hole_dia = 4.5; // Screw hole diameter head_dia = 8.5; // Screw head diameter hole_spacing = 44; // Distance between top and bottom screw holes // --- Modules --- module backplate() { difference() { // Main plate with rounded corners hull() { translate([-bp_width/2 + corner_radius, -bp_height/2 + corner_radius, 0]) cylinder(r=corner_radius, h=bp_thick); translate([bp_width/2 - corner_radius, -bp_height/2 + corner_radius, 0]) cylinder(r=corner_radius, h=bp_thick); translate([-bp_width/2 + corner_radius, bp_height/2 - corner_radius, 0]) cylinder(r=corner_radius, h=bp_thick); translate([bp_width/2 - corner_radius, bp_height/2 - corner_radius, 0]) cylinder(r=corner_radius, h=bp_thick); } // Mounting holes for (y = [-hole_spacing/2, hole_spacing/2]) { translate([0, y, -1]) { // Main screw shaft clearance cylinder(d=hole_dia, h=bp_thick + 2); // Countersink translate([0, 0, bp_thick - 2.5 + 1]) cylinder(d1=hole_dia, d2=head_dia, h=2.51); // Screw head clearance translate([0, 0, bp_thick + 1]) cylinder(d=head_dia, h=10); } } } } module hook_profile() { // Defines the contoured side profile of a single prong z0 = bp_thick; y0 = 0; d0 = 14; // Thicker base for strength z1 = bp_thick + prong_length * 0.4; y1 = prong_drop; d1 = 10; // Tapered mid-section z2 = bp_thick + prong_length; y2 = prong_lift; d2 = 8; // Rounded tip hull() { translate([0, y0, z0]) rotate([0, 90, 0]) cylinder(d=d0, h=prong_width, center=true); translate([0, y1, z1]) rotate([0, 90, 0]) cylinder(d=d1, h=prong_width, center=true); } hull() { translate([0, y1, z1]) rotate([0, 90, 0]) cylinder(d=d1, h=prong_width, center=true); translate([0, y2, z2]) rotate([0, 90, 0]) cylinder(d=d2, h=prong_width, center=true); } } // --- Assembly --- difference() { union() { backplate(); // Left Prong translate([-prong_spacing/2 - prong_width/2, 0, 0]) hook_profile(); // Right Prong translate([prong_spacing/2 + prong_width/2, 0, 0]) hook_profile(); } // Cleanly slice off anything extending behind the backplate // (caused by the circular base of the prongs) translate([0, 0, -50]) cube([100, 100, 100], center=true); }