基本クラス・パラメーターおよびフィーチャー

ibm_ilog.graphlayout.GraphLayout クラスは、 多数の汎用的な機能およびパラメーターを定義しています。 これらの機能およびパラメーターを使用して、レイアウト・アルゴリズムをカスタマイズできます。
GraphLayout クラスは、汎用パラメーターを定義していますが、そのサブクラスにおける汎用パラメーターの使用方法は制御しません。 各レイアウト・アルゴリズム (すなわち、 GraphLayout の各サブクラス) が、汎用的な機能 のサブセットをサポートし、汎用パラメーターの使用方法を決定します。 GraphLayout のサブクラスを作成することにより 独自のレイアウト・アルゴリズムを作成する場合は、これらの機能を使用するかどうかを決定し、 使用する場合はその使用方法を決定します。
GraphLayout クラスで定義されている 汎用的な機能は以下のとおりです。
各レイアウト・アルゴリズムでサポートされる汎用パラメーターの要約が、汎用的な機能およびパラメーターのアルゴリズムによるサポートに示されています。 グラフ・レイアウト API に備わっているサブクラスのいずれかを使用する場合は、 そのサブクラスで所定のパラメーターがサポートされるかどうか、およびそのサブクラスでパラメーターが どのように解釈されるかについて、そのサブクラスの文書で調べてください。

許容時間

いくつかのレイアウト・アルゴリズムは、ユーザーが定義した時間指定を超えると計算を 停止するように設計することができます。これは、さまざまな理由により行われる可能性があります。 例えば、セキュリティーの観点から、大きいグラフで計算が長時間にわたって行われないようにするために許容時間を設定する場合や、現行のソリューションを繰り返し改善するアルゴリズムで、計算を停止するための基準が他に何もない場合の上限として許容時間を設定する場合などがあります。
許容時間の指定の例
レイアウトを最大 60 秒間実行できるようにするには、以下のように指定します。
以下を呼び出します。
layout.setAllowedTime(60000); 
時間はミリ秒で指定します。デフォルト値は 32000 (32 秒) です。
ibm_ilog.graphlayout.GraphLayout のサブクラスを作成する場合、指定した時間を超過したかどうかを把握するには、以下のメソッドを使用します。
layout.isLayoutTimeElapsed();
GraphLayout のサブクラスがこのメカニズムをサポートするかどうかを示すには、以下のメソッドを使用します。
layout.supportsAllowedTime();
デフォルトの実装では false が返されます。 サブクラスは、このメカニズムがサポートされることを示す true を返すように、このメソッドをオーバーライドすることができます。

接続コンポーネントのレイアウト

基本クラス ibm_ilog.graphlayout.GraphLayout は、非接続グラフ (接続コンポーネントで構成される) のレイアウトに対する汎用サポートを提供します。
詳しくは、非接続グラフの接続コンポーネントのレイアウト を参照してください。
レイアウトの例
非接続グラフの配置を有効にするには、次のようにします。
以下を呼び出します。
layout.setLayoutOfConnectedComponentsEnabled(true);
メモ
一部のレイアウト・クラス (HierarchicalLayoutCircularLayout) には、接続コンポーネントを配置するための 組み込みアルゴリズムがあります。このアルゴリズムは、デフォルトで有効になっており、 大部分の一般的な状態に適合します。このレイアウト・クラスについては、 基本クラス GraphLayout により提供される汎用メカニズムはデフォルトで無効になっています。
有効になっている場合、クラス ibm_ilog.graphlayout.grid.GridLayout のデフォルトのインスタンスは、 非接続グラフの配置に内部的に使用されます。必要であれば、 このレイアウトをカスタマイズできます。
レイアウトのカスタマイズの例
このレイアウトをカスタマイズするには、次のようにします。
以下を呼び出します。
var gridLayout = new ibm_ilog.graphlayout.grid.GridLayout();
gridLayout.setLayoutMode(ibm_ilog.graphlayout.grid.GridLayout.TILE_TO_ROWS);
gridLayout.setTopMargin(20);
layout.setLayoutOfConnectedComponents(gridLayout);

