Parameter und Features der Basisklasse

Die Klasse ibm_ilog.graphlayout.GraphLayout definiert eine Reihe generischer Merkmale und Parameter. Diese Features und Parameter können verwendet werden, um die Layoutalgorithmen anzupassen.
Obwohl die Klasse GraphLayout die generischen Parameter definiert, steuert sie nicht, wie diese von ihren Unterklassen verwendet werden. Jeder Layoutalgorithmus (d. h. jede Unterklasse von GraphLayout) unterstützt ein Subset der generischen Features und bestimmt die Art und Weise, in der die generischen Parameter verwendet werden. Wenn Sie einen eigenen Layoutalgorithmus erstellen, indem Sie Unterklassen von GraphLayout erstellen, legen Sie fest, ob Sie die Features verwenden möchten und wie.
Die Klasse GraphLayout definiert die folgenden generischen Features.
Unterstützung generischer Merkmale und Parameter in Algorithmen enthält eine Zusammenfassung der von den einzelnen Layoutalgorithmen unterstützten generischen Parametern. Wenn Sie eine der Unterklassen verwenden, die mit der Graphenlayout-API bereitgestellt werden, lesen Sie in der Dokumentation zu dieser Unterklasse nach, ob sie einen bestimmten Parameter unterstützt und wie sie den Parameter interpretiert.

Zulässige Zeit

Es können mehrere Layoutalgorithmen erstellt werden, um die Berechnung zu stoppen, wenn eine vom Benutzer definierte Zeit überschritten wird. Dies kann aus verschiedenen Gründen geschehen: aus Sicherheitsgründen, um lange Rechenzeiten in großen Graphen zu verhindern, oder zur Festlegung eines oberen Grenzwerts für Algorithmen, die eine aktuelle Lösung iterativ verbessern und keine anderen Kriterien zum Stoppen der Berechnung haben.
Beispiel für die Festlegung der zulässigen Zeit
Gehen Sie wie folgt vor, um festzulegen, dass Layout maximal 60 Sekunden dauern darf:
Rufen Sie Folgendes auf:
layout.setAllowedTime(60000); 
Die Zeiteinheit sind Millisekunden. Der Standardwert ist 32000 (32 Sekunden).
Wenn Sie eine Unterklasse von ibm_ilog.graphlayout.GraphLayout erstellen, verwenden Sie die folgende Methode, um festzustellen, ob die angegebene Zeit überschritten wurde:
layout.isLayoutTimeElapsed();
Verwenden Sie die folgende Methode, um anzugeben, ob eine Unterklasse von GraphLayout diesen Mechanismus unterstützt:
layout.supportsAllowedTime();
Die Standardimplementierung gibt false zurück. Eine Unterklasse kann diese Methode überschreiben, so dass true zurückgegeben wird, um anzuzeigen, dass dieser Mechanismus unterstützt wird.

Layout verbundener Komponenten

Die Basisklasse ibm_ilog.graphlayout.GraphLayout bietet generische Unterstützung für das Layout nicht verbundener Graphen (die sich aus verbundenen Komponenten zusammensetzen).
Beispiel für Layout
Gehen Sie zum Aktivieren der Platzierung nicht verbundener Graphen wie folgt vor:
Rufen Sie Folgendes auf:
layout.setLayoutOfConnectedComponentsEnabled(true);
Hinweis
Einige der Layoutklassen (HierarchicalLayout, CircularLayout) haben einen integrierten Algorithmus für die Platzierung verbundener Komponenten. Dieser Algorithmus ist standardmäßig aktiviert und für die meisten gängigen Situationen geeignet. Für diese Layoutklasse ist der von der Basisklasse GraphLayout bereitgestellte generische Mechanismus standardmäßig inaktiviert.
Wenn dieser Mechanismus aktiviert ist, wird intern eine Standardinstanz der Klasse ibm_ilog.graphlayout.grid.GridLayout verwendet, um die nicht verbundenen Graphen zu platzieren. Sie können dieses Layout bei Bedarf anpassen.
Beispiel für das Anpassen des Layouts
Gehen Sie zum Anpassen dieses Layouts wie folgt vor:
Rufen Sie Folgendes auf:
var gridLayout = new ibm_ilog.graphlayout.grid.GridLayout();
gridLayout.setLayoutMode(ibm_ilog.graphlayout.grid.GridLayout.TILE_TO_ROWS);
gridLayout.setTopMargin(20);
layout.setLayoutOfConnectedComponents(gridLayout);

