$fn = 64; // --- Parametric Variables --- tile_size = 60; base_thickness = 6; curb_height = 1.5; road_width = 30; // Peg hole dimensions for modular connections peg_radius = 2; peg_depth = 4; // Derived road radius values road_center_r = tile_size / 2; road_inner_r = road_center_r - (road_width / 2); road_outer_r = road_center_r + (road_width / 2); union() { difference() { // Main tile base and sidewalks cube([tile_size, tile_size, base_thickness + curb_height]); // Cut out the 90-degree curved road surface translate([0, 0, base_thickness]) difference() { cylinder(h = curb_height + 1, r = road_outer_r); translate([0, 0, -0.5]) cylinder(h = curb_height + 2, r = road_inner_r); } // Cut out connector holes for modularity (Bottom & Top edges) for (x = [10, tile_size - 10]) { translate([x, 0, base_thickness / 2]) rotate([90, 0, 0]) cylinder(h = peg_depth * 2, r = peg_radius, center = true); translate([x, tile_size, base_thickness / 2]) rotate([90, 0, 0]) cylinder(h = peg_depth * 2, r = peg_radius, center = true); } // Cut out connector holes for modularity (Left & Right edges) for (y = [10, tile_size - 10]) { translate([0, y, base_thickness / 2]) rotate([0, 90, 0]) cylinder(h = peg_depth * 2, r = peg_radius, center = true); translate([tile_size, y, base_thickness / 2]) rotate([0, 90, 0]) cylinder(h = peg_depth * 2, r = peg_radius, center = true); } } // Raised dashed center line for easy painting/printing for (angle = [15 : 15 : 75]) { rotate([0, 0, angle]) translate([road_center_r, 0, base_thickness]) translate([-1, -3, 0]) cube([2, 6, 0.4]); } }