Récursivité simple : application du même agencement à tous les sous-graphes

Vous pouvez appliquer le même agencement lorsque les deux conditions suivantes sont remplies :
  • Le même algorithme d'agencement doit être appliqué au graphe de niveau supérieur et à tous ses sous-graphes.
  • Les paramètres de l'algorithme d'agencement (c'est-à-dire, les paramètres d'agencement) doivent être identiques pour le graphe de niveau supérieur et pour tous les sous-graphes.
La figure ci-après illustre un exemple dans lequel un agencement arborescent est appliqué au graphe de niveau supérieur et à tous ses sous-graphes. De plus, les paramètres de l'algorithme d'agencement arborescent sont les mêmes pour tous les graphes. L'application n'a pas besoin, par exemple, de directions de flux différentes dans le graphe de niveau supérieur et dans les sous-graphes.
Exemple d'agencement récursif d'un graphe imbriqué dont le côté gauche représente une partie 1 (Part 1) contenant un élément Network 1 avec deux sous-graphes, Network 1.1 et Network 1.2, et le côté droit représente une partie 2 (Part 2) contenant un élément Network 2 avec 2 sous-graphes, Network
2.1 et Network 2.2. Examinez la partie 1 avant la partie 2. Pour l'élément Network 1, le premier niveau comporte un noeud, le deuxième niveau comporte trois noeuds et le troisième niveau comporte deux noeuds. Les noeuds présents sur les deuxième et troisième niveaux sont agencés horizontalement. Le noeud 1 est relié à tous les noeuds du deuxième niveau. Le noeud du milieu sur le deuxième niveau est relié aux deux noeuds du troisième niveau.
L'agencement de Network 2 est le même que celui de Network 1. Pour l'élément Network 1.1, le premier niveau comporte un noeud, le deuxième niveau comporte deux noeuds et le troisième niveau comporte trois noeuds. Les noeuds présents sur les deuxième et troisième niveaux sont agencés horizontalement. Le noeud 1 est relié à tous les noeuds du deuxième niveau. Le noeud situé à droite du deuxième niveau est relié à tous les noeuds du troisième niveau. L'agencement de Network 2.1 est le même que celui de Network
1.1. Pour l'élément Network 1.2, le premier niveau comporte un noeud et le deuxième niveau comporte trois noeuds. Les noeuds présents sur le deuxième niveau sont agencés horizontalement.
Le noeud 1 est relié à tous les noeuds du deuxième niveau. L'agencement de Network 2.2 est le même que celui de Network 1.2.
Exemple d'agencement récursif d'un graphe imbriqué
Il est facile d'obtenir de tels agencements récursifs. Vous devez spécifier l'agencement de graphe sur l'instance Diagram ou Graph de niveau supérieur et appeler la méthode performGraphLayout. L'agencement sera effectué de façon récursive, car, par défaut, l'argument recursive de la méthode a pour valeur true.

Mécanisme interne

Le mécanisme interne repose sur le principe selon lequel une instance d'agencement est utilisée pour un graphe uniquement et ne peut pas être réutilisée pour ses sous-graphes. Par conséquent, l'instance d'agencement arborescent est automatiquement "clonée" à l'aide de la méthode ibm_ilog.graphlayout.GraphLayout.copy().
L'agencement de graphe est appliqué à un modèle de graphe, et le même principe s'applique aux modèles de graphe : une instance de modèle de graphe est utilisée pour un graphe uniquement et ne peut pas être réutilisée pour des sous-graphes.
Les modèles de graphe des sous-graphes sont créés par des appels à la méthode ibm_ilog.graphlayout.GraphLayout.copy(), laquelle crée à son tour le modèle de graphe à l'aide de la méthode ibm_ilog.graphlayout.GraphLayout.getGraphModel().
Toutes ces opérations sont effectuées automatiquement, de façon transparente. Il vous suffit d'appeler la méthode performGraphLayout, avec l'argument recursive défini avec la valeur true ou omis.

Exemple de code Dojo

L'exemple de code suivant montre comment appliquer un seul algorithme d'agencement à un graphe imbriqué :
var diagram = dijit.byId("diagram");
var treeLayout = new ibm_ilog.graphlayout.tree.TreeLayout();
diagram.attr("nodeLayout", treeLayout);
diagram.performGraphLayout(true);