$fn = 64; // --- PARAMETERS --- cable_dia = 6.2; // Diameter of the cable hole (fits standard 5-6mm cables) cable_spacing = 13.0; // Center-to-center distance between cables snap_gap = 3.5; // Width of the top slit for snapping cables in cable_z = 5.5; // Z-height of the cable center // --- MAIN ASSEMBLY --- // The design uses a solid dragon paw shape, then subtracts the cable channels. // This ensures perfect functional alignment while maintaining an organic look. difference() { union() { base_pad(); dragon_palm(); dragon_fingers(); } cable_cutouts(); flatten_bottom(); } // --- MODULES --- // Creates a rounded, flat base for double-sided tape adhesion module base_pad() { hull() { // Back corners translate([-22, -18, 0]) cylinder(h=3, r=4); translate([ 22, -18, 0]) cylinder(h=3, r=4); // Front corners translate([-18, 14, 0]) cylinder(h=3, r=3); translate([ 18, 14, 0]) cylinder(h=3, r=3); } } // Creates the main body/heel of the paw module dragon_palm() { // Main palm mass translate([0, -5, 6]) scale([1, 0.75, 0.45]) sphere(r=26); // Decorative scales on the back of the hand for(x = [-13, 0, 13]) { translate([x, -14, 14]) scale([1, 1.2, 0.5]) sphere(r=4); translate([x, -20, 11]) scale([1, 1.2, 0.5]) sphere(r=3); } } // Creates the 4 fingers that wrap around the 3 cable slots module dragon_fingers() { // Finger base X positions for(x = [-19.5, -6.5, 6.5, 19.5]) { // Splay outer fingers slightly outward for a natural look splay = (x < -10) ? -3 : ((x > 10) ? 3 : 0); // Joint positions [X, Y, Z] p1 = [x, -2, 7]; p2 = [x + splay*0.3, 8, 12]; p3 = [x + splay*0.6, 18, 8]; p4 = [x + splay*0.8, 26, 4]; p5 = [x + splay, 32, 0]; // Talon tip // Joint thicknesses r1 = 5.0; r2 = 4.5; r3 = 3.5; r4 = 2.5; r5 = 1.0; // Finger fleshy segments hull() { translate(p1) sphere(r=r1); translate(p2) sphere(r=r2); } hull() { translate(p2) sphere(r=r2); translate(p3) sphere(r=r3); } hull() { translate(p3) sphere(r=r3); translate(p4) sphere(r=r4); } hull() { translate(p4) sphere(r=r4); translate(p5) sphere(r=r5); } // Knuckle spikes translate(p2) rotate([-20, 0, 0]) cylinder(h=8, r1=r2*0.8, r2=0.5); translate(p3) rotate([-30, 0, 0]) cylinder(h=6, r1=r3*0.8, r2=0.5); } } // Hollows out the paths for the cables module cable_cutouts() { for(x = [-cable_spacing, 0, cable_spacing]) { // Main cylindrical tunnel for the cable translate([x, -30, cable_z]) rotate([-90, 0, 0]) cylinder(h=70, d=cable_dia); // Top slit to allow the cable to be pressed in translate([x - snap_gap/2, -30, cable_z]) cube([snap_gap, 70, 20]); // Flared openings to prevent cable wear and ease insertion translate([x, -25, cable_z]) rotate([-90, 0, 0]) cylinder(h=8, d1=cable_dia+4, d2=cable_dia); translate([x, 25, cable_z]) rotate([-90, 0, 0]) cylinder(h=8, d1=cable_dia, d2=cable_dia+4); } } // Ensures the bottom is perfectly flat for printing and mounting module flatten_bottom() { translate([0, 0, -50]) cube([100, 100, 100], center=true); }