X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=reprap-play.git;a=blobdiff_plain;f=commitid.scad.pl;h=3b20d6275ec4a11a25f4b01e85cc0386141b1664;hp=2da787311e2f9d9b6d8d9996a6e29b9469ca999b;hb=ec68479632e04d4675682e9bdc1b87d6b720a705;hpb=9755520a70fa4b32fc1ee8c6e3d6012cdd108a5f diff --git a/commitid.scad.pl b/commitid.scad.pl index 2da7873..3b20d62 100755 --- a/commitid.scad.pl +++ b/commitid.scad.pl @@ -34,6 +34,7 @@ $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) # # For each form we have # @@ -52,57 +53,51 @@ $SIG{__WARN__} = sub { die @_; }; # # We can generate these forms: # -# Small3: -# Small4: -# Small5: -# Small6: -# Small7: -# Small8: -# Small9: -# Small10: +# In each case: +# if tree is dirty, * is suffixed or prefixed to count or commitid +# if tree has untracked files, + is added +# (where it is added depends on the Form; in any case it does not +# change the size, but steals space from digits) +# +# Small2 Small3 ... Small10: # git rev-list --first-parent --count HEAD # typically 3-4 characters but we allow for up to 6 # padded with zeroes; if too long we reduce mod 10^n -# eg -# Small4 1070 -# If tree is dirty, + or * is suffixed, reducing number of -# digits by 1. +# eg if the count is 123456 +# Small5 3456* +# Small8 _*123456 (where _ are spaces) +# the git objectid is included if it will fit +# unambiguously and usefully eg +# Small9 ab*123456 # -# Small4S: -# Small6S: Small6T: -# Small8S: Small9T: -# Small10S: +# Small2S Small4S ... Small10S: +# Small3T Small9T: # same but split into two lines (S) or three lines (T) eg -# Small4S 10 Small6t 1 -# 70 07 -# 0* +# Small4S 45 Small6T _3 +# 6* 45 +# 6* # -# Git4 Git4S -# Git6 Git6S Git6T -# Git8 Git8S -# Git9 Git9T -# Git10 Git10S +# Git2 Git3 ... Git10: +# Git4S Git6S ... Git10S: +# Git6T Git9T: # git-rev-parse HEAD (prefix of requested length) -# eg -# Git6 82f2a2 -# If tree is dirty, + or * is suffixed to commitid, -# reducing number of hex digits by 1. - -# Full3 -# Full4 -# Full5 -# Full6 -# Full7 -# Full8 -# Full9 -# Full10 +# eg if the commitid is abcdef0123... +# Git5 abcd* + +# Full4 Full6 ... Full20: # git-rev-list --first-parent --count HEAD # git-rev-parse HEAD +# (all on two lines) # eg -# Full6 1070 -# 82f2a2 -# If tree is dirty, + or * is suffixed to count (but not to -# commitid) reducing number of digits by 1. +# Full6 abcdef Full8 abcdef01 +# 23456* _123456* +# +# Full6T Full9T ... Full30T +# as Full but commit is split over two lines +# for a 3-line message; eg +# Full9T abc +# de* +# 456 # # FontDemo # @@ -133,9 +128,18 @@ our $gtm_demo_i = -1; our $gtm_demo_j; our @gtm_demo_o; -sub gentextmodule_demo_start_batch ($;$) { - ($gtm_demo_i, $gtm_demo_j) = @_; - $gtm_demo_j //= 0; +sub gentextmodule_demo_start_batch () { + $gtm_demo_j = 0; + $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 ($@) { @@ -159,10 +163,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); @@ -257,21 +258,40 @@ our $do_git; # contains may chars 'c' (count) and/or 'o' (object) our $do_git_untracked = 1; our $argcounter; -sub rjustt ($$) { # right justify and truncate (ie, pad and truncate at left) - my ($sz, $whole) = @_; +our @forms; + +sub rjustt ($$;$) { # right justify and truncate (ie, pad and truncate at left) + # always includes prefix + my ($sz, $whole, $prefix) = @_; + $prefix //= ''; my $lw = length $whole; - return $lw > $sz - ? substr($whole, $lw-$sz) - : sprintf "%${sz}s", $whole; + my $spare = $sz - $lw - (length $prefix); + return + ($spare > 0 ? (' ' x $spare) : ''). + $prefix. + substr($whole, ($spare < 0 ? -$spare : 0)); } -sub ljustt ($$$) { # always includes $suffix +sub ljustt ($$;$) { my ($sz, $whole, $suffix) = @_; + $suffix //= ''; $sz -= length $suffix; return sprintf "%-${sz}.${sz}s%s", $whole, $suffix; } -sub gentextmodule_q ($$$) { +sub genform ($@) { + my ($form, @lines) = @_; + gentextmodule($form, @lines); + my $f = { + Form => $form, + Chars => (length join '', @lines), + Lines => (scalar @lines), + Ambiguous => ($form =~ m/Full/ && !grep { m/\W/ } @lines), + }; + push @forms, $f; +} + +sub genform_q ($$$) { my ($form, $s, $lines) = @_; $gtm_demo_j++; my $l = length $s; @@ -279,14 +299,14 @@ sub gentextmodule_q ($$$) { my $e = $l/$lines; return if $e < 2; $gtm_demo_j--; - gentextmodule($form, $s =~ m/.{$e}/g); + genform($form, $s =~ m/.{$e}/g); } -sub gentextmodule_plusq ($$) { +sub genform_plusq ($$) { my ($form, $s) = @_; - gentextmodule($form, $s); - gentextmodule_q("${form}S", $s, 2); - gentextmodule_q("${form}T", $s, 3); + genform($form, $s); + genform_q("${form}S", $s, 2); + genform_q("${form}T", $s, 3); } our @gcmd; @@ -342,22 +362,104 @@ sub do_git () { $git_object = gitoutput qw(rev-parse HEAD); } - foreach my $sz (3..10) { - gentextmodule_demo_start_batch($sz-3); + foreach my $sz (2..10) { + gentextmodule_demo_start_batch(); - gentextmodule_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); + } - gentextmodule_plusq("Git$sz", ljustt($sz, $git_object, $git_dirty)) + genform_plusq("Git$sz", ljustt($sz, $git_object, $git_dirty)) if defined $git_object; if (defined $git_count && defined $git_object) { - gentextmodule("Full$sz", - rjustt($sz, $git_count.$git_dirty), - ljustt($sz, $git_object, '')); + genform("Full".($sz*2), + ljustt($sz, $git_object), + rjustt($sz, $git_count, $git_dirty)); + + my $e = $sz; + genform("Full".($e*3)."T", + ljustt($e*2, $git_object, $git_dirty) + =~ m/.{$e}/g, + rjustt($e, $git_count)); + } + } +} + +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"; + 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 + $a->{Lines} <=> $b->{Chars} + } + grep { + $_->{Form} =~ m/$formre/ && + !$_->{Ambiguous} + } + @forms + ) { + 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, <