Beispiel für Experten
Die zahlreichen Funktionen der Klasse ibm_ilog.graphlayout.grid.GridLayout decken die meisten gängigen Anforderungen für die Platzierung nicht verbundener Graphen ab. Bei Bedarf können Sie eine eigene Unterklasse von ibm_ilog.graphlayout.GraphLayout für die Platzierung nicht verbundener Graphen schreiben und diese anstelle von GridLayout angeben:
Rufen Sie Folgendes auf:
var myGridLayout = new MyGridLayout();
// settings for myGridLayout, if necessary
layout.setLayoutOfConnectedComponents(myGridLayout);
Verwenden Sie die folgende Methode, um anzugeben, ob eine Unterklasse von GraphLayout diesen Mechanismus unterstützt:
layout.supportsLayoutOfConnectedComponents();
Die Standardimplementierung gibt false zurück. Sie können eine Unterklasse schreiben, um dieses Verhalten zu überschreiben.

Layoutbereich

Einige Layoutalgorithmen können die Größe der Graphenzeichnung steuern und einen benutzerdefinierten Layoutbereich (siehe layout region) berücksichtigen.
Beispiel für die Angabe eines Layoutbereichs
Gehen Sie wie folgt vor, um einen Bereich mit einer Größe von 100 mal 100 anzugeben:
layout.setLayoutRegion({x:0, y:0, width:100, height:100});
Verwenden Sie für den Zugriff auf den Layoutbereich die folgende Methode:
var rect = layout.getSpecLayoutRegion();  
Diese Methode gibt eine Kopie des Rechtecks zurück, das den angegebenen Layoutbereich definiert.
Die Layoutalgorithmen rufen eine andere Methode auf:
var rect = layout.getCalcLayoutRegion();  
Diese Methode versucht zuerst, die Layoutregionsspezifikation mit der Methode ibm_ilog.graphlayout.GraphLayout.getSpecLayoutRegion zu verwenden. Wenn diese Methode ein Rechteck ungleich null zurückgibt, wird dieses Rechteck zurückgegeben. Andernfalls versucht die Methode, einen entsprechenden Layoutbereich anhand der Anzahl und der Größe der Knoten im zugeordneten Graphen zu schätzen. Wenn kein Graph zugeordnet ist oder wenn der zugeordnete Graph leer ist, wird ein Standardrechteck ({x:0, y:0, width:1000, height:1000}) zurückgegeben.
Verwenden Sie die folgende Methode, um anzugeben, ob eine Unterklasse von GraphLayout den Layoutbereichsmechanismus unterstützt:
layout.supportsLayoutRegion(); 
Die Standardimplementierung gibt false zurück. Eine Unterklasse kann diese Methode überschreiben, so dass true zurückgegeben wird, um anzuzeigen, dass dieser Mechanismus unterstützt wird.
Hinweis
Die Implementierung der Methode ibm_ilog.graphlayout.GraphLayout.layout() ist nur dafür zuständig, ob der Layoutbereich bei der Berechnung des Layouts berücksichtigt wird und wie. Weitere Einzelheiten finden Sie in der Dokumentation der Layoutalgorithmen.

Linkverbindungsrahmen

