Copyright notice inclussion
[3dmodels/seg_digit.git] / digit7.scad
1 /*
2  * digit7.scad : 7 segment digit generation library
3  * 
4  * Author : Jose Ignacio Croce Busquets <jose@crossforests.com>
5  *
6  * Date : 08-DEC-2013
7  *
8  * Copyright 2014, 2015 Jose Ignacio Croce Busquets
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
22  *
23  * Usage
24  * The module contains the following public methods
25  *
26  * digit7_str(s, h, on)
27  *                     Writes a string from "0123456789ABCDEFabcdef" chars
28  *                     as a 7 digit display of the specified height.
29  *                     on = on-relief/low-relief flag
30  * digit7_int(v, h)    Writes an integer value in decimal representation
31  *                     as a 7 digit display of the specified height.
32  * digit7_float(v, h)  Writes a floating point value in decimal representation
33  *                     as a 7 digit display of the specified height.
34  */
35
36 /* Include general definitions */
37 use <seg_digit.scad>
38
39 /*
40  * Creates a 7 segment display for the given string
41  *   s    String to display. Characters should be within "0"-"9", "A"-"F",
42  *        "a"-"f" ranges. Otherwise nothing is shown.
43  *   h    digit height
44  *  on   on-relief/low-relief flag
45  */
46 module digit7_str(s, h, on = true)
47 {
48  for(i = [ 0 : len(s) ])
49  {
50    translate(v = [ i * digit_spacing(h), 0, 0 ])
51      put_digit7(s[i], h, on);
52  }
53 }
54
55 /*
56  * Creates a 7 segment display for an integer value (decimal)
57  *   v    Value to display
58  *   h    digit height
59  *   on   on-relief/low-relief flag
60  */
61 module digit7_int(v, h, on = true)
62 {
63  digit7_str(str(v), h, on);
64 }
65
66 /*
67  * Creates a 7 segment display for a float value
68  *   v    Value to display
69  *   h    digit height
70  *   on   on-relief/low-relief flag
71  */
72 module digit7_float(v, h, on = true)
73 {
74  s = str(v);
75  if (search(".", s)[0] == undef) {
76     digit7_str(s, h, on); // integer value
77  } else {
78     for (i = [ 0 : search(".", s)[0] - 1 ]) {
79         translate(v = [ i * digit_spacing(h), 0, 0 ])
80           put_digit7(s[i], h, on);
81     }
82     translate(v = [ (search(".", s)[0] - 1) * digit_spacing(h), 0, 0 ])
83       put_digit7(s[i], h, on);
84     for (i = [ search(".", s)[0] : len(s) ]) {
85         translate(v = [ (i - 1) * digit_spacing(h)
86                       , 0
87                       , 0 ])
88           put_digit7(s[i], h, on);
89     }
90  }
91 }
92
93 /*
94  * Creates a 7 segment display for the given character
95  *   c    Character to display. Should be within "0"-"9", "A"-"F", "a"-"f"
96  *        ranges. Otherwise nothing is shown.
97  *   h    digit height
98  *   on   on-relief/low-relief flag
99  */
100 module put_digit7(c, h, on = true)
101 {
102  if (c == ".") digit7_P(h, on);
103  if (c == "0") digit7_0(h, on);
104  if (c == "1") digit7_1(h, on);
105  if (c == "2") digit7_2(h, on);
106  if (c == "3") digit7_3(h, on);
107  if (c == "4") digit7_4(h, on);
108  if (c == "5") digit7_5(h, on);
109  if (c == "6") digit7_6(h, on);
110  if (c == "7") digit7_7(h, on);
111  if (c == "8") digit7_8(h, on);
112  if (c == "9") digit7_9(h, on);
113  if (c == "A" || c == "a") digit7_A(h, on);
114  if (c == "B" || c == "b") digit7_B(h, on);
115  if (c == "C" || c == "c") digit7_C(h, on);
116  if (c == "D" || c == "d") digit7_D(h, on);
117  if (c == "E" || c == "e") digit7_E(h, on);
118  if (c == "F" || c == "f") digit7_F(h, on);
119 }
120
121 //---------------------------------------------------------------------------
122 // End of public modules - Just jump to the examples
123 //---------------------------------------------------------------------------
124
125 /* Draws 0 in a 7 segment digit
126  *  h    digit length
127  *  on   on-relief/low-relief flag
128  */
129 module digit7_0(h, on = true)
130 {
131  segment_a(segment_length(h), on);
132  segment_b(segment_length(h), on);
133  segment_c(segment_length(h), on);
134  segment_d(segment_length(h), on);
135  segment_e(segment_length(h), on);
136  segment_f(segment_length(h), on);
137 }
138
139 /* Draws 1 in a 7 segment digit
140  *  h    digit length
141  *  on   on-relief/low-relief flag
142  */
143 module digit7_1(h, on = true)
144 {
145  segment_b(segment_length(h), on);
146  segment_c(segment_length(h), on);
147 }
148
149 /* Draws 2 in a 7 segment digit
150  *  h    digit length
151  *  on   on-relief/low-relief flag
152  */
153 module digit7_2(h, on = true)
154 {
155  segment_a(segment_length(h), on);
156  segment_b(segment_length(h), on);
157  segment_d(segment_length(h), on);
158  segment_e(segment_length(h), on);
159  segment_g(segment_length(h), on);
160 }
161
162 /* Draws 3 in a 7 segment digit
163  *  h    digit length
164  *  on   on-relief/low-relief flag
165  */
166 module digit7_3(h, on = true)
167 {
168  segment_a(segment_length(h), on);
169  segment_b(segment_length(h), on);
170  segment_c(segment_length(h), on);
171  segment_d(segment_length(h), on);
172  segment_g(segment_length(h), on);
173 }
174
175 /* Draws 4 in a 7 segment digit
176  *  h    digit length
177  *  on   on-relief/low-relief flag
178  */
179 module digit7_4(h, on = true)
180 {
181  segment_b(segment_length(h), on);
182  segment_c(segment_length(h), on);
183  segment_f(segment_length(h), on);
184  segment_g(segment_length(h), on);
185 }
186
187 /* Draws 5 in a 7 segment digit
188  *  h    digit length
189  *  on   on-relief/low-relief flag
190  */
191 module digit7_5(h, on = true)
192 {
193  segment_a(segment_length(h), on);
194  segment_c(segment_length(h), on);
195  segment_d(segment_length(h), on);
196  segment_f(segment_length(h), on);
197  segment_g(segment_length(h), on);
198 }
199
200 /* Draws 6 in a 7 segment digit
201  *  h    digit length
202  *  on   on-relief/low-relief flag
203  */
204 module digit7_6(h, on = true)
205 {
206  segment_a(segment_length(h), on);
207  segment_c(segment_length(h), on);
208  segment_d(segment_length(h), on);
209  segment_e(segment_length(h), on);
210  segment_f(segment_length(h), on);
211  segment_g(segment_length(h), on);
212 }
213
214 /* Draws 7 in a 7 segment digit
215  *  h    digit length
216  *  on   on-relief/low-relief flag
217  */
218 module digit7_7(h, on = true)
219 {
220  segment_a(segment_length(h), on);
221  segment_b(segment_length(h), on);
222  segment_c(segment_length(h), on);
223 }
224
225 /* Draws 8 in a 7 segment digit
226  *  h    digit length
227  *  on   on-relief/low-relief flag
228  */
229 module digit7_8(h, on = true)
230 {
231  segment_a(segment_length(h), on);
232  segment_b(segment_length(h), on);
233  segment_c(segment_length(h), on);
234  segment_d(segment_length(h), on);
235  segment_e(segment_length(h), on);
236  segment_f(segment_length(h), on);
237  segment_g(segment_length(h), on);
238 }
239
240 /* Draws 9 in a 7 segment digit
241  *  h    digit length
242  *  on   on-relief/low-relief flag
243  */
244 module digit7_9(h, on = true)
245 {
246  segment_a(segment_length(h), on);
247  segment_b(segment_length(h), on);
248  segment_c(segment_length(h), on);
249  segment_f(segment_length(h), on);
250  segment_g(segment_length(h), on);
251 }
252
253 /* Draws A in a 7 segment digit
254  *  h    digit length
255  *  on   on-relief/low-relief flag
256  */
257 module digit7_A(h, on = true)
258 {
259  segment_a(segment_length(h), on);
260  segment_b(segment_length(h), on);
261  segment_c(segment_length(h), on);
262  segment_e(segment_length(h), on);
263  segment_f(segment_length(h), on);
264  segment_g(segment_length(h), on);
265 }
266
267 /* Draws b in a 7 segment digit
268  *  h    digit length
269  *  on   on-relief/low-relief flag
270  */
271 module digit7_B(h, on = true)
272 {
273  segment_c(segment_length(h), on);
274  segment_d(segment_length(h), on);
275  segment_e(segment_length(h), on);
276  segment_f(segment_length(h), on);
277  segment_g(segment_length(h), on);
278 }
279
280 /* Draws C in a 7 segment digit
281  *  h    digit length
282  *  on   on-relief/low-relief flag
283  */
284 module digit7_C(h, on = true)
285 {
286  segment_a(segment_length(h), on);
287  segment_d(segment_length(h), on);
288  segment_e(segment_length(h), on);
289  segment_f(segment_length(h), on);
290 }
291
292 /* Draws d in a 7 segment digit
293  *  h    digit length
294  *  on   on-relief/low-relief flag
295  */
296 module digit7_D(h, on = true)
297 {
298  segment_b(segment_length(h), on);
299  segment_c(segment_length(h), on);
300  segment_d(segment_length(h), on);
301  segment_e(segment_length(h), on);
302  segment_g(segment_length(h), on);
303 }
304
305 /* Draws E in a 7 segment digit
306  *  h    digit length
307  *  on   on-relief/low-relief flag
308  */
309 module digit7_E(h, on = true)
310 {
311  segment_a(segment_length(h), on);
312  segment_d(segment_length(h), on);
313  segment_e(segment_length(h), on);
314  segment_f(segment_length(h), on);
315  segment_g(segment_length(h), on);
316 }
317
318 /* Draws F in a 7 segment digit
319  *  h    digit length
320  *  on   on-relief/low-relief flag
321  */
322 module digit7_F(h, on = true)
323 {
324  segment_a(segment_length(h), on);
325  segment_e(segment_length(h), on);
326  segment_f(segment_length(h), on);
327  segment_g(segment_length(h), on);
328 }
329
330 /* Draws a decimal point in a 7 segment digit
331  *  h    digit length
332  *  on   on-relief/low-relief flag
333  */
334 module digit7_P(h, on = true)
335 {
336  segment_p(segment_length(h), on);
337 }
338
339 //---------------------------------------------------------------------------
340 // Examples
341 //---------------------------------------------------------------------------
342
343 ex_height = 100;        // Digit height for all examples
344
345 // Base for on-relief examples
346 translate(v = [ 0, 0, -2 * segment_radius(ex_height) ])
347   cube(size = [ (len("0123456789ABCDEF") + 2) * digit_spacing(ex_height)
348               , 5 * ex_height
349               , 2 * segment_radius(ex_height) 
350               ]);
351
352 // On relief examples
353 translate(v = [ digit_spacing(ex_height), 3.5 * ex_height, 0 ])
354   digit7_str("0123456789ABCDEF", ex_height);
355
356 translate(v = [ digit_spacing(ex_height), 2 * ex_height, 0 ])
357   digit7_int(65535, ex_height);
358
359 translate(v = [ digit_spacing(ex_height), 0.5 * ex_height, 0 ])
360   digit7_float(1234.56, ex_height);
361
362 // Low relief examples
363 // Low relief effect is performed by substracting from the base
364 translate(v = [ 0, -5 * ex_height, 0 ])
365   difference()
366   {
367     // Base for low-relief examples
368     translate(v = [ 0, 0, -2 * segment_radius(ex_height) ])
369       cube(size = [ (len("0123456789ABCDEF") + 2) * digit_spacing(ex_height)
370                   , 5 * ex_height
371                   , 2 * segment_radius(ex_height) 
372                   ]);
373
374     translate(v = [ digit_spacing(ex_height), 3.5 * ex_height, 0 ])
375       digit7_str("0123456789ABCDEF", ex_height, on = false);
376
377     translate(v = [ digit_spacing(ex_height), 2 * ex_height, 0 ])
378       digit7_int(65535, 100, on = false);
379
380     translate(v = [ digit_spacing(ex_height), 0.5 * ex_height, 0 ])
381       digit7_float(1234.56, 100, on = false);
382   }
383
384 /* EOF : digit7.scad */