# 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}
#
$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]); }
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);
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");
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;
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 => '' };
}
}
}
-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); }
} 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.'_';
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}= [ ];
&{ "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".
$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/^\!//);
$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 ".