上級者向けの例
クラス ibm_ilog.graphlayout.grid.GridLayout のさまざまな機能により、 非接続グラフの配置に必要と思われるほとんどの要件に対処できます。 必要に応じて、非接続グラフを配置するための、ユーザー固有の、 ibm_ilog.graphlayout.GraphLayout のサブクラスを作成して、GridLayout の代わりに指定できます。
以下を呼び出します。
var myGridLayout = new MyGridLayout();
// settings for myGridLayout, if necessary
layout.setLayoutOfConnectedComponents(myGridLayout);
GraphLayout のサブクラスがこのメカニズムをサポートするかどうかを示すには、以下のメソッドを使用します。
layout.supportsLayoutOfConnectedComponents();
デフォルトの実装では false が返されます。 サブクラスを作成して、この動作をオーバーライドすることができます。

レイアウト領域

レイアウト・アルゴリズムの中には、グラフ描画のサイズを制御したり、 ユーザーが定義したレイアウト領域を考慮したりすることができるものがあります。
レイアウト領域の指定の例
100 x 100 の領域を指定するには、以下のようにします。
layout.setLayoutRegion({x:0, y:0, width:100, height:100});
レイアウト領域にアクセスするには、以下のメソッドを使用します。
var rect = layout.getSpecLayoutRegion();  
このメソッドは、指定されたレイアウト領域を定義する長方形のコピーを返します。
レイアウト・アルゴリズムで異なるメソッドを呼び出すこともできます。
var rect = layout.getCalcLayoutRegion();  
このメソッドは、まず、 ibm_ilog.graphlayout.GraphLayout.getSpecLayoutRegion メソッドを呼び出してレイアウト領域の仕様を入手します。このメソッドにより NULL 以外の長方形が返された場合は、 その長方形が返されます。それ以外の場合、メソッドは、関連付けられたグラフのノードの数およびサイズに応じて、 適切なレイアウト領域を見積もります。グラフが関連付けられていない場合、または関連付けられているグラフが空の場合は、デフォルトの長方形 {x:0, y:0, width:1000, height:1000} を返します。
GraphLayout のサブクラスがレイアウト領域メカニズムをサポートするかどうかを示すには、以下のメソッドを使用します。
layout.supportsLayoutRegion(); 
デフォルトの実装では false が返されます。 サブクラスで、このメカニズムがサポートされることを示す true を返すようにして、このメソッドをオーバーライドすることができます。
メモ
ibm_ilog.graphlayout.GraphLayout.layout() メソッドの実装は、レイアウトを計算する際にレイアウト領域を考慮するかどうか、 およびその方法についてのみ関与します。詳しくは、レイアウト・アルゴリズムの文書を参照してください。

Link connection box

レイアウト・アルゴリズムは、特定の接続ポイントを計算する場合、デフォルトで、リンク接続ポイントをノードのバウンディング・ボックスのボーダーに、両側の中央に対称になるように配置します。しかし、バウンディング・ボックスよりも小さいまたは大きい長方形に、場合によっては非対称的に、接続ポイントを配置する必要が生じることがあります。例えば、ラベルがノードの上または下に表示される場合、 接続ポイントを非対称的に配置することがあります。 link connection box・インターフェースの結果を参照してください。これは、link connection box・インターフェースを指定することにより行えます。link connection box・インターフェースを使用すると、リンクをノードに接続する際に使用するバウンディング・ボックスとは異なるノード・ボックスをノードごとに指定できます。
link connection box・インターフェースの例
リンク接続ボックス・インターフェースを設定するには、以下を呼び出します。
layout.setLinkConnectionBoxInterface(provider);
リンク接続ボックス・インターフェースを実装するには、ibm_ilog.graphlayout.ILinkConnectionBoxProvider を実装するクラスを定義します。このインターフェースは、以下のメソッドを定義します。
getBox(graphModel, node)    
このメソッドにより、リンク接続ポイントを配置する有効な長方形が返されます。
インターフェースで定義されている 2 番目のメソッドにより、個々のノードの側面ごとに 異なる方法で接続ポイントを接線方向に「シフト」することができます。
getTangentialOffset(graphModel, node, nodeSide)  
インターフェースの使用方法および最終結果となる接続ポイントは、 各レイアウト・アルゴリズムごとに異なります。
階層型レイアウト、ツリー・レイアウト、短リンク・レイアウトおよび長リンク・レイアウトは、 link connection boxを使用して、リンクを接続するノード・ボックスを定義します。
以下の図は、接続ボックスのカスタマイズによる結果を示しています。 左側は、link connection box・インターフェースを使用しなかった場合の結果です。 右側は、link connection box・インターフェースにより、青色のノード用に破線の長方形 が返された場合の結果を示しています。
リンク接続ボックス・インターフェースまたはリンク接続ボックス・プロバイダー・インターフェースの結果を示す 2 つのグラフが左右に 1 つずつ示されています。
link connection box・インターフェースの結果
環状レイアウト、ランダム・レイアウト、および Force-directedレイアウトは、リンクをノードのボーダーに展開しませんが、 リンクがノードの中央を指すように経路指定することができます。
ノードが不規則な形状である場合、リンクがノード・バウンディング・ボックスの中央ではなく、 ノード内の仮想中央を指す方が好ましいことがあります。 link connection box・インターフェースを使用して、ノードの仮想中央を定義できます。 以下の図は、結果の例を示しています。

