$fn = 64; // --- Parametric Variables --- // Grid configuration grid_x = 2; grid_y = 2; cell_size = 20; // Size of each grid cell in mm base_thickness = 6; // Main plate thickness // Top connection pegs (for stacking and figure placement) peg_diameter = 6; peg_height = 3; // Bottom connection holes (for interlocking/stacking) hole_tolerance = 0.3; hole_diameter = peg_diameter + hole_tolerance; hole_depth = peg_height + 0.5; // Accessory/Stand mounting hole (center) center_hole_diameter = 4; center_hole_depth = base_thickness + 1; module figure_stage_baseplate() { // Calculate total dimensions width = grid_x * cell_size; depth = grid_y * cell_size; difference() { union() { // Main baseplate body translate([-width/2, -depth/2, 0]) cube([width, depth, base_thickness]); // Top interlocking pegs for (x = [0 : grid_x - 1]) { for (y = [0 : grid_y - 1]) { translate([ (x * cell_size) - (width / 2) + (cell_size / 2), (y * cell_size) - (depth / 2) + (cell_size / 2), base_thickness ]) // Peg with slight chamfer for easier stacking union() { cylinder(h = peg_height - 0.5, d = peg_diameter); translate([0, 0, peg_height - 0.5]) cylinder(h = 0.5, d1 = peg_diameter, d2 = peg_diameter - 1); } } } } // Bottom interlocking holes for (x = [0 : grid_x - 1]) { for (y = [0 : grid_y - 1]) { translate([ (x * cell_size) - (width / 2) + (cell_size / 2), (y * cell_size) - (depth / 2) + (cell_size / 2), -0.01 // Offset to prevent z-fighting ]) // Hole with slight entry chamfer union() { cylinder(h = hole_depth, d = hole_diameter); cylinder(h = 0.5, d1 = hole_diameter + 1, d2 = hole_diameter); } } } // Center accessory/stand mounting hole translate([0, 0, -0.01]) cylinder(h = center_hole_depth, d = center_hole_diameter); // Optional: Cutout cross on bottom to save material and aid printability translate([-width/2 + 2, -1, -0.01]) cube([width - 4, 2, 2]); translate([-1, -depth/2 + 2, -0.01]) cube([2, depth - 4, 2]); } } // Generate the model figure_stage_baseplate();