$fn=64; // --- Parameters --- bowl_hole_radius = 60; // Radius of the hole for the bowl rim_width = 20; // Width of the top supporting rim stand_height = 90; // Total height of the stand top_thickness = 8; // Thickness of the top rim leg_radius = 10; // Radius of the legs leg_angle = 15; // Outward splay angle of the legs // --- Calculated Variables --- top_radius = bowl_hole_radius + rim_width; leg_length = stand_height / cos(leg_angle) + 20; module pet_bowl_stand() { difference() { union() { // Top Ring translate([0, 0, stand_height - top_thickness]) cylinder(h=top_thickness, r=top_radius); // Legs for(i = [0:3]) { rotate([0, 0, i * 90 + 45]) translate([top_radius - leg_radius - 5, 0, stand_height - top_thickness/2]) rotate([0, -leg_angle, 0]) translate([0, 0, -leg_length]) cylinder(h=leg_length, r=leg_radius); } } // Cutout for the bowl translate([0, 0, stand_height - top_thickness - 1]) cylinder(h=top_thickness + 2, r=bowl_hole_radius); // Flatten the base (z < 0) to ensure it sits flat on the floor translate([0, 0, -50]) cube([top_radius * 5, top_radius * 5, 100], center=true); // Flatten the top (z > stand_height) to remove any protruding leg tops translate([0, 0, stand_height + 50]) cube([top_radius * 5, top_radius * 5, 100], center=true); } } // Render the model pet_bowl_stand();