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