Dans certaines situations, vous serez peut-être amené à utiliser une séquence d'agencements dans le même graphe. Par exemple :
- Vous travaillez dans des graphes qui sont devenus obsolètes et vous devez étendre votre graphe. Si vous effectuez un agencement sur le graphe étendu, vous voudrez probablement identifier les éléments qui étaient déjà agencés dans le graphe d'origine. L'agencement ne doit pas être très différent comparé à l'agencement du graphe d'origine.
- Le premier agencement présente un tracé comportant quelques petites lacunes. Vous voulez combler ces lacunes manuellement et effectuer un second agencement afin de nettoyer le tracé. Dans le second agencement, les parties du graphe qui étaient déjà acceptables dans le premier ne seront sûrement pas beaucoup modifiées.
L'agencement hiérarchique fonctionne normalement de manière non incrémentielle.
Il effectue un agencement sur des bases entièrement nouvelles, déplace tous les noeuds vers de nouvelles positions et reroute tous les liens. Les positions précédentes des noeuds n'ont aucune
incidence sur le résultat de l'agencement. Même une petite modification peut avoir un effet important sur l'agencement suivant.
Cependant, l'agencement hiérarchique prend en charge également les séquences incrémentielles d'agencement qui ne “changent pas beaucoup".
Il peut placer les noeuds près de leurs positions précédentes, de sorte que vous
pouvez facilement identifier les éléments déjà agencés dans le graphe d'origine. Le mode incrémentiel tient compte des positions précédentes de noeud. Dans ce mode, l'algorithme conserve le classement
relatif des niveaux et des noeuds au sein des niveaux au sein de l'agencement suivant. Il ne conserve pas les positions absolues des noeuds, mais il essaie de détecter la structure de l'agencement précédent
par l'examen des coordonnées de noeud. Par exemple, si deux noeuds sont au même
niveau, ils restent à ce même niveau après un agencement incrémentiel. Si un noeud est à un niveau plus élevé qu'un autre noeud, il reste au niveau plus élevé.
La figure ci-après illustre la différence entre un agencement
incrémentiel et non incrémentiel.

Agencements incrémentiels et non incrémentiels
Le mode incrémentiel est désactivé par défaut.
Pour activer le mode incrémentiel :
Utilisez la méthode setIncrementalMode. Par exemple :
layout.setIncrementalMode(true);
Phases du mode incrémentiel
L'algorithme d'agencement analyse le tracé en mode incrémentiel de la manière suivante :
- Tout d'abord, il détermine à partir des coordonnées de noeud les noeuds qui doivent appartenir au au même niveau. Par exemple, si la direction de flux est vers le bas, il essaie de détecter les lignes de référence horizontales aux positions verticales, lorsqu'un grand nombre de noeuds sont placés le long d'une ligne. Le décalage de noeud vertical spécifié permet de détecter ces lignes car les lignes de référence horizontales doivent correspondre environ au décalage de noeud vertical. Voir la figure ci-après.
- Tous les noeuds qui touchent la même ligne de référence sont affectés au même niveau.
- Il détermine le classement des noeuds au sein de chaque niveau en analysant à quel endroit le noeud touche la ligne de référence. Par exemple, si direction de flux est vers le bas, il détermine à partir de l'abscisse (axe des x) de noeuds comment ils sont classés au sein des niveaux
- Si des liens longs s'étalent sur plusieurs niveaux, l'algorithme peut conserver la forme d'un lien long. Il détermine le point auquel un lien croise la ligne de référence du niveau. Il crée un point de flexion pour le lien long à l'intérieur du niveau. Il essaie de conserver le classement des points de flexion dans chaque niveau. Par exemple, si dans une direction de flux vers le bas, un lien long ignore un autre noeud sur le côté droit, l'agencement incrémentiel essaie de trouver une forme similaire du lien qui ignore le noeud sur le côté droit. Voir la figure ci-après.
- Enfin, l'agencement essaie de calculer les positions absolues des noeuds qui respectent les niveaux et le classement au sein des niveaux. Il essaie d'équilibrer les positions de noeud. Toutefois, il essaie également de placer chaque noeud près de sa position précédente. Les deux critères sont souvent en concurrence, car pour obtenir un équilibre parfait, les noeuds doivent parfois se déplacer loin de leur position d'origine. L'agencement hiérarchique contient un heuristique paramétré pour respecter ces deux critères.
La figure ci-après illustre le résultat des phases de l'agencement incrémentiel.

