// --- Parameters --- base_radius = 45; slot_depth = 2; floor_thickness = 1.5; total_base_h = slot_depth + floor_thickness; wall_height = 110; wall_thickness = 1.5; flare_angle = 10; hole_d = 8; slot_width = 8; $fn = 500; // --- assembly --- difference() { flower_pot_body(); // radial slots translate([0, 0, -0.1]) linear_extrude(height = slot_depth + 0.1) radial_slots_pattern(); // drainage holes translate([0, 0, -0.1]) linear_extrude(height = total_base_h + 0.2) holes_pattern(); } // --- modules --- module flower_pot_body() { top_x_outer = base_radius + wall_height * tan(flare_angle); top_x_inner = top_x_outer - (wall_thickness / cos(flare_angle)); rotate_extrude() { polygon(points = [ [0, 0], [base_radius, 0], [top_x_outer, wall_height + total_base_h], [top_x_inner, wall_height + total_base_h], [base_radius - wall_thickness, total_base_h], [0, total_base_h] ]); } } module radial_slots_pattern() { // 6 slots for(a = [0 : 60 : 359]) { rotate([0, 0, a]) translate([base_radius / 2, 0, 0]) square([base_radius + 5, slot_width], center = true); } } module holes_pattern() { union() { circle(d = hole_d); // rings based on the base radius hole_circles = (base_radius < 35) ? [base_radius * 0.5] : (base_radius < 55) ? [base_radius * 0.33, base_radius * 0.66] : [base_radius * 0.25, base_radius * 0.5, base_radius * 0.75]; for(r = hole_circles) { for(a = [0 : 60 : 359]) { rotate([0, 0, a]) translate([r, 0, 0]) circle(d = hole_d); } } } }