$fn = 128; // --- Parameters --- body_length = 90; body_width = 70; body_height = 90; wall = 3; leg_h = 25; module elephant_drainer() { difference() { // --- Solid Body --- union() { // Main body (rounded belly, straight upper walls) hull() { translate([body_length/2, 0, leg_h + body_width/2 - 5]) sphere(r=body_width/2); translate([-body_length/2, 0, leg_h + body_width/2 - 5]) sphere(r=body_width/2); translate([body_length/2, 0, leg_h + body_height]) cylinder(h=0.1, r=body_width/2); translate([-body_length/2, 0, leg_h + body_height]) cylinder(h=0.1, r=body_width/2); } // Trunk (angled downwards for draining) translate([body_length/2 + 10, 0, leg_h + 10]) rotate([0, 105, 0]) cylinder(h=65, r1=15, r2=10); // Legs for(x = [body_length/2 - 10, -body_length/2 + 15]) { for(y = [body_width/2 - 15, -body_width/2 + 15]) { translate([x, y, 0]) cylinder(h=leg_h + 10, r1=8, r2=12); } } // Ears translate([body_length/2 - 5, body_width/2 - 5, leg_h + 45]) rotate([15, 15, 30]) scale([1, 0.15, 1.2]) sphere(r=25); mirror([0, 1, 0]) translate([body_length/2 - 5, body_width/2 - 5, leg_h + 45]) rotate([15, 15, 30]) scale([1, 0.15, 1.2]) sphere(r=25); // Eyes translate([body_length/2 + 25, 12, leg_h + 50]) sphere(r=3.5); mirror([0, 1, 0]) translate([body_length/2 + 25, 12, leg_h + 50]) sphere(r=3.5); // Tail translate([-body_length/2 - body_width/2 + 5, 0, leg_h + 25]) rotate([0, -45, 0]) cylinder(h=25, r1=4, r2=1); } // --- Cutouts --- // Main cavity (sloped floor for optimal water drainage to the front) hull() { translate([body_length/2, 0, leg_h + body_width/2 - 5]) sphere(r=body_width/2 - wall); translate([-body_length/2, 0, leg_h + body_width/2 + 10]) sphere(r=body_width/2 - wall); translate([body_length/2, 0, leg_h + body_height + 1]) cylinder(h=0.1, r=body_width/2 - wall); translate([-body_length/2, 0, leg_h + body_height + 1]) cylinder(h=0.1, r=body_width/2 - wall); } // Trunk drain hole (intersects the lowest point of the sloped floor) translate([body_length/2 - 5, 0, leg_h + 7.5]) rotate([0, 105, 0]) cylinder(h=85, r1=10, r2=7); // Flat top cutoff for cutlery insertion translate([-body_length, -body_width, leg_h + body_height - 10]) cube([body_length * 2, body_width * 2, 50]); } } // Render the model (Best printed with tree supports for the belly and trunk) elephant_drainer();