Decimal point included in digit
authorJose Ignacio Croce Busquets <jose.croce@gmail.com>
Sun, 16 Feb 2014 18:42:36 +0000 (15:42 -0300)
committerJose Ignacio Croce Busquets <jose.croce@gmail.com>
Sun, 16 Feb 2014 18:42:36 +0000 (15:42 -0300)
digit7.scad
seg_digit.scad

index 89f5505..6ea3e24 100644 (file)
@@ -64,10 +64,10 @@ module digit7_float(v, h, on = true)
         translate(v = [ i * digit_spacing(h), 0, 0 ])
           put_digit7(s[i], h, on);
     }
-    translate(v = [ search(".", s)[0] * digit_spacing(h), 0, 0 ])
-      segment_dp(h, on);
+    translate(v = [ (search(".", s)[0] - 1) * digit_spacing(h), 0, 0 ])
+      put_digit7(s[i], h, on);
     for (i = [ search(".", s)[0] : len(s) ]) {
-        translate(v = [ (i - 1) * digit_spacing(h) + segment_length(h) * 0.5
+        translate(v = [ (i - 1) * digit_spacing(h)
                       , 0
                       , 0 ])
           put_digit7(s[i], h, on);
@@ -84,6 +84,7 @@ module digit7_float(v, h, on = true)
  */
 module put_digit7(c, h, on = true)
 {
+ if (c == ".") digit7_P(h, on);
  if (c == "0") digit7_0(h, on);
  if (c == "1") digit7_1(h, on);
  if (c == "2") digit7_2(h, on);
@@ -311,6 +312,15 @@ module digit7_F(h, on = true)
  segment_g(segment_length(h), on);
 }
 
+/* Draws a decimal point in a 7 segment digit
+ *  h    digit length
+ *  on   on-relief/low-relief flag
+ */
+module digit7_P(h, on = true)
+{
+ segment_p(segment_length(h), on);
+}
+
 //---------------------------------------------------------------------------
 // Examples
 //---------------------------------------------------------------------------
@@ -332,7 +342,7 @@ translate(v = [ digit_spacing(ex_height), 2 * ex_height, 0 ])
   digit7_int(65535, ex_height);
 
 translate(v = [ digit_spacing(ex_height), 0.5 * ex_height, 0 ])
-  digit7_float(123.45, ex_height);
+  digit7_float(1234.56, ex_height);
 
 // Low relief examples
 // Low relief effect is performed by substracting from the base
@@ -353,7 +363,7 @@ translate(v = [ 0, -5 * ex_height, 0 ])
       digit7_int(65535, 100, on = false);
 
     translate(v = [ digit_spacing(ex_height), 0.5 * ex_height, 0 ])
-      digit7_float(123.45, 100, on = false);
+      digit7_float(1234.56, 100, on = false);
   }
 
 /* EOF : seg_digit.scad */
index c0f1e1f..b6083a1 100644 (file)
@@ -35,7 +35,8 @@ function digit_height(seglen) = 2 * seglen;
 function segment_radius(seglen) = seglen / 10;
 
 /* Position (horiz) for next digit based on digit length */
-function digit_spacing(height) = segment_length(height) * 1.5;
+function digit_spacing(height) = segment_length(height)
+                               + 6 * segment_radius(segment_length(height));
 
 /* Draws A segment (top)
  *  size segment size
@@ -228,50 +229,67 @@ module segment_m(size, on = true)
 }
 
 /*
+ * Place the decimal point at the end of the character
+ * size segment size
+ * on on-relief/low-relief flag
+ */
+module segment_p(size, on = true)
+{
+ radius = segment_radius(size);
+ translate(v = [ size + radius, 0, 0 ])
+   decimal_point(size, on = on);
+}
+
+//---------------------------------------------------------------------------
+// End of public modules - Just jump to the examples
+//---------------------------------------------------------------------------
+
+/*
  * Draws a decimal point
- * digit_size whole digit size
- *         on on-relief/low-relief flag
+ * size segment size
+ * on on-relief/low-relief flag
  */
-module segment_dp(digit_size, on = true)
+module decimal_point(size, on = true)
 {
- radius = segment_radius(segment_length(digit_size));
+ radius = segment_radius(size);
  if (on)
  {
-  polyhedron(points = [ [          0,          0,      0 ]
-                      , [          0, 2 * radius,      0 ]
-                      , [ 2 * radius, 2 * radius,      0 ]
-                      , [ 2 * radius,          0,      0 ]
-                      , [     radius,     radius, radius ]
-                      ]
-        , triangles = [ [ 0, 1, 4 ]
-                      , [ 1, 2, 4 ]
-                      , [ 2, 3, 4 ]
-                      , [ 0, 4, 3 ]
-                      , [ 0, 3, 1 ]
-                      , [ 1, 3, 2 ]
-                      ]);
+  translate(v = [ radius, 0, 0 ])
+    polyhedron(points = [ [ -radius, -radius,      0 ]
+                        , [ -radius,  radius,      0 ]
+                        , [  radius,  radius,      0 ]
+                        , [  radius, -radius,      0 ]
+                        , [       0,       0, radius ]
+                        ]
+          , triangles = [ [ 0, 1, 4 ]
+                        , [ 1, 2, 4 ]
+                        , [ 2, 3, 4 ]
+                        , [ 0, 4, 3 ]
+                        , [ 0, 3, 1 ]
+                        , [ 1, 3, 2 ]
+                        ]);
  } else {
-  polyhedron(points = [ [          0,          0,       0 ]
-                      , [          0, 2 * radius,       0 ]
-                      , [ 2 * radius, 2 * radius,       0 ]
-                      , [ 2 * radius,          0,       0 ]
-                      , [     radius,     radius, -radius ]
-                      ]
-        , triangles = [ [ 0, 1, 4 ]
-                      , [ 1, 2, 4 ]
-                      , [ 2, 3, 4 ]
-                      , [ 0, 4, 3 ]
-                      , [ 0, 3, 1 ]
-                      , [ 1, 3, 2 ]
-                      ]);
-  cube(size= [ 2 * radius, 2 * radius, radius ], center = false);
+  translate(v = [ radius, 0, 0 ])
+  {
+   polyhedron(points = [ [ -radius, -radius,       0 ]
+                       , [ -radius,  radius,       0 ]
+                       , [  radius,  radius,       0 ]
+                       , [  radius, -radius,       0 ]
+                       , [       0,       0, -radius ]
+                       ]
+         , triangles = [ [ 0, 4, 1 ]
+                       , [ 1, 4, 2 ]
+                       , [ 2, 4, 3 ]
+                       , [ 0, 3, 4 ]
+                       , [ 0, 1, 3 ]
+                       , [ 1, 2, 3 ]
+                       ]);
+   translate(v = [ 0, 0, radius / 2 ])
+     cube(size= [ 2 * radius, 2 * radius, radius ], center = true);
+  }
  }
 }
 
-//---------------------------------------------------------------------------
-// End of public modules - Just jump to the examples
-//---------------------------------------------------------------------------
-
 /* Draws a single segment
  *  size segment size
  *  r    segment radius (default = segment_radius(h))
@@ -351,14 +369,15 @@ module diag_segment(size, r = 0, on = true)
  length = (size > 2 * radius) ? size - 2 * radius : 0;
  if (on)
  {
-  polyhedron(points = [ [                   radius,               radius,      0 ]
-                      , [                   radius,        2.41 * radius,      0 ]
-                      , [ size / 2 - 2.41 * radius, size -        radius,      0 ]
-                      , [ size / 2 -        radius, size -        radius,      0 ]
-                      , [ size / 2 -        radius, size - 2.41 * radius,      0 ]
-                      , [            2.41 * radius,               radius,      0 ]
-                      , [            1.70 * radius,        1.70 * radius, radius ]
-                      , [ size / 2 - 1.70 * radius, size - 1.70 * radius, radius ]
+  polyhedron(points = [
+                    [                   radius,               radius,      0 ]
+                  , [                   radius,        2.41 * radius,      0 ]
+                  , [ size / 2 - 2.41 * radius, size -        radius,      0 ]
+                  , [ size / 2 -        radius, size -        radius,      0 ]
+                  , [ size / 2 -        radius, size - 2.41 * radius,      0 ]
+                  , [            2.41 * radius,               radius,      0 ]
+                  , [            1.70 * radius,        1.70 * radius, radius ]
+                  , [ size / 2 - 1.70 * radius, size - 1.70 * radius, radius ]
                       ]
         , triangles = [ [ 0, 1, 6 ]
                       , [ 1, 2, 6 ]
@@ -374,14 +393,15 @@ module diag_segment(size, r = 0, on = true)
                       , [ 2, 4, 3 ]
                       ]);
  } else {
-  polyhedron(points = [ [                   radius,               radius,       0 ]
-                      , [                   radius,        2.41 * radius,       0 ]
-                      , [ size / 2 - 2.41 * radius, size -        radius,       0 ]
-                      , [ size / 2 -        radius, size -        radius,       0 ]
-                      , [ size / 2 -        radius, size - 2.41 * radius,       0 ]
-                      , [            2.41 * radius,               radius,       0 ]
-                      , [            1.70 * radius,        1.70 * radius, -radius ]
-                      , [ size / 2 - 1.70 * radius, size - 1.70 * radius, -radius ]
+  polyhedron(points = [
+                   [                   radius,               radius,       0 ]
+                 , [                   radius,        2.41 * radius,       0 ]
+                 , [ size / 2 - 2.41 * radius, size -        radius,       0 ]
+                 , [ size / 2 -        radius, size -        radius,       0 ]
+                 , [ size / 2 -        radius, size - 2.41 * radius,       0 ]
+                 , [            2.41 * radius,               radius,       0 ]
+                 , [            1.70 * radius,        1.70 * radius, -radius ]
+                 , [ size / 2 - 1.70 * radius, size - 1.70 * radius, -radius ]
                       ]
         , triangles = [ [ 0, 1, 6 ]
                       , [ 1, 2, 6 ]
@@ -437,8 +457,7 @@ translate(v = [ digit_spacing(digit_height(ex_seglen)) / 2
  segment_e(ex_seglen);
  segment_f(ex_seglen);
  segment_g(ex_seglen);
- translate(v = [ digit_spacing(digit_height(ex_seglen)), 0, 0 ])
-   segment_dp(digit_height(ex_seglen));
+ segment_p(ex_seglen);
 }
 
 // 16 segment on-relief example
@@ -462,8 +481,7 @@ translate(v = [ digit_spacing(digit_height(ex_seglen)) / 2
  segment_k(ex_seglen);
  segment_l(ex_seglen);
  segment_m(ex_seglen);
- translate(v = [ digit_spacing(digit_height(ex_seglen)), 0, 0 ])
-   segment_dp(digit_height(ex_seglen));
+ segment_p(ex_seglen);
 }
 
 // Low relief examples
@@ -492,8 +510,7 @@ translate(v = [ 2 * digit_spacing(digit_height(ex_seglen)), 0, 0 ])
      segment_e(ex_seglen, on = false);
      segment_f(ex_seglen, on = false);
      segment_g(ex_seglen, on = false);
-     translate(v = [ digit_spacing(digit_height(ex_seglen)), 0, 0 ])
-       segment_dp(digit_height(ex_seglen));
+     segment_p(ex_seglen, on = false);
     }
 
     // 16 segment on-relief example
@@ -517,8 +534,7 @@ translate(v = [ 2 * digit_spacing(digit_height(ex_seglen)), 0, 0 ])
      segment_k(ex_seglen, on = false);
      segment_l(ex_seglen, on = false);
      segment_m(ex_seglen, on = false);
-     translate(v = [ digit_spacing(digit_height(ex_seglen)), 0, 0 ])
-       segment_dp(digit_height(ex_seglen), on = false);
+     segment_p(ex_seglen, on = false);
     }
 
   }