update puzzle to latest version to match solution instructions
[ozzloy@gmail.com/3d-printables] / place-value-manipulative.scad
1 /*
2 GNU AGPLv3 (or later at your option)
3 see bottom for more license info.
4 please do not remove this notice.
5 */
6
7 /*****************************************************/
8 /* binary */
9 //ones_place();
10 //twos_place();
11 //fours_place();
12 //eights_place();
13
14 /*****************************************************/
15 /* trinary */
16 //ones_place();
17 //threes_place();
18 //nines_place();
19 twenty_sevens_place();
20
21 /*****************************************************/
22 /* decimal */
23 //ones_place();
24 //tens_place();
25 //hundreds_place();
26 //thousands_place();
27
28 // use this while editing so previewing is faster:
29 //$fn = 30;
30 // use this for generating STL so model is more accurate:
31 $fn = 100;
32
33 // how big each ones place side is in millimeters
34 side_length = 20;
35
36 // modify this to your aesthetic taste
37 corner_radius = side_length / 6;
38
39 connector_thickness = side_length / 4;
40
41 fudge = 0.1;
42
43 module fillet(r) {
44 offset(-r) { offset(r) { children(); } } }
45
46 module round_inside_corners(r) {
47 fillet(r) children(); }
48
49 module round_outside_corners(r) {
50 fillet(-r) children(); }
51
52 module connector_tab(connector_thickness) {
53 rotate([0, -90, -90]) {
54 translate([corner_radius / 2, 0, 0]) {
55 linear_extrude(height = connector_thickness) {
56 intersection() {
57 circle(corner_radius, $fn = 3);
58 translate([-corner_radius, -corner_radius]) {
59 square([corner_radius, 2 * corner_radius]); } }
60 round_outside_corners(corner_radius / 3) {
61 circle(corner_radius, $fn = 3); } } } } }
62
63 module ones_place() {
64 difference() {
65 linear_extrude(height = side_length) {
66 round_outside_corners(corner_radius) {
67 square(side_length); } }
68 translate([side_length / 2, -fudge, -fudge]) {
69 connector_tab(connector_thickness); }
70 translate([side_length / 2,
71 side_length - connector_thickness + fudge,
72 -fudge]) {
73 connector_tab(connector_thickness); } }
74 translate([side_length / 2,
75 0,
76 side_length - 2 * fudge]) {
77 connector_tab(connector_thickness - 2 * fudge); }
78 translate([side_length / 2,
79 side_length - connector_thickness + 2 * fudge,
80 side_length - 2 * fudge]) {
81 connector_tab(connector_thickness - 2 * fudge); } }
82
83 /*****************************************************/
84 /* decimal */
85 module tens_place() {
86 for(ones_index = [0 : (10 - 1)]) {
87 translate([ones_index * side_length, 0, 0]) {
88 ones_place(); } } }
89
90 module hundreds_place() {
91 for(tens_index = [0 : (10 - 1)]) {
92 translate([0, tens_index * side_length, 0]) {
93 tens_place(); } } }
94
95 module thousands_place() {
96 for(hundreds_index = [0 : (10 - 1)]) {
97 translate([0, 0, hundreds_index * side_length]) {
98 hundreds_place(); } } }
99
100
101 /*****************************************************/
102 /* binary */
103 module twos_place() {
104 for(ones_index = [0 : (2 - 1)]) {
105 translate([ones_index * side_length, 0, 0]) {
106 ones_place(); } } }
107
108 module fours_place() {
109 for(twos_index = [0 : (2 - 1)]) {
110 translate([0, twos_index * side_length, 0]) {
111 twos_place(); } } }
112
113 module eights_place() {
114 for(fours_index = [0 : (2 - 1)]) {
115 translate([0, 0, fours_index * side_length]) {
116 fours_place(); } } }
117
118 /*****************************************************/
119 /* trinary */
120 module threes_place() {
121 for(ones_index = [0 : (3 - 1)]) {
122 translate([ones_index * side_length, 0, 0]) {
123 ones_place(); } } }
124
125 module nines_place() {
126 for(threes_index = [0 : (3 - 1)]) {
127 translate([0, threes_index * side_length, 0]) {
128 threes_place(); } } }
129
130 module twenty_sevens_place() {
131 for(nines_index = [0 : (3 - 1)]) {
132 translate([0, 0, nines_index * side_length]) {
133 nines_place(); } } }
134
135 //connector_tab(connector_thickness);