製品に用意されているレイアウト・アルゴリズムがニーズに合わない場合、 ibm_ilog.graphlayout.GraphLayout をサブクラス化することによって、独自のレイアウト・アルゴリズムを開発できます。
ibm_ilog.graphlayout.GraphLayout のサブクラスが 作成されると、作成されたサブクラスは自動的に汎用 IBM® ILOG® Dojo Diagrammer レイアウト・フレームワークに収まり、以下に示すように、そのインフラストラクチャーを利用します。
- 汎用パラメーター: 基本クラス・パラメーターおよびフィーチャーを参照してください。
- 進行通知: イベント・リスナーの使用を参照してください。
- 非接続グラフの接続コンポーネントに対して個別にレイアウトを適用する 機能: 非接続グラフの接続コンポーネントのレイアウトを参照してください。
- 入れ子グラフをレイアウトする機能: 入れ子レイアウトを参照してください。
例
新しいレイアウトを定義することについての基本的な概念を示すため、
以下の単純な例では、最も単純なレイアウト・アルゴリズムであるランダム・レイアウト
の実装例を示します。この新しいレイアウト・クラス
は
MyRandomLayout
という名前です。以下のコードは、このクラスの骨組みを示します。
dojo.declare("MyRandomLayout", ibm_ilog.graphlayout.GraphLayout, { copy: function(){ return new MyRandomLayout(this); }, copyParameters: function(source){ this.inherited(arguments); // Now copy any specific parameters from this class... }, layout: function(){ // ... } });
入れ子グラフをレイアウトするときに使用されるため、
copy
メソッド が実装されます
(入れ子レイアウトを参照してください)。次に、基本クラスのメソッド layout() が次のように
実装されます。
layout: function(){ var model = this.getGraphModel(); var report = this.getLayoutReport(); var rect = this.getCalcLayoutRegion(); var xMin = rect.x; var yMin = rect.y; var xMax = rect.x + rect.width; var yMax = rect.y + rect.height; var nds = model.getNodes(); var count = nds.length; for (var i = 0; i < count; i++) { var node = nds[i]; if (this.isPreserveFixedNodes() && this.isFixed(node)) return; var x = xMin + (xMax - xMin) * Math.random(); var y = yMin + (yMax - yMin) * Math.random(); model.moveNode(node, x, y); this.callLayoutStepPerformedIfNeeded(); } report.code = ibm_ilog.graphlayout.GraphLayoutReport.LAYOUT_DONE; }