$fn=64; // --- Parameters --- cable_diameter = 6.5; // Diameter of the cable holding channel slot_width = 4.0; // Width of the snap-fit slot (smaller than cable) base_width = 50; // Width of the stand footprint base_length = 70; // Length of the stand footprint base_thickness = 5; // Thickness of the base plate module dragon_cable_holder() { difference() { union() { // 1. Base Plate translate([0, -5, 0]) rounded_base(); // 2. Main Head Shape hull() { // Back/Top of head translate([0, -10, 32]) sphere(r=22); // Snout / Upper Jaw translate([0, 24, 22]) sphere(r=14); // Lower Jaw / Chin translate([0, 24, 12]) sphere(r=12); // Neck base translate([0, -10, base_thickness]) cylinder(r=22, h=1); translate([0, 15, base_thickness]) cylinder(r=16, h=1); } // 3. Brow Ridges translate([9, 10, 35]) sphere(r=8); translate([-9, 10, 35]) sphere(r=8); // 4. Nostrils translate([6, 34, 25]) sphere(r=4); translate([-6, 34, 25]) sphere(r=4); // 5. Horns horn(12, -12, 45, -45, 25); horn(-12, -12, 45, -45, -25); // 6. Back Spikes for(i=[0:3]) { translate([0, -18 - i*9, 48 - i*6]) rotate([-55, 0, 0]) cylinder(r1=4, r2=0.5, h=16); } } // --- Cutouts --- // A. Cable Channel (The Mouth interior) translate([0, 16, 18]) rotate([0, 90, 0]) cylinder(h=base_width+20, d=cable_diameter, center=true); // B. Snap-fit Slot (The inner lips) translate([0, 26, 18]) cube([base_width+20, 20, slot_width], center=true); // C. Flared Jaw Opening (Visual Open Mouth) hull() { translate([0, 32, 18]) cube([base_width+20, 1, slot_width], center=true); translate([0, 45, 18]) cube([base_width+20, 1, 18], center=true); } // D. Angry Eyes // Right eye translate([11, 15, 30]) rotate([15, 20, 35]) scale([2, 0.5, 0.5]) sphere(r=5); // Left eye translate([-11, 15, 30]) rotate([15, -20, -35]) scale([2, 0.5, 0.5]) sphere(r=5); // E. Mounting Tape Recess under base (for desk adhesion) translate([0, -5, 0]) cube([base_width-10, base_length-10, 2], center=true); } } module rounded_base() { hull() { translate([base_width/2-5, base_length/2-5, 0]) cylinder(r=5, h=base_thickness); translate([-base_width/2+5, base_length/2-5, 0]) cylinder(r=5, h=base_thickness); translate([base_width/2-5, -base_length/2+5, 0]) cylinder(r=5, h=base_thickness); translate([-base_width/2+5, -base_length/2+5, 0]) cylinder(r=5, h=base_thickness); } } module horn(x, y, z, rot_x, rot_y) { translate([x, y, z]) rotate([rot_x, rot_y, 0]) cylinder(r1=5, r2=1, h=25); } // Render the model dragon_cable_holder();