From: ian Date: Fri, 6 Feb 2004 22:15:37 +0000 (+0000) Subject: sorted out part layer problem X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=9214201b2c482b364c13640a0c3d8d1eb5c6c33c;p=trains.git sorted out part layer problem --- diff --git a/TODO b/TODO index d78f7cd..e69de29 100644 --- a/TODO +++ b/TODO @@ -1,3 +0,0 @@ -quiet bits -add new `silently' directive or something, as mustn't use layers in parts -don't use layers in parts diff --git a/layout/layout b/layout/layout index 66188b4..45da1cc 100755 --- a/layout/layout +++ b/layout/layout @@ -54,17 +54,22 @@ our $allwidthmin= allwidth(undef); # Data structures: # $ctx->{CmdLog}= undef } not in defobj # $ctx->{CmdLog}[]= [ command args ] } in defobj -# $ctx->{LocsMade}[]{Id}= $id -# $ctx->{LocsMade}[]{Neg}= $id +# $ctx->{LocsMade}[]{Id}= $id +# $ctx->{LocsMade}[]{Neg}= 1 or 0 # $ctx->{Loc}{$id}{X} # $ctx->{Loc}{$id}{Y} # $ctx->{Loc}{$id}{A} +# $ctx->{Loc}{$id}{LayerKind} # $ctx->{Trans}{X} # transformation. is ev representing # $ctx->{Trans}{Y} # new origin. (is applied at _input_ # $ctx->{Trans}{A} # not at plot-time) # $ctx->{Trans}{R} # but multiply all y coords by this! # $ctx->{Draw} # sequence of one or more chrs from uc $drawers -# # or X meaning never draw anything (eg in defobj) +# # possibly including X meaning never draw +# # anything now (eg in defobj) +# $ctx->{DrawMap} # =$fn s.t. +# # &$fn($drawchrs_spec_by_layer_cmdline) +# # = $drawchrs_we_should_use_due_to_obj_etc # $ctx->{Layer}{Level} # $ctx->{Layer}{Kind} # @@ -309,8 +314,12 @@ sub cva_idnew ($) { $neg = $sp =~ s/^\-//; $id=cva_idstr($sp); die "duplicate $id" if exists $ctx->{Loc}{$id}; - exists $ctx->{Loc}{$id}{X}; - push @{ $ctx->{LocsMade} }, { Id => $id, Neg => $neg }; + $ctx->{Loc}{$id}{LayerKind}= $ctx->{Layer}{Kind}; + push @{ $ctx->{LocsMade} }, { + Id => $id, + Neg => $neg, + }; +print STDERR "defined $id LayerKind >$ctx->{Layer}{Kind}<\n"; return $ctx->{Loc}{$id}; } sub cva_cmd ($) { return cva_idstr($_[0]); } @@ -433,6 +442,13 @@ sub o_line ($$$) { o_path_stroke($width); } +sub current_draw () { + my ($r); + $r= $ctx->{Draw} =~ m/X/ ? '' : $ctx->{Draw}; +print STDERR "current_draw >$ctx->{Draw}< gave >$r<\n"; + $r; +} + sub psu_coords ($$$) { my ($ends,$inunit,$across)=@_; # $ends->[0]{X} etc.; $inunit 0 to 1 (but go to 1.5); @@ -471,7 +487,7 @@ sub parametric_segment ($$$$$) { my ($sleeperctr)=($psu_ulen*0.5); my ($sleeperend)=($psu_sleeperlen*0.5); print DEBUG "ps $p0 $p1 $lenperp ($ppu)\n"; - $draw= $ctx->{Draw}; + $draw= current_draw(); if ($draw =~ m/C/) { my ($pt); o(" $psu_thinlw setlinewidth\n"); @@ -863,7 +879,8 @@ sub newctx (;$) { my ($ctx_save) = @_; $ctx= { Trans => { X => 0.0, Y => 0.0, A => 0.0, R => 1.0 }, - InRunObj => "" + InRunObj => "", + DrawMap => sub { $_[0]; } }; %{ $ctx->{Layer} }= %{ $ctx_save->{Layer} } if defined $ctx_save; @@ -885,7 +902,8 @@ sub cmd__defobj ($) { newctx($defobj_save); $ctx->{CmdLog}= [ ]; $ctx->{InDefObj}= $id; - $ctx->{Draw}= 'X'; + $ctx->{Draw}= $defobj_save->{Draw}.'X'; + $ctx->{DrawMap}= sub { ''; }; $ctx->{Layer}= { Level => 5, Kind => '' }; } @@ -914,34 +932,43 @@ sub cmd__runobj ($) { } } -sub cmd_layer { - my ($kl, $k,$l, $eo,$cc); - $kl= can(\&cva_identity); - $kl =~ m/^([A-Za-z_]*)(\d*|\=)$/ or die "invalid layer spec"; - ($k,$l)=($1,$2); - $l= $ctx->{Layer}{Level} if $l =~ m/^\=?$/; - $ctx->{Layer}{Kind}= $l; - $ctx->{Layer}{Level}= $l; - return if $ctx->{Draw} =~ m/X/; +sub layer_draw ($$) { + my ($k,$l) = @_; + my ($eo,$cc, $r); if ($output_layer ne '*' && $l != $output_layer) { - $ctx->{Draw} = ''; + $r = ''; } elsif ($k eq '') { - $ctx->{Draw}= 'RLMN'; + $r= 'RLMN'; } elsif ($k eq 's') { - $ctx->{Draw}= ''; + $r= ''; } elsif ($k eq 'l') { - $ctx->{Draw}= 'CLMN'; + $r= 'CLMN'; } else { - $ctx->{Draw}= 'ARSCLMNO'; + $r= 'ARSCLMNO'; } foreach $eo (@eopts) { next unless $k =~ m/^$eo->{GlobRe}$/; next unless &{ $eo->{LayerCheck} }($l); foreach $cc (split //, $eo->{DrawMods}) { - $ctx->{Draw} =~ s/$cc//ig; - $ctx->{Draw} .= $cc if $cc =~ m/[A-Z]/; + $r =~ s/$cc//ig; + $r .= $cc if $cc =~ m/[A-Z]/; } } +print STDERR "layer ($k $l) Draw 0 $r\n"; + $r= &{ $ctx->{DrawMap} }($r); +print STDERR "layer ($k $l) Draw 1 $r\n"; + return $r; +} + +sub cmd_layer { + my ($kl, $k,$l); + $kl= can(\&cva_identity); + $kl =~ m/^([A-Za-z_]*)(\d*|\=)$/ or die "invalid layer spec"; + ($k,$l)=($1,$2); + $l= $ctx->{Layer}{Level} if $l =~ m/^\=?$/; + $ctx->{Layer}{Kind}= $k; + $ctx->{Layer}{Level}= $l; + $ctx->{Draw}= layer_draw($k,$l); } sub cmd_part { cmd__obj(Part); } @@ -985,14 +1012,21 @@ sub cmd__obj ($) { } else { $ctx->{InRunObj}= $ctx_save->{InRunObj}."${obj_id}::"; } - $ctx->{Draw}= $ctx_save->{Draw}; - if ($obj->{Part}) { - $ctx->{Draw} =~ s/[LMN]//g; - $ctx->{Draw} =~ s/O/MNO/; - } else { - $ctx->{Draw} =~ s/[LM]//g; - $ctx->{Draw} =~ s/N/MN/; - } + $ctx->{DrawMap}= sub { + my ($i) = @_; +print STDERR "obj $obj_id DrawMap running >$i<\n"; + $i= &{ $ctx_save->{DrawMap} }($i); + if ($obj->{Part}) { + $i =~ s/[LMN]//g; + $i =~ s/O/MNO/; + } else { + $i =~ s/[LM]//g; + $i =~ s/N/MN/; + } +print STDERR "obj DrawMap returning >$i<\n"; + return $i; + }; + $ctx->{Draw}= &{ $ctx->{DrawMap} }($ctx_save->{Draw}); cmd__runobj($obj_id); if (defined $part_name) { $pfx= $part_name.'_'; @@ -1037,7 +1071,8 @@ sub cmd__do { my ($cmd); dv("cmd__do $ctx @al ",'$ctx',$ctx); $cmd= can(\&cva_cmd); - my ($lm,$id,$loc,$io,$ad); +print STDERR "cmd1 $cmd draw $ctx->{Draw}\n"; + my ($lm,$id,$loc,$io,$ad,$draw); $io= defined $ctx->{InDefObj} ? "$ctx->{InDefObj}!" : $ctx->{InRunObj}; o("%L cmd $io $cmd @al\n"); $ctx->{LocsMade}= [ ]; @@ -1046,21 +1081,23 @@ dv("cmd__do $ctx @al ",'$ctx',$ctx); &{ "cmd_$cmd" }; }; die "too many args" if @al; +print STDERR "cmd3 $cmd draw $ctx->{Draw}\n"; foreach $lm (@{ $ctx->{LocsMade} }) { $id= $lm->{Id}; $loc= $ctx->{Loc}{$id}; $loc->{A} += $pi if $lm->{Neg}; $ad= ang2deg($loc->{A}); ol("%L point $io$id ".loc2dbg($loc)." ($lm->{Neg})\n"); - if ($ctx->{Draw} =~ m/[LM]/) { + $draw= layer_draw($loc->{LayerKind}, $ctx->{Layer}{Level}); + if ($draw =~ m/[LM]/) { ol(" gsave\n". " $loc->{X} $loc->{Y} translate $ad rotate\n"); - if ($ctx->{Draw} =~ m/M/) { + if ($draw =~ m/M/) { ol(" 0 $allwidthmin newpath moveto\n". " 0 -$allwidthmin lineto\n". " $lmu_marklw setlinewidth stroke\n"); } - if ($ctx->{Draw} =~ m/L/) { + if ($draw =~ m/L/) { ol(" /s ($id) def\n". " lf setfont\n". " /sx5 s stringwidth pop\n". @@ -1088,6 +1125,7 @@ sub cmd_showlibrary { $ctx_save= $ctx; foreach $obj_id (sort keys %objs) { $got= 1; +print STDERR "obj $obj_id\n"; foreach $glob (@al) { $pat= $glob; $got= !($pat =~ s/^\!//); @@ -1134,7 +1172,9 @@ sub cmd_showlibrary { $ctx->{InRunObj}= $ctx_save->{InRunObj}."${obj_id}//"; $ctx->{Draw}= $ctx_save->{Draw}; +print STDERR "cmd_showlibrary cmd__runobj 0 draw $ctx->{Draw}\n"; cmd__runobj($obj_id); +print STDERR "cmd_showlibrary cmd__runobj 1 draw $ctx->{Draw}\n"; ol(" gsave\n". " /s ($obj_id) def\n". " lf setfont\n ". diff --git a/layout/showlib.m4 b/layout/showlib.m4 index fcba8c2..38bf11b 100644 --- a/layout/showlib.m4 +++ b/layout/showlib.m4 @@ -1,3 +1,3 @@ include(`parts.i4') -#showlibrary pt_peco_c* pt_peco_l* pt_peco_s* cross_peco_s -showlibrary +showlibrary pt_shino_6* +#showlibrary diff --git a/pcb/Makefile b/pcb/Makefile index 2c6988f..9b4d044 100644 --- a/pcb/Makefile +++ b/pcb/Makefile @@ -4,7 +4,7 @@ M4INCS= parts.i4 E_TRACK= ArsCLMNo LAYOUTOPTS= -E$(E_TRACK) -default: ours-a.ps +default: ours-a.ps library.ps all: default \ ours-l0.ps \ @@ -22,5 +22,8 @@ o=>$@.new && mv -f $@.new $@ ours-l%.ps: ours.d4 layout ./layout <$< $(LAYOUTOPTS) $o +parts.ps: showlib.d4 layout + ./layout <$< $o + clean: -rm -f -- *.d4 *.ps diff --git a/pic.make b/pic.make index 2c6988f..9b4d044 100644 --- a/pic.make +++ b/pic.make @@ -4,7 +4,7 @@ M4INCS= parts.i4 E_TRACK= ArsCLMNo LAYOUTOPTS= -E$(E_TRACK) -default: ours-a.ps +default: ours-a.ps library.ps all: default \ ours-l0.ps \ @@ -22,5 +22,8 @@ o=>$@.new && mv -f $@.new $@ ours-l%.ps: ours.d4 layout ./layout <$< $(LAYOUTOPTS) $o +parts.ps: showlib.d4 layout + ./layout <$< $o + clean: -rm -f -- *.d4 *.ps diff --git a/spice/Makefile b/spice/Makefile index 2c6988f..9b4d044 100644 --- a/spice/Makefile +++ b/spice/Makefile @@ -4,7 +4,7 @@ M4INCS= parts.i4 E_TRACK= ArsCLMNo LAYOUTOPTS= -E$(E_TRACK) -default: ours-a.ps +default: ours-a.ps library.ps all: default \ ours-l0.ps \ @@ -22,5 +22,8 @@ o=>$@.new && mv -f $@.new $@ ours-l%.ps: ours.d4 layout ./layout <$< $(LAYOUTOPTS) $o +parts.ps: showlib.d4 layout + ./layout <$< $o + clean: -rm -f -- *.d4 *.ps