From: ian Date: Wed, 9 Apr 2008 21:50:41 +0000 (+0000) Subject: segment labelling work-in-progress - yet to do are labels and graph colouring X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?p=trains.git;a=commitdiff_plain;h=8ea6aa74d86a71b7d53a5ddfd9cb956a5a0d96ac segment labelling work-in-progress - yet to do are labels and graph colouring --- diff --git a/layout/.cvsignore b/layout/.cvsignore index 75dbf06..8bf1382 100644 --- a/layout/.cvsignore +++ b/layout/.cvsignore @@ -6,6 +6,7 @@ ours-*.ps *.new *.segcmapreq *.segcmap +*.segjoins *.m *.run-layout t.* diff --git a/layout/Makefile b/layout/Makefile index 3a317c3..e4d19af 100644 --- a/layout/Makefile +++ b/layout/Makefile @@ -73,6 +73,9 @@ compose-segenco: compose-segenco.o %.redacted.forsafety: %.redactgraph ./$< $(REDACT) consistency printforforsafety $o +%.redacted.segjoins: %.redactgraph + ./$< $(REDACT) consistency printforlayoutsegjoins $o + %.layout-data.c: data2safety %.wiring %.redacted.forsafety \ reversers.pin-info detectors.pin-info ./$(filter-out %.pin-info, $^) $o @@ -123,6 +126,10 @@ ours.graph.c: extractgraph ours.dgram-bot.p0.segenco.ps ours-l%.ps: ours.d4 layout ./layout <$< -l$* $(LAYOUTOPTS) $(XLAYOUTOPTS_LAYER) $o +ours-s%.ps: layout ours.redacted.segjoins ours.d4 + ./layout -l$* -e'*=*rldm' -E'=5Q' -e'segjoin=5M' \ + $(filter-out layout, $^) $o + ours-m%.ps: ours.d4 layout ./layout <$< -l$* -E'=*aRsclDmno' \ -E'=5RNLDA' -E'*~=5rCdsml' $(LAYOUTOPTS_PS) $o @@ -164,12 +171,12 @@ clean: -rm -f *.segcmap *.segcmapreq -rm -f *.dgram-*.p*.segenco.ps *.dgram-*.p*.segenco.ppm -rm -f *.dgram-*.plandata.c ours.graph.c ours.layout-data.c - -rm -f $(CPROGS) *.o *.d ours.redactgraph + -rm -f $(CPROGS) *.o *.d ours.redactgraph *.segjoins -rm -f tmp.* ui-plan-*.ppm .PRECIOUS: $(OPRINTS) .PRECIOUS: %.segcmap %.segcmapreq %.segenco.ppm %.d4 %.neato %.raw.neato .PRECIOUS: %.redactgraph %.redacted.forsafety %.redacted.neato -.PRECIOUS: %.layout-data.c %.pin-info +.PRECIOUS: %.layout-data.c %.pin-info %.segjoins include $(wildcard *.d) diff --git a/layout/extractgraph b/layout/extractgraph index 52f66d8..5c71d59 100755 --- a/layout/extractgraph +++ b/layout/extractgraph @@ -248,13 +248,20 @@ sub writeout () { } o("\n};\n"); } - o("\n"); + o("Segment *all_segments[]= {\n"); + for $segname (keys %segments) { + o(" &segment_$segname,\n"); + } + o(" 0\n". + "};\n". + "\n"); for ($i=0; $i<@nodes; $i++) { $node= $nodes[$i]; o("static Node ",pr(Node,$node),"= { \"$i\",\n"); o(" ".($i>0 ? '&'.pr(Node,$nodes[$i-1]) : '0'). ", ".($i<$#nodes ? '&'.pr(Node,$nodes[$i+1]) : '0')); - o(", {"); + o(",\n $node->{X}, $node->{Y}, $node->{A},". + " $node->{LayerMin}, $node->{LayerMax}, {"); $delim= ''; for ($side=0; $side<2; $side++) { o("$delim\n { &".pr(Node,$node).", $side,"); diff --git a/layout/graph-data.h b/layout/graph-data.h index 6ecbcad..bd44975 100644 --- a/layout/graph-data.h +++ b/layout/graph-data.h @@ -18,6 +18,7 @@ struct Segment { int n_movfeats; MovFeat *movfeats; /* [0] is fixed */ MovFeat *starfeature; /* set by movfeatmultedges */ + int u; }; struct MovFeat { @@ -50,6 +51,8 @@ struct NodeSide { struct Node { const char *pname; Node *back, *next; + double x,y,a; + int layermin,layermax; NodeSide sides[2]; }; @@ -60,6 +63,8 @@ struct NodeList { extern NodeList all_nodes; extern int next_nodenum, next_edgenum; +extern Segment *all_segments[]; + #define FOR_ALL_NODES(node) for (node=all_nodes.head; node; node=node->next) #define FOR_BOTH(sideend) for (sideend=0; sideend<2; sideend++) @@ -88,6 +93,10 @@ extern int next_nodenum, next_edgenum; if ((edge= edgeend->edge), edgeend->end) { \ /* do each edge once, from end 0, only */ \ } else - + +#define FOR_ALL_SEGMENTS(segmentp,segment) \ + for (segmentp=all_segments; \ + (segment= *segmentp); \ + segmentp++) #endif /*GRAPH_DATA_H*/ diff --git a/layout/informat.txt b/layout/informat.txt index 916f1f6..ba9f55a 100644 --- a/layout/informat.txt +++ b/layout/informat.txt @@ -194,6 +194,18 @@ Commands namespace as a new loc PL (unless PL already exists). P may be `=' to indicate an empty prefix (default is not to export locs). + segcmap S P... + Map segment S to colours using postscript commands P... (which + should be a postscript fragment to modify the graphics state, + typically `N setgray' or the like. This is used for the drawing + element Q (see below). S should be the bare segment (no movfeat). + + segend S + Notes that segment S (which should not specify a movfeat) has + an end at this location. This is fed back from extractgraph's run + on a previous result of running layout, and used to determine where + to place the segment labels for E. NOT YET IMPLEMENTED + Command-line options -D turn on debug (level 1) } currently only debug levels are @@ -224,7 +236,7 @@ Command-line options l do not label any locs l label distances D label all distances D - d do not label any locs d + d do not label any distances bars at locs (thick lines perp to track dir'n) M bars for top-level locs only Mnog N bars for top-level locs and those in obj's MNog @@ -238,6 +250,7 @@ Command-line options individual elements A draw track swept area, with ticks R draw track rails + Q draw track segment fills according to segcmap S draw track sleepers C draw track centrelines L label locs diff --git a/layout/layout b/layout/layout index d47a57c..c8df20a 100755 --- a/layout/layout +++ b/layout/layout @@ -28,8 +28,9 @@ our @eopts; our @segments= ('/'); our @ident_strings= (); our %subsegcmap; +our %segcmap; -our $drawers= 'arscldmnog'; +our $drawers= 'arqscldmnog'; our %chdraw_emap= qw(A ARScgd R aRscgD S aRScgd @@ -166,6 +167,7 @@ our $psu_thinlw= 1.0; our %psu_subseglw; $psu_subseglw{'e'}= 20.0; $psu_subseglw{'m'}= 15.0; +$psu_subseglw{'q'}= 20.0; our $lmu_marklw= 4; our $lmu_marktpt= 11; @@ -701,7 +703,7 @@ sub parametric_segment ($$$$$) { # $calcfn is invoked with $param set and should return a loc # (ie, ref to X =>, Y =>, A =>). my ($pa,$pb,@ends,$side,$ppu,$e,$v,$tick,$draw,$allwidth); - return unless $ctx->{Draw} =~ m/[ARSCG]/; + return unless $ctx->{Draw} =~ m/[ARSCGQ]/; $ppu= $psu_ulen/$lenperp; $allwidth= allwidth($minradius); my ($railctr)=($psu_gauge + $psu_raillw)*0.5; @@ -711,11 +713,12 @@ sub parametric_segment ($$$$$) { my ($sleeperend)=($psu_sleeperlen*0.5); print DEBUG "ps $p0 $p1 $lenperp ($ppu)\n"; $draw= current_draw(); - if ($draw =~ m/G/) { + if ($draw =~ m/[QG]/) { my ($pt,$going,$red,$csegbare,$movfeat,$movstroke); my ($used_last,$me,$segsave); + o("gsave\n"); $segsave= segment_state_save(); - foreach $me (qw(e m)) { + foreach $me ($draw =~ m/Q/ ? qw(q) : qw(e m)) { segment_state_restore($segsave); $going=0; o("% segments @segments\n"); @@ -732,27 +735,37 @@ print DEBUG "ps $p0 $p1 $lenperp ($ppu)\n"; $subsegcmap{$csegbare}++; } } else { - $movfeat= $csegbare =~ s,(/\D+)(\d+)$,$1, ? $2 : 'f'; - die "unknown subsegment colour for $csegbare\n" - unless exists $subsegcmap{$csegbare}; - $red= $pt->{A} / (2*$pi); - $red *= $subsegcmapangscale; - $red += $subsegcmapangscale*2; - $red += $subsegcmapangscale/2 if $segments[0] =~ m/^\-/; - $red %= $subsegcmapangscale; - $red += $subsegcmapangscale if $me eq 'e'; - $red= sprintf("%f", $red / 255.0); - $movstroke= - (" $red $subsegcmap{$csegbare} setrgbcolor\n". - " $psu_subseglw{$me} setlinewidth stroke\n"); - if ($subsegmovfeatpos ne $movfeat || - ($me eq 'e' && $csegbare =~ m,^/,)) { - $movstroke= "% no-stroke\n"; + if ($draw =~ m/Q/) { + $csegbare =~ m,^[^/]*,; +#print STDERR "looking for \`$&' $me\n"; + $movstroke= $segcmap{$&}; + $movstroke= "% no-colour " + unless defined $movstroke; + } elsif ($draw =~ m/G/) { + $movfeat= $csegbare =~ s,(/\D+)(\d+)$,$1, ? $2 : 'f'; + die "unknown subsegment colour for $csegbare\n" + unless exists $subsegcmap{$csegbare}; + $red= $pt->{A} / (2*$pi); + $red *= $subsegcmapangscale; + $red += $subsegcmapangscale*2; + $red += $subsegcmapangscale/2 + if $segments[0] =~ m/^\-/; + $red %= $subsegcmapangscale; + $red += $subsegcmapangscale if $me eq 'e'; + $red= sprintf("%f", $red / 255.0); + $movstroke= " $red $subsegcmap{$csegbare}". + " setrgbcolor\n"; + if ($subsegmovfeatpos ne $movfeat || + ($me eq 'e' && $csegbare =~ m,^/,)) { + $movstroke= "% no-stroke "; + } } + $movstroke .= + " $psu_subseglw{$me} setlinewidth stroke\n"; } o_path_begin(); parametric__o_pt($pt); - + $param += $ppu; last if $param>=$p1; $pt= &$calcfn; @@ -767,6 +780,7 @@ print DEBUG "ps $p0 $p1 $lenperp ($ppu)\n"; parametric__o_pt($pt); o($movstroke); } + o("grestore\n"); } if ($draw =~ m/C/) { my ($pt); @@ -1233,6 +1247,12 @@ sub cmd__runobj ($) { } } +sub cva_segment ($) { + my ($sp)=@_; + die "invalid segment" if $sp =~ m/[^0-9A-Za-z_]/; + return $sp; +} + sub cva_subsegspec ($) { my ($sp)=@_; die "invalid subsegment spec" unless @@ -1314,6 +1334,17 @@ sub cmd_segmap { } } +sub cmd_segend { + @al=(); +}; + +sub cmd_segcmap { + my ($seg,$colour); + $seg= can(\&cva_segment); + $segcmap{$seg}= "@al"; + @al= (); +}; + sub layer_draw ($$) { my ($k,$l) = @_; my ($eo,$cc, $r); diff --git a/layout/redactgraph.c b/layout/redactgraph.c index 6fc1185..09bc197 100644 --- a/layout/redactgraph.c +++ b/layout/redactgraph.c @@ -725,6 +725,38 @@ static void printforforsafety(void) { output("end\n"); } +static void printforlayoutsegjoins(void) { + Node *node; + EdgeEnd *edgeend; + Segment **segmentp, *segment; + int side; + + FOR_ALL_NODES(node) { + output("layer "); + FOR_BOTH(side) + if (!node->sides[side].head) { + output("segterminus"); + goto one_sided; + } + output("segjoin"); + one_sided: + output("%d\n", (node->layermin + node->layermax)/2); + + output("abs segjoin_%s",node->pname); + FOR_NODE_EDGEENDS(side,edgeend, node) + output("_%s",edgeend->edge->subseg->segment->segname); + output(" %f %f %f\n", node->x,node->y,node->a); + FOR_ALL_SEGMENTS(segmentp,segment) segment->u= 0; + FOR_NODE_EDGEENDS(side,edgeend, node) { + segment= edgeend->edge->subseg->segment; + if (segment->u++) continue; + output("segend %s\n",segment->segname); + output("segcmap %s 0.5 setgray\n",segment->segname); + } + output("\n"); + } +} + /*---------- main program ----------*/ typedef struct { @@ -736,6 +768,7 @@ static const OpInfo opinfos[]= { #define OI(x) { #x, x }, OI(printforneato) OI(printforforsafety) + OI(printforlayoutsegjoins) OI(consistency) OI(movfeatsplitedges) OI(movfeatrmstubs)