/* GNU AGPLv3 (or later at your option) see bottom for more license info. please do not remove this notice. */ //$fn = 30; // use this while editing $fn = 100; // use this for generating STL // how big each ones place side is side_length = 20; // modify this to your aesthetic taste corner_radius = side_length / 6; connector_thickness = corner_radius; fudge = 0.1; module fillet(r) { offset(-r) { offset(r) { children(); } } } module round_inside_corners(r) { fillet(r) children(); } module round_outside_corners(r) { fillet(-r) children(); } module connector_base(connector_thickness) { rotate([0, -90, -90]) { translate([corner_radius / 2, 0, 0]) { linear_extrude(height = connector_thickness) { intersection() { circle(corner_radius, $fn = 3); translate([-corner_radius, -corner_radius]) { square([corner_radius, 2 * corner_radius]); } } round_outside_corners(corner_radius / 3) { circle(corner_radius, $fn = 3); } } } } } module ones_place() { difference() { linear_extrude(height = side_length) { round_outside_corners(corner_radius) { square(side_length); } } translate([side_length / 2, -0.1, -0.1]) { connector_base(connector_thickness); } translate([side_length / 2, side_length - connector_thickness + fudge, -fudge]) { connector_base(connector_thickness); } } translate([side_length / 2, 0, side_length - 3 * fudge]) { connector_base(connector_thickness - 3 * fudge); } translate([side_length / 2, side_length - connector_thickness + 3 * fudge, side_length - 3 * fudge]) { connector_base(connector_thickness - 3 * fudge); } } module tens_place() { for(ones_index = [0 : (10 - 1)]) { translate([ones_index * side_length, 0]) { ones_place(); } } } module hundreds_place() { for(tens_index = [0 : (10 - 1)]) { for(ones_index = [0 : (10 - 1)]) { translate([ones_index * side_length, tens_index * side_length]) { ones_place(); } } } } module thousands_place() { for(hundreds_index = [0 : (10 - 1)]) { for(tens_index = [0 : (10 - 1)]) { for(ones_index = [0 : (10 - 1)]) { translate([ones_index * side_length, tens_index * side_length, hundreds_index * side_length]) { ones_place(); } } } } } //connector_base(connector_thickness); ones_place(); //tens_place(); //hundreds_place(); //thousands_place();