無向グラフのDOTにgvprでrank付きサブグラフを加える #2

DOTにおけるサブグラフの定義の順序は、サブグラフが新規に作成されてグラフに追加される順序である。
それは前回のコードでは各ノードが走査される順序に依存していた。
前回は走査順が0,1,2,3になっていたが、順序は与えられるグラフ次第なので、しっかり順序を制御したい。
そこで、ノードを走査する前に追加されるべき全てのサブグラフをグラフに追加してしまおう。

insert_rank.g
BEG_G {
  int y = -1;
  node_t n;
  for (n = fstnode($); n != NULL; n = nxtnode(n)) y = MAX(y, yOf(n.name));
  for (; y >= 0; y--) {
    graph_t g = subg($, y);
    g.rank = 'same';
  }
}

N {
  subnode(subg($G, yOf(name)), $);
}

要は、BEG_G節でノードの最大y値を求めておいて、必要な順序でサブグラフを登録していく。
今の場合なら最大のy値から1ずつデクリメントして0までの名を持つサブグラフをグラフに加えていく。
後はN節で各ノードを該当するサブグラフに所属させればいい。

gvpr -f gen_mesh.g -a 3,4 | gvpr -cf insert_rank.g | dot -T png -o 3x4.png


rankdirはデフォルトのTBのままで済むようになった。
また、これでどんな順序でノードが走査されてもサブグラフの順序は変わらないはずである。