$fn=64; // --- Parameters --- base_width = 70; base_height = 110; base_thickness = 5; corner_radius = 10; paw_thickness = 3; hook_radius = 6; hook_outward = 25; hook_upward = 15; hole_radius = 2.5; head_radius = 5.5; // --- Main Assembly --- difference() { union() { base_plate(); // Decorative Paw Print translate([0, 5, base_thickness - 0.1]) paw_print(); // Key Hook hook(); } // Mounting Holes (Countersunk) screw_hole(base_width/2 - 12, base_height/2 - 12); screw_hole(-base_width/2 + 12, base_height/2 - 12); screw_hole(base_width/2 - 12, -base_height/2 + 12); screw_hole(-base_width/2 + 12, -base_height/2 + 12); } // --- Modules --- module base_plate() { hull() { translate([base_width/2 - corner_radius, base_height/2 - corner_radius, 0]) cylinder(r=corner_radius, h=base_thickness); translate([-base_width/2 + corner_radius, base_height/2 - corner_radius, 0]) cylinder(r=corner_radius, h=base_thickness); translate([base_width/2 - corner_radius, -base_height/2 + corner_radius, 0]) cylinder(r=corner_radius, h=base_thickness); translate([-base_width/2 + corner_radius, -base_height/2 + corner_radius, 0]) cylinder(r=corner_radius, h=base_thickness); } } module paw_print() { // Main center pad hull() { translate([0, 0, 0]) cylinder(r=10, h=paw_thickness); translate([-9, 7, 0]) cylinder(r=8, h=paw_thickness); translate([9, 7, 0]) cylinder(r=8, h=paw_thickness); } // Four toe pads translate([-20, 18, 0]) rotate([0, 0, 35]) scale([1, 1.4, 1]) cylinder(r=4.5, h=paw_thickness); translate([-7, 28, 0]) rotate([0, 0, 12]) scale([1, 1.4, 1]) cylinder(r=5, h=paw_thickness); translate([7, 28, 0]) rotate([0, 0, -12]) scale([1, 1.4, 1]) cylinder(r=5, h=paw_thickness); translate([20, 18, 0]) rotate([0, 0, -35]) scale([1, 1.4, 1]) cylinder(r=4.5, h=paw_thickness); } module hook() { // Base anchor translate([0, -30, 0]) cylinder(r=hook_radius, h=base_thickness); // Outward extension hull() { translate([0, -30, base_thickness - 0.1]) cylinder(r=hook_radius, h=0.1); translate([0, -30, base_thickness + hook_outward]) sphere(r=hook_radius); } // Upward curve hull() { translate([0, -30, base_thickness + hook_outward]) sphere(r=hook_radius); translate([0, -30 + hook_upward, base_thickness + hook_outward]) sphere(r=hook_radius); } // Rounded end knob to prevent keys from slipping translate([0, -30 + hook_upward, base_thickness + hook_outward]) sphere(r=hook_radius + 2); } module screw_hole(x, y) { // Straight shaft translate([x, y, -1]) cylinder(r=hole_radius, h=base_thickness + 2); // Countersink cone translate([x, y, base_thickness - 2]) cylinder(r1=hole_radius, r2=head_radius, h=2.01); }