2 * seg_digit.scad : 7 segment and 16 segment digit generation library
4 * Author : Jose Ignacio Croce Busquets <jose.croce@gmail.com>
9 * The module contains the following public methods
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.
21 /* Segment length based on digit height */
22 function segment_length(height) = height / 2;
24 /* digit height based on segment length */
25 function digit_height(seglen) = 2 * seglen;
27 /* Segment radius based on segment length */
28 function segment_radius(seglen) = seglen / 10;
30 /* Position (horiz) for next digit based on digit length */
31 function digit_spacing(height) = segment_length(height) * 1.5;
34 * Creates a 7 segment display for the given string
35 * s String to display. Characters should be within "0"-"9", "A"-"F",
36 * "a"-"f" ranges. Otherwise nothing is shown.
38 * on on-relief/low-relief flag
40 module digit7_str(s, h, on = true)
42 for(i = [ 0 : len(s) ])
44 translate(v = [ i * digit_spacing(h), 0, 0 ])
45 put_digit7(s[i], h, on);
50 * Creates a 7 segment display for an integer value (decimal)
53 * on on-relief/low-relief flag
55 module digit7_int(v, h, on = true)
57 digit7_str(str(v), h, on);
61 * Creates a 7 segment display for a float value
64 * on on-relief/low-relief flag
66 module digit7_float(v, h, on = true)
69 if (search(".", s)[0] == undef) {
70 digit7_str(s, h, on); // integer value
72 for (i = [ 0 : search(".", s)[0] - 1 ]) {
73 translate(v = [ i * digit_spacing(h), 0, 0 ])
74 put_digit7(s[i], h, on);
76 translate(v = [ search(".", s)[0] * digit_spacing(h), 0, 0 ])
78 for (i = [ search(".", s)[0] : len(s) ]) {
79 translate(v = [ (i - 1) * digit_spacing(h) + segment_length(h) * 0.5
82 put_digit7(s[i], h, on);
88 * Creates a 7 segment display for the given character
89 * c Character to display. Should be within "0"-"9", "A"-"F", "a"-"f"
90 * ranges. Otherwise nothing is shown.
92 * on on-relief/low-relief flag
94 module put_digit7(c, h, on = true)
96 if (c == "0") digit7_0(h, on);
97 if (c == "1") digit7_1(h, on);
98 if (c == "2") digit7_2(h, on);
99 if (c == "3") digit7_3(h, on);
100 if (c == "4") digit7_4(h, on);
101 if (c == "5") digit7_5(h, on);
102 if (c == "6") digit7_6(h, on);
103 if (c == "7") digit7_7(h, on);
104 if (c == "8") digit7_8(h, on);
105 if (c == "9") digit7_9(h, on);
106 if (c == "A" || c == "a") digit7_A(h, on);
107 if (c == "B" || c == "b") digit7_B(h, on);
108 if (c == "C" || c == "c") digit7_C(h, on);
109 if (c == "D" || c == "d") digit7_D(h, on);
110 if (c == "E" || c == "e") digit7_E(h, on);
111 if (c == "F" || c == "f") digit7_F(h, on);
114 //---------------------------------------------------------------------------
115 // End of public modules - Just jump to the examples
116 //---------------------------------------------------------------------------
118 /* Draws a single segment
120 * r segment radius (default = segment_radius(h))
121 * on on-relief/low-relief flag
123 module segment(h, r = 0, on = true)
125 radius = (r == 0) ? segment_radius(h) : r;
126 length = (h > 2 * radius) ? h - 2 * radius : 0;
129 polyhedron(points = [ [ 0, 0, 0 ]
130 , [ radius , radius, 0 ]
131 , [ radius + length, radius, 0 ]
132 , [ 2 * radius + length, 0, 0 ]
133 , [ radius + length, -radius, 0 ]
134 , [ radius , -radius, 0 ]
135 , [ radius , 0, radius ]
136 , [ radius + length, 0, radius ]
138 , triangles = [ [ 0, 1, 6 ]
152 polyhedron(points = [ [ 0, 0, 0 ]
153 , [ radius , radius, 0 ]
154 , [ radius + length, radius, 0 ]
155 , [ 2 * radius + length, 0, 0 ]
156 , [ radius + length, -radius, 0 ]
157 , [ radius , -radius, 0 ]
158 , [ radius , 0, -radius ]
159 , [ radius + length, 0, -radius ]
161 , triangles = [ [ 0, 1, 6 ]
174 linear_extrude(height = radius)
175 polygon(points = [ [ 0 , 0]
176 , [ radius , radius ]
177 , [ radius + length, radius ]
178 , [ 2 * radius + length, 0 ]
179 , [ radius + length, -radius ]
180 , [ radius , -radius ]
182 , paths = [ [ 0, 1, 2, 3, 4, 5 ] ]);
187 * Draws a decimal point
189 * on on-relief/low-relief flag
191 module segment_dp(h, on = true)
193 radius = segment_radius(segment_length(h));
196 polyhedron(points = [ [ 0, 0, 0 ]
197 , [ 0, 2 * radius, 0 ]
198 , [ 2 * radius, 2 * radius, 0 ]
199 , [ 2 * radius, 0, 0 ]
200 , [ radius, radius, radius ]
202 , triangles = [ [ 0, 1, 4 ]
210 polyhedron(points = [ [ 0, 0, 0 ]
211 , [ 0, 2 * radius, 0 ]
212 , [ 2 * radius, 2 * radius, 0 ]
213 , [ 2 * radius, 0, 0 ]
214 , [ radius, radius, -radius ]
216 , triangles = [ [ 0, 1, 4 ]
223 cube(size= [ 2 * radius, 2 * radius, radius ], center = false);
227 /* Draws A segment (top)
229 * on on-relief/low-relief flag
231 module segment_a(h, on = true)
233 translate(v = [ 0, digit_height(h), 0 ])
237 /* Draws B segment (right top)
239 * on on-relief/low-relief flag
241 module segment_b(h, on = true)
243 translate(v = [ 0, h, 0 ])
244 segment_c(h, on = on);
247 /* Draws C segment (right bottom)
249 * on on-relief/low-relief flag
251 module segment_c(h, on = true)
253 translate(v = [ h, h, 0 ])
254 rotate(a = [ 0, 0, 270 ])
258 /* Draws D segment (bottom)
260 * on on-relief/low-relief flag
262 module segment_d(h, on = true)
267 /* Draws E segment (left bottom)
269 * on on-relief/low-relief flag
271 module segment_e(h, on = true)
273 rotate(a = [ 0, 0, 90 ])
277 /* Draws F segment (left top)
279 * on on-relief/low-relief flag
281 module segment_f(h, on = true)
283 translate(v = [ 0, h, 0 ])
284 segment_e(h, on = on);
287 /* Draws G segment (middle)
289 * on on-relief/low-relief flag
291 module segment_g(h, on = true)
293 translate(v = [ 0, h, 0 ])
294 segment_d(h, on = on);
297 /* Draws 0 in a 7 segment digit
299 * on on-relief/low-relief flag
301 module digit7_0(h, on = true)
303 segment_a(segment_length(h), on);
304 segment_b(segment_length(h), on);
305 segment_c(segment_length(h), on);
306 segment_d(segment_length(h), on);
307 segment_e(segment_length(h), on);
308 segment_f(segment_length(h), on);
311 /* Draws 1 in a 7 segment digit
313 * on on-relief/low-relief flag
315 module digit7_1(h, on = true)
317 segment_b(segment_length(h), on);
318 segment_c(segment_length(h), on);
321 /* Draws 2 in a 7 segment digit
323 * on on-relief/low-relief flag
325 module digit7_2(h, on = true)
327 segment_a(segment_length(h), on);
328 segment_b(segment_length(h), on);
329 segment_d(segment_length(h), on);
330 segment_e(segment_length(h), on);
331 segment_g(segment_length(h), on);
334 /* Draws 3 in a 7 segment digit
336 * on on-relief/low-relief flag
338 module digit7_3(h, on = true)
340 segment_a(segment_length(h), on);
341 segment_b(segment_length(h), on);
342 segment_c(segment_length(h), on);
343 segment_d(segment_length(h), on);
344 segment_g(segment_length(h), on);
347 /* Draws 4 in a 7 segment digit
349 * on on-relief/low-relief flag
351 module digit7_4(h, on = true)
353 segment_b(segment_length(h), on);
354 segment_c(segment_length(h), on);
355 segment_f(segment_length(h), on);
356 segment_g(segment_length(h), on);
359 /* Draws 5 in a 7 segment digit
361 * on on-relief/low-relief flag
363 module digit7_5(h, on = true)
365 segment_a(segment_length(h), on);
366 segment_c(segment_length(h), on);
367 segment_d(segment_length(h), on);
368 segment_f(segment_length(h), on);
369 segment_g(segment_length(h), on);
372 /* Draws 6 in a 7 segment digit
374 * on on-relief/low-relief flag
376 module digit7_6(h, on = true)
378 segment_a(segment_length(h), on);
379 segment_c(segment_length(h), on);
380 segment_d(segment_length(h), on);
381 segment_e(segment_length(h), on);
382 segment_f(segment_length(h), on);
383 segment_g(segment_length(h), on);
386 /* Draws 7 in a 7 segment digit
388 * on on-relief/low-relief flag
390 module digit7_7(h, on = true)
392 segment_a(segment_length(h), on);
393 segment_b(segment_length(h), on);
394 segment_c(segment_length(h), on);
397 /* Draws 8 in a 7 segment digit
399 * on on-relief/low-relief flag
401 module digit7_8(h, on = true)
403 segment_a(segment_length(h), on);
404 segment_b(segment_length(h), on);
405 segment_c(segment_length(h), on);
406 segment_d(segment_length(h), on);
407 segment_e(segment_length(h), on);
408 segment_f(segment_length(h), on);
409 segment_g(segment_length(h), on);
412 /* Draws 9 in a 7 segment digit
414 * on on-relief/low-relief flag
416 module digit7_9(h, on = true)
418 segment_a(segment_length(h), on);
419 segment_b(segment_length(h), on);
420 segment_c(segment_length(h), on);
421 segment_f(segment_length(h), on);
422 segment_g(segment_length(h), on);
425 /* Draws A in a 7 segment digit
427 * on on-relief/low-relief flag
429 module digit7_A(h, on = true)
431 segment_a(segment_length(h), on);
432 segment_b(segment_length(h), on);
433 segment_c(segment_length(h), on);
434 segment_e(segment_length(h), on);
435 segment_f(segment_length(h), on);
436 segment_g(segment_length(h), on);
439 /* Draws b in a 7 segment digit
441 * on on-relief/low-relief flag
443 module digit7_B(h, on = true)
445 segment_c(segment_length(h), on);
446 segment_d(segment_length(h), on);
447 segment_e(segment_length(h), on);
448 segment_f(segment_length(h), on);
449 segment_g(segment_length(h), on);
452 /* Draws C in a 7 segment digit
454 * on on-relief/low-relief flag
456 module digit7_C(h, on = true)
458 segment_a(segment_length(h), on);
459 segment_d(segment_length(h), on);
460 segment_e(segment_length(h), on);
461 segment_f(segment_length(h), on);
464 /* Draws d in a 7 segment digit
466 * on on-relief/low-relief flag
468 module digit7_D(h, on = true)
470 segment_b(segment_length(h), on);
471 segment_c(segment_length(h), on);
472 segment_d(segment_length(h), on);
473 segment_e(segment_length(h), on);
474 segment_g(segment_length(h), on);
477 /* Draws E in a 7 segment digit
479 * on on-relief/low-relief flag
481 module digit7_E(h, on = true)
483 segment_a(segment_length(h), on);
484 segment_d(segment_length(h), on);
485 segment_e(segment_length(h), on);
486 segment_f(segment_length(h), on);
487 segment_g(segment_length(h), on);
490 /* Draws F in a 7 segment digit
492 * on on-relief/low-relief flag
494 module digit7_F(h, on = true)
496 segment_a(segment_length(h), on);
497 segment_e(segment_length(h), on);
498 segment_f(segment_length(h), on);
499 segment_g(segment_length(h), on);
502 //---------------------------------------------------------------------------
504 //---------------------------------------------------------------------------
506 ex_height = 100; // Digit height for all examples
508 // Base for on-relief examples
509 translate(v = [ 0, 0, -2 * segment_radius(ex_height) ])
510 cube(size = [ (len("0123456789ABCDEF") + 2) * digit_spacing(ex_height)
512 , 2 * segment_radius(ex_height)
515 // On relief examples
516 translate(v = [ digit_spacing(ex_height), 3.5 * ex_height, 0 ])
517 digit7_str("0123456789ABCDEF", ex_height);
519 translate(v = [ digit_spacing(ex_height), 2 * ex_height, 0 ])
520 digit7_int(65535, ex_height);
522 translate(v = [ digit_spacing(ex_height), 0.5 * ex_height, 0 ])
523 digit7_float(123.45, ex_height);
525 // Low relief examples
526 // Low relief effect is performed by substracting from the base
527 translate(v = [ 0, -5 * ex_height, 0 ])
530 // Base for low-relief examples
531 translate(v = [ 0, 0, -2 * segment_radius(ex_height) ])
532 cube(size = [ (len("0123456789ABCDEF") + 2) * digit_spacing(ex_height)
534 , 2 * segment_radius(ex_height)
537 translate(v = [ digit_spacing(ex_height), 3.5 * ex_height, 0 ])
538 digit7_str("0123456789ABCDEF", ex_height, on = false);
540 translate(v = [ digit_spacing(ex_height), 2 * ex_height, 0 ])
541 digit7_int(65535, 100, on = false);
543 translate(v = [ digit_spacing(ex_height), 0.5 * ex_height, 0 ])
544 digit7_float(123.45, 100, on = false);
547 /* EOF : seg_digit.scad */