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