$fn = 64; // --- PARAMETERS --- // Grid dimensions cols = 3; rows = 4; // Dimensions per grid unit unit_size = 25; thickness = 6; // Connection point (hole) dimensions hole_dia = 5; hole_depth = 4; // Interlocking dovetail tab dimensions tab_base = 8; tab_tip = 12; tab_length = 5; tolerance = 0.2; // Clearance for easy assembly // --- MODULES --- module male_tab() { linear_extrude(height = thickness) polygon([ [-tab_base/2, 0], [-tab_tip/2, tab_length], [tab_tip/2, tab_length], [tab_base/2, 0] ]); } module female_cutout() { translate([0, 0, -0.1]) linear_extrude(height = thickness + 0.2) polygon([ [-(tab_base/2 + tolerance), -0.1], // Extend slightly to prevent manifold slivers [-(tab_tip/2 + tolerance), tab_length + tolerance], [(tab_tip/2 + tolerance), tab_length + tolerance], [(tab_base/2 + tolerance), -0.1] ]); } module figure_stage_baseplate() { difference() { union() { // Main platform body cube([cols * unit_size, rows * unit_size, thickness]); // Male tabs on Right edge (X+) for (y = [0 : rows - 1]) { translate([cols * unit_size, (y + 0.5) * unit_size, 0]) rotate([0, 0, -90]) male_tab(); } // Male tabs on Top edge (Y+) for (x = [0 : cols - 1]) { translate([(x + 0.5) * unit_size, rows * unit_size, 0]) rotate([0, 0, 0]) male_tab(); } } // Female cutouts on Left edge (X-) for (y = [0 : rows - 1]) { translate([0, (y + 0.5) * unit_size, 0]) rotate([0, 0, -90]) female_cutout(); } // Female cutouts on Bottom edge (Y-) for (x = [0 : cols - 1]) { translate([(x + 0.5) * unit_size, 0, 0]) rotate([0, 0, 0]) female_cutout(); } // Grid connection holes for (x = [0 : cols - 1]) { for (y = [0 : rows - 1]) { translate([(x + 0.5) * unit_size, (y + 0.5) * unit_size, thickness - hole_depth]) cylinder(d = hole_dia, h = hole_depth + 0.1); } } } } // --- RENDER --- figure_stage_baseplate();