$fn=64; // --- Parametric Variables --- disc_diameter = 100; // Outer diameter of the insert disc disc_thickness = 3; // Thickness of the grid plate grid_spacing = 8; // Distance between grid lines (hole size) grid_width = 2; // Width of the grid lines foot_height = 8; // Height of the standoff feet for drainage foot_diameter = 6; // Diameter of the standoff feet // --- Main Assembly --- union() { // Outer support ring difference() { cylinder(h=disc_thickness, d=disc_diameter); translate([0, 0, -1]) cylinder(h=disc_thickness + 2, d=disc_diameter - grid_width * 2); } // Perforated raised grid pattern intersection() { cylinder(h=disc_thickness, d=disc_diameter); // Generate intersecting grid lines num_lines = ceil(disc_diameter / grid_spacing) + 1; start_pos = -(num_lines * grid_spacing) / 2; union() { for (i = [0 : num_lines]) { // X-axis bars translate([0, start_pos + i * grid_spacing, disc_thickness / 2]) cube([disc_diameter + 10, grid_width, disc_thickness], center=true); // Y-axis bars translate([start_pos + i * grid_spacing, 0, disc_thickness / 2]) cube([grid_width, disc_diameter + 10, disc_thickness], center=true); } } } // Standoff feet to elevate the disc and improve aeration translate([0, 0, -foot_height]) { // Center foot cylinder(h=foot_height + 0.1, d=foot_diameter); // Perimeter feet num_feet = 8; radius = (disc_diameter / 2) - foot_diameter; for (i = [0 : num_feet - 1]) { angle = i * (360 / num_feet); translate([radius * cos(angle), radius * sin(angle), 0]) cylinder(h=foot_height + 0.1, d=foot_diameter); } } }