b2c1c59b3cc12ed57b388066eb7c8e8253bac4c7
[3dmodels/seg_digit.git] / digit7.scad
1 /*
2  * digit7.scad : 7 segment digit generation library
3  * 
4  * Author : Jose Ignacio Croce Busquets <jose@crossforests.com>
5  *
6  * Date : 08-DEC-2013
7  *
8  * Usage
9  * The module contains the following public methods
10  *
11  * digit7_str(s, h, on)
12  *                     Writes a string from "0123456789ABCDEFabcdef" chars
13  *                     as a 7 digit display of the specified height.
14  *                     on = on-relief/low-relief flag
15  * digit7_int(v, h)    Writes an integer value in decimal representation
16  *                     as a 7 digit display of the specified height.
17  * digit7_float(v, h)  Writes a floating point value in decimal representation
18  *                     as a 7 digit display of the specified height.
19  */
20
21 /* Include general definitions */
22 use <seg_digit.scad>
23
24 /*
25  * Creates a 7 segment display for the given string
26  *   s    String to display. Characters should be within "0"-"9", "A"-"F",
27  *        "a"-"f" ranges. Otherwise nothing is shown.
28  *   h    digit height
29  *  on   on-relief/low-relief flag
30  */
31 module digit7_str(s, h, on = true)
32 {
33  for(i = [ 0 : len(s) ])
34  {
35    translate(v = [ i * digit_spacing(h), 0, 0 ])
36      put_digit7(s[i], h, on);
37  }
38 }
39
40 /*
41  * Creates a 7 segment display for an integer value (decimal)
42  *   v    Value to display
43  *   h    digit height
44  *   on   on-relief/low-relief flag
45  */
46 module digit7_int(v, h, on = true)
47 {
48  digit7_str(str(v), h, on);
49 }
50
51 /*
52  * Creates a 7 segment display for a float value
53  *   v    Value to display
54  *   h    digit height
55  *   on   on-relief/low-relief flag
56  */
57 module digit7_float(v, h, on = true)
58 {
59  s = str(v);
60  if (search(".", s)[0] == undef) {
61     digit7_str(s, h, on); // integer value
62  } else {
63     for (i = [ 0 : search(".", s)[0] - 1 ]) {
64         translate(v = [ i * digit_spacing(h), 0, 0 ])
65           put_digit7(s[i], h, on);
66     }
67     translate(v = [ (search(".", s)[0] - 1) * digit_spacing(h), 0, 0 ])
68       put_digit7(s[i], h, on);
69     for (i = [ search(".", s)[0] : len(s) ]) {
70         translate(v = [ (i - 1) * digit_spacing(h)
71                       , 0
72                       , 0 ])
73           put_digit7(s[i], h, on);
74     }
75  }
76 }
77
78 /*
79  * Creates a 7 segment display for the given character
80  *   c    Character to display. Should be within "0"-"9", "A"-"F", "a"-"f"
81  *        ranges. Otherwise nothing is shown.
82  *   h    digit height
83  *   on   on-relief/low-relief flag
84  */
85 module put_digit7(c, h, on = true)
86 {
87  if (c == ".") digit7_P(h, on);
88  if (c == "0") digit7_0(h, on);
89  if (c == "1") digit7_1(h, on);
90  if (c == "2") digit7_2(h, on);
91  if (c == "3") digit7_3(h, on);
92  if (c == "4") digit7_4(h, on);
93  if (c == "5") digit7_5(h, on);
94  if (c == "6") digit7_6(h, on);
95  if (c == "7") digit7_7(h, on);
96  if (c == "8") digit7_8(h, on);
97  if (c == "9") digit7_9(h, on);
98  if (c == "A" || c == "a") digit7_A(h, on);
99  if (c == "B" || c == "b") digit7_B(h, on);
100  if (c == "C" || c == "c") digit7_C(h, on);
101  if (c == "D" || c == "d") digit7_D(h, on);
102  if (c == "E" || c == "e") digit7_E(h, on);
103  if (c == "F" || c == "f") digit7_F(h, on);
104 }
105
106 //---------------------------------------------------------------------------
107 // End of public modules - Just jump to the examples
108 //---------------------------------------------------------------------------
109
110 /* Draws 0 in a 7 segment digit
111  *  h    digit length
112  *  on   on-relief/low-relief flag
113  */
114 module digit7_0(h, on = true)
115 {
116  segment_a(segment_length(h), on);
117  segment_b(segment_length(h), on);
118  segment_c(segment_length(h), on);
119  segment_d(segment_length(h), on);
120  segment_e(segment_length(h), on);
121  segment_f(segment_length(h), on);
122 }
123
124 /* Draws 1 in a 7 segment digit
125  *  h    digit length
126  *  on   on-relief/low-relief flag
127  */
128 module digit7_1(h, on = true)
129 {
130  segment_b(segment_length(h), on);
131  segment_c(segment_length(h), on);
132 }
133
134 /* Draws 2 in a 7 segment digit
135  *  h    digit length
136  *  on   on-relief/low-relief flag
137  */
138 module digit7_2(h, on = true)
139 {
140  segment_a(segment_length(h), on);
141  segment_b(segment_length(h), on);
142  segment_d(segment_length(h), on);
143  segment_e(segment_length(h), on);
144  segment_g(segment_length(h), on);
145 }
146
147 /* Draws 3 in a 7 segment digit
148  *  h    digit length
149  *  on   on-relief/low-relief flag
150  */
151 module digit7_3(h, on = true)
152 {
153  segment_a(segment_length(h), on);
154  segment_b(segment_length(h), on);
155  segment_c(segment_length(h), on);
156  segment_d(segment_length(h), on);
157  segment_g(segment_length(h), on);
158 }
159
160 /* Draws 4 in a 7 segment digit
161  *  h    digit length
162  *  on   on-relief/low-relief flag
163  */
164 module digit7_4(h, on = true)
165 {
166  segment_b(segment_length(h), on);
167  segment_c(segment_length(h), on);
168  segment_f(segment_length(h), on);
169  segment_g(segment_length(h), on);
170 }
171
172 /* Draws 5 in a 7 segment digit
173  *  h    digit length
174  *  on   on-relief/low-relief flag
175  */
176 module digit7_5(h, on = true)
177 {
178  segment_a(segment_length(h), on);
179  segment_c(segment_length(h), on);
180  segment_d(segment_length(h), on);
181  segment_f(segment_length(h), on);
182  segment_g(segment_length(h), on);
183 }
184
185 /* Draws 6 in a 7 segment digit
186  *  h    digit length
187  *  on   on-relief/low-relief flag
188  */
189 module digit7_6(h, on = true)
190 {
191  segment_a(segment_length(h), on);
192  segment_c(segment_length(h), on);
193  segment_d(segment_length(h), on);
194  segment_e(segment_length(h), on);
195  segment_f(segment_length(h), on);
196  segment_g(segment_length(h), on);
197 }
198
199 /* Draws 7 in a 7 segment digit
200  *  h    digit length
201  *  on   on-relief/low-relief flag
202  */
203 module digit7_7(h, on = true)
204 {
205  segment_a(segment_length(h), on);
206  segment_b(segment_length(h), on);
207  segment_c(segment_length(h), on);
208 }
209
210 /* Draws 8 in a 7 segment digit
211  *  h    digit length
212  *  on   on-relief/low-relief flag
213  */
214 module digit7_8(h, on = true)
215 {
216  segment_a(segment_length(h), on);
217  segment_b(segment_length(h), on);
218  segment_c(segment_length(h), on);
219  segment_d(segment_length(h), on);
220  segment_e(segment_length(h), on);
221  segment_f(segment_length(h), on);
222  segment_g(segment_length(h), on);
223 }
224
225 /* Draws 9 in a 7 segment digit
226  *  h    digit length
227  *  on   on-relief/low-relief flag
228  */
229 module digit7_9(h, on = true)
230 {
231  segment_a(segment_length(h), on);
232  segment_b(segment_length(h), on);
233  segment_c(segment_length(h), on);
234  segment_f(segment_length(h), on);
235  segment_g(segment_length(h), on);
236 }
237
238 /* Draws A in a 7 segment digit
239  *  h    digit length
240  *  on   on-relief/low-relief flag
241  */
242 module digit7_A(h, on = true)
243 {
244  segment_a(segment_length(h), on);
245  segment_b(segment_length(h), on);
246  segment_c(segment_length(h), on);
247  segment_e(segment_length(h), on);
248  segment_f(segment_length(h), on);
249  segment_g(segment_length(h), on);
250 }
251
252 /* Draws b in a 7 segment digit
253  *  h    digit length
254  *  on   on-relief/low-relief flag
255  */
256 module digit7_B(h, on = true)
257 {
258  segment_c(segment_length(h), on);
259  segment_d(segment_length(h), on);
260  segment_e(segment_length(h), on);
261  segment_f(segment_length(h), on);
262  segment_g(segment_length(h), on);
263 }
264
265 /* Draws C in a 7 segment digit
266  *  h    digit length
267  *  on   on-relief/low-relief flag
268  */
269 module digit7_C(h, on = true)
270 {
271  segment_a(segment_length(h), on);
272  segment_d(segment_length(h), on);
273  segment_e(segment_length(h), on);
274  segment_f(segment_length(h), on);
275 }
276
277 /* Draws d in a 7 segment digit
278  *  h    digit length
279  *  on   on-relief/low-relief flag
280  */
281 module digit7_D(h, on = true)
282 {
283  segment_b(segment_length(h), on);
284  segment_c(segment_length(h), on);
285  segment_d(segment_length(h), on);
286  segment_e(segment_length(h), on);
287  segment_g(segment_length(h), on);
288 }
289
290 /* Draws E in a 7 segment digit
291  *  h    digit length
292  *  on   on-relief/low-relief flag
293  */
294 module digit7_E(h, on = true)
295 {
296  segment_a(segment_length(h), on);
297  segment_d(segment_length(h), on);
298  segment_e(segment_length(h), on);
299  segment_f(segment_length(h), on);
300  segment_g(segment_length(h), on);
301 }
302
303 /* Draws F in a 7 segment digit
304  *  h    digit length
305  *  on   on-relief/low-relief flag
306  */
307 module digit7_F(h, on = true)
308 {
309  segment_a(segment_length(h), on);
310  segment_e(segment_length(h), on);
311  segment_f(segment_length(h), on);
312  segment_g(segment_length(h), on);
313 }
314
315 /* Draws a decimal point in a 7 segment digit
316  *  h    digit length
317  *  on   on-relief/low-relief flag
318  */
319 module digit7_P(h, on = true)
320 {
321  segment_p(segment_length(h), on);
322 }
323
324 //---------------------------------------------------------------------------
325 // Examples
326 //---------------------------------------------------------------------------
327
328 ex_height = 100;        // Digit height for all examples
329
330 // Base for on-relief examples
331 translate(v = [ 0, 0, -2 * segment_radius(ex_height) ])
332   cube(size = [ (len("0123456789ABCDEF") + 2) * digit_spacing(ex_height)
333               , 5 * ex_height
334               , 2 * segment_radius(ex_height) 
335               ]);
336
337 // On relief examples
338 translate(v = [ digit_spacing(ex_height), 3.5 * ex_height, 0 ])
339   digit7_str("0123456789ABCDEF", ex_height);
340
341 translate(v = [ digit_spacing(ex_height), 2 * ex_height, 0 ])
342   digit7_int(65535, ex_height);
343
344 translate(v = [ digit_spacing(ex_height), 0.5 * ex_height, 0 ])
345   digit7_float(1234.56, ex_height);
346
347 // Low relief examples
348 // Low relief effect is performed by substracting from the base
349 translate(v = [ 0, -5 * ex_height, 0 ])
350   difference()
351   {
352     // Base for low-relief examples
353     translate(v = [ 0, 0, -2 * segment_radius(ex_height) ])
354       cube(size = [ (len("0123456789ABCDEF") + 2) * digit_spacing(ex_height)
355                   , 5 * ex_height
356                   , 2 * segment_radius(ex_height) 
357                   ]);
358
359     translate(v = [ digit_spacing(ex_height), 3.5 * ex_height, 0 ])
360       digit7_str("0123456789ABCDEF", ex_height, on = false);
361
362     translate(v = [ digit_spacing(ex_height), 2 * ex_height, 0 ])
363       digit7_int(65535, 100, on = false);
364
365     translate(v = [ digit_spacing(ex_height), 0.5 * ex_height, 0 ])
366       digit7_float(1234.56, 100, on = false);
367   }
368
369 /* EOF : digit7.scad */