$fn = 64; // --- Parameters --- stand_height = 80; // Total height of the stand base_radius = 80; // Radius at the bottom (for stability) bowl_hole_radius = 60; // Radius of the hole for the bowl to drop into top_outer_radius = 75; // Outer radius of the top rim wall_thickness = 6; // Thickness of the walls top_thickness = 6; // Thickness of the top resting surface arch_width = 50; // Width of the leg arches arch_height = 35; // Height of the straight part of the arch // --- Model --- difference() { // Main outer body cylinder(h=stand_height, r1=base_radius, r2=top_outer_radius); // Inner hollow cavity translate([0, 0, -1]) cylinder( h=stand_height - top_thickness + 1, r1=base_radius - wall_thickness, r2=top_outer_radius - wall_thickness ); // Top hole for the bowl translate([0, 0, stand_height - top_thickness - 1]) cylinder(h=top_thickness + 2, r=bowl_hole_radius); // Cutouts for legs (4 arches) for (i = [0 : 90 : 270]) { rotate([0, 0, i]) arch_cutout(); } } module arch_cutout() { // Offset slightly to ensure a clean cut through the outer wall and floor translate([-10, 0, -1]) union() { // Rectangular base of the arch translate([0, -arch_width/2, 0]) cube([base_radius + 20, arch_width, arch_height + 1]); // Semicircular top of the arch translate([0, 0, arch_height + 1]) rotate([0, 90, 0]) cylinder(h=base_radius + 20, r=arch_width/2); } }