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 :
- Paramètres génériques : voir Paramètres et fonctions de la classe de base
- Notification de progression : voir Utilisation des programmes d'écoute d'événement
- Capacité à appliquer l'agencement séparément pour les composants connectés d'un graphe déconnecté : voir Agencement de composants connectés d'un graphe déconnecté
- Capacité à agencer des graphes imbriqués : voir Agencements imbriqués
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; }