*.new
*.segcmapreq
*.segcmap
+*.segjoins
*.m
*.run-layout
t.*
%.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
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
-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)
}
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,");
int n_movfeats;
MovFeat *movfeats; /* [0] is fixed */
MovFeat *starfeature; /* set by movfeatmultedges */
+ int u;
};
struct MovFeat {
struct Node {
const char *pname;
Node *back, *next;
+ double x,y,a;
+ int layermin,layermax;
NodeSide sides[2];
};
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++)
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*/
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
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
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
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
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;
# $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;
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");
$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;
parametric__o_pt($pt);
o($movstroke);
}
+ o("grestore\n");
}
if ($draw =~ m/C/) {
my ($pt);
}
}
+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
}
}
+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);
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 {
#define OI(x) { #x, x },
OI(printforneato)
OI(printforforsafety)
+ OI(printforlayoutsegjoins)
OI(consistency)
OI(movfeatsplitedges)
OI(movfeatrmstubs)