単純な再帰: すべてのサブグラフに同じレイアウトを適用する

同じレイアウトを適用できるのは、次の両方の条件が満たされている場合です。
  • 最上位グラフとすべてのサブグラフに同じレイアウト・アルゴリズムが適用される必要がある。
  • レイアウト・アルゴリズムの設定 (すなわち、レイアウト・パラメーター) が、最上位グラフとすべてのサブグラフ で同じである必要がある。
以下の図は、最上位グラフとそのすべてのサブグラフにツリー・レイアウトが 適用されている例です。さらに、 ツリー・レイアウト・アルゴリズムの設定はすべてのグラフで同じです。 アプリケーションは、例えば、最上位グラフとサブグラフとでフローの向きを 違うものにする必要はありません。
入れ子グラフの
再帰レイアウトの例。左のパート 1 に含まれているネットワーク 1 には
ネットワーク 1.1 と ネットワーク 1.2 という 2 つのサブグラフがあり、右のパート 2 に含まれて
いるネットワーク 2 にはネットワーク 2.1 と ネットワーク 2.2 という 2 つのサブグラフ
があります。パート 1 の後にパート 2 を見てください。ネットワーク 1 は、第 1 レベルに 1 つ、
第 2 レベルに 3 つ、第 3 レベルに 2 つのノードを含んでいます。第 2 レベルと第 3 レベルのノードは、
水平にレイアウトされています。ノード 1 は、第 2 レベルのすべてのノードにリンクしています。第 2 レベル
の中央のノードは、第 3 レベルの両方のノードにリンクしています。
ネットワーク 2 のレイアウトはネットワーク 1 と同じです。ネットワーク 1.1 は第 1 レベルに 1 つ、
第 2 レベルに 2 つ、第 3 レベルに 3 つのノードを
含んでいます。第 2 レベルと第 3 レベルのノードは、
水平にレイアウトされています。ノード 1 は、第 2 レベルのすべてのノードにリンクしています。第 2 レベルの右のノードは、第 3 レベルのすべての
ノードにリンクしています。ネットワーク 2.1 のレイアウトは
ネットワーク 1.1 と同じです。ネットワーク 1.2 は、第 1 レベルに 1 つ、第 2 レベル
に 3 つのノードを含んでいます。第 2 レベルのノードは水平にレイアウトされています。
ノード 1 は、第 2 レベルのすべてのノードにリンクしています。ネットワーク 2.2 の
レイアウトはネットワーク 1.2 と同じです。
入れ子グラフの再帰レイアウトの例
このような再帰レイアウトを得るのは簡単です。最上位 の Diagram または Graph インスタンスに対してグラフ・レイアウトを指定し、performGraphLayout メソッドを呼び出す必要があります。このメソッド の recursive 引数はデフォルトで true なので、レイアウトは再帰的に実行されます。

内部メカニズム

内部メカニズムは、1 つのレイアウト・インスタンスは 1 つのグラフにのみ使用され、 そのグラフのサブグラフには再使用されないという原則に基づいて います。したがって、 ibm_ilog.graphlayout.GraphLayout.copy() メソッドを使用して、ツリー・レイアウト・インスタンスの「クローン」が自動的に作成されます。
グラフ・レイアウトはグラフ・モデルに適用され、同じ 原則がグラフ・モデルについても保持されます。 すなわち、1 つのグラフ・モデル・インスタンスは 1 つのグラフのみに使用され、サブグラフに再使用されることはありません。
サブグラフ用のグラフ・モデルは、 ibm_ilog.graphlayout.GraphLayout.copy() メソッドの呼び出しによって作成されます。このメソッドが、メソッド ibm_ilog.graphlayout.GraphLayout.getGraphModel() を使用して、グラフ・モデルを作成します。
これらの操作は、透過的な方法ですべて自動的に実行され ます。ユーザーは、recursive 引数を true に設定するか省略して、メソッド performGraphLayout を呼び出すだけですみます。

Dojo コード例

以下のコード例は、単一のレイアウト・アルゴリズムを入れ子グラフに 適用する方法を示しています。
var diagram = dijit.byId("diagram");
var treeLayout = new ibm_ilog.graphlayout.tree.TreeLayout();
diagram.attr("nodeLayout", treeLayout);
diagram.performGraphLayout(true);