カスタム・レイアウト・アルゴリズムの例

製品に用意されているレイアウト・アルゴリズムがニーズに合わない場合、 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;
            }