2010-11-05 42 views
4

J'ai un module qui sort automatiquement (au format de point) des fonctions écrites dans une sorte de langage d'assemblage (l'IR de mon compilateur). Les nœuds sont les blocs de base imprimés en utilisant la forme 'record'. Le problème est que les bords prennent une route étrange, par exemple:Strange bord placement dans Graphviz Dot

digraph { 
node [shape = record]; 
n0[label="{<name> entry | <body> store i, 0\nstore sum, 0\ngoto test | {<target> target}}"]; 
n1[label="{<name> test | <body> t2 = load i\nif t4, body, done | {<true> true | <false> false}}"] 
n2[label="{<name> body | <body> t5 = load sum\ngoto test | {<target> target}}"]; 
n3[color=firebrick3, label="{<name> done | <body> t9 = load sum\nret t9}}"]; 
n0:target:s -> n1:name:n 
n1:true:s -> n2:name:n 
n1:false:s -> n3:name:n 
n2:target:s -> n1:name:n 
} 

Et une image:

http://img529.imageshack.us/img529/3780/graphviz.png

Que puis-je faire pour que le bord de « cible » à « test » est placé sur le côté gauche?

+0

Pouvez-vous être précis sur les critères que vous voulez graphiques à suivre en général pour les flèches de routage? Par exemple. vous voulez minimiser les traversées? – LarsH

+0

Je veux que le bord de «cible» à «test» soit acheminé sur le côté gauche. Maintenant, il a l'air vraiment fatigué et ne peut pas vraiment comprendre pourquoi un tel itinéraire est choisi en premier lieu. –

Répondre

8

Le moyen le plus simple non-gourou est de forcer ce lien vers l'extérieur pour attacher sur les côtés «ouest».

n2:target:w -> n1:name:w 

Cela peut fonctionner dans ce cas. Une façon plus générale, mais qui prend plus de réflexion et de codage, mais permettrait au bord de se lier à: s et: n si vous le désirez, ajoutez un nœud invisible de taille zéro (couleur = blanc, ou il pourrait y avoir une visibilité attribut) et obtenir de n2 à n1 en utilisant deux bords. Avoir la pointe de la flèche sur un seul d'entre eux. Le nœud invisible devrait s'asseoir à gauche de n1 ou n2. Hélas, mon graphvis-fu n'est pas assez fort pour créer un exemple de travail; peut-être que quelqu'un d'autre peut en créer un.

alt text