Wenn ein Layoutalgorithmus spezielle Verbindungspunkte berechnet, platziert er die Verbindungspunkte der Links standardmäßig symmetrisch in Bezug auf die Mitte jeder Seite am Rand des Zeichenrahmens der Knoten. Manchmal kann es erforderlich sein, die Verbindungspunkte auf einem Rechteck zu platzieren, das kleiner oder größer ist als der Zeichenrahmen, unter Umständen auch asymmetrisch. Verbindungspunkte können beispielsweise asymmetrisch platziert werden, wenn Beschriftungen oberhalb oder unterhalb der Knoten angezeigt werden. Weitere Informationen finden Sie unter Auswirkungen der Schnittstelle für Linkverbindungsrahmen. Dies kann mit einer Schnittstelle für Linkverbindungsrahmen (Linkverbindungsrahmen) erreicht werden. Die Schnittstelle für Linkverbindungsrahmen ermöglicht Ihnen, für jeden Knoten einen Knotenrahmen anzugeben, der sich von dem Zeichenrahmen unterscheidet, der für die Verbindung der Links zum Knoten verwendet wird.
Beispiel für eine Schnittstelle für Linkverbindungsrahmen
Zum Definieren einer Schnittstelle für Linkverbindungsrahmen rufen Sie Folgendes auf:
layout.setLinkConnectionBoxInterface(provider);
Sie implementieren die Schnittstelle für Linkverbindungsrahmen, indem Sie eine Klasse definieren, die ibm_ilog.graphlayout.ILinkConnectionBoxProvider implementiert. Diese Schnittstelle definiert die folgende Methode:
getBox(graphModel, node)    
Diese Methode ermöglicht Ihnen, das effektive Rechteck zurückzugeben, in dem die Verbindungspunkte der Links platziert werden.
Eine zweite in der Schnittstelle definierte Methode ermöglicht eine tangentiale "Verschiebung" der Verbindungspunkte, für jede Seite des Knotens auf jeweils andere Weise:
getTangentialOffset(graphModel, node, nodeSide)  
Wie die Schnittstellen verwendet werden und welche Verbindungspunkte letztendlich platziert werden, richtet sich nach dem jeweiligen Layoutalgorithmus.
Das hierarchische Layout, das Baumstrukturlayout sowie die Layouts für kurze und lange Links verwenden den Linkverbindungsrahmen, um den Rahmen des Knotens zu definieren, dem die Links zugeordnet werden sollen.
Die folgende Abbildung veranschaulicht die Auswirkungen der Anpassung des Verbindungsrahmens. Auf der linken Seite sehen Sie das Ergebnis ohne Schnittstelle für Linkverbindungsrahmen. Auf der rechten Seite sehen Sie den Effekt, wenn die Schnittstelle für Linkverbindungsrahmen das gestrichelte Rechteck für den blauen Knoten zurückgibt.
Zwei Graphen, einer links einer rechts, die den Effekt
des Linkverbindungsrahmens bzw. der Schnittstelle für Linkverbindungsrahmen zeigen.
Auswirkungen der Schnittstelle für Linkverbindungsrahmen
Das zirkuläre Layout, das Zufallslayout und das kräftegesteuerte Layout (Force-directed) verteilen die Links nicht am Knotenrand, sondern können die Links so steuern, dass sie auf die Knotenmitte zeigen.
Weitere Informationen finden Sie in der Beschreibung der Methode ibm_ilog.graphlayout.basic.BasicLinkStyleLayout.setConnectLinksToNodeCenters.
Wenn ein Knoten eine unregelmäßige Form hat, sollen die Links manchmal nicht auf die Mitte des Knotenzeichenrahmens, sondern auf eine virtuelle Mitte innerhalb des Knotens zeigen. Die Schnittstelle für Linkverbindungsrahmen kann verwendet werden, um die virtuelle Knotenmitte zu definieren. In der folgenden Abbildung sehen Sie ein Beispiel für den Effekt.
Abbildung, die den Effekt
des Linkverbindungsrahmens in Kombination mit Linkbefestigung veranschaulicht
Kombinierter Effekt der Linkbefestigungsschnittstelle und des Linkverbindungsrahmens
Wenn die Links am unregelmäßigen grünen Sternknoten auf der linken Seite der Abbildung befestigt werden, zeigen sie nicht auf die Mitte des Sterns, sondern auf die Mitte des Zeichenrahmens des Knotens. Sie können diesen Effekt korrigieren, indem Sie eine Schnittstelle für Linkverbindungsrahmen angeben, die einen kleineren Knotenrahmen als den Zeichenrahmen zurückgibt, wie auf der rechten Seite der Abbildung gezeigt. Alternativ kann das Problem durch Angabe einer Schnittstelle für Linkverbindungsrahmen korrigiert werden, die den Zeichenrahmen als Knotenrahmen, aber mit weiteren tangentialen Offsets (Versatz) zurückgibt, die die virtuelle Mitte des Knotens verlagern.
Rufen Sie beispielsweise Folgendes auf, um eine Schnittstelle für Linkverbindungsrahmen zu definieren, die ein Linkverbindungsrechteck zurückgibt, das kleiner als der Zeichenrahmen für alle Knoten des Typs MyNode ist und die Verbindungspunkte auf der linken und auf der rechten Seite aller Knoten verlagert:
dojo.declare('MyLinkConnectionBoxProvider', 
 ibm_ilog.graphlayout.ILinkConnectionBoxProvider,
{
 getBox: function(graphModel, node)
 {
  var rect:Rectangle = graphModel.getBounds(node);
  if (node is MyNode) {
     // for example, the size of the bounding box is reduced:
     rect.x += 4;
     rect.y += 4;
     rect.width -= 8;
     rect.height -= 8;
    }
    return rect;
   }
   getTangentialOffset: function(graphModel, node, side)
   {
     switch (side) {
      case ibm_ilog.graphlayout.Direction.LEFT:
      case ibm_ilog.graphlayout.Direction.RIGHT:
       return -10; // shift up with 10 for both left and right side
      case ibm_ilog.graphlayout.Direction.TOP:
      case ibm_ilog.graphlayout.Direction.BOTTOM:
      default:
       return 0; // no shift for top and bottom side
     }
    }
});
layout.setLinkConnectionBoxProvider(new MyLinkConnectionBoxProvider());

