Wenn die im Produkt bereitgestellten Layoutalgorithmen Ihre Anforderungen nicht erfüllen, können Sie eigene
Layoutalgorithmen entwickeln, indem Sie Unterklassen von ibm_ilog.graphlayout.GraphLayout bilden.
Wenn eine Unterklasse von ibm_ilog.graphlayout.GraphLayout erstellt wird,
entspricht diese automatisch dem generischen Layout-Framework von
IBM® ILOG® Dojo Diagrammer und kann dessen Infrastruktur nutzen, z. B.:
- Generische Parameter: Sehen Sie sich den Abschnitt Parameter und Features der Basisklasse an.
- Fortschrittsbenachrichtigungen: Sehen Sie sich den Abschnitt Ereignislistener verwenden an.
- Möglichkeit, das Layout für die verbundenen Komponenten eines nicht verbundenen Graphen separat anzulegen: Sehen Sie sich den Abschnitt Verbundene Komponenten eines nicht verbundenen Graphen anlegen an.
- Möglichkeit, verschachtelte Graphen anzulegen: Sehen Sie sich den Abschnitt Verschachtelte Layouts an.
Beispiel
Zur Veranschaulichung der grundlegenden Ideen für das Definieren
eines neuen Layouts zeigt das folgende einfache Beispiel eine mögliche Implementierung des einfachsten
Layoutalgorithmus, des Zufallslayouts (RandomLayout).
Die neue Layoutklasse erhält den Namen
MyRandomLayout
. Der folgende Code zeigt den Entwurf der Klasse:
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(){ // ... } });
Die Methode
copy
wird implementiert, weil sie für das Anlegen eines verschachtelten Graphen verwendet wird
(siehe Verschachtelte Layouts). Anschließend wird die Methode layout() der Basisklasse wie folgt implementiert:
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; }