$fn = 64; // --- Parameters --- pot_inner_dia = 105; // Fits standard 4-inch pot (with clearance) wall_thickness = 5; // Robust wall for vertical stacking ring_height = 50; // Height of the main pot ring body stack_depth = 12; // Depth of the interlocking joint clearance = 0.6; // Tolerance for easy stacking saucer_extension = 16; // Width of the built-in saucer lip saucer_height = 24; // Height of the saucer outer wall drain_hole_dia = 8; // Diameter of drainage holes floor_dome = 2; // Center height offset to direct water to edges // --- Derived Variables --- r_in = pot_inner_dia / 2; r_out = r_in + wall_thickness; r_stack_mid = r_in + wall_thickness / 2; module stackable_pot_ring() { difference() { // Main solid body via revolved 2D profile rotate_extrude() { polygon([ [0, stack_depth], [r_stack_mid + clearance/2, stack_depth], // Inner socket top [r_stack_mid + clearance/2, 0], // Socket bottom opening [r_out + saucer_extension, 0], // Saucer outer base [r_out + saucer_extension, saucer_height], // Saucer lip top [r_out + saucer_extension - wall_thickness, saucer_height], // Saucer lip inner [r_out + saucer_extension - wall_thickness, wall_thickness], // Saucer floor [r_out, wall_thickness], // Main outer wall base [r_out, ring_height], // Top outer shoulder [r_stack_mid - clearance/2, ring_height], // Base of male plug [r_stack_mid - clearance/2, ring_height + stack_depth - 1], // Plug top chamfer start [r_stack_mid - clearance/2 - 1, ring_height + stack_depth], // Plug top chamfer end [r_in, ring_height + stack_depth], // Inner top edge [r_in, stack_depth + wall_thickness], // Inner floor perimeter [0, stack_depth + wall_thickness + floor_dome] // Inner floor center (domed) ]); } // Central vertical drainage hole translate([0, 0, stack_depth - 5]) cylinder(h = wall_thickness + floor_dome + 10, r = drain_hole_dia); // Perimeter vertical drainage holes for(i = [0 : 60 : 359]) { rotate([0, 0, i]) translate([r_in * 0.5, 0, stack_depth - 5]) cylinder(h = wall_thickness + floor_dome + 10, r = drain_hole_dia / 2); } // Radial drainage slots (connects inner floor to the saucer lip) for(i = [0 : 45 : 359]) { rotate([0, 0, i]) translate([r_out, 0, stack_depth + wall_thickness]) rotate([0, 90, 0]) cylinder(h = 40, r = drain_hole_dia / 2, center = true); } } } // Render the object stackable_pot_ring();