A l'attention des experts : options spéciales d'agencement avec liens longs

Les options suivantes s'appliquent uniquement à l'agencement avec liens longs :

Spécification d'autres obstacles

L'algorithme d'agencement avec liens longs considère les noeuds comme des obstacles qui ne peuvent pas être chevauchés et les liens comme des obstacles qui peuvent être croisés à un angle de 90 degrés (approximativement, si le style de lien est direct), mais qui ne peuvent pas être chevauchés.
Lien qui chevauche un noeud, puis croise un autre lien, puis chevauche un autre lien
Intersections et chevauchements
Exemple de spécification d'autres obstacles (algorithme d'agencement de liens)
Si une application nécessite d'autres obstacles qui ne sont pas des liens ou des noeuds, ces obstacles peuvent être spécifiés comme suit :
Appelez :
layout.addRectObstacle(rect);
layout.addLineRectObstacle(rect);
layout.addLineObstacle(p1, p2);
Les obstacles rectangulaires se comportent comme des noeuds : les liens ne peuvent pas chevaucher les rectangles. Les obstacles de ligne se comportent comme des segments de lien : d'autres liens peuvent croiser les segments de ligne, mais ne peuvent pas chevaucher les segments. Ces paramètres d'obstacle peuvent être supprimés comme suit :
layout.removeAllLineObstacles();
layout.removeAllRectObstacles();

Pénalités pour des points de fin variables

Si les points d'arrêt des liens ne sont pas fixes, l'algorithme utilise une méthode heuristique pour les calculer. Il examine tous les points de grille libres situés à proximité du bord du noeud de début et de fin et affecte une pénalité à chaque point de grille. Si un filtre de côtés de noeud est installé, la pénalité varie selon que le côté de noeud est autorisé ou rejeté.
L'utilisation du filtre de points d'arrêt permet de définir plus précisément la façon dont les points d'arrêt sont choisis. Cela permet à l'utilisateur de spécifier la pénalité pour chaque point de grille.
Exemple de spécification de filtre de points d'arrêt (algorithme d'agencement de liens)
Un filtre de points d'arrêt est une classe qui implémente l'interface ibm_ilog.graphlayout.longlink.LongLinkTerminationPointFilter qui définit la méthode suivante :
getPenalty(graphModel, link, origin, node, point, side, proposedPenalty)
Pour la sélection du point origin ou de destination de l'entrée link, l'entrée point (point de grille sur l'entrée side du node) est examinée. La proposedPenalty est calculée par la méthode heuristique par défaut de l'algorithme. Vous pouvez renvoyer une pénalité modifiée ou vous pouvez renvoyer la valeur Number.MAX_VALUE pour rejeter le point de grille. Si le point de grille est rejeté, il n'est pas choisi comme point d'arrêt du lien.
Le filtre de points d'arrêt peut être défini avec la méthode setTerminationPointFilter.
layout.setTerminationPointFilter(new MyTerminationPointFilter());

Manipulation des phases de routage

Comme indiqué dans Algorithme d'agencement avec liens longs, l'algorithme commence par traiter chaque lien individuellement, puis applique une phase de réduction du nombre d'intersections à tous les liens. Pour trouver une route pour chaque lien individuel, l'algorithme commence par vérifier si un routage (tel qu'une ligne droite ou avec une seule courbe) est possible. Si ce type de routage n'est pas possible, il utilise un algorithme de recherche de grille sophistiqué et dont le temps d'exécution est plus long, avec une fonction de retour en arrière, pour rechercher une route avec de nombreuses courbes.
Exemple de manipulation des phases de routage (algorithme d'agencement de liens)
Pour désactiver la phase qui permet de rechercher un routage straight-line ou avec une seule courbe :
Utilisez la méthode setStraightRouteEnabled :
layout.setStraightRouteEnabled(true);
Il existe plusieurs manière de procéder à la recherche avec retour arrière d'une route comportant de nombreuses courbes.
Un moyen pratique consiste à spécifier le délai maximal afin de rechercher la route pour chaque lien.
Exemple de spécification d'étapes de recherche avec retour arrière (algorithme d'agencement de liens)
Vous pouvez spécifier le nombre maximal d'étapes de recherche avec retour arrière.
Utilisez la méthode setMaxBacktrack :
layout.setMaxBacktrack(25000);
Le nombre maximal par défaut d'étapes de recherche avec retour arrière est 30 000.
Exemple de spécification de délai maximal pour la recherche de route (algorithme d'agencement de liens)
Pour spécifier le délai maximal disponible afin de rechercher la route pour chaque lien :
Utilisez la méthode setAllowedTimePerLink.
layout.setAllowedTimePerLink(2500);
Le temps imparti par défaut pour chaque lien est de 2 000 millisecondes (2 secondes).
Enfin, vous pouvez indiquer le nombre d'étapes à exécuter au cours de la phase de réduction du nombre d'intersections.
Exemple de spécification du nombre d'étapes à exécuter au cours de la phase de réduction du nombre d'intersections (algorithme d'agencement de liens)
Pour indiquer le nombre d'étapes à exécuter au cours de la phase de réduction du nombre d'intersections :
layout.setNumberCrossingReductionIterations(3);
Exemple de désactivation de la réduction du nombre d'intersections (algorithme d'agencement de liens)
Vous pouvez désactiver complètement la réduction du nombre d'intersections.
Utilisez la méthode setCrossingReductionEnabled.
layout.setCrossingReductionEnabled(false);

Mécanisme de rétromigration

Si l'un des noeuds de fin est au sein d'une enclave, l'algorithme d'agencement avec liens longs peut ne pas être en mesure de trouver un routage pour un lien. Dans Noeud au sein d'une enclave, le lien rose se trouve au sein d'une enclave. Dans ce cas, l'algorithme de recherche avec retour arrière ne parvient pas à trouver un routage ne comportant aucun chevauchement de noeud. L'algorithme de recherche avec retour arrière peut également échouer si la situation est trop complexe et que le temps de recherche autorisé par lien est dépassé.
Lien qui chevauche un noeud pour se connecter à un noeud qui se trouve au sein d'une enclave
Noeud au sein d'une enclave
Lorsque l'algorithme de recherche avec retour arrière ne parvient pas à trouver un routage, un simple mécanisme de rétromigration est appliqué afin de créer un routage avec un chevauchement de noeud.
Exemple de désactivation du mécanisme de rétromigration (algorithme d'agencement de liens)
Pour désactiver le mécanisme de rétromigration :
Utilisez la méthode setFallbackRouteEnabled :
layout.setFallbackRouteEnabled(false);
Si le mécanisme de rétromigration est désactivé, ces liens ne sont pas routés et leur forme reste telle qu'elle était avant l'agencement. En code Java, vous pouvez extraire les liens qui n'ont pas pu être routés de la façon habituelle sans le mécanisme de rétromigration.
Exemple d'extraction de liens sans le mécanisme de rétromigration (algorithme d'agencement de liens)
Pour extraire les liens qui n'ont pas pu être routés de la façon habituelle sans le mécanisme de rétromigration :
var links = layout.getCalcFallbackLinks();
while(links.hasNext()){
    var link = links.next();
    // ...
} 
Par exemple, vous pouvez effectuer une itération sur ces liens et appliquer votre propre mécanisme de rétromigration à la place du mécanisme de rétromigration par défaut de l'algorithme d'agencement avec liens longs.