$fn=64; // --- Parameters --- phone_w = 90; // Width of the phone resting area tilt_angle = 15; // Tilt angle of the backrest seat_h = 25; // Height of the base/seat back_h = 130; // Height of the backrest back_t = 15; // Thickness of the backrest arm_w = 16; // Width of the armrests arm_h = 40; // Height of the armrests above the seat total_w = phone_w + (arm_w * 2); total_d = 100; // Total depth of the throne module throne() { difference() { // Main Solid Body union() { // 1. Base / Seat cube([total_w, total_d, seat_h]); // 2. Tilted Backrest // Positioned halfway back to allow resting space translate([0, 50, seat_h]) rotate([-tilt_angle, 0, 0]) union() { // Main back panel cube([total_w, back_t, back_h]); // Side posts for backrest cube([arm_w, back_t, back_h + 20]); translate([total_w - arm_w, 0, 0]) cube([arm_w, back_t, back_h + 20]); // Top Arch translate([total_w/2, 0, back_h]) rotate([-90, 0, 0]) cylinder(r=phone_w/2, h=back_t); // Vertical decorative pillars for(i=[1:4]) { translate([arm_w + phone_w * i/5, 0, 0]) cylinder(r=4, h=back_h); } // Top Finials on posts translate([arm_w/2, back_t/2, back_h + 20]) sphere(r=arm_w/2 + 4); translate([total_w - arm_w/2, back_t/2, back_h + 20]) sphere(r=arm_w/2 + 4); } // 3. Armrests for(x = [0, total_w - arm_w]) { translate([x, 0, seat_h]) { // Main armrest block cube([arm_w, total_d, arm_h]); // Rounded top translate([arm_w/2, 0, arm_h]) rotate([-90, 0, 0]) cylinder(r=arm_w/2, h=total_d); // Front finial (hand rest) translate([arm_w/2, 0, arm_h]) sphere(r=arm_w/2 + 3); // Back finial translate([arm_w/2, total_d, arm_h]) sphere(r=arm_w/2); } } // 4. Phone Stopper (Front Lip) translate([arm_w, 15, seat_h]) { cube([phone_w, 10, 8]); // Rounded top for the stopper translate([0, 5, 8]) rotate([0, 90, 0]) cylinder(r=5, h=phone_w); } // 5. Seat Cushion (Slightly raised area for phone) translate([arm_w, 25, seat_h]) cube([phone_w, 25, 2]); } // --- Subtractions (Leg Cutouts) --- // Front-to-back arch cutout translate([total_w/2, -10, 0]) scale([1, 1, 0.5]) rotate([-90, 0, 0]) cylinder(r=phone_w/2 - 5, h=total_d + 20); // Left-to-right arch cutout translate([-10, total_d/2 + 5, 0]) scale([1, 1, 0.6]) rotate([0, 90, 0]) cylinder(r=total_d/2 - 15, h=total_w + 20); } } // Render the model throne();