chiark / gitweb /
segment labelling work-in-progress - yet to do are labels and graph colouring
authorian <ian>
Wed, 9 Apr 2008 21:50:41 +0000 (21:50 +0000)
committerian <ian>
Wed, 9 Apr 2008 21:50:41 +0000 (21:50 +0000)
layout/.cvsignore
layout/Makefile
layout/extractgraph
layout/graph-data.h
layout/informat.txt
layout/layout
layout/redactgraph.c

index 75dbf06f1d600bc34a2ab81387f4613b4d2d8e01..8bf1382126d78aa6b8bed42052e8d8c834b70805 100644 (file)
@@ -6,6 +6,7 @@ ours-*.ps
 *.new
 *.segcmapreq
 *.segcmap
+*.segjoins
 *.m
 *.run-layout
 t.*
index 3a317c3fa33760f5d14ee07c108547ef3157daaf..e4d19afa81f34d3c61e437a2cec97121fabef5a1 100644 (file)
@@ -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)
index 52f66d8f3a50bea7c91797c7f91ac6edbe8d6d75..5c71d597929dcca66fb15165cd75ff8bf53187af 100755 (executable)
@@ -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,");
index 6ecbcadca7abdf5c7c08ced52c87535e8d984d43..bd44975b02c41bd5061cb41eccaefded6620852d 100644 (file)
@@ -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*/
index 916f1f6fbb10715c10c32d984dcc5fb91e3dfff4..ba9f55a6ced3e29b846efe60f8b10e39cc800e8c 100644 (file)
@@ -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
index d47a57c9b6f068e636f4cca5e02febc34c4124d8..c8df20a3c5cf69d0cface18d9f424afecad0c696 100755 (executable)
@@ -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);
index 6fc11854f4c6d74cfbfdeb6a426ecfe04eabb0df..09bc197dfc1fccff9f4e5fb33563304c3dd7250e 100644 (file)
@@ -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)