Dorian Fevrier's blog - Mot-clé - graphique
Je m’appelle FEVRIER Dorian, je suis infographiste 3D passionné par mon métier, l’informatique en général, l’internet, la programmation et l’évolution de tout ce petit monde. Vous trouverez sur ce blog des tutoriaux, mes coups de cœurs, avis, etc.
2024-01-02T23:48:05+01:00
FEVRIER Dorian
urn:md5:695d9c73474c33ce3dab043823509c4b
Dotclear
Utiliser Graphviz pour générer des graphes de dépendance
urn:md5:455cc6a0eb98160654cff8c9f149290c
2011-07-20T21:26:00+02:00
2013-07-26T18:07:38+02:00
Narann
Infographie 3D - Boulot
dot
fr
graph
graphique
script
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_07_18_Graphviz/myGraph_tn.png" alt="myGraph_tn.png" style="float:left; margin: 0 1em 1em 0;" title="myGraph_tn.png, juil. 2011" height="150" width="150" />Aujourd'hui je voudrais vous présenter <a href="http://www.graphviz.org/" hreflang="en">Graphviz</a>, un outil qui génère des graphes depuis des fichiers texte. :seSentCon:</p>
<p>Je m'en suis servi en production pour générer des graphes de dépendance de révision (La révision "machin" du cache "machin" a été généré depuis la révision "machin" du model "machin" et est utilisé dans le set "truc", "bidule" et "bitonio").</p>
<p>Je ne peux bien évidement pas vous montrer les graphes générés ici mais sachez qu'on découvrait pas mal de choses en les regardant... Justement parce que ce genre d'outil permet de visualiser rapidement des choses que notre cerveau a du mal à concevoir tout seul. Dans le cas d'un dataflow un peu compliqué, ça détend les neurones. :nevroz:</p>
<p>(Merci à <a href="http://fr.linkedin.com/in/adrienherubel">Adrien Herubel</a> de m'avoir fait découvrir cet outil)</p> <p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_07_18_Graphviz/french_pipeline.jpg" alt="french_pipeline.jpg" style="display:block; margin:0 auto;" title="french_pipeline.jpg, juil. 2011" height="467" width="550" />
D'autres graphiques impressionnants sur cette <a href="http://www2.research.att.com/~yifanhu/GALLERY/GRAPHS/" hreflang="en">magnifique galerie</a>.</p>
<h3>Principe</h3>
<p>Le principe est très simple: Vous générez un fichier texte contenant les informations du graphe.</p>
<p>Vous donnez ensuite ce fichier à un des outils de Graphviz (principalement dot) qui génère ainsi une image de votre graphe. :hehe:</p>
<h3>Un premier exemple, simple</h3>
<p>Installer graphviz pour votre OS, lancez un terminal et c'est parti! :grenadelauncher:</p>
<p>Le langage dot est très simple et il s'apprend quasiment uniquement par la pratique.</p>
<p>Voici un exemple que je vais détailler:</p>
<pre class="dot dot"><span style="color: #000000; font-weight: bold;">digraph</span> g <span style="color: #66cc66;">{</span>
<span style="color: #000000; font-weight: bold;">graph</span> <span style="color: #66cc66;">[</span>
<span style="color: #000066;">rankdir</span> <span style="color: #66cc66;">=</span> LR
<span style="color: #000066;">bgcolor</span><span style="color: #66cc66;">=</span> grey50
<span style="color: #66cc66;">]</span>
<span style="color: #000000; font-weight: bold;">node</span> <span style="color: #66cc66;">[</span>
<span style="color: #000066;">fontsize</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"10"</span>
<span style="color: #000066;">shape</span> <span style="color: #66cc66;">=</span> <span style="color: #993333;">box</span>
<span style="color: #000066;">style</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"rounded,filled"</span>
<span style="color: #66cc66;">]</span>
myNode1 <span style="color: #66cc66;">[</span>
<span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"Node One"</span>
<span style="color: #000066;">color</span> <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">lightsalmon</span>
<span style="color: #000066;">fillcolor</span> <span style="color: #66cc66;">=</span> grey75
<span style="color: #66cc66;">]</span>
myNode2 <span style="color: #66cc66;">[</span>
<span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"Node Two"</span>
<span style="color: #000066;">color</span> <span style="color: #66cc66;">=</span> lightcoral
<span style="color: #000066;">fillcolor</span> <span style="color: #66cc66;">=</span> grey75
<span style="color: #66cc66;">]</span>
myNode3 <span style="color: #66cc66;">[</span>
<span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"Node Three"</span>
<span style="color: #000066;">color</span> <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">lightpink</span>
<span style="color: #000066;">fillcolor</span> <span style="color: #66cc66;">=</span> grey75
<span style="color: #66cc66;">]</span>
myNode4 <span style="color: #66cc66;">[</span>
<span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"Node Four"</span>
<span style="color: #000066;">color</span> <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">orange</span>
<span style="color: #000066;">fillcolor</span> <span style="color: #66cc66;">=</span> grey75
<span style="color: #66cc66;">]</span>
myNode1 <span style="color: #66cc66;">-></span> myNode2 <span style="color: #66cc66;">[</span> penwidth <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span>, <span style="color: #000066;">fontsize</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">8</span>, <span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"Connection One"</span> <span style="color: #66cc66;">]</span>
myNode2 <span style="color: #66cc66;">-></span> myNode3 <span style="color: #66cc66;">[</span> penwidth <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span>, <span style="color: #000066;">fontsize</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">8</span>, <span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"Connection Two"</span> <span style="color: #66cc66;">]</span>
myNode1 <span style="color: #66cc66;">-></span> myNode4 <span style="color: #66cc66;">[</span> penwidth <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span>, <span style="color: #000066;">fontsize</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">8</span>, <span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"Connection Three"</span> <span style="color: #66cc66;">]</span>
<span style="color: #000000; font-weight: bold;">subgraph</span> cluster_sg1 <span style="color: #66cc66;">{</span>
<span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"subGraph One"</span>
<span style="color: #000066;">style</span> <span style="color: #66cc66;">=</span> rounded
<span style="color: #000066;">color</span> <span style="color: #66cc66;">=</span> springgreen4
myNode1
myNode4
<span style="color: #66cc66;">}</span>
<span style="color: #000000; font-weight: bold;">subgraph</span> cluster_sg2 <span style="color: #66cc66;">{</span>
<span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"subGraph Two"</span>
<span style="color: #000066;">style</span> <span style="color: #66cc66;">=</span> rounded
<span style="color: #000066;">color</span> <span style="color: #66cc66;">=</span> violetred3
myNode2
myNode3
<span style="color: #66cc66;">}</span>
<span style="color: #66cc66;">}</span></pre>
<p>Copiez tout ça dans un fichier <em>monFichier.dot</em> puis faites:</p>
<pre class="bash bash">dot <span style="color: #660033;">-Tpng</span> monFichier.dot <span style="color: #660033;">-o</span> monGraphe.png</pre>
<p>Ici, <em>-Tpng</em> sert à dire à dot de créer un graph au format png. (Il y en a d'autres comme <em>-Tsvg</em>. La liste complète est disponible dans <a href="http://www.graphviz.org/pdf/dot.1.pdf" hreflang="en">la doc de dot</a>, bas de la première page).</p>
<p>Une fois généré, vous devriez avoir ça:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_07_18_Graphviz/myGraph001.png" alt="myGraph001.png" style="display:block; margin:0 auto;" title="myGraph001.png, juil. 2011" height="243" width="557" /></p>
<center><i>Et voilà le travail! :hehe:</i></center>
<p>Notez qu'on a pas besoin de réfléchir au positionnement des nodes. On déclare, les nodes, les connexions et il génère le graphe. Cette "puissance" peut être bloquante quand justement, on essaye d'organiser un peu les graphes qu'on sort... :reflechi:</p>
<p>Et maintenant les explications.</p>
<p>Vous allez voir que Graphviz peut être très flexible quand vous décrivez vos graphes. Il n'y a pas une seule façon de déclarer un graphe, d’où l’intérêt d’expérimenter un maximum. :idee:</p>
<p>C'est aussi la porte ouverte au n'importe quoi. C'est à vous de faire attention. :papi:</p>
<pre class="dot dot"><span style="color: #000000; font-weight: bold;">digraph</span> g <span style="color: #66cc66;">{</span> ... <span style="color: #66cc66;">}</span></pre>
<p>Il ne doit y en avoir qu'un seul et c'est celui qui contient votre graphe. C'est un peu la racine.</p>
<p>:longBar:</p>
<pre class="dot dot"><span style="color: #000000; font-weight: bold;">graph</span> <span style="color: #66cc66;">[</span>
<span style="color: #000066;">rankdir</span> <span style="color: #66cc66;">=</span> LR
<span style="color: #000066;">bgcolor</span><span style="color: #66cc66;">=</span> grey50
<span style="color: #66cc66;">]</span></pre>
<p>Contient tout les attributs par défaut du graphe (<a href="http://www.graphviz.org/pdf/dotguide.pdf" hreflang="en">cf dotguide</a>, page 33).</p>
<ul>
<li><em>rankdir</em>: Permet de définir le sens du graphe (ici, Left to Right)</li>
<li><em>bgcolor</em>: La couleur du fond du graphe, à choisir parmi les nombreuses <a href="http://www.graphviz.org/content/color-names" hreflang="en">couleurs disponibles</a>.</li>
</ul>
<p>:longBar:</p>
<pre class="dot dot"><span style="color: #000000; font-weight: bold;">node</span> <span style="color: #66cc66;">[</span>
<span style="color: #000066;">fontsize</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"10"</span>
<span style="color: #000066;">shape</span> <span style="color: #66cc66;">=</span> <span style="color: #993333;">box</span>
<span style="color: #000066;">style</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"rounded,filled"</span>
<span style="color: #66cc66;">]</span></pre>
<p>Contient tout les attributs par défaut des nodes (<a href="http://www.graphviz.org/pdf/dotguide.pdf" hreflang="en">cf dotguide</a>, page 30).</p>
<ul>
<li><em>fontsize</em>: La taille de la police de caractère utilisée pour les nodes.</li>
<li><em>shape</em>: La forme des nodes (<a href="http://www.graphviz.org/pdf/dotguide.pdf" hreflang="en">cf dotguide</a>, page 38).</li>
<li><em>style</em>: La "mise en page" des nodes. Ici, bords arrondis (j'aime bien :seSentCon: ) et bg coloré.</li>
</ul>
<p>:longBar:</p>
<pre class="dot dot">myNode1 <span style="color: #66cc66;">[</span>
<span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"Node One"</span>
<span style="color: #000066;">color</span> <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">lightsalmon</span>
<span style="color: #000066;">fillcolor</span> <span style="color: #66cc66;">=</span> grey75
<span style="color: #66cc66;">]</span></pre>
<p>S'en suit maintenant la description de chaque node.</p>
<p>Par défaut, les valeurs des attributs sont celles définies dans la déclaration <em>node</em>, juste au dessus.</p>
<p>Ensuite, chaque paramètre vient s'ajouter:</p>
<ul>
<li><em>label</em>: Ce qui est écrit dans le node (nous verrons plus loin quand on souhaite faire de la mise en forme plus complexe)</li>
<li><em>color</em>: La couleur des bords du node, à choisir parmi les nombreuses <a href="http://www.graphviz.org/content/color-names" hreflang="en">couleurs disponibles</a>.</li>
<li><em>fillcolor</em>: La couleur du fond du node.</li>
</ul>
<p>On déclare plusieurs nodes comme ça puis on attaque les connections.</p>
<p>:longBar:</p>
<pre class="dot dot">myNode1 <span style="color: #66cc66;">-></span> myNode2 <span style="color: #66cc66;">[</span> penwidth <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span>, <span style="color: #000066;">fontsize</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">8</span>, <span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"Connection One"</span> <span style="color: #66cc66;">]</span></pre>
<p>Les attributs et leurs valeurs par défauts sont dispos sur le <a href="http://www.graphviz.org/pdf/dotguide.pdf" hreflang="en">dotguide</a>, page 32.</p>
<ul>
<li><em>penwidth</em>: La taille du tracé de la connexion (Inutile dans ce cas là car, comme vous pouvez le constater dans la doc, la taille par défaut est déjà à 1). :baffed:</li>
<li><em>fontsize</em>: La taille du texte de la connexion.</li>
<li><em>label</em>: Ce qui est écrit dans la connection (notez que j’écris rarement un texte sur une connexion).</li>
</ul>
<p>:longBar:</p>
<p>Viennent ensuite les subgraphs qui sont tout à fait optionnel mais peuvent servir à donner un peu d'ordre à vos graphes:</p>
<pre class="dot dot"><span style="color: #000000; font-weight: bold;">subgraph</span> cluster_sg1 <span style="color: #66cc66;">{</span>
<span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"subGraph One"</span>
<span style="color: #000066;">style</span> <span style="color: #66cc66;">=</span> rounded
<span style="color: #000066;">color</span> <span style="color: #66cc66;">=</span> springgreen4
myNode1
myNode4
<span style="color: #66cc66;">}</span></pre>
<ul>
<li><em>label</em>: Le nom du subgraph qui s'affichera.</li>
<li><em>style</em>: Le "style" du subgraph (comme les nodes).</li>
<li><em>color</em>: La couleur des contours du subgraph.</li>
</ul>
<p>Viennent ensuite la liste des nodes contenu dans le subgraph.</p>
<blockquote><p>Important: Les identifiants des subgraphs doivent toujours commencer par "cluster" sinon ils ne s'afficheront pas. Je m'en suis fait des bosses à me taper la tête contre les murs avec ça. :aupoil:</p></blockquote>
<p>Nous avons donc fini avec le premier exemple. Nous allons maintenant prendre un cas plus concret. :enerve:</p>
<h3>Un graphe de dépendance de révision</h3>
<p>Comme je ne m'en suis servi que dans le cadre d'une production CG, je placerai mon exemple dans ce contexte. Peut être existe t'il mille façons d'utiliser dot et que la mienne est bien la dernière, mais après tout, c'est ce qui nous intéresse non? :dentcasse:</p>
<p>Nous allons prendre l'exemple d'un graphe de dépendance de révision. L'avantage de ce genre de graph, c'est qu'il est souvent de <a href="http://fr.wikipedia.org/wiki/Arbre_%28graphe%29" hreflang="fr">type tree</a>.</p>
<h4>Avant propos, Python est ton amis</h4>
<p>Je vais passer brièvement sur le "comment" de la génération des fichiers .dot.</p>
<p>Pour générer un tel fichier, je me suis servi des classes en Python auquel je rajoutais des attributs.</p>
<p>Chaque nœud du graphe est en fait un objet Python de type <em>RevNode</em> contenant tous ses attributs ainsi qu'une liste de tous ses enfants.</p>
<p>L'idée est de créer une liste de <em>RevNode</em>, chacun ayant ces propres attributs et les autres Nodes auxquels il se connecte.</p>
<p>Bien entendu, vous récupérez automatiquement ces informations dans la base de donnée de votre pipeline. :sourit:</p>
<p>Vous partez donc d'une révision que vous choisissez, puis vous la parcourez en arbre via une fonction récursive.</p>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">class</span> RevNode<span style="color: black;">(</span><span style="color: black;">)</span> :
<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">(</span> <span style="color: #008000;">self</span> <span style="color: black;">)</span> :
<span style="color: #008000;">self</span>.<span style="color: black;">nodeName</span> = <span style="color: #483d8b;">""</span> <span style="color: #808080; font-style: italic;"># Ici, un identifiant unique du node, c'est à vous de voir</span>
<span style="color: #008000;">self</span>.<span style="color: black;">assetName</span> = <span style="color: #483d8b;">""</span> <span style="color: #808080; font-style: italic;"># "chaussette"</span>
<span style="color: #008000;">self</span>.<span style="color: black;">assetType</span> = <span style="color: #483d8b;">""</span> <span style="color: #808080; font-style: italic;"># anim, model, etc...</span>
<span style="color: #008000;">self</span>.<span style="color: black;">rev</span> = <span style="color: #483d8b;">""</span> <span style="color: #808080; font-style: italic;"># "Last", "Validated", "5", etc...</span>
<span style="color: #008000;">self</span>.<span style="color: black;">childrenList</span> = <span style="color: black;">[</span><span style="color: black;">]</span> <span style="color: #808080; font-style: italic;"># List de tout les RevNode enfant de celui ci</span>
<span style="color: #ff7700;font-weight:bold;">def</span> getAllRevNode<span style="color: black;">(</span> <span style="color: #008000;">self</span> <span style="color: black;">)</span> :
<span style="color: #483d8b;">"""Renvoit ce node plus ces enfants"""</span>
revNodeList = <span style="color: black;">[</span><span style="color: black;">]</span>
revNodeList.<span style="color: black;">append</span><span style="color: black;">(</span> <span style="color: #008000;">self</span> <span style="color: black;">)</span> <span style="color: #808080; font-style: italic;"># on ajoute ce node</span>
<span style="color: #ff7700;font-weight:bold;">for</span> revNode <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">childrenList</span> :
revNodeList += revNode.<span style="color: black;">getAllAssetNode</span><span style="color: black;">(</span><span style="color: black;">)</span>
<span style="color: #ff7700;font-weight:bold;">return</span> assetNodeList</pre>
<center><i>Oui je sais, les fonctions récursives en Python, caymal :baffed:</i></center>
<p>Arrivé à ce stade, vous avez une liste de <em>RevNode</em>.</p>
<p>Il faut ensuite générer le fichier .dot contenant tout ça. Nous allons voir que l'on peut "formater" le contenu d'un node de manière plus personnalisé grâce à une possibilité intéressante de dot qui permet de lui donner un label qui sera interprété en HTML (<a href="http://www.graphviz.org/pdf/dotguide.pdf" hreflang="en">cf dotguide</a>, page 9).</p>
<h4>HTML dans dot</h4>
<p>Il faut préciser à dot que le <em>label</em> que vous lui donnez devra être interprété en HTML.</p>
<p>Pour ça, rien de plus simple, il faut simplement placer le contenu HTML entre < ... > :</p>
<pre class="dot dot"><span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #66cc66;"><</span> maDescriptionHTML <span style="color: #66cc66;">></span></pre>
<p>Le plus dur étant de justement avoir de l'HTML valide. :sourit:</p>
<p>Un exemple:</p>
<pre>
<TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD ALIGN="right" ><FONT COLOR="deeppink">Name:</FONT></TD><TD ALIGN="left" >Chausset</TD></TR>
<TR><TD ALIGN="right" ><FONT COLOR="blue4">Type:</FONT></TD><TD ALIGN="left" >Model</TD></TR>
<TR><TD ALIGN="right" ><FONT COLOR="darkorchid4">Rev:</FONT></TD ALIGN="left" ><TD>5</TD></TR>
</TABLE>
</pre>
<p>Mettez tout ça entre < ... >.</p>
<p>Expérimentez! :sourit:</p>
<h4>Let's go!</h4>
<p>Voici un graphe qui pourrait ressembler à un graphe de dépendance:</p>
<pre class="dot dot"><span style="color: #000000; font-weight: bold;">digraph</span> g <span style="color: #66cc66;">{</span>
<span style="color: #000000; font-weight: bold;">graph</span> <span style="color: #66cc66;">[</span>
<span style="color: #000066;">rankdir</span> <span style="color: #66cc66;">=</span> RL
<span style="color: #000066;">bgcolor</span><span style="color: #66cc66;">=</span> grey50
<span style="color: #66cc66;">]</span>
<span style="color: #000000; font-weight: bold;">node</span> <span style="color: #66cc66;">[</span>
<span style="color: #000066;">fontsize</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"10"</span>
<span style="color: #000066;">shape</span> <span style="color: #66cc66;">=</span> <span style="color: #993333;">box</span>
<span style="color: #000066;">style</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"rounded,filled"</span>
<span style="color: #66cc66;">]</span>
<span style="color: #000000; font-weight: bold;">edge</span> <span style="color: #66cc66;">[</span>
<span style="color: #000066;">fontsize</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"8"</span>
<span style="color: #66cc66;">]</span>
myNodeSet1 <span style="color: #66cc66;">[</span>
<span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #66cc66;"><<</span>TABLE BORDER<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"0"</span> CELLBORDER<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"0"</span> CELLSPACING<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"0"</span><span style="color: #66cc66;">></span>
<span style="color: #66cc66;"><</span>TR<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"right"</span> <span style="color: #66cc66;">><</span>FONT <span style="color: #000066;">COLOR</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">"blue4"</span><span style="color: #66cc66;">></span>Name:<span style="color: #66cc66;"></</span>FONT<span style="color: #66cc66;">></</span>TD<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"left"</span> <span style="color: #66cc66;">></span>Etagere<span style="color: #66cc66;"></</span>TD<span style="color: #66cc66;">></</span>TR<span style="color: #66cc66;">></span>
<span style="color: #66cc66;"><</span>TR<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"right"</span> <span style="color: #66cc66;">><</span>FONT <span style="color: #000066;">COLOR</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">"blue4"</span><span style="color: #66cc66;">></span>Type:<span style="color: #66cc66;"></</span>FONT<span style="color: #66cc66;">></</span>TD<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"left"</span> <span style="color: #66cc66;">></span>Set<span style="color: #66cc66;"></</span>TD<span style="color: #66cc66;">></</span>TR<span style="color: #66cc66;">></span>
<span style="color: #66cc66;"><</span>TR<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"right"</span> <span style="color: #66cc66;">><</span>FONT <span style="color: #000066;">COLOR</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">"darkorchid4"</span><span style="color: #66cc66;">></span>Rev:<span style="color: #66cc66;"></</span>FONT<span style="color: #66cc66;">></</span>TD<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"left"</span> <span style="color: #66cc66;">></span><span style="color: #cc66cc;">7</span><span style="color: #66cc66;"></</span>TD<span style="color: #66cc66;">></</span>TR<span style="color: #66cc66;">></span>
<span style="color: #66cc66;"></</span>TABLE<span style="color: #66cc66;">>></span>
<span style="color: #000066;">color</span> <span style="color: #66cc66;">=</span> blue4
<span style="color: #000066;">fillcolor</span> <span style="color: #66cc66;">=</span> deepskyblue1
<span style="color: #66cc66;">]</span>
myNodeModel1 <span style="color: #66cc66;">[</span>
<span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #66cc66;"><<</span>TABLE BORDER<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"0"</span> CELLBORDER<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"0"</span> CELLSPACING<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"0"</span><span style="color: #66cc66;">></span>
<span style="color: #66cc66;"><</span>TR<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"right"</span> <span style="color: #66cc66;">><</span>FONT <span style="color: #000066;">COLOR</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">"darkgreen"</span><span style="color: #66cc66;">></span>Name:<span style="color: #66cc66;"></</span>FONT<span style="color: #66cc66;">></</span>TD<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"left"</span> <span style="color: #66cc66;">></span>Chaussette<span style="color: #66cc66;"></</span>TD<span style="color: #66cc66;">></</span>TR<span style="color: #66cc66;">></span>
<span style="color: #66cc66;"><</span>TR<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"right"</span> <span style="color: #66cc66;">><</span>FONT <span style="color: #000066;">COLOR</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">"blue4"</span><span style="color: #66cc66;">></span>Type:<span style="color: #66cc66;"></</span>FONT<span style="color: #66cc66;">></</span>TD<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"left"</span> <span style="color: #66cc66;">></span>Model<span style="color: #66cc66;"></</span>TD<span style="color: #66cc66;">></</span>TR<span style="color: #66cc66;">></span>
<span style="color: #66cc66;"><</span>TR<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"right"</span> <span style="color: #66cc66;">><</span>FONT <span style="color: #000066;">COLOR</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">"darkorchid4"</span><span style="color: #66cc66;">></span>Rev:<span style="color: #66cc66;"></</span>FONT<span style="color: #66cc66;">></</span>TD<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"left"</span> <span style="color: #66cc66;">></span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;"></</span>TD<span style="color: #66cc66;">></</span>TR<span style="color: #66cc66;">></span>
<span style="color: #66cc66;"></</span>TABLE<span style="color: #66cc66;">>></span>
<span style="color: #000066;">color</span> <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">darkgreen</span>
<span style="color: #000066;">fillcolor</span> <span style="color: #66cc66;">=</span> darkolivegreen4
<span style="color: #66cc66;">]</span>
myNodeCache1 <span style="color: #66cc66;">[</span>
<span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #66cc66;"><<</span>TABLE BORDER<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"0"</span> CELLBORDER<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"0"</span> CELLSPACING<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"0"</span><span style="color: #66cc66;">></span>
<span style="color: #66cc66;"><</span>TR<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"right"</span> <span style="color: #66cc66;">><</span>FONT <span style="color: #000066;">COLOR</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">"deeppink"</span><span style="color: #66cc66;">></span>Name:<span style="color: #66cc66;"></</span>FONT<span style="color: #66cc66;">></</span>TD<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"left"</span> <span style="color: #66cc66;">></span>Chaussette<span style="color: #66cc66;"></</span>TD<span style="color: #66cc66;">></</span>TR<span style="color: #66cc66;">></span>
<span style="color: #66cc66;"><</span>TR<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"right"</span> <span style="color: #66cc66;">><</span>FONT <span style="color: #000066;">COLOR</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">"blue4"</span><span style="color: #66cc66;">></span>Type:<span style="color: #66cc66;"></</span>FONT<span style="color: #66cc66;">></</span>TD<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"left"</span> <span style="color: #66cc66;">></span>Cache<span style="color: #66cc66;"></</span>TD<span style="color: #66cc66;">></</span>TR<span style="color: #66cc66;">></span>
<span style="color: #66cc66;"><</span>TR<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"right"</span> <span style="color: #66cc66;">><</span>FONT <span style="color: #000066;">COLOR</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">"darkorchid4"</span><span style="color: #66cc66;">></span>Rev:<span style="color: #66cc66;"></</span>FONT<span style="color: #66cc66;">></</span>TD<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"left"</span> <span style="color: #66cc66;">></span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;"></</span>TD<span style="color: #66cc66;">></</span>TR<span style="color: #66cc66;">></span>
<span style="color: #66cc66;"></</span>TABLE<span style="color: #66cc66;">>></span>
<span style="color: #000066;">color</span> <span style="color: #66cc66;">=</span> violetred3
<span style="color: #000066;">fillcolor</span> <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">coral</span>
<span style="color: #66cc66;">]</span>
myNodeModel2 <span style="color: #66cc66;">[</span>
<span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #66cc66;"><<</span>TABLE BORDER<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"0"</span> CELLBORDER<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"0"</span> CELLSPACING<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"0"</span><span style="color: #66cc66;">></span>
<span style="color: #66cc66;"><</span>TR<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"right"</span> <span style="color: #66cc66;">><</span>FONT <span style="color: #000066;">COLOR</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">"darkgreen"</span><span style="color: #66cc66;">></span>Name:<span style="color: #66cc66;"></</span>FONT<span style="color: #66cc66;">></</span>TD<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"left"</span> <span style="color: #66cc66;">></span>Chemise<span style="color: #66cc66;"></</span>TD<span style="color: #66cc66;">></</span>TR<span style="color: #66cc66;">></span>
<span style="color: #66cc66;"><</span>TR<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"right"</span> <span style="color: #66cc66;">><</span>FONT <span style="color: #000066;">COLOR</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">"blue4"</span><span style="color: #66cc66;">></span>Type:<span style="color: #66cc66;"></</span>FONT<span style="color: #66cc66;">></</span>TD<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"left"</span> <span style="color: #66cc66;">></span>Model<span style="color: #66cc66;"></</span>TD<span style="color: #66cc66;">></</span>TR<span style="color: #66cc66;">></span>
<span style="color: #66cc66;"><</span>TR<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"right"</span> <span style="color: #66cc66;">><</span>FONT <span style="color: #000066;">COLOR</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">"darkorchid4"</span><span style="color: #66cc66;">></span>Rev:<span style="color: #66cc66;"></</span>FONT<span style="color: #66cc66;">></</span>TD<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"left"</span> <span style="color: #66cc66;">></span><span style="color: #cc66cc;">12</span><span style="color: #66cc66;"></</span>TD<span style="color: #66cc66;">></</span>TR<span style="color: #66cc66;">></span>
<span style="color: #66cc66;"></</span>TABLE<span style="color: #66cc66;">>></span>
<span style="color: #000066;">color</span> <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">darkgreen</span>
<span style="color: #000066;">fillcolor</span> <span style="color: #66cc66;">=</span> darkolivegreen4
<span style="color: #66cc66;">]</span>
myNodeCache2 <span style="color: #66cc66;">[</span>
<span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #66cc66;"><<</span>TABLE BORDER<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"0"</span> CELLBORDER<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"0"</span> CELLSPACING<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"0"</span><span style="color: #66cc66;">></span>
<span style="color: #66cc66;"><</span>TR<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"right"</span> <span style="color: #66cc66;">><</span>FONT <span style="color: #000066;">COLOR</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">"deeppink"</span><span style="color: #66cc66;">></span>Name:<span style="color: #66cc66;"></</span>FONT<span style="color: #66cc66;">></</span>TD<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"left"</span> <span style="color: #66cc66;">></span>Chemise<span style="color: #66cc66;"></</span>TD<span style="color: #66cc66;">></</span>TR<span style="color: #66cc66;">></span>
<span style="color: #66cc66;"><</span>TR<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"right"</span> <span style="color: #66cc66;">><</span>FONT <span style="color: #000066;">COLOR</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">"blue4"</span><span style="color: #66cc66;">></span>Type:<span style="color: #66cc66;"></</span>FONT<span style="color: #66cc66;">></</span>TD<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"left"</span> <span style="color: #66cc66;">></span>Cache<span style="color: #66cc66;"></</span>TD<span style="color: #66cc66;">></</span>TR<span style="color: #66cc66;">></span>
<span style="color: #66cc66;"><</span>TR<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"right"</span> <span style="color: #66cc66;">><</span>FONT <span style="color: #000066;">COLOR</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">"darkorchid4"</span><span style="color: #66cc66;">></span>Rev:<span style="color: #66cc66;"></</span>FONT<span style="color: #66cc66;">></</span>TD<span style="color: #66cc66;">><</span>TD ALIGN<span style="color: #66cc66;">=</span><span style="color: #ff0000;">"left"</span> <span style="color: #66cc66;">></span><span style="color: #cc66cc;">12</span><span style="color: #66cc66;"></</span>TD<span style="color: #66cc66;">></</span>TR<span style="color: #66cc66;">></span>
<span style="color: #66cc66;"></</span>TABLE<span style="color: #66cc66;">>></span>
<span style="color: #000066;">color</span> <span style="color: #66cc66;">=</span> violetred3
<span style="color: #000066;">fillcolor</span> <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">coral</span>
<span style="color: #66cc66;">]</span>
myNodeModel1 <span style="color: #66cc66;">-></span> myNodeCache1
myNodeModel2 <span style="color: #66cc66;">-></span> myNodeCache2
myNodeCache1 <span style="color: #66cc66;">-></span> myNodeSet1 <span style="color: #66cc66;">[</span><span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"used in"</span><span style="color: #66cc66;">]</span>
myNodeModel2 <span style="color: #66cc66;">-></span> myNodeSet1 <span style="color: #66cc66;">[</span><span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"used in"</span><span style="color: #66cc66;">]</span>
<span style="color: #000000; font-weight: bold;">subgraph</span> cluster_model1 <span style="color: #66cc66;">{</span>
<span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"Models"</span>
<span style="color: #000066;">style</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"rounded, filled"</span>
<span style="color: #000066;">color</span> <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">darkgreen</span>
<span style="color: #000066;">fillcolor</span> <span style="color: #66cc66;">=</span> darkolivegreen3
myNodeModel1
myNodeModel2
<span style="color: #66cc66;">}</span>
<span style="color: #000000; font-weight: bold;">subgraph</span> cluster_cache1 <span style="color: #66cc66;">{</span>
<span style="color: #000066;">label</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"Caches"</span>
<span style="color: #000066;">style</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">"rounded, filled"</span>
<span style="color: #000066;">color</span> <span style="color: #66cc66;">=</span> violetred3
<span style="color: #000066;">fillcolor</span> <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">darksalmon</span>
myNodeCache1
myNodeCache2
<span style="color: #66cc66;">}</span>
<span style="color: #66cc66;">}</span></pre>
<p>Le résultat:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_07_18_Graphviz/myGraph002.png" alt="myGraph002.png" style="display:block; margin:0 auto;" title="myGraph002.png, juil. 2011" height="263" width="528" /></p>
<p>L'objectif est donc de faire un script python capable de générer un tel fichier, de l’exécuter à la volé et de l'afficher à l'utilisateur. :jdicajdirien:</p>
<p>Ce graphe est minuscule. Ça commence à devenir intéressant quand les informations abondent (dans le cas d'une "vraie" prod, les infos, il en pleut à torrent! :hehe: ).</p>
<h3>Liens</h3>
<p>N'oubliez pas de passer en revue les exemples proposés dans <a href="http://www.graphviz.org/Gallery.php" hreflang="en">la galerie</a> qui sont tous disponibles avec leur code dot.</p>
<p>Le <a href="http://www.graphviz.org/pdf/dotguide.pdf" hreflang="en">guide</a> contient aussi pas mal d'infos.</p>
<p>Sans oublier internet qui regorge d'exemples. :hehe:</p>
<h3>Conclusion</h3>
<p>Et voilà! J'espère que ça vous aura donné envie d'essayer de faire des graphes quand la situation l'exige. :laClasse:</p>
<p>Je pense qu'on ne se rend compte de l’intérêt d'un tel truc qu'une fois qu'on en a vu un qui correspond à nos propres besoins.</p>
<p>A bientôt!</p>
<p>Dorian</p>
<center>:marioCours:</center>