リンク接続ボックスをリンク・クリッピングと組み合わせて使用した結果を示す図
リンク・クリッピング・インターフェースとlink connection boxを組み合わせて使用した場合の結果
図の左側にある緑色の不規則なスター型ノードでリンクをクリップすると、 リンクはスター型の中央を指さずに、ノードのバウンディング・ボックスの中央を指します。 図の右側に示されているように、バウンディング・ボックスより小さいノード・ボックスを返す link connection box・インターフェースを指定することにより、 これを修正できます。あるいは、 ノード・ボックスとしてバウンディング・ボックスを返すlink connection box・インターフェースを、ノードの仮想中央をシフトする接線方向の追加オフセットと共に指定することにより、この問題を修正することもできます。
例えば、MyNode タイプのすべてのノードについてバウンディング・ボックスより小さいリンク接続長方形を返し、すべてのノードの左右の接続ポイントを上にシフトするリンク接続ボックス・インターフェースを設定するには、以下を呼び出します。
dojo.declare('MyLinkConnectionBoxProvider', 
 ibm_ilog.graphlayout.ILinkConnectionBoxProvider,
{
 getBox: function(graphModel, node)
 {
  var rect:Rectangle = graphModel.getBounds(node);
  if (node is MyNode) {
     // for example, the size of the bounding box is reduced:
     rect.x += 4;
     rect.y += 4;
     rect.width -= 8;
     rect.height -= 8;
    }
    return rect;
   }
   getTangentialOffset: function(graphModel, node, side)
   {
     switch (side) {
      case ibm_ilog.graphlayout.Direction.LEFT:
      case ibm_ilog.graphlayout.Direction.RIGHT:
       return -10; // shift up with 10 for both left and right side
      case ibm_ilog.graphlayout.Direction.TOP:
      case ibm_ilog.graphlayout.Direction.BOTTOM:
      default:
       return 0; // no shift for top and bottom side
     }
    }
});
layout.setLinkConnectionBoxProvider(new MyLinkConnectionBoxProvider());

ibm_ilog.graphlayout.GraphLayout のサブクラスがリンク接続ボックス・プロバイダー・インターフェース をサポートするかどうかを示すには、ibm_ilog.graphlayout.GraphLayout.supportsLinkConnectionBox() メソッドを使用します。
デフォルトの実装では false が返されます。このメカニズムがサポートされることを示す true を返すようにこのメソッドをオーバーライドするサブクラスを作成することができます。

計算完了パーセンテージ

一部のレイアウト・アルゴリズムでは、レイアウトがどの程度完了したか推定して示すことができます。 この推定は、グラフ・レイアウト・レポートに保管されるパーセント値として示されます。 アルゴリズムの開始時に、パーセント値が 0 に設定されます。 レイアウト・アルゴリズムは、時々以下のメソッドを呼び出して、パーセント値が 100 になるまで、 ステップごとにパーセント値を増やしていきます。
layout.increasePercentageComplete(newPercentage);  
パーセント値は、以下のメソッドを使用して、レイアウト・レポートからアクセスできます。
var percentage = layoutReport.getPercentageComplete(); 
ibm_ilog.graphlayout.GraphLayout のサブクラスがこのメカニズムをサポートするかどうかを示すには、 以下のメソッドを使用します。
layout.supportsPercentageComplete(); 
デフォルトの実装では false が返されます。 サブクラスは、このメカニズムがサポートされることを示す true を返すように、このメソッドをオーバーライドすることができます。

固定リンクの保持

