2011-08-19 3 views
17

Je souhaite créer un diagramme (similaire à Visio) à l'aide de Graphviz. Voici un exemple de digramme.Création de bords droits dans Graphviz

digraph start_up { 
node [style = rounded]; 
node [shape = rect] start end; 
node [style = ""]; 
node [shape = diamond] "USB\nCommand\nArrived"; 
start -> "Initialize\nCode"; 
"Initialize\nCode" -> "USB\nCommand\nArrived"; 
"USB\nCommand\nArrived" -> "USB\nCommand\nArrived" [label="No" tailport=w headport=n]; 
"USB\nCommand\nArrived" -> "Has USB 3.0\nInterface Been\nSelected" [label = "Yes"]; 
"Has USB 3.0\nInterface Been\nSelected" -> end 
} 

Le problème est quand je rends cela dans Graphviz la ligne créée par "USB\nCommand\nArrived" -> "USB\nCommand\nArrived" [label="No" tailport=w headport=n]; semble assez laid. Cela ne me dérangerait pas les lignes courbes, mais cette ligne semble déformée. Vous pouvez voir ce que Graphviz crée ici

Y at-il un moyen de faire mieux ce regard?

Répondre

28

Je pense qu'il est préférable d'apprendre point par exemple. Il suffit de lire mes commentaires et je serai heureux de répondre si quelque chose n'est pas clair.

En tant que nœud latéral: Alors que graphviz est idéal pour générer des graphiques pour grands ensembles de données, il est moins impressionnant pour créer des choses comme des diagrammes ER, flux-caractères et des diagrammes de séquence. C'est possible et relativement simple, mais le temps que vous avez à mettre pour faire quelque chose est souvent injustifié parce que vous pourriez obtenir la même chose avec un outil de modélisation Wsywig-GUI en une fraction de temps. Cependant, le temps que vous y consacrez vous aidera à apprendre la syntaxe et les propriétés du langage, ce qui est très pratique lorsque vous avez besoin de visualiser un problème important ou complexe (où les outils de modélisation GUI seraient inutiles).


digraph start_up { 
    { 
/* fake levels (level0 -> level1) and support nodes 
* 
* graphviz to charts is what latex is to documents, 
* sometimes you'll have to fight it. 
* This is typically done by defining levels and connection points that 
* don't really have anything to do with your graph, but are used to 
* force the graph to appear in a certain way. 
*/ 
     node [shape=none, /*label="."*/]; l1a; l2a; l3a; l4a; l5a; l6a; 
     node [shape=square label="no"]; l20a; 
    } 

    { /* connectiong point for the no arrow above "arrived" */ 
     node [width=0 shape=point label=""]; 
     d1; no; 
    } 

    node [style = rounded]; 
    node [shape = rect] start end; 
    node [style = ""]; 

    node [shape = diamond]; { 
     node [label="USB\nCommand\nArrived"]; arrived; 
     node [label="Has USB 3.0\nInterface Been\nSelected"]; selected; 
     node [label="Initialize\nCode"]; init; 
    } 

    start -> init; 
    /*init -> arrived; */ 
    init -> d1 [arrowhead=none]; 
      d1 -> arrived; 

/* 
* tricky part: 
* since nodes in a digrap go either from top to bottom or left to right, we 
* can usually not connect (->) two nodes and have them appear on the same 
* level unless the connection is specified within a block that has the 
* parameter `rank' set to `same' 
*/ 
      l20a->no [arrowhead=none]; 

    { rank=same; no -> arrived [dir=back arrowtail=none]; } 
    { rank=same; l20a -> d1; } 

    /*arrived  -> arrived;*/ /* [label="No" tailport=w headport=n]; */ 
    arrived  -> selected [label = "Yes"]; 
    selected -> end 


    /* just to demonstrate */ 
    l1a-> l2a-> l3a-> l4a-> l5a-> l6a; 
} 

Solution proposal

+0

Par ailleurs, [PlantUml] (http://plantuml.com/) est plus que génial pour créer des diagrammes liés aux codes et il est basé sur graphviz. –