$fn=64; // --- Parameters --- res_dia = 120; // Main reservoir diameter res_h = 60; // Reservoir overall height wall = 2.4; // Wall thickness wick_dia = 35; // Diameter of the central wicking column fill_port_dia = 25; // Diameter of the fill port indicator_dia = 20; // Diameter of the water indicator chamber lip_depth = 15; // Depth of the top seating lip for the upper pot wick_h = res_h - lip_depth; // Height of the wick column // --- 2D Profiles --- module outer_profile() { union() { // Main body circle(d=res_dia); // Fill port extension hull() { circle(d=res_dia); translate([res_dia/2, 0]) circle(d=fill_port_dia + 2*wall); } // Indicator chamber extension hull() { circle(d=res_dia); translate([0, -res_dia/2]) circle(d=indicator_dia + 2*wall); } } } module inner_profile() { union() { // Main interior circle(d=res_dia - 2*wall); // Fill port interior hull() { circle(d=res_dia - 2*wall); translate([res_dia/2, 0]) circle(d=fill_port_dia); } // Indicator chamber interior hull() { circle(d=res_dia - 2*wall); translate([0, -res_dia/2]) circle(d=indicator_dia); } } } // --- 3D Construction --- union() { difference() { // Main solid body linear_extrude(res_h) outer_profile(); // Hollow out the interior translate([0, 0, wall]) linear_extrude(res_h + 1) inner_profile(); // Water level indicator window (recessed slot) translate([0, -res_dia/2 - indicator_dia/2 - wall/2, res_h/2 + wall]) cube([8, wall + 2, res_h - 15], center=true); } // Thin translucent pane (0.8mm) to prevent leaking while allowing visibility // Made slightly wider (8.2mm) to ensure clean manifold intersection with walls translate([0, -res_dia/2 - indicator_dia/2 - wall + 0.4, res_h/2 + wall]) cube([8.2, 0.8, res_h - 15], center=true); // Seating ledge for the upper pot translate([0, 0, res_h - lip_depth]) difference() { // +1 diameter ensures clean union with the outer wall cylinder(d=res_dia - 2*wall + 1, h=lip_depth); translate([0, 0, -1]) cylinder(d=res_dia - 6*wall, h=lip_depth + 2); } // Central wicking column difference() { cylinder(d=wick_dia, h=wick_h); translate([0, 0, wall]) cylinder(d=wick_dia - 2*wall, h=wick_h + 1); // Slotted perforations for water ingress for(z = [wall + 4 : 8 : wick_h - 5]) { for(a = [0 : 45 : 135]) { rotate([0, 0, a]) translate([0, 0, z]) cube([wick_dia + 10, 2.5, 4], center=true); } } } }