From 726aff369425a34ae3d67021117ec69d54521633 Mon Sep 17 00:00:00 2001 From: ian Date: Sun, 20 Mar 2005 10:31:09 +0000 Subject: [PATCH] bugfixes to graph extraction and numbering --- layout/extractgraph | 21 ++++++++++++++------- layout/graph-data.h | 1 + layout/layout | 5 ++++- layout/redactgraph.c | 17 ++++++++++------- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/layout/extractgraph b/layout/extractgraph index 26d6477..dd047cc 100755 --- a/layout/extractgraph +++ b/layout/extractgraph @@ -63,6 +63,7 @@ our @nodes; # $nodes[]{X} # $nodes[]{Y} # $nodes[]{A} +# $nodes[]{NodeNum} # $nodes[]{LayerMin} # $nodes[]{LayerMax} # $nodes[]{"Edges$back"}[] = [ \$edges[], $far ] @@ -133,7 +134,7 @@ sub find_node (@) { return ($node,$back); } } - $node= { X => $x, Y => $y, A => $a, + $node= { X => $x, Y => $y, A => $a, NodeNum => scalar(@nodes), LayerMin => $l, LayerMax => $l, LineInfo => $lni }; $back= $isdest; push @nodes, $node; @@ -176,9 +177,9 @@ sub o ($@) { sub pr ($$) { my ($kind,$ref) = @_; - $ref= "$ref"; - $ref =~ y/()/__/; - return lc $ref.lc $kind; + my ($n); + $n= $ref->{"${kind}Num"}; + return sprintf "%s%d", lc($kind), $n; } sub pr_edgeend ($) { @@ -221,7 +222,7 @@ sub writeout () { my ($node, $edge, $i, $side, $sideedges); my ($end, $endnum, $sss, $reverse, $nodeside, $connectnum, $j, $edgeend); my ($segname, $segment, $movfeats, $movfeat, $delim); - my ($movfeatpos, $movpos); + my ($movfeatpos, $movpos, $maxedgenum); o("\n"); o("#include \"graph-data.h\"\n"); for $node (@nodes) { o("static Node ",pr(Node,$node),";\n"); } @@ -272,13 +273,17 @@ sub writeout () { o("\n }\n};\n"); } o("\n"); + $maxedgenum=-1; for ($i=0; $i<@edges; $i++) { $edge= $edges[$i]; o("static Edge ",pr(Edge,$edge),"= { $edge->{EdgeNum},\n"); + if ($edge->{EdgeNum} > $maxedgenum) { + $maxedgenum= $edge->{EdgeNum}; + } o(" $edge->{Dist}, "); $sss= $edge->{SubSegSpec}; + o("/* $sss */ "); $reverse= !!($sss =~ s/^\-//); - if ($reverse) { o("/*reverse*/ "); } $sss =~ m,^(\w*)/(([A-Za-z]*)(\d*))$, or die; ($segname, $movfeatpos, $movfeat, $movpos) = ($1,$2,$3,$4); o("&movfeats_${segname}","[", @@ -307,7 +312,7 @@ sub writeout () { '&'.pr_edgeend($sideedges->[$connectnum-1]) : '0'), ", ".($connectnum < $#$sideedges ? '&'.pr_edgeend($sideedges->[$connectnum+1]) : '0')); - o(",\n &".pr(Edge,$edge),", $end, ", + o(",\n &".pr(Edge,$edge),", $endnum, ", "&".pr(Node,$node).".sides[$side]"); o(" }"); $delim= ','; @@ -319,6 +324,8 @@ sub writeout () { (@nodes ? '&'.pr(Node,$nodes[0]) : 0), ", ", (@nodes ? '&'.pr(Node,$nodes[$#nodes]) : 0), " };\n"); + o("int next_nodenum= ".scalar(@nodes).";\n". + "int next_edgenum= ".($maxedgenum+1).";\n"); } o("/*autogenerated - do not edit*/\n\n"); diff --git a/layout/graph-data.h b/layout/graph-data.h index b9fbfe9..eaafde6 100644 --- a/layout/graph-data.h +++ b/layout/graph-data.h @@ -57,6 +57,7 @@ struct NodeList { }; extern NodeList all_nodes; +extern int next_nodenum, next_edgenum; #endif /*GRAPH_DATA_H*/ diff --git a/layout/layout b/layout/layout index 2c53215..7269eb2 100755 --- a/layout/layout +++ b/layout/layout @@ -1038,7 +1038,10 @@ sub cmd_join { sub line ($$$) { my ($from,$to,$len) = @_; - parametric_segment(0.0, 1.0, abs($len) + 1e-6, undef, sub { + if ($len < 0) { + ($from,$to,$len) = ($to,$from,-$len); + } + parametric_segment(0.0, 1.0, $len + 1e-6, undef, sub { ev_lincomb({}, $from, $to, $param); }); } diff --git a/layout/redactgraph.c b/layout/redactgraph.c index b330172..6f50fbb 100644 --- a/layout/redactgraph.c +++ b/layout/redactgraph.c @@ -68,11 +68,11 @@ OF(trace,1) /*---------- general graph-manipulation and printing stuff ----------*/ static void trace_node(Node *node) { - trace("n%p",node); + trace("node%d",node->nodenum); } static void trace_edgeend(EdgeEnd *edge) { - trace("n%p%c",edge->node->node,"OI"[edge->node->side]); + trace("edge%d %c",edge->edge->edgenum,"OI"[edge->end]); } static EdgeEnd *edgeend_otherend(EdgeEnd *thisend) { @@ -241,14 +241,14 @@ static void check(const char *why) { trace("consistency check (%s) ...\n",why); for (node=all_nodes.head; node; node=node->next) { - trace(" consistency node %p\n", node); + trace(" consistency node%d\n", node->nodenum); LIST_CHECKNODE(all_nodes,node); for (side=0; side<2; side++) { - trace(" consistency node %p%c\n", node, "OI"[side]); + trace(" consistency node%d %c\n", node->nodenum, "OI"[side]); assert(node->sides[side].node == node); assert(node->sides[side].side == side); for (edgeend=node->sides[side].head; edgeend; edgeend=edgeend->next) { - trace(" consistency node %p%c ", node, "OI"[side]); + trace(" consistency node%d %c ", node->nodenum, "OI"[side]); trace_edgeend(edgeend); trace("\n"); @@ -265,7 +265,7 @@ static void check(const char *why) { search_edone < edone + used_edone && search_edone->edge != edge; search_edone++); if (search_edone >= edone + used_edone) { - search_edone->edge= 0; + search_edone->edge= edge; search_edone->endsdone= 0; used_edone++; } @@ -276,8 +276,11 @@ static void check(const char *why) { } for (search_edone= edone; search_edone < edone + used_edone; - search_edone++) + search_edone++) { + trace("consistency edge%d count=%d\n", + search_edone->edge, search_edone->endsdone); assert(search_edone->endsdone == 2); + } trace("consistency check (%s) ok\n",why); } -- 2.30.2