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