$fn = 64; // --- Parameters --- // Inner diameter of the ring (sized for ~76mm / 3-inch nursery pots) ring_inner_dia = 78; // Total height of the main ring body ring_height = 30; // Thickness of the outer wall (needs to be thick enough to house the stacking groove) wall_thickness = 7; // Width of the bottom inward flange that supports the pot flange_width = 10; // Thickness of the bottom support flange flange_thickness = 2; // Height of the interlocking V-ridge for stacking stacking_ridge_height = 2.5; // Width of the interlocking V-ridge stacking_ridge_width = 3; // Clearance for easy stacking clearance = 0.4; // Drainage hole parameters drainage_hole_dia = 6; drainage_hole_count = 8; // Grip texture parameters grip_ridge_dia = 2; grip_ridge_count = 32; // --- Calculated Variables --- r_in = ring_inner_dia / 2; r_out = r_in + wall_thickness; h = ring_height; fw = flange_width; fh = flange_thickness; rh = stacking_ridge_height; rw = stacking_ridge_width; c = clearance; // The ridge is centered in the wall. rim_outer is the flat top area outside the ridge. rim_outer = 2; // --- Main Geometry --- module stackable_pot_ring() { // 2D Profile for the ring, revolved to create the perfectly manifold 3D shape profile_points = [ [r_in - fw, 0], // 0: Bottom inner flange edge [r_in - fw, fh], // 1: Top inner flange edge [r_in, fh], // 2: Inner wall base [r_in, h], // 3: Inner wall top [r_out - rim_outer - rw, h], // 4: Male stacking ridge inner base [r_out - rim_outer - rw/2, h + rh], // 5: Male stacking ridge peak [r_out - rim_outer, h], // 6: Male stacking ridge outer base [r_out, h], // 7: Outer wall top [r_out, 0], // 8: Outer wall bottom [r_out - rim_outer + c, 0], // 9: Female groove outer base (with clearance) [r_out - rim_outer - rw/2, rh + c], // 10: Female groove peak (with clearance) [r_out - rim_outer - rw - c, 0] // 11: Female groove inner base (with clearance) ]; difference() { union() { // Main revolved body rotate_extrude() { polygon(profile_points); } // Outer grip ridges for(i = [0 : grip_ridge_count - 1]) { rotate([0, 0, i * 360 / grip_ridge_count]) translate([r_out - grip_ridge_dia/3, 0, 1]) cylinder(d=grip_ridge_dia, h=h-2, $fn=16); } } // Drainage holes in the support flange for(i = [0 : drainage_hole_count - 1]) { rotate([0, 0, i * 360 / drainage_hole_count]) translate([r_in - fw/2, 0, -1]) cylinder(d=drainage_hole_dia, h=fh + 2, $fn=32); } } } // Render the model stackable_pot_ring();