$fn = 64; // --- Parameters --- base_thickness = 6; toe_size_large = 20; toe_size_small = 18; hook_radius = 5; hook_length = 32; hook_angle = 45; // Angle upwards from the wall hole_spacing = 26; screw_dia = 4.5; head_dia = 8.5; module paw_base() { // Main pad (metacarpal) - created with two overlapping hulls for a top dip union() { hull() { translate([-12, 6, 0]) cylinder(d=26, h=base_thickness); translate([0, -10, 0]) cylinder(d=28, h=base_thickness); } hull() { translate([12, 6, 0]) cylinder(d=26, h=base_thickness); translate([0, -10, 0]) cylinder(d=28, h=base_thickness); } // Center fill translate([0, -2, 0]) cylinder(d=28, h=base_thickness); } // Toe pads (digital pads) // Far left toe translate([-26, 20, 0]) rotate([0, 0, 35]) scale([0.8, 1.15, 1]) cylinder(d=toe_size_small, h=base_thickness); // Inner left toe translate([-10, 32, 0]) rotate([0, 0, 10]) scale([0.8, 1.15, 1]) cylinder(d=toe_size_large, h=base_thickness); // Inner right toe translate([10, 32, 0]) rotate([0, 0, -10]) scale([0.8, 1.15, 1]) cylinder(d=toe_size_large, h=base_thickness); // Far right toe translate([26, 20, 0]) rotate([0, 0, -35]) scale([0.8, 1.15, 1]) cylinder(d=toe_size_small, h=base_thickness); } module key_hook() { // Angled peg protruding from the bottom center translate([0, -10, base_thickness - 1]) { // Fillet at the base for strength cylinder(r1=hook_radius * 1.8, r2=hook_radius, h=4); // Main hook shaft rotate([-hook_angle, 0, 0]) { cylinder(r=hook_radius, h=hook_length); // Retaining knob at the end translate([0, 0, hook_length]) sphere(r=hook_radius * 1.4); } } } module mounting_holes() { // Left hole translate([-hole_spacing/2, 4, -1]) { cylinder(d=screw_dia, h=base_thickness + 2); translate([0, 0, base_thickness - 2]) cylinder(d1=screw_dia, d2=head_dia, h=2.1); translate([0, 0, base_thickness + 0.1]) cylinder(d=head_dia, h=2); } // Right hole translate([hole_spacing/2, 4, -1]) { cylinder(d=screw_dia, h=base_thickness + 2); translate([0, 0, base_thickness - 2]) cylinder(d1=screw_dia, d2=head_dia, h=2.1); translate([0, 0, base_thickness + 0.1]) cylinder(d=head_dia, h=2); } } // --- Final Assembly --- difference() { union() { paw_base(); key_hook(); } mounting_holes(); }