chiark / gitweb /
commitid: Consistently use "Objid"
[reprap-play.git] / commitid.scad.pl
index e51318aaf26ba755d3be754fd6a867f64770898f..65963be2734aca3fa7918f741e683f849c9f5230 100755 (executable)
@@ -15,7 +15,7 @@ $SIG{__WARN__} = sub { die @_; };
 #   --git    generate git commit indications, as shown below
 #            (this is the default if no strings are requested with -t)
 #
-#   --git=object
+#   --git=objid
 #            generate git commit indication based on commit object only
 #            (ie avoid counting commits)
 #
@@ -34,6 +34,15 @@ $SIG{__WARN__} = sub { die @_; };
 #    $Commitid_scale          if not set, we use 1.0 }  together
 #    $Commitid_depth          if not set, we use xy pixel size from above / 2
 #    $Commitid_depth_scale    if not set, we use 1.0 (multiplies depth above)
+#    $Commitid_max_best_scale if not set, we use 2.0 (max mult of xy in Best)
+#
+# We have auto-sizing modules:
+#
+#   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()) { ... }
+#      // max_sz should be [x,y]
 #
 # For each form we have
 #
@@ -64,7 +73,10 @@ $SIG{__WARN__} = sub { die @_; };
 #       padded with zeroes; if too long we reduce mod 10^n
 #       eg if the count is 123456
 #            Small5    3456*
-#            Small8    __123456    (where _ are spaces)
+#            Small8    _*123456    (where _ are spaces)
+#       the git objectid is included if it will fit
+#       unambiguously and usefully eg
+#            Small9    ab*123456
 #
 #   Small2S Small4S ... Small10S:
 #   Small3T Small9T:
@@ -129,6 +141,15 @@ sub gentextmodule_demo_start_batch () {
     $gtm_demo_i++;
 }
 
+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";
+}
+
 sub gentextmodule ($@) {
     my ($form, @lines) = @_;
     my $modb = "Commitid_$form";
@@ -150,10 +171,7 @@ sub gentextmodule ($@) {
     }
     p " }\n";
     p "}\n";
-    p "module ${modb}(){\n";
-    p " d=Commitid_depth();\n";
-    p " translate([0,0,-d]) linear_extrude(height=d*2) ${modb}_2D();\n";
-    p "}\n";
+    gen3dmodule($modb);
 
     p sprintf "function %s_sz() = Commitid__scale() * 0.1 * [ %d, %d ];\n",
        $modb, 2 * ($cols * 4 - 1), 2 * (@lines * 6 - 1);
@@ -355,8 +373,16 @@ sub do_git () {
     foreach my $sz (2..10) {
        gentextmodule_demo_start_batch();
 
-       genform_plusq("Small$sz", rjustt($sz, $git_count, $git_dirty))
-           if defined $git_count;
+       if (defined($git_count)) {
+           my $smallstr = rjustt($sz, $git_count, $git_dirty);
+           if (defined($git_object) && $sz >= length($git_count) + 3) {
+               $smallstr = $git_object;
+               $smallstr .= ($git_dirty || ' ');
+               $smallstr .= $git_count;
+               $smallstr = rjustt($sz, $smallstr);
+           }
+           genform_plusq("Small$sz", $smallstr);
+       }
 
        genform_plusq("Git$sz", ljustt($sz, $git_object, $git_dirty))
            if defined $git_object;
@@ -377,7 +403,13 @@ sub do_git () {
 
 sub do_some_best ($$) {
     my ($modname, $formre) = @_;
-    p "module Commitid_$modname(max_sz) {\n";
+    my $fullmodname = "Commitid_${modname}_2D";
+    my @argl = qw(max_sz margin=Commitid_pixelsz());
+    p "module $fullmodname(".(join ', ', @argl).") {\n";
+    my $mbs = '$Commitid_max_best_scale';
+    p " sc_max = $mbs ? $mbs : 2;\n";
+    p " sz = max_sz - 2*[margin,margin];\n";
+    my @do;
     foreach my $f (
         sort {
            $b->{Chars} <=> $a->{Chars} or
@@ -389,9 +421,33 @@ sub do_some_best ($$) {
        }
         @forms
     ) {
-        p "// $f->{Form}\n";
+       my $form = $f->{Form};
+       p " sz_$form = Commitid_${form}_sz();\n";
+       foreach my $rot (qw(0 1)) {
+           my $id = "${form}_r${rot}";
+           p " sc_$id = min(sc_max";
+           foreach my $xy (qw(0 1)) {
+               p ",sz[$xy]/sz_$form","[",(($xy xor $rot)+0),"]";
+           }
+           p ");\n";
+           push @do, " if (sc_$id >= 1.0";
+           push @do, " && sc_$id >= sc_${form}_r1" if !$rot;
+           push @do, ") {\n";
+           push @do, "  translate([margin,margin]) scale(sc_$id)\n";
+           push @do, "   rotate(90) translate([0,-sz_$form"."[1]])\n" if $rot;
+           push @do, "   Commitid_${form}_2D();\n";
+           push @do, " } else";
+       }
     }
+    push @do, <<END;
+ {
+  echo("$fullmodname could not fit anything in", max_sz);
+ }
+END
+    p $_ foreach @do;
     p "}\n";
+
+    gen3dmodule "Commitid_$modname", @argl;
 }
 
 sub do_git_best () {
@@ -417,7 +473,7 @@ while (@ARGV) {
     $_ = shift;
     if (m/^--(no)?-git$/) {
        $do_git = $1 ? '' : 'co';
-    } elsif (m/^---git=object$/) {
+    } elsif (m/^---git=objid$/i) {
        $do_git = 'o';
     } elsif (m/^-i$/) {
        $do_git_untracked = 0;