$fn = 64; // --- Parameters --- cable_diameter = 8; // Diameter of the cables cable_spacing = 28; // Distance between each cable clip claw_width = 12; // Thickness of the claw along the cable base_thickness = 6; // Total thickness of the base plate base_margin = 14; // Extra space on the ends for screw holes // Derived variables cr = cable_diameter / 2; // Module to create the cylindrical joints of the claw module joint(x, z, r) { translate([x, 0, z]) rotate([90, 0, 0]) cylinder(h=claw_width, r=r, center=true); } // Module for a single dragon claw clip module dragon_claw() { difference() { union() { // Main organic claw shape (knuckles) hull() { joint(-cr-2, 0, 6); joint(-cr-1, cr+4, 5); } hull() { joint(-cr-1, cr+4, 5); joint(0, cr*2+3, 4.5); } hull() { joint(0, cr*2+3, 4.5); joint(cr+1, cr+4, 3.5); } // Sharp talon tip curling over the cable hull() { joint(cr+1, cr+4, 3.5); translate([cr+0.5, 0, cr+2]) scale([1, 0.6, 1]) sphere(r=1.5); } // Dragon scales / dorsal ridges on the back of the claw translate([-cr-1, 0, cr+4]) scale([1, 0.5, 1.2]) sphere(r=6); translate([0, 0, cr*2+3]) scale([1, 0.5, 1.2]) sphere(r=5.5); translate([cr+1, 0, cr+4]) scale([1, 0.5, 1.2]) sphere(r=4.5); } // Cut out the perfectly round cable channel // This ensures the inside is smooth and fits the cable exactly rotate([90, 0, 0]) cylinder(h=claw_width+2.1, r=cr, center=true); // Flatten the bottom for a clean merge with the base plate translate([0, 0, -50]) cube([100, 100, 100], center=true); } } // --- Main Assembly --- difference() { union() { // Rounded base plate hull() { translate([-(cable_spacing + base_margin), 0, -base_thickness+2]) cylinder(h=base_thickness, r=claw_width/2 + 4); translate([(cable_spacing + base_margin), 0, -base_thickness+2]) cylinder(h=base_thickness, r=claw_width/2 + 4); } // Add the three dragon claws for(i = [-1, 0, 1]) { translate([i * cable_spacing, 0, 0]) dragon_claw(); } } // Cable channels (cradles cut into the base for stability) for(i = [-1, 0, 1]) { translate([i * cable_spacing, 0, cr]) rotate([90, 0, 0]) cylinder(h=claw_width + 20, r=cr, center=true); } // Mounting screw holes on the ends for(i = [-1, 1]) { // Main screw hole (4.4mm for standard screws) translate([i * (cable_spacing + base_margin - 2), 0, -10]) cylinder(h=20, r=2.2); // Countersink for the screw head translate([i * (cable_spacing + base_margin - 2), 0, -0.5]) cylinder(h=5, r1=2.2, r2=4.5); } }