グラフのいくつかのリンクを「固定」したい (すなわち、 レイアウトが行われても現在の形状が保たれるようにしたい) 場合があります。 このような場合、レイアウト・アルゴリズムが形状変更できないリンクを示す方法が必要になります。 これは、特に、半自動レイアウト (レイアウトが行われた後にユーザーが手動でレイアウトを微調整する方法) を使用する場合や、インクリメンタル・レイアウト (レイアウトが行われた後にグラフ、リンクの形状、またはその両方を変更してから、レイアウトを再度実行する方法) を使用する場合に有意義です。
リンクの固定の例
リンクが固定であることを指定するには、以下のようにします。
以下のメソッドを使用します。
layout.setFixed(link, fixed);  
fixed パラメーター を true に設定すると、そのリンクが固定であることを意味します。 リンクの現在の設定を取得するには、以下のようにします。
layout.isFixed(link);  
デフォルト値は false です。
グラフ内のすべてのリンクから固定属性を除去するには、以下のメソッドを使用します。
layout.unfixAllLinks();   
リンクの固定属性は、以下のステートメントをさらに呼び出した場合にのみ考慮されます。
layout.setPreserveFixedLinks(true);
GraphLayout のサブクラスがこのメカニズムをサポートするかどうかを示すには、以下のメソッドを使用します。
layout.supportsPreserveFixedLinks(); 
デフォルトの実装では false が返されます。 サブクラスは、このメカニズムがサポートされることを示す true を返すように、このメソッドをオーバーライドすることができます。

固定ノードの保持

グラフのいくつかのノードを「固定」したい (すなわち、 レイアウトが行われても現在の位置が保たれるようにしたい) 場合があります。このような場合、レイアウト・アルゴリズムが移動できないノードを示す方法が必要になります。 これは、特に、半自動レイアウト (レイアウトが行われた後にユーザーが手動でレイアウトを微調整する方法) を使用する場合や、インクリメンタル・レイアウト (レイアウトが行われた後にグラフ、ノードの位置、またはその両方を変更してから、レイアウトを再度実行する方法) を使用する場合に有意義です。
ノードの固定の例
ノードが固定であることを指定するには、以下のようにします。
以下のメソッドを使用します。
layout.setFixed(node, fixed); 
fixed パラメーター を true に設定すると、そのノードが固定であることを意味します。 ノードの現在の設定を取得するには、以下のようにします。
layout.isFixed(node); 
デフォルト値は false です。
グラフ内のすべてのノードから固定属性を除去するには、以下のメソッドを使用します。
layout.unfixAllNodes();  
ノードの固定属性は、以下も呼び出した場合にのみ考慮されます。
layout.setPreserveFixedNodes(true);
GraphLayout のサブクラスがこのメカニズムをサポートするかどうかを示すには、以下のメソッドを使用します。
layout.supportsPreserveFixedNodes(); 
デフォルトの実装では false が返されます。 サブクラスは、このメカニズムがサポートされることを示す true を返すように、このメソッドをオーバーライドすることができます。

即時停止

多くのレイアウト・アルゴリズムでは、外部イベントの発生時 (ユーザーが「停止」ボタンを 押した場合など) に計算を停止できます。
レイアウトを停止するには、以下を呼び出します。
layout.stopImmediately();  
このメソッドは、 停止処理が開始された場合は true を返し、 アルゴリズムが停止できない場合は false を返します。このメソッドは即時に戻りますが、レイアウト・スレッドでは通常、データ構造をクリーンアップするため、 停止処理開始後から少し時間がかかります。
レイアウト処理を停止した結果は、個々のレイアウト・アルゴリズムによって異なります。 レイアウト・アルゴリズムの中には、反復機能を持つものがあります。 反復処理を停止すると、描画の品質が若干低下しますが、レイアウトは有効であると見なされます。 また、順次処理を行うレイアウト・アルゴリズムもあります。レイアウト・ステップのシーケンス を中断すると、有効なレイアウトが作成されない可能性があります。通常、 これらのアルゴリズムは、レイアウト処理の開始前の状態に戻ります。
GraphLayout のサブクラスがこのメカニズムをサポートするかどうかを示すには、以下のメソッドを使用します。
layout.supportsStopImmediately(); 
デフォルトの実装では false が返されます。 このメカニズムがサポートされることを示す true を返すようにこのメソッドをオーバーライドするサブクラスを作成することができます。