Exemple d'algorithme d'agencement personnalisé

Si les algorithmes d'agencement fournis dans le produit ne répondent pas à vos besoins, vous pouvez développer vos propres algorithmes d'agencement à l'aide de sous-classes de ibm_ilog.graphlayout.GraphLayout.
Lorsqu'une sous-classe de ibm_ilog.graphlayout.GraphLayout est créée, elle s'adapte automatiquement au canevas d'agencement IBM® ILOG® Dojo Diagrammer générique et tire parti de son infrastructure, par exemple :

Exemple

Pour illustrer les idées de base pour la définition d'un nouvel agencement, l'exemple simple suivant montre une implémentation possible de l'algorithme d'agencement le plus simple, l'agencement aléatoire. La nouvelle classe d'agencement est appelée MyRandomLayout.
Le code suivant montre le squelette de la classe :
        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(){
                // ...
            }
        });
La méthode copy est implémentée, car elle est utilisée lors de l'agencement d'un graphe imbriqué (voir Agencements imbriqués).
Ensuite, la méthode layout() de la classe de base est implémentée comme suit :
            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;
            }