$fn=64; // --- Parameters --- pot_diameter = 100; // Inner diameter for the pot wall_thickness = 4; // Thickness of the main plates lip_height = 12; // Height of the retaining lip base_width = 70; // Width of the sill mount base_length = 80; // Length of the sill mount base_height = 30; // Height of the base block rocker_radius = 50; // Radius of the adjustable tilt cylinder clearance = 0.5; // Tolerance for moving parts // --- Layout --- // Base part (sits perfectly flat on the build plate) translate([0, -base_length/2 - 5, 0]) base(); // Platform part (flipped upside down for optimal support-free printing) translate([0, base_length/2 + 5, wall_thickness + lip_height]) rotate([180, 0, 0]) platform(); // --- Modules --- module base() { cradle_z = 5 + rocker_radius; difference() { // Main base block translate([0, 0, base_height/2]) cube([base_width, base_length, base_height], center=true); // Cradle cutout for the rocker translate([0, 0, cradle_z]) { // Main cylindrical cutout rotate([0, 90, 0]) cylinder(h=base_width+2, r=rocker_radius, center=true); // Central slot for lateral locking rotate([0, 90, 0]) cylinder(h=12 + clearance*2, r=rocker_radius+5, center=true); // Negative grooves for tilt adjustment locking for(a = [-45 : 5 : 45]) { rotate([-a, 0, 0]) translate([0, 0, -rocker_radius]) rotate([0, 90, 0]) cylinder(h=base_width+2, d=4, center=true, $fn=16); } } // Non-slip diamond texture on the underside for(x = [-base_width/2 + 5 : 5 : base_width/2 - 5]) { translate([x, 0, 0]) rotate([90, 0, 0]) cylinder(h=base_length+2, r=1, center=true, $fn=4); } for(y = [-base_length/2 + 5 : 5 : base_length/2 - 5]) { translate([0, y, 0]) rotate([0, 90, 0]) cylinder(h=base_width+2, r=1, center=true, $fn=4); } } } module platform() { union() { // Pot holding plate and retaining lip difference() { cylinder(h=wall_thickness + lip_height, d=pot_diameter + wall_thickness*2); translate([0, 0, wall_thickness]) cylinder(h=lip_height+2, d=pot_diameter); } // Convex rocker mechanism intersection() { union() { // Main rocker body rotate([0, 90, 0]) cylinder(h=base_width - 2, r=rocker_radius, center=true); // Central ring for lateral locking rotate([0, 90, 0]) cylinder(h=12, r=rocker_radius+4, center=true); // Positive ridges for tilt adjustment locking for(a = [-45 : 5 : 45]) { rotate([-a, 0, 0]) translate([0, 0, -rocker_radius]) rotate([0, 90, 0]) cylinder(h=base_width-2, d=3, center=true, $fn=16); } } // Bounding box to slice the cylinder exactly at the bottom of the plate // +0.1 ensures a clean manifold union with the plate translate([0, 0, -rocker_radius/2 + 0.1]) cube([base_width+10, rocker_radius*2, rocker_radius], center=true); } } }