Spécification de voisins est-ouest
Vous pouvez spécifier que deux noeuds qui ne sont pas liés doivent être des voisins directs dans une direction perpendiculaire à la direction de flux. Avec les modes d'agencement radial et en niveaux, les noeuds sont positionnés sur le même niveau, les uns à côté des autres. Avec les modes d'agencement libre et renversé, les noeuds sont positionnés alignés sur le bord nord. De tels noeuds sont appelés voisins est-ouest car un noeud est positionné comme le voisin direct de l'autre noeud, sur le côté est de celui-ci.
L'autre noeud devient le voisin direct du premier noeud, sur le côté ouest de celui-ci. (Voir aussi Utilisation de directions de compas pour les paramètres d'agencement positionnels (TL).)
Techniquement, les noeuds sont traités comme parent et enfants, même s'il n'existe aucun lien entre eux. Par conséquent, l'un des deux noeuds peut avoir un parent réel, mais pas l'autre, car son parent virtuel est son voisin est-ouest.
La fonction de voisin est-ouest peut être utilisée, par exemple, pour annoter des noeuds dans une arborescence de syntaxe tapée dans une construction de compilateur. Arborescence de syntaxe annotée de l'instruction a[25] = b[24] +
0.5; illustre un exemple d'une arborescence de ce type.

Arborescence de syntaxe annotée de l'instruction a[25] = b[24] +
0.5;
Pour spécifier que deux noeuds sont des voisins est-ouest, utilisez la méthode suivante :
treeLayout.setEastWestNeighboring(eastNode, westNode);
Vous pouvez également utiliser la fonction suivante, qui est identique, à l'exception de l'ordre inversé des paramètres :
treeLayout.setWestEastNeighboring(westNode, eastNode);
Si la direction du flux est vers le bas, la dernière méthode peut être plus facile à mémoriser car, dans ce cas, l'ouest est vers la gauche de l'est dans l'agencement, ce qui est similaire au flux de texte des paramètres.
Pour obtenir le noeud qui correspond au voisin est ou ouest d'un noeud, utilisez les appels suivants :
var eastNode = treeLayout.getEastNeighbor(westNode);
var westNode = treeLayout.getWestNeighbor(eastNode);
Chaque noeud peut avoir au maximum un voisin est et un voisin ouest car ils sont des voisins directs. Si plus d'un voisin direct est spécifié, il est partiellement ignoré. Des spécifications cycliques peuvent également causer des conflits.
Par exemple, si le noeud B est le voisin est du noeud A et le noeud C est le voisin est du noeud B, le noeud A ne peut pas être le voisin est du noeud C. (Bien que en théorie, de tels cycles soient techniquement possibles dans certaines situations en mode d'agencement radial, ils ne sont autorisés dans aucun mode d'agencement.)
Si le noeud B est le voisin est du noeud A, celui-ci est automatiquement le noeud ouest du noeud B. Le voisin est du noeud A peut lui-même avoir un autre voisin est. Cela permet de créer des chaînes de voisins est-ouest, et, ainsi, de visualiser facilement des listes d'arborescences. L'illustration Chaînes de voisins est-ouest permettant de visualiser des listes d'arborescences contient deux exemples.

Chaînes de voisins est-ouest permettant de visualiser des listes d'arborescences
Extraction de catégories de liens
L'algorithme d'agencement arborescent fonctionne sur une arborescence fractionnée, comme indiqué dans Algorithme d'agencement arborescent (Tree Layout - TL). Si le graphe à agencer n'est pas une arborescence pure, l'algorithme ignore certains liens.
Pour traiter de tels liens d'une façon spécifique, vous pouvez obtenir une liste de liens hors arborescence.
Etant donné qu'il existe des parents et des noeuds enfants dans l'arborescence fractionnée, l'on distingue les catégories de liens suivantes :
- Un lien d'arborescence vers l'avant est un lien entre un parent et son enfant.
- Un lien d'arborescence vers l'arrière est un enfant et son parent. Si le lien est tracé comme une flèche orientée, celle-ci pointe dans la direction opposée à la direction de flux.
- Un lien hors arborescence est un lien entre deux noeuds n'ayant aucune relation ; aucun des deux n'est l'enfant de l'autre.

