$fn = 64; // --- Parameters --- // Backplate dimensions plate_width = 240; plate_height = 80; plate_thickness = 5; corner_radius = 6; // Harness pegs (larger, top row) harness_peg_len = 45; harness_peg_r = 7; // Collar pegs (smaller, bottom row) collar_peg_len = 25; collar_peg_r = 4; // Mounting holes screw_hole_r = 2.5; screw_head_r = 5; hole_margin = 15; // --- Modules --- // Print-in-place friendly peg with a chamfered stopper module peg(len, r) { // Main shaft cylinder(h=len, r=r); // Stopper (angles are >45 degrees for easy printing without supports) translate([0, 0, len]) cylinder(h=r*1.2, r1=r, r2=r*1.6); translate([0, 0, len+r*1.2]) cylinder(h=r*1.2, r1=r*1.6, r2=r); } module backplate() { difference() { // Main rounded rectangle body hull() { translate([corner_radius, corner_radius, 0]) cylinder(r=corner_radius, h=plate_thickness); translate([plate_width-corner_radius, corner_radius, 0]) cylinder(r=corner_radius, h=plate_thickness); translate([plate_width-corner_radius, plate_height-corner_radius, 0]) cylinder(r=corner_radius, h=plate_thickness); translate([corner_radius, plate_height-corner_radius, 0]) cylinder(r=corner_radius, h=plate_thickness); } // Countersunk mounting holes in the corners for(x = [hole_margin, plate_width-hole_margin]) { for(y = [hole_margin, plate_height-hole_margin]) { translate([x, y, -1]) { // Screw shaft hole cylinder(r=screw_hole_r, h=plate_thickness+2); // Countersink for screw head translate([0, 0, plate_thickness - 2 + 1]) cylinder(r1=screw_hole_r, r2=screw_head_r, h=2.1); } } } } } // --- Assembly --- union() { backplate(); // Top Row: 3 Heavy-duty pegs for harnesses for(i = [1 : 3]) { x_pos = i * (plate_width / 4); // Embed slightly into the plate to ensure a manifold mesh translate([x_pos, plate_height - 25, plate_thickness - 0.1]) peg(harness_peg_len, harness_peg_r); } // Bottom Row: 4 Standard pegs for collars/leashes for(i = [1 : 4]) { x_pos = (i - 0.5) * (plate_width / 4); translate([x_pos, 25, plate_thickness - 0.1]) peg(collar_peg_len, collar_peg_r); } }