chiark / gitweb /
filamentspool: ArmEnd nondove commitid
[reprap-play.git] / commitid.scad.pl
index 1ee20e8b84440c66cb0cc5b5e2ce17a8108276d7..983a4abc08abf4a5b8423705bb59058357f35d5b 100755 (executable)
 # General form of provided openscad modules
 # -----------------------------------------
 #
-#   module Commitid_MODULE_2D(...)  A collection of polygons forming characters
-#   module Commitid_MODULE(...)     The above, extruded up and down in Z
-#   function Commitid_MODULE_sz()   A 2-vector giving the X,Y size
+#   module Commitid_MODULE_2D(...)   Collection of polygons forming characters
+#   module Commitid_MODULE(...)      The above, extruded up and down in Z
+#   module Commitid_MODULE_M_2D(...) Mirror writing
+#   module Commitid_MODULE_M(...)    3D mirror writing
+#   function Commitid_MODULE_sz()    A 2-vector giving the X,Y size
 #
 # Except for *Best* modules, the XY origin is in the bottom left
 # corner without any margin.  Likewise Commitid_MODULE_sz does not
@@ -93,6 +95,9 @@
 # the model.  This means it's convenient to either add or subtract from
 # a workpiece whose face is in the XY plane.
 #
+# The _M versions are provided to avoid doing inconvenient translation
+# and rotation to get the flipped version in the right place.
+#
 #
 # Autoscaling modules
 # -------------------
 # These modules take a specification of the available XY space, and
 # select and generate a suitable specific identification layout:
 # 
-#   module Commitid_BestCount_2D(max_sz, margin=Commitid_pixelsz())
-#   module Commitid_BestCount   (max_sz, margin=Commitid_pixelsz())
-#   module Commitid_BestObjid_2D(max_sz, margin=Commitid_pixelsz())
-#   module Commitid_BestObjid   (max_sz, margin=Commitid_pixelsz())
+#   module Commitid_BestCount_2D  (max_sz, margin=Commitid_pixelsz())
+#   module Commitid_BestCount     (max_sz, margin=Commitid_pixelsz())
+#   module Commitid_BestCount_M_2D(max_sz, margin=Commitid_pixelsz())
+#   module Commitid_BestCount_M   (max_sz, margin=Commitid_pixelsz())
+#   module Commitid_BestObjid_2D  (max_sz, margin=Commitid_pixelsz())
+#   module Commitid_BestObjid     (max_sz, margin=Commitid_pixelsz())
+#   module Commitid_BestObjid_M_2D(max_sz, margin=Commitid_pixelsz())
+#   module Commitid_BestObjid_M   (max_sz, margin=Commitid_pixelsz())
 #
 # max_sz should be [x,y].
 #
 #
 #    module Commitid_LAYOUT_2D()
 #    module Commitid_LAYOUT()
+#    module Commitid_LAYOUT_M_2D()
+#    module Commitid_LAYOUT_M()
 #    function Commitid_LAYOUT_sz()
 #
 # Here LAYOUT is one of the following (giving for example, `module
 #
 
 
+# COPYRIGHT, LICENCE AND LACK-OF-WARRANTY INFORMATION
+# ===================================================
+#
+# This program is Free Software and a Free Cultural Work.
+#
+#   You can redistribute it and/or modify it under the terms of the
+#   GNU General Public License as published by the Free Software
+#   Foundation, either version 3 of the License, or (at your option)
+#   any later version.
+#
+#   This program is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#   GNU General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# Alternatively, at your option:
+#
+#   This work is licensed under the Creative Commons
+#   Attribution-ShareAlike 4.0 International License.
+#
+#   There is NO WARRANTY.
+
+
 use strict;
 
 $SIG{__WARN__} = sub { die @_; };
@@ -253,13 +290,25 @@ sub gentextmodule_demo_start_batch () {
     $gtm_demo_i++;
 }
 
+sub argl_formal (@) { join ', ', @_; }
+sub argl_actual (@) { join ',', map { m/=/ ? $` : $_ } @_; }
+
 sub gen3dmodule ($@) {
-    my ($modb,@argl) = (@_);
-    p "module ${modb}(".(join ', ', @argl)."){\n";
-    p " d=Commitid_depth();\n";
-    p " translate([0,0,-d]) linear_extrude(height=d*2)\n";
-    p "  ${modb}_2D(".(join ',', map { m/=/ ? $` : $_ } @argl).");\n";
-    p "}\n";
+    my ($modb,$size,@argl) = (@_);
+    $size ||= "${modb}_sz()";
+    p "module ${modb}_M_2D(".argl_formal(@argl)."){\n";
+    p "  translate([${size}[0],0])\n";
+    p "    mirror([1,0,0])\n";
+    p "    ${modb}_2D(".argl_actual(@argl).");\n";
+    p "};\n";
+    foreach my $mir ('','_M') {
+       my $mm = "${modb}${mir}";
+       p "module ${mm}(".argl_formal(@argl)."){\n";
+       p " d=Commitid_depth();\n";
+       p " translate([0,0,-d]) linear_extrude(height=d*2)\n";
+       p "  ${mm}_2D(".argl_actual(@argl).");\n";
+       p "}\n";
+    }
 }
 
 sub gentextmodule ($@) {
@@ -283,7 +332,7 @@ sub gentextmodule ($@) {
     }
     p " }\n";
     p "}\n";
-    gen3dmodule($modb);
+    gen3dmodule($modb,'');
 
     p sprintf "function %s_sz() = Commitid__scale() * 0.1 * [ %d, %d ];\n",
        $modb, 2 * ($cols * 4 - 1), 2 * (@lines * 6 - 1);
@@ -481,6 +530,8 @@ sub do_git () {
     if ($do_git =~ m/o/) {
        $git_object = gitoutput qw(rev-parse HEAD);
     }
+    print STDERR join ' ', map { $_ // '?' }
+       "-- commitid", $git_object, $git_dirty, $git_count, "--\n";
 
     foreach my $sz (2..10) {
        gentextmodule_demo_start_batch();
@@ -517,7 +568,7 @@ sub do_some_best ($$) {
     my ($modname, $formre) = @_;
     my $fullmodname = "Commitid_${modname}_2D";
     my @argl = qw(max_sz margin=Commitid_pixelsz());
-    p "module $fullmodname(".(join ', ', @argl).") {\n";
+    p "module $fullmodname(".argl_formal(@argl).") {\n";
     my $mbs = '$Commitid_max_best_scale';
     p " sc_max = $mbs ? $mbs : 2;\n";
     p " sz = max_sz - 2*[margin,margin];\n";
@@ -559,7 +610,7 @@ END
     p $_ foreach @do;
     p "}\n";
 
-    gen3dmodule "Commitid_$modname", @argl;
+    gen3dmodule "Commitid_$modname", 'max_sz', @argl;
 }
 
 sub do_git_best () {
@@ -632,7 +683,7 @@ R 20 22 02
 
 0 1 2 3 4 5 6 7 8 9
 
-/#\  r  /#\ ##\ # # ### / ### /#\ /#\
+/#\  r  /#\ ##\ # # ### /#/ ### /#\ /#\
 # # /#    #   # # # #   #     # # # # #
 # #  #  /#/ ##< \## ##\ ##\  // >#< \##
 # #  #  #     #   #   # # #  #  # #   #