Verwenden Sie die Methode ibm_ilog.graphlayout.GraphLayout.supportsLinkConnectionBox(), um anzugeben, ob eine Unterklasse von ibm_ilog.graphlayout.GraphLayout die Providerschnittstelle für Linkverbindungsrahmen unterstützt.
Die Standardimplementierung gibt "false" zurück. Sie können eine Unterklasse schreiben, die diese Methode überschreibt, damit "true" zurückgegeben wird, um anzuzeigen, dass dieser Mechanismus unterstützt wird.

Berechnung der Fertigstellung in Prozent

Einige Layoutalgorithmen können eine Schätzung der Layoutfertigstellung in Prozent bereitstellen. Diese Schätzung wird als Prozentsatzwert verfügbar gemacht, der im Graphenlayoutbericht gespeichert wird. Beim Starten des Algorithmus wird der Prozentsatzwert auf 0 gesetzt. Von Zeit zu Zeit ruft Layoutalgorithmus die folgende Methode auf, um den Prozentsatzwert zu erhöhen, bis 100 erreicht ist:
layout.increasePercentageComplete(newPercentage);  
Mit der folgenden Methode können Sie auf den Prozentsatzwert im Layoutbericht zugreifen:
var percentage = layoutReport.getPercentageComplete(); 
Verwenden Sie die folgende Methode, um anzugeben, ob eine Unterklasse von ibm_ilog.graphlayout.GraphLayout diesen Mechanismus unterstützt:
layout.supportsPercentageComplete(); 
Die Standardimplementierung gibt false zurück. Eine Unterklasse kann diese Methode überschreiben, so dass true zurückgegeben wird, um anzuzeigen, dass dieser Mechanismus unterstützt wird.

Feste Links beibehalten

Manchmal kann es erwünscht sein, einige Links des Graphen zu "fixieren" (d. h., dass die Links ihre aktuelle Form behalten, wenn das Layout ausgeführt wird). Dazu benötigen Sie eine Methode, die die Links angibt, die der Layoutalgorithmus nicht umformen soll. Dies ist insbesondere dann sinnvoll, wenn Sie ein halbautomatisches Layout (die Methode, bei der der Benutzer das Layout nach Abschluss des Layouts manuell optimiert) oder ein inkrementelles Layout (die Methode, bei der der Graph und/oder die Form der Links nach Abschluss des Layouts geändert und das Layout erneut ausgeführt wird) verwenden.
Beispiel für das Fixieren von Links
Gehen Sie wie folgt vor, um anzugeben, dass ein Link fest ist:
Verwenden Sie die folgende Methode:
layout.setFixed(link, fixed);  
Wenn der Parameter fixed auf true gesetzt ist, ist der Link fest. Zum Abrufen der aktuellen Einstellung für einen Link geben Sie Folgendes ein:
layout.isFixed(link);  
Der Standardwert ist false.
Verwenden Sie die folgende Methode, um das feste Attribut aus allen Links im Graphen zu entfernen:
layout.unfixAllLinks();   
Die festen Attribute in Links werden nur berücksichtigt, wenn Sie zusätzlich die folgende Anweisung aufrufen:
layout.setPreserveFixedLinks(true);
Verwenden Sie die folgende Methode, um anzugeben, ob eine Unterklasse von GraphLayout diesen Mechanismus unterstützt:
layout.supportsPreserveFixedLinks(); 
Die Standardimplementierung gibt false zurück. Eine Unterklasse kann diese Methode überschreiben, so dass true zurückgegeben wird, um anzuzeigen, dass dieser Mechanismus unterstützt wird.

