$fn = 64; // --- Parameters --- cable_diameter = 6.0; // Target cable diameter cable_clearance = 0.5; // Clearance for the channel base_thickness = 3.0; // Thickness of the mounting base // --- Derived Values --- hole_r = (cable_diameter + cable_clearance) / 2; // Lowered slightly into base for a clean manifold cut and a seating groove cable_z = base_thickness + hole_r - 0.5; // --- Main Assembly --- dragon_claw_clip(); module dragon_claw_clip() { difference() { union() { base_pad(); palm(); // Center Claw single_claw(); // Left Claw (splayed outwards) translate([-7.5, 0, 0]) rotate([0, 0, -12]) single_claw(); // Right Claw (splayed outwards) translate([7.5, 0, 0]) rotate([0, 0, 12]) single_claw(); } // Main Cable Channel Cutout translate([-20, 0, cable_z]) rotate([0, 90, 0]) cylinder(r=hole_r, h=40); // Channel Flares for smooth cable entry/exit translate([-16, 0, cable_z]) rotate([0, 90, 0]) cylinder(r1=hole_r + 1.5, r2=hole_r, h=4); translate([12, 0, cable_z]) rotate([0, 90, 0]) cylinder(r1=hole_r, r2=hole_r + 1.5, h=4); // Flatten the bottom completely to ensure a perfect printing surface translate([0, 0, -5]) cube([60, 60, 10], center=true); } } module base_pad() { // A slightly organic rounded diamond/shield shape for mounting hull() { translate([-14, -6, 0]) cylinder(r=3, h=base_thickness); translate([14, -6, 0]) cylinder(r=3, h=base_thickness); translate([-8, 12, 0]) cylinder(r=4, h=base_thickness); translate([8, 12, 0]) cylinder(r=4, h=base_thickness); translate([0, 15, 0]) cylinder(r=4, h=base_thickness); translate([0, -10, 0]) cylinder(r=3, h=base_thickness); } } module palm() { // Fleshy pad connecting the roots of the claws at the back hull() { translate([-8, hole_r + 3, base_thickness]) sphere(r=4.5); translate([8, hole_r + 3, base_thickness]) sphere(r=4.5); translate([0, hole_r + 6, base_thickness]) sphere(r=5); } } module single_claw() { // Control points for the claw's curve p0 = [0, hole_r + 4, base_thickness + 1]; r0 = 4.5; p1 = [0, 1, base_thickness + hole_r*2 + 3.5]; r1 = 3.5; p2 = [0, -hole_r - 2.5, base_thickness + hole_r + 3]; r2 = 2.0; p3 = [0, -hole_r - 1.5, base_thickness + 5.5]; r3 = 0.8; // Claw segments curving over the cable hull() { translate(p0) sphere(r=r0); translate(p1) sphere(r=r1); } hull() { translate(p1) sphere(r=r1); translate(p2) sphere(r=r2); } hull() { translate(p2) sphere(r=r2); translate(p3) sphere(r=r3); } // Knuckle bump for an aggressive dragon-like ridge hull() { translate(p0 + [0, 2, 2]) sphere(r=r0 - 1); translate(p1 + [0, 1.5, 1]) sphere(r=r1 - 0.5); } }