X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=reprap-play.git;a=blobdiff_plain;f=commitid.scad.pl;h=6d02726c8aee8242f54fb8a1033d0c300ff1b019;hp=82842125a630a3102910aa933f3cfa4d67e909c2;hb=4c41de2c647ee95f9935276c8358757420040537;hpb=aebe4541d8bb503fa27525a27f89ad9f6c4bd451 diff --git a/commitid.scad.pl b/commitid.scad.pl index 8284212..6d02726 100755 --- a/commitid.scad.pl +++ b/commitid.scad.pl @@ -81,9 +81,11 @@ # 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 # ------------------- @@ -100,10 +105,14 @@ # 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]. # @@ -159,6 +168,8 @@ # # 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 @@ -279,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 ($@) { @@ -309,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); @@ -405,26 +428,35 @@ our $do_git_untracked = 1; our $argcounter; our @forms; +our %included; # 0 = not at all; 1 = truncated; 2 = full -sub rjustt ($$;$) { # right justify and truncate (ie, pad and truncate at left) - # always includes prefix - my ($sz, $whole, $prefix) = @_; +sub rjustt ($$$;$) { + # right justify and truncate (ie, pad and truncate at left) + # always includes prefix + # sets $included{$what} + my ($sz, $what, $whole, $prefix) = @_; $prefix //= ''; my $lw = length $whole; my $spare = $sz - $lw - (length $prefix); + $included{$what}= 1 + ($spare > 0); return ($spare > 0 ? (' ' x $spare) : ''). $prefix. substr($whole, ($spare < 0 ? -$spare : 0)); } -sub ljustt ($$;$) { - my ($sz, $whole, $suffix) = @_; +sub ljustt ($$$;$) { + my ($sz, $what, $whole, $suffix) = @_; $suffix //= ''; $sz -= length $suffix; + $included{$what} = 1 + ($sz >= length $whole); return sprintf "%-${sz}.${sz}s%s", $whole, $suffix; } +sub genform_prep() { + $included{$_}=0 foreach qw(Objid Count); +} + sub genform ($@) { my ($form, @lines) = @_; gentextmodule($form, @lines); @@ -433,6 +465,7 @@ sub genform ($@) { Chars => (length join '', @lines), Lines => (scalar @lines), Ambiguous => ($form =~ m/Full/ && !grep { m/\W/ } @lines), + Included => { %included }, }; push @forms, $f; } @@ -514,44 +547,50 @@ sub do_git () { gentextmodule_demo_start_batch(); 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_prep(); + my $smallstr = rjustt($sz, 'Count', $git_count, $git_dirty); + my $forgitobj = $sz - length($git_count) - 1; + if (defined($git_object) && $forgitobj >= 2) { + $smallstr = ljustt($forgitobj, 'Objid', $git_object). + ($git_dirty || ' '). + $git_count; } genform_plusq("Small$sz", $smallstr); } - genform_plusq("Git$sz", ljustt($sz, $git_object, $git_dirty)) + genform_prep(); + genform_plusq("Git$sz", ljustt($sz, 'Objid', $git_object, $git_dirty)) if defined $git_object; if (defined $git_count && defined $git_object) { + genform_prep(); genform("Full".($sz*2), - ljustt($sz, $git_object), - rjustt($sz, $git_count, $git_dirty)); + ljustt($sz, 'Objid', $git_object), + rjustt($sz, 'Count', $git_count, $git_dirty)); + genform_prep(); my $e = $sz; genform("Full".($e*3)."T", - ljustt($e*2, $git_object, $git_dirty) + ljustt($e*2, 'Objid', $git_object, $git_dirty) =~ m/.{$e}/g, - rjustt($e, $git_count)); + rjustt($e, 'Count', $git_count)); } } } sub do_some_best ($$) { - my ($modname, $formre) = @_; + my ($bestwhat, $formre) = @_; + my $modname = "Best$bestwhat"; 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"; my @do; foreach my $f ( sort { + $b->{Included}{$bestwhat} <=> $a->{Included}{$bestwhat} or $b->{Chars} <=> $a->{Chars} or $a->{Lines} <=> $b->{Chars} } @@ -587,7 +626,7 @@ END p $_ foreach @do; p "}\n"; - gen3dmodule "Commitid_$modname", @argl; + gen3dmodule "Commitid_$modname", 'max_sz', @argl; } sub do_git_best () { @@ -605,8 +644,8 @@ sub do_git_best () { # (decreasing), and then by number of lines (increasing) and # try each one both ways round. - do_some_best('BestCount', 'Small|Full') if $do_git =~ m/c/; - do_some_best('BestObjid', 'Git|Full') if $do_git =~ m/o/; + do_some_best('Count', 'Small|Full') if $do_git =~ m/c/; + do_some_best('Objid', 'Git|Full') if $do_git =~ m/o/; } while (@ARGV) { @@ -660,7 +699,7 @@ R 20 22 02 0 1 2 3 4 5 6 7 8 9 -/#\ r /#\ ##\ # # ### /# ### /#\ /#\ +/#\ r /#\ ##\ # # ### /#/ ### /#\ /#\ # # /# # # # # # # # # # # # # # # /#/ ##< \## ##\ ##\ // >#< \## # # # # # # # # # # # # #