Feste Knoten beibehalten

Manchmal kann es erwünscht sein, einige Knoten des Graphen zu "fixieren" (d. h., dass die Knoten ihre aktuelle Position behalten, wenn das Layout ausgeführt wird). Dazu benötigen Sie eine Methode, die die Knoten angibt, die der Layoutalgorithmus nicht verschieben soll. Dies ist insbesondere dann sinnvoll, wenn Sie ein halbautomatisches Layout (die Methode, bei der der Benutzer das Layout nach Abschluss des Layouts manuell optimiert) oder ein inkrementelles Layout (die Methode, bei der der Graph und/oder die Positionen der Knoten nach Abschluss des Layouts geändert und das Layout erneut ausgeführt wird) verwenden.
Beispiel für das Fixieren von Knoten
Gehen Sie wie folgt vor, um anzugeben, dass ein Knoten fest ist:
Verwenden Sie die folgende Methode:
layout.setFixed(node, fixed); 
Wenn der Parameter fixed auf true gesetzt ist, ist der Knoten fest. Zum Abrufen der aktuellen Einstellung für einen Knoten geben Sie Folgendes ein:
layout.isFixed(node); 
Der Standardwert ist false.
Verwenden Sie die folgende Methode, um das feste Attribut aus allen Knoten im Graphen zu entfernen:
layout.unfixAllNodes();  
Die festen Attribute in Knoten werden nur berücksichtigt, wenn Sie zusätzlich Folgendes aufrufen:
layout.setPreserveFixedNodes(true);
Verwenden Sie die folgende Methode, um anzugeben, ob eine Unterklasse von GraphLayout diesen Mechanismus unterstützt:
layout.supportsPreserveFixedNodes(); 
Die Standardimplementierung gibt false zurück. Eine Unterklasse kann diese Methode überschreiben, so dass true zurückgegeben wird, um anzuzeigen, dass dieser Mechanismus unterstützt wird.

Sofort stoppen

Mehrere Layoutalgorithmen können die Berechnung stoppen, wenn ein externes Ereignis eintritt, z. B., wenn der Benutzer auf eine Schaltfläche "Stoppen" klickt.
Zum Stoppen des Layouts können Sie Folgendes aufrufen:
layout.stopImmediately();  
Die Methode gibt true zurück, wenn der Stopp eingeleitet wurde, und false, wenn der Algorithmus die Ausführung nicht stoppen kann. Die Methode kehrt sofort zurück, aber der Layout-Thread benötigt gewöhnlich zusätzliche Zeit nach dem Einleiten des Stopps für die Bereinigung der Datenstrukturen.
Die Folgen des Stoppens eines Layoutprozesses sind vom jeweiligen Layoutalgorithmus abhängig. Einige Layoutalgorithmen haben einen iterativen Charakter. Das Stoppen des Iterationsprozesses führt zu einem geringfügigen Qualitätsverlust in der Zeichnung, aber das Layout kann weiterhin als gültig angesehen werden. Andere Layoutalgorithmen haben einen sequenziellen Charakter. Die Unterbrechung der Abfolge von Layoutschritten hat zur Folge, dass das Layout ungültig ist. Gewöhnlich kehren diese Algorithmen zu der Situation vor dem Start des Layoutprozesses zurück.
Verwenden Sie die folgende Methode, um anzugeben, ob eine Unterklasse von GraphLayout diesen Mechanismus unterstützt:
layout.supportsStopImmediately(); 
Die Standardimplementierung gibt false zurück. Sie können eine Unterklasse schreiben, um diese Methode zu überschreiben, damit true zurückgegeben wird, um anzuzeigen, dass dieser Mechanismus unterstützt wird.