Catégories de liens
L'algorithme d'agencement utilise ces catégories de liens en interne mais il ne les stocke pas de façon permanente pour économiser du temps et assurer l'efficacité de la mémoire. Si vous souhaitez traiter certaines catégories de liens d'une façon particulière (par exemple, pour appeler l'agencement de liens sur les liens hors arborescence), vous devez spécifier avant l'agencement que vous souhaitez accéder aux catégories de liens après l'agencement.
Pour ce faire, utilisez la méthode setCategorizingLinks comme suit :
treeLayout.setCategorizingLinks(true); graph.setNodeLayout(treeLayout); graph.performGraphLayout(); var link; var forwardLinks = treeLayout.getCalcForwardTreeLinks(); console.log("forward links:"); while(forwardLinks.hasNext()){ link = forwardLinks.next(); console.log(link.getStartNode().getLabel() + " -> " + link.getEndNode().getLabel()); } var backwardLinks = treeLayout.getCalcBackwardTreeLinks(); console.log("backward links:"); while(backwardLinks.hasNext()){ link = backwardLinks.next(); console.log(link.getStartNode().getLabel() + " -> " + link.getEndNode().getLabel()); } var nonTreeLinks = treeLayout.getCalcNonTreeLinks(); console.log("non-tree links:"); while(nonTreeLinks.hasNext()){ link = nonTreeLinks.next(); console.log(link.getStartNode().getLabel() + " -> " + link.getEndNode().getLabel()); }
Une fois que vous avez exécuté l'agencement, vous pouvez accéder aux catégories de liens.
Les données de catégorie de liens sont remplies chaque fois que l'agencement est appelé, sauf si vous appelez la méthode setCategorizingLinks(false)..
Séquences d'agencements avec des modifications incrémentielles
Vous pouvez travailler avec des arborescences devenues obsolètes, par exemple, avec des arborescences qui nécessitent d'être étendues avec davantage de noeuds enfants.
Si vous exécutez un agencement après une extension, vous souhaiterez probablement identifier les parties qui avaient déjà été agencées dans le graphe d'origine. L'algorithme d'agencement prend en charge ces modifications incrémentielles en mode incrémentiel car il prend en compte les positions précédentes des noeuds.
Il conserve l'ordre relatif des noeuds enfants dans l'agencement suivant.
En mode non incrémentiel, l'algorithme d'agencement arborescent calcule l'ordre des noeuds enfants à partir de l'ordre des noeuds fourni par le modèle de graphe (ou le graphe) attaché.
Dans ce cas, l'agencement est indépendant des positions des noeuds avant l'agencement. Il ne conserve pas l'ordre relatif des noeuds enfants dans les agencements suivants.
Le mode incrémentiel est activé par défaut.
Pour désactiver le mode incrémentiel :
Appelez :
treeLayout.setIncrementalMode(false);
Edition interactive
Le fait que l'ordre relatif de l'agencement soit conservé est utile au cours de l'édition interactive. Cela vous permet de corriger l'agencement facilement. Par exemple, si le premier agencement positionne un noeud A à gauche de B, son noeud frère, et si vous avez besoin d'inverser cet ordre, il vous suffit de déplacer le noeud A à la droite du noeud B et de lancer un nouvel agencement afin de nettoyer le tracé. Dans le second agencement, A reste à la droite de B, et la sous-arborescence de A "suit" le noeud A.

Edition interactive en vue d'obtenir un ordre de noeuds enfants spécifique
Spécification de l'ordre des noeuds enfants
Certaines applications nécessitent un ordre relatif spécifique pour les noeuds enfants dans l'arborescence. Cela signifie que lorsque la direction de flux est vers le bas, par exemple, un enfant spécifique doit être positionné à la gauche d'un autre enfant.
Pour cela, en mode non incrémentiel, vous pouvez spécifier un comparateur de noeuds comme suit :
treeLayout.setNodeComparator(function(node1, node2) { // for example: sort nodes by increasing width return node1.getBounds().width - node2.getBounds().width; });
Le comparateur indique l'ordre tel qu'il est défini dans le tableau ci-après. Pour un alignement régulier, les coordonnées des enfants sont augmentées. Pour un alignement renversé, la distance à partir du parent est augmentée. Pour les modes radial et en ballon, l'ordre est défini dans le sens des aiguilles d'une montre.
Mode d'agencement | Alignement | Direction de flux | Ordre |
---|---|---|---|
Libre, en niveaux, renversé | Autre que renversé | Bas | De la gauche vers la droite |
Haut | De la gauche vers la droite | ||
Gauche | Du haut vers le bas | ||
Droite | Du haut vers le bas | ||
Libre, en niveaux, renversé | Renversé | Bas | Du haut vers le bas |
Haut | Du bas vers le haut | ||
Gauche | De la droite vers la gauche | ||
Droite | De la gauche vers la droite | ||
Radial, en ballon | N'importe lequel | N'importe lequel | Dans le sens des aiguilles d'une montre |