$fn=64; // --- Parameters --- cable_diameter = 5.0; // Diameter of the cable to clip clip_thickness = 2.5; // Thickness of the clip walls skull_size = 24; // Base radius of the cranium eye_radius = 9; // Radius of the eye sockets // --- Modules --- module skull_body() { // Cranium translate([0, 0, 28]) scale([1, 1.15, 1]) sphere(r=skull_size); // Cheekbones translate([-13, -11, 20]) sphere(r=8); translate([13, -11, 20]) sphere(r=8); // Jaw hull() { translate([0, -4, 18]) cube([32, 16, 10], center=true); translate([0, -12, 4]) cube([20, 12, 8], center=true); } } module skull_cuts() { // Eye sockets translate([-12, -15, 28]) rotate([90, 0, 0]) cylinder(r=eye_radius, h=30, center=true); translate([12, -15, 28]) rotate([90, 0, 0]) cylinder(r=eye_radius, h=30, center=true); // Nose cavity translate([0, -20, 16]) rotate([45, 0, 0]) rotate([0, 45, 0]) cube([8, 8, 20], center=true); // Teeth lines for(i=[-2:2]) { translate([i*3.5, -15, 4]) cube([1.2, 20, 8], center=true); } // Horizontal mouth line translate([0, -15, 4]) cube([22, 20, 1.2], center=true); } module cable_clip() { difference() { union() { // Main cylindrical clip body cylinder(r=cable_diameter/2 + clip_thickness, h=12, center=true); // Anchor block to merge solidly into the back of the eye socket translate([0, 5, 0]) cube([cable_diameter + clip_thickness*2, 10, 12], center=true); } // Inner cutout for the cable cylinder(r=cable_diameter/2, h=14, center=true); // Front slot for snapping the cable in translate([0, -5, 0]) cube([cable_diameter*0.75, 10, 14], center=true); } } // --- Main Assembly --- difference() { union() { // The hollowed-out skull difference() { skull_body(); skull_cuts(); } // Cable clips placed inside the eye sockets translate([-12, -14, 28]) cable_clip(); translate([12, -14, 28]) cable_clip(); } // Bounding box cut to ensure a perfectly flat, 3D-printable bottom translate([0, 0, -50]) cube([100, 100, 100], center=true); }