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 * 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) * 1.5;
40 /* Draws A segment (top)
42 * on on-relief/low-relief flag
44 module segment_a(size, on = true)
46 translate(v = [ 0, digit_height(size), 0 ])
47 segment(size, on = on);
50 /* Draws A1 segment (top)
52 * on on-relief/low-relief flag
54 module segment_a1(size, on = true)
56 translate(v = [ 0, digit_height(size), 0 ])
57 segment(size /2 , r = segment_radius(size), on = on);
60 /* Draws A2 segment (top)
62 * on on-relief/low-relief flag
64 module segment_a2(size, on = true)
66 translate(v = [ size / 2, digit_height(size), 0 ])
67 segment(size /2 , r = segment_radius(size), on = on);
70 /* Draws B segment (right top)
72 * on on-relief/low-relief flag
74 module segment_b(size, on = true)
76 translate(v = [ 0, size, 0 ])
77 segment_c(size, on = on);
80 /* Draws C segment (right bottom)
82 * on on-relief/low-relief flag
84 module segment_c(size, on = true)
86 translate(v = [ size, size, 0 ])
87 rotate(a = [ 0, 0, 270 ])
88 segment(size, on = on);
91 /* Draws D segment (bottom)
93 * on on-relief/low-relief flag
95 module segment_d(size, on = true)
97 segment(size, on = on);
100 /* Draws D1 segment (top)
102 * on on-relief/low-relief flag
104 module segment_d1(size, on = true)
106 segment(size /2 , r = segment_radius(size), on = on);
109 /* Draws D2 segment (top)
111 * on on-relief/low-relief flag
113 module segment_d2(size, on = true)
115 translate(v = [ size / 2, 0, 0 ])
116 segment(size /2 , r = segment_radius(size), on = on);
119 /* Draws E segment (left bottom)
121 * on on-relief/low-relief flag
123 module segment_e(size, on = true)
125 rotate(a = [ 0, 0, 90 ])
126 segment(size, on = on);
129 /* Draws F segment (left top)
131 * on on-relief/low-relief flag
133 module segment_f(size, on = true)
135 translate(v = [ 0, size, 0 ])
136 segment_e(size, on = on);
139 /* Draws G segment (middle)
141 * on on-relief/low-relief flag
143 module segment_g(size, on = true)
145 translate(v = [ 0, size, 0 ])
146 segment_d(size, on = on);
149 /* Draws G1 segment (top)
151 * on on-relief/low-relief flag
153 module segment_g1(size, on = true)
155 translate(v = [ 0, size, 0 ])
156 segment(size /2 , r = segment_radius(size), on = on);
159 /* Draws G2 segment (top)
161 * on on-relief/low-relief flag
163 module segment_g2(size, on = true)
165 translate(v = [ size / 2, size, 0 ])
166 segment(size /2 , r = segment_radius(size), on = on);
169 /* Draws H segment (upper left diagonal)
171 * on on-relief/low-relief flag
173 module segment_h(size, on = true)
175 translate(v = [ size / 2, size, 0 ])
177 diag_segment(size, on = on);
180 /* Draws I segment (middle top)
182 * on on-relief/low-relief flag
184 module segment_i(size, on = true)
186 translate(v = [ -size / 2, 0, 0 ])
187 segment_b(size, on = on);
190 /* Draws J segment (upper right diagonal)
192 * on on-relief/low-relief flag
194 module segment_j(size, on = true)
196 translate(v = [ size / 2, size, 0 ])
197 diag_segment(size, on = on);
200 /* Draws K segment (lower right diagonal)
202 * on on-relief/low-relief flag
204 module segment_k(size, on = true)
206 translate(v = [ size, 0, 0 ])
208 diag_segment(size, on = on);
211 /* Draws L segment (middle bottom)
213 * on on-relief/low-relief flag
215 module segment_l(size, on = true)
217 translate(v = [ -size / 2, 0, 0 ])
218 segment_c(size, on = on);
221 /* Draws M segment (lower left diagonal)
223 * on on-relief/low-relief flag
225 module segment_m(size, on = true)
227 diag_segment(size, on = on);
231 * Draws a decimal point
232 * digit_size whole digit size
233 * on on-relief/low-relief flag
235 module segment_dp(digit_size, on = true)
237 radius = segment_radius(segment_length(digit_size));
240 polyhedron(points = [ [ 0, 0, 0 ]
241 , [ 0, 2 * radius, 0 ]
242 , [ 2 * radius, 2 * radius, 0 ]
243 , [ 2 * radius, 0, 0 ]
244 , [ radius, radius, radius ]
246 , triangles = [ [ 0, 1, 4 ]
254 polyhedron(points = [ [ 0, 0, 0 ]
255 , [ 0, 2 * radius, 0 ]
256 , [ 2 * radius, 2 * radius, 0 ]
257 , [ 2 * radius, 0, 0 ]
258 , [ radius, radius, -radius ]
260 , triangles = [ [ 0, 1, 4 ]
267 cube(size= [ 2 * radius, 2 * radius, radius ], center = false);
271 //---------------------------------------------------------------------------
272 // End of public modules - Just jump to the examples
273 //---------------------------------------------------------------------------
275 /* Draws a single segment
277 * r segment radius (default = segment_radius(h))
278 * on on-relief/low-relief flag
280 module segment(size, r = 0, on = true)
282 radius = (r == 0) ? segment_radius(size) : r;
283 length = (size > 2 * radius) ? size - 2 * radius : 0;
286 polyhedron(points = [ [ 0, 0, 0 ]
287 , [ radius , radius, 0 ]
288 , [ radius + length, radius, 0 ]
289 , [ 2 * radius + length, 0, 0 ]
290 , [ radius + length, -radius, 0 ]
291 , [ radius , -radius, 0 ]
292 , [ radius , 0, radius ]
293 , [ radius + length, 0, radius ]
295 , triangles = [ [ 0, 1, 6 ]
309 polyhedron(points = [ [ 0, 0, 0 ]
310 , [ radius , radius, 0 ]
311 , [ radius + length, radius, 0 ]
312 , [ 2 * radius + length, 0, 0 ]
313 , [ radius + length, -radius, 0 ]
314 , [ radius , -radius, 0 ]
315 , [ radius , 0, -radius ]
316 , [ radius + length, 0, -radius ]
318 , triangles = [ [ 0, 1, 6 ]
331 linear_extrude(height = radius)
332 polygon(points = [ [ 0 , 0]
333 , [ radius , radius ]
334 , [ radius + length, radius ]
335 , [ 2 * radius + length, 0 ]
336 , [ radius + length, -radius ]
337 , [ radius , -radius ]
339 , paths = [ [ 0, 1, 2, 3, 4, 5 ] ]);
343 /* Draws a diagonal segment
345 * r segment radius (default = segment_radius(h))
346 * on on-relief/low-relief flag
348 module diag_segment(size, r = 0, on = true)
350 radius = (r == 0) ? segment_radius(size) : r;
351 length = (size > 2 * radius) ? size - 2 * radius : 0;
354 polyhedron(points = [ [ radius, radius, 0 ]
355 , [ radius, 2.41 * radius, 0 ]
356 , [ size / 2 - 2.41 * radius, size - radius, 0 ]
357 , [ size / 2 - radius, size - radius, 0 ]
358 , [ size / 2 - radius, size - 2.41 * radius, 0 ]
359 , [ 2.41 * radius, radius, 0 ]
360 , [ 1.70 * radius, 1.70 * radius, radius ]
361 , [ size / 2 - 1.70 * radius, size - 1.70 * radius, radius ]
363 , triangles = [ [ 0, 1, 6 ]
377 polyhedron(points = [ [ radius, radius, 0 ]
378 , [ radius, 2.41 * radius, 0 ]
379 , [ size / 2 - 2.41 * radius, size - radius, 0 ]
380 , [ size / 2 - radius, size - radius, 0 ]
381 , [ size / 2 - radius, size - 2.41 * radius, 0 ]
382 , [ 2.41 * radius, radius, 0 ]
383 , [ 1.70 * radius, 1.70 * radius, -radius ]
384 , [ size / 2 - 1.70 * radius, size - 1.70 * radius, -radius ]
386 , triangles = [ [ 0, 1, 6 ]
399 linear_extrude(height = radius)
400 polygon(points = [ [ radius, radius ]
401 , [ radius, 2.41 * radius ]
402 , [ size / 2 - 2.41 * radius, size - radius ]
403 , [ size / 2 - radius, size - radius ]
404 , [ size / 2 - radius, size - 2.41 * radius ]
405 , [ 2.41 * radius, radius ]
407 , paths = [ [ 0, 1, 2, 3, 4, 5 ] ]);
411 //---------------------------------------------------------------------------
413 //---------------------------------------------------------------------------
415 ex_seglen = 100; // segment length for all examples
417 // Base for on-relief examples
419 , -2 * digit_height(ex_seglen)
420 , -2 * segment_radius(digit_height(ex_seglen)) ])
421 cube(size = [ 2 * digit_spacing(digit_height(ex_seglen))
422 , 4 * digit_height(ex_seglen)
423 , 2 * segment_radius(digit_height(ex_seglen))
426 // On relief examples
428 // 7 segment on-relief example
429 translate(v = [ digit_spacing(digit_height(ex_seglen)) / 2
430 , digit_height(ex_seglen) / 2
433 segment_a(ex_seglen);
434 segment_b(ex_seglen);
435 segment_c(ex_seglen);
436 segment_d(ex_seglen);
437 segment_e(ex_seglen);
438 segment_f(ex_seglen);
439 segment_g(ex_seglen);
440 translate(v = [ digit_spacing(digit_height(ex_seglen)), 0, 0 ])
441 segment_dp(digit_height(ex_seglen));
444 // 16 segment on-relief example
445 translate(v = [ digit_spacing(digit_height(ex_seglen)) / 2
446 , -1.5 * digit_height(ex_seglen)
449 segment_a1(ex_seglen);
450 segment_a2(ex_seglen);
451 segment_b(ex_seglen);
452 segment_c(ex_seglen);
453 segment_d1(ex_seglen);
454 segment_d2(ex_seglen);
455 segment_e(ex_seglen);
456 segment_f(ex_seglen);
457 segment_g1(ex_seglen);
458 segment_g2(ex_seglen);
459 segment_h(ex_seglen);
460 segment_i(ex_seglen);
461 segment_j(ex_seglen);
462 segment_k(ex_seglen);
463 segment_l(ex_seglen);
464 segment_m(ex_seglen);
465 translate(v = [ digit_spacing(digit_height(ex_seglen)), 0, 0 ])
466 segment_dp(digit_height(ex_seglen));
469 // Low relief examples
470 // Low relief effect is performed by substracting from the base
471 translate(v = [ 2 * digit_spacing(digit_height(ex_seglen)), 0, 0 ])
474 // Base for low-relief examples
476 , -2 * digit_height(ex_seglen)
477 , -2 * segment_radius(digit_height(ex_seglen)) ])
478 cube(size = [ 2 * digit_spacing(digit_height(ex_seglen))
479 , 4 * digit_height(ex_seglen)
480 , 2 * segment_radius(digit_height(ex_seglen))
483 // 7 segment low-relief example
484 translate(v = [ digit_spacing(digit_height(ex_seglen)) / 2
485 , digit_height(ex_seglen) / 2
488 segment_a(ex_seglen, on = false);
489 segment_b(ex_seglen, on = false);
490 segment_c(ex_seglen, on = false);
491 segment_d(ex_seglen, on = false);
492 segment_e(ex_seglen, on = false);
493 segment_f(ex_seglen, on = false);
494 segment_g(ex_seglen, on = false);
495 translate(v = [ digit_spacing(digit_height(ex_seglen)), 0, 0 ])
496 segment_dp(digit_height(ex_seglen));
499 // 16 segment on-relief example
500 translate(v = [ digit_spacing(digit_height(ex_seglen)) / 2
501 , -1.5 * digit_height(ex_seglen)
504 segment_a1(ex_seglen, on = false);
505 segment_a2(ex_seglen, on = false);
506 segment_b(ex_seglen, on = false);
507 segment_c(ex_seglen, on = false);
508 segment_d1(ex_seglen, on = false);
509 segment_d2(ex_seglen, on = false);
510 segment_e(ex_seglen, on = false);
511 segment_f(ex_seglen, on = false);
512 segment_g1(ex_seglen, on = false);
513 segment_g2(ex_seglen, on = false);
514 segment_h(ex_seglen, on = false);
515 segment_i(ex_seglen, on = false);
516 segment_j(ex_seglen, on = false);
517 segment_k(ex_seglen, on = false);
518 segment_l(ex_seglen, on = false);
519 segment_m(ex_seglen, on = false);
520 translate(v = [ digit_spacing(digit_height(ex_seglen)), 0, 0 ])
521 segment_dp(digit_height(ex_seglen), on = false);
526 /* EOF : seg_digit.scad */