Phase de l'agencement incrémentiel
Paramètres experts pour le mode incrémentiel
Chaque phase du mode incrémentiel peut être paramétrée.
Ces paramètres d'agencement n'ont un effet que si le mode incrémentiel est activé.
Réduction des intersections de liens longs
L'agencement incrémentiel essaie de conserver la forme des liens longs qui s'entrecroisent sur plusieurs niveaux. Cela implique que les intersections de liens
entre les liens longs ne sont pas résolues. Si les intersections de liens longs ne sont pas souhaitées, il peut être préférable de rerouter les liens longs sur des bases entièrement nouvelles.
La figure ci-après illustre quatre arborescences hiérarchiques, avec l'agencement d'origine dans la partie supérieure gauche. La partie inférieure droite indique le résultat si les liens longs sont reroutés, et la partie supérieure droite indique le résultat si la forme des liens longs est conservée.

Réduction des intersections lors des agencements incrémentiels
Pour rerouter les liens longs sur des bases entièrement nouvelles, vous devez activer le mécanisme de réduction des intersections pour les liens longs :
Utilisez la méthode setLongLinkCrossingReductionDuringIncremental. Par exemple :
layout.setLongLinkCrossingReductionDuringIncremental(true);
La réduction des intersections de liens longs détermine uniquement la forme des liens. Elle n'a aucune incidence sur le classement des autres noeuds au sein des niveaux.
Réduction de toutes les intersections de liens
Vous pouvez, de façon facultative, appliquer une réduction des intersections à tous les noeuds au sein de chaque niveau. Dans ce cas, l'agencement incrémentiel détermine à partir des coordonnées de noeud les noeuds qui appartiennent au même niveau, mais il peut
reclasser complètement les noeuds au sein des niveaux afin d'éviter les intersections de noeud. Il réorganise également les liens longs dans ce cas. La figure précédente, partie inférieure gauche, indique le résultat. Notez que le classement des noeuds “F”, “G” et “H” a été modifié pour résoudre les intersections de liens.
Pour activer la réduction des intersections de tous les noeuds :
Utilisez la méthode setCrossingReductionDuringIncremental :
layout.setCrossingReductionDuringIncremental(true);
Définition du positionnement de niveau absolu
L'agencement incrémentiel essaie de placer les noeuds dans des
positions absolues qui sont proches des positions précédentes. Il essaie d'éviter
que les noeuds se déplacent sur une grande distance, car même si le classement relatif des noeuds
au sein des niveaux ne change pas, d'importantes distances de déplacement
peuvent prêter à confusion pour les utilisateurs. Il est beaucoup plus facile de conserver une image mentale du diagramme si les noeuds demeurent proches de leurs positions initiales.
La figure ci-après illustre le repositionnement de noeud avec et sans
prise en compte des positions précédentes. L'agencement incrémentiel
du graphe d'origine dans la partie supérieure gauche produit le graphe
situé dans la partie supérieure droite, lequel est facile à identifier comme étant identique
au graphe situé dans la partie inférieure.
La fonction de positionnement de niveau absolu activée par
défaut mais peut être désactivée.
Pour désactiver la fonction de positionnement de niveau absolu :
Utilisez la méthode setIncrementalAbsoluteLevelPositioning. Par exemple :
layout.setIncrementalAbsoluteLevelPositioning(false);
Avec cette instruction l'agencement n'essaie pas de placer les noeuds
près de leurs positions précédentes. Il place les noeuds de manière à obtenir un agencement
équilibré. Toutefois, pour créer un équilibre parfait,
l'agencement peut avoir besoin de déplacer quelques noeuds à des distances si éloignées
que vous ne reconnaissez plus le diagramme (voir la figure suivante, partie inférieure).

Positionnement absolu lors des agencements incrémentiels
Définition de plages de positionnement de niveau absolu et tendances
Si le positionnement de niveau absolu est activé, il est en concurrence
avec les critères esthétiques pour créer un agencement équilibré. Etant donné que les noeuds
peuvent rester proches de leurs positions précédentes, le diagramme une fois l'agencement incrémentiel effectué peut être quelque peu déséquilibré et non symétrique. L'algorithme d'agencement hiérarchique utilise un heuristique sur lequel vous pouvez influer
avec deux paramètres, la plage de positionnements de niveau absolu et les tendances.
La fonction de positionnement de niveau absolu activée par
défaut mais peut être désactivée.
Pour désactiver la fonction de positionnement de niveau absolu :
Utilisez la méthode setIncrementalAbsoluteLevelPositionRange. Par exemple :
layout.setIncrementalAbsoluteLevelPositionRange(100);
Cette instruction indique qu'au sein de la plage de 100 unités de coordonnées de l'ancienne position du noeud, l'équilibre est le seul critère pour le placement. Cela signifie qu'un noeud dont
la position optimale est inférieure à 100 unités de coordonnées par rapport à sa
position précédente est placé exactement à sa position optimale. Les noeuds dont la
position optimale est bien plus éloignée sont placés à une position qui est un compromis entre la
position précédente et la position optimale. Voir la figure ci-après, à droite.
Pour définir la tendance de positionnement de niveau absolu :
Utilisez la méthode setIncrementalAbsoluteLevelPositionTendency. Par exemple :
layout.setIncrementalAbsoluteLevelPositionTendency(70);
Cette instruction indique que lorsque la position optimale d'un noeud est
très éloignée de sa position précédente, sa position est influencée à 70% par sa position précédente et à 30% par sa position optimale. Imaginez un élastique qui essaie de tirer un noeud
vers sa position précédente, et un autre élastique qui essaie de tirer ce même noeud vers sa position équilibrée optimale. La tendance de positionnement de niveau
70
signifie qu'un élastique
tire avec 70% de force vers la position précédente, et que l'autre élastique
tire avec 30% de force vers la position optimale. Une augmentation de cette tendance
signifie que le noeud demeure plus proche de son ancienne position,
tandis qu'une réduction signifie que le noeud se rapproche de sa position optimale.
Si vous définissez cette tendance sur 0%, cela a le même effet que la désactivation
du positionnement de niveau absolu incrémentiel (voir la figure ci-après). 
Positionnement absolu lors des agencements incrémentiels
Marquage des noeuds pour l'agencement incrémentiel
L'agencement incrémentiel traite normalement tous les noeuds et tous les liens du tracé de la même manière. Toutefois, des noeuds et des liens peuvent avoir été ajoutés au tracé à l'aide d'un programme, et les nouveaux noeuds et liens n'ont pas encore de coordonnées significatives. Vous les avez peut-être tous placés
aux coordonnées d'origine (0,0) ou à des coordonnées aléatoires. Dans ce cas, vous avez besoin d'un agencement incrémentiel qui prenne en compte les coordonnées de tous les noeuds qui ont été préalablement agencés, et qui ignore les coordonnées de tous les nouveaux noeuds.
Le mode incrémentiel de l'agencement hiérarchique vous permet de
spécifier les noeuds qui ne peuvent pas être agencés de manière incrémentielle à l'aide
de la méthode :
layout.markForIncremental(nodeOrLink);
Si vous appelez cette instruction, le noeud ou le lien est marqué de sorte que ses
coordonnées sont ignorées lors de l'agencement incrémentiel suivant. Les positions des noeuds et des liens marqués sont calculées sur des bases entièrement nouvelles. La marque est valide uniquement jusqu'à l'agencement suivant est automatiquement effacée ensuite.