2 * seg_digit.scad : 7 segment and 16 segment digit generation library
4 * Author : Jose Ignacio Croce Busquets <jose@crossforests.com>
9 * The module contains the following public methods
11 * segment_a(size, on = true)
12 * segment_b(size, on = true)
13 * segment_c(size, on = true)
14 * segment_d(size, on = true)
15 * segment_e(size, on = true)
16 * segment_f(size, on = true)
17 * segment_g(size, on = true) Write the corresponding segment from a 7
20 * on = on-relief/low-relief flag
22 * segment_dp(digit_size, on = true)
23 * Write the decimal point for a 7 segment display
24 * digit_size = whole digit size
25 * on = on-relief/low-relief flag
28 /* Segment length based on digit height */
29 function segment_length(height) = height / 2;
31 /* digit height based on segment length */
32 function digit_height(seglen) = 2 * seglen;
34 /* Segment radius based on segment length */
35 function segment_radius(seglen) = seglen / 10;
37 /* Position (horiz) for next digit based on digit length */
38 function digit_spacing(height) = segment_length(height)
39 + 6 * segment_radius(segment_length(height));
41 /* Draws A segment (top)
43 * on on-relief/low-relief flag
45 module segment_a(size, on = true)
47 translate(v = [ 0, digit_height(size), 0 ])
48 segment(size, on = on);
51 /* Draws A1 segment (top)
53 * on on-relief/low-relief flag
55 module segment_a1(size, on = true)
57 translate(v = [ 0, digit_height(size), 0 ])
58 segment(size /2 , r = segment_radius(size), on = on);
61 /* Draws A2 segment (top)
63 * on on-relief/low-relief flag
65 module segment_a2(size, on = true)
67 translate(v = [ size / 2, digit_height(size), 0 ])
68 segment(size /2 , r = segment_radius(size), on = on);
71 /* Draws B segment (right top)
73 * on on-relief/low-relief flag
75 module segment_b(size, on = true)
77 translate(v = [ 0, size, 0 ])
78 segment_c(size, on = on);
81 /* Draws C segment (right bottom)
83 * on on-relief/low-relief flag
85 module segment_c(size, on = true)
87 translate(v = [ size, size, 0 ])
88 rotate(a = [ 0, 0, 270 ])
89 segment(size, on = on);
92 /* Draws D segment (bottom)
94 * on on-relief/low-relief flag
96 module segment_d(size, on = true)
98 segment(size, on = on);
101 /* Draws D1 segment (top)
103 * on on-relief/low-relief flag
105 module segment_d1(size, on = true)
107 segment(size /2 , r = segment_radius(size), on = on);
110 /* Draws D2 segment (top)
112 * on on-relief/low-relief flag
114 module segment_d2(size, on = true)
116 translate(v = [ size / 2, 0, 0 ])
117 segment(size /2 , r = segment_radius(size), on = on);
120 /* Draws E segment (left bottom)
122 * on on-relief/low-relief flag
124 module segment_e(size, on = true)
126 rotate(a = [ 0, 0, 90 ])
127 segment(size, on = on);
130 /* Draws F segment (left top)
132 * on on-relief/low-relief flag
134 module segment_f(size, on = true)
136 translate(v = [ 0, size, 0 ])
137 segment_e(size, on = on);
140 /* Draws G segment (middle)
142 * on on-relief/low-relief flag
144 module segment_g(size, on = true)
146 translate(v = [ 0, size, 0 ])
147 segment_d(size, on = on);
150 /* Draws G1 segment (top)
152 * on on-relief/low-relief flag
154 module segment_g1(size, on = true)
156 translate(v = [ 0, size, 0 ])
157 segment(size /2 , r = segment_radius(size), on = on);
160 /* Draws G2 segment (top)
162 * on on-relief/low-relief flag
164 module segment_g2(size, on = true)
166 translate(v = [ size / 2, size, 0 ])
167 segment(size /2 , r = segment_radius(size), on = on);
170 /* Draws H segment (upper left diagonal)
172 * on on-relief/low-relief flag
174 module segment_h(size, on = true)
176 translate(v = [ size / 2, size, 0 ])
178 diag_segment(size, on = on);
181 /* Draws I segment (middle top)
183 * on on-relief/low-relief flag
185 module segment_i(size, on = true)
187 translate(v = [ -size / 2, 0, 0 ])
188 segment_b(size, on = on);
191 /* Draws J segment (upper right diagonal)
193 * on on-relief/low-relief flag
195 module segment_j(size, on = true)
197 translate(v = [ size / 2, size, 0 ])
198 diag_segment(size, on = on);
201 /* Draws K segment (lower right diagonal)
203 * on on-relief/low-relief flag
205 module segment_k(size, on = true)
207 translate(v = [ size, 0, 0 ])
209 diag_segment(size, on = on);
212 /* Draws L segment (middle bottom)
214 * on on-relief/low-relief flag
216 module segment_l(size, on = true)
218 translate(v = [ -size / 2, 0, 0 ])
219 segment_c(size, on = on);
222 /* Draws M segment (lower left diagonal)
224 * on on-relief/low-relief flag
226 module segment_m(size, on = true)
228 diag_segment(size, on = on);
232 * Place the decimal point at the end of the character
234 * on on-relief/low-relief flag
236 module segment_p(size, on = true)
238 radius = segment_radius(size);
239 translate(v = [ size + radius, 0, 0 ])
240 decimal_point(size, on = on);
243 //---------------------------------------------------------------------------
244 // End of public modules - Just jump to the examples
245 //---------------------------------------------------------------------------
248 * Draws a decimal point
250 * on on-relief/low-relief flag
252 module decimal_point(size, on = true)
254 radius = segment_radius(size);
257 translate(v = [ radius, 0, 0 ])
258 polyhedron(points = [ [ -radius, -radius, 0 ]
259 , [ -radius, radius, 0 ]
260 , [ radius, radius, 0 ]
261 , [ radius, -radius, 0 ]
264 , triangles = [ [ 0, 1, 4 ]
272 translate(v = [ radius, 0, 0 ])
274 polyhedron(points = [ [ -radius, -radius, 0 ]
275 , [ -radius, radius, 0 ]
276 , [ radius, radius, 0 ]
277 , [ radius, -radius, 0 ]
280 , triangles = [ [ 0, 4, 1 ]
287 translate(v = [ 0, 0, radius / 2 ])
288 cube(size= [ 2 * radius, 2 * radius, radius ], center = true);
293 /* Draws a single segment
295 * r segment radius (default = segment_radius(h))
296 * on on-relief/low-relief flag
298 module segment(size, r = 0, on = true)
300 radius = (r == 0) ? segment_radius(size) : r;
301 length = (size > 2 * radius) ? size - 2 * radius : 0;
304 polyhedron(points = [ [ 0, 0, 0 ]
305 , [ radius , radius, 0 ]
306 , [ radius + length, radius, 0 ]
307 , [ 2 * radius + length, 0, 0 ]
308 , [ radius + length, -radius, 0 ]
309 , [ radius , -radius, 0 ]
310 , [ radius , 0, radius ]
311 , [ radius + length, 0, radius ]
313 , triangles = [ [ 0, 1, 6 ]
327 polyhedron(points = [ [ 0, 0, 0 ]
328 , [ radius , radius, 0 ]
329 , [ radius + length, radius, 0 ]
330 , [ 2 * radius + length, 0, 0 ]
331 , [ radius + length, -radius, 0 ]
332 , [ radius , -radius, 0 ]
333 , [ radius , 0, -radius ]
334 , [ radius + length, 0, -radius ]
336 , triangles = [ [ 0, 6, 1 ]
349 linear_extrude(height = radius)
350 polygon(points = [ [ 0 , 0]
351 , [ radius , radius ]
352 , [ radius + length, radius ]
353 , [ 2 * radius + length, 0 ]
354 , [ radius + length, -radius ]
355 , [ radius , -radius ]
357 , paths = [ [ 0, 1, 2, 3, 4, 5 ] ]);
361 /* Draws a diagonal segment
363 * r segment radius (default = segment_radius(h))
364 * on on-relief/low-relief flag
366 module diag_segment(size, r = 0, on = true)
368 radius = (r == 0) ? segment_radius(size) : r;
369 length = (size > 2 * radius) ? size - 2 * radius : 0;
372 polyhedron(points = [
373 [ radius, radius, 0 ]
374 , [ radius, 2.41 * radius, 0 ]
375 , [ size / 2 - 2.41 * radius, size - radius, 0 ]
376 , [ size / 2 - radius, size - radius, 0 ]
377 , [ size / 2 - radius, size - 2.41 * radius, 0 ]
378 , [ 2.41 * radius, radius, 0 ]
379 , [ 1.70 * radius, 1.70 * radius, radius ]
380 , [ size / 2 - 1.70 * radius, size - 1.70 * radius, radius ]
382 , triangles = [ [ 0, 1, 6 ]
396 polyhedron(points = [
397 [ radius, radius, 0 ]
398 , [ radius, 2.41 * radius, 0 ]
399 , [ size / 2 - 2.41 * radius, size - radius, 0 ]
400 , [ size / 2 - radius, size - radius, 0 ]
401 , [ size / 2 - radius, size - 2.41 * radius, 0 ]
402 , [ 2.41 * radius, radius, 0 ]
403 , [ 1.70 * radius, 1.70 * radius, -radius ]
404 , [ size / 2 - 1.70 * radius, size - 1.70 * radius, -radius ]
406 , triangles = [ [ 0, 1, 6 ]
419 linear_extrude(height = radius)
420 polygon(points = [ [ radius, radius ]
421 , [ radius, 2.41 * radius ]
422 , [ size / 2 - 2.41 * radius, size - radius ]
423 , [ size / 2 - radius, size - radius ]
424 , [ size / 2 - radius, size - 2.41 * radius ]
425 , [ 2.41 * radius, radius ]
427 , paths = [ [ 0, 1, 2, 3, 4, 5 ] ]);
431 //---------------------------------------------------------------------------
433 //---------------------------------------------------------------------------
435 ex_seglen = 100; // segment length for all examples
437 // Base for on-relief examples
439 , -2 * digit_height(ex_seglen)
440 , -2 * segment_radius(digit_height(ex_seglen)) ])
441 cube(size = [ 2 * digit_spacing(digit_height(ex_seglen))
442 , 4 * digit_height(ex_seglen)
443 , 2 * segment_radius(digit_height(ex_seglen))
446 // On relief examples
448 // 7 segment on-relief example
449 translate(v = [ digit_spacing(digit_height(ex_seglen)) / 2
450 , digit_height(ex_seglen) / 2
453 segment_a(ex_seglen);
454 segment_b(ex_seglen);
455 segment_c(ex_seglen);
456 segment_d(ex_seglen);
457 segment_e(ex_seglen);
458 segment_f(ex_seglen);
459 segment_g(ex_seglen);
460 segment_p(ex_seglen);
463 // 16 segment on-relief example
464 translate(v = [ digit_spacing(digit_height(ex_seglen)) / 2
465 , -1.5 * digit_height(ex_seglen)
468 segment_a1(ex_seglen);
469 segment_a2(ex_seglen);
470 segment_b(ex_seglen);
471 segment_c(ex_seglen);
472 segment_d1(ex_seglen);
473 segment_d2(ex_seglen);
474 segment_e(ex_seglen);
475 segment_f(ex_seglen);
476 segment_g1(ex_seglen);
477 segment_g2(ex_seglen);
478 segment_h(ex_seglen);
479 segment_i(ex_seglen);
480 segment_j(ex_seglen);
481 segment_k(ex_seglen);
482 segment_l(ex_seglen);
483 segment_m(ex_seglen);
484 segment_p(ex_seglen);
487 // Low relief examples
488 // Low relief effect is performed by substracting from the base
489 translate(v = [ 2 * digit_spacing(digit_height(ex_seglen)), 0, 0 ])
492 // Base for low-relief examples
494 , -2 * digit_height(ex_seglen)
495 , -2 * segment_radius(digit_height(ex_seglen)) ])
496 cube(size = [ 2 * digit_spacing(digit_height(ex_seglen))
497 , 4 * digit_height(ex_seglen)
498 , 2 * segment_radius(digit_height(ex_seglen))
501 // 7 segment low-relief example
502 translate(v = [ digit_spacing(digit_height(ex_seglen)) / 2
503 , digit_height(ex_seglen) / 2
506 segment_a(ex_seglen, on = false);
507 segment_b(ex_seglen, on = false);
508 segment_c(ex_seglen, on = false);
509 segment_d(ex_seglen, on = false);
510 segment_e(ex_seglen, on = false);
511 segment_f(ex_seglen, on = false);
512 segment_g(ex_seglen, on = false);
513 segment_p(ex_seglen, on = false);
516 // 16 segment on-relief example
517 translate(v = [ digit_spacing(digit_height(ex_seglen)) / 2
518 , -1.5 * digit_height(ex_seglen)
521 segment_a1(ex_seglen, on = false);
522 segment_a2(ex_seglen, on = false);
523 segment_b(ex_seglen, on = false);
524 segment_c(ex_seglen, on = false);
525 segment_d1(ex_seglen, on = false);
526 segment_d2(ex_seglen, on = false);
527 segment_e(ex_seglen, on = false);
528 segment_f(ex_seglen, on = false);
529 segment_g1(ex_seglen, on = false);
530 segment_g2(ex_seglen, on = false);
531 segment_h(ex_seglen, on = false);
532 segment_i(ex_seglen, on = false);
533 segment_j(ex_seglen, on = false);
534 segment_k(ex_seglen, on = false);
535 segment_l(ex_seglen, on = false);
536 segment_m(ex_seglen, on = false);
537 segment_p(ex_seglen, on = false);
542 /* EOF : seg_digit.scad */