2011-08-19 16 views
17

Chcę utworzyć schemat blokowy (podobny do Visio) za pomocą Graphviz. Oto przykładowy digraf.Tworzenie prostych krawędzi w 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 
} 

Problemem jest to, kiedy czynią to w Graphviz linia stworzona przez "USB\nCommand\nArrived" -> "USB\nCommand\nArrived" [label="No" tailport=w headport=n]; wygląda dość brzydki. Nie miałbym nic przeciwko zakrzywionym liniom, ale ta linia wygląda na zdeformowaną. Można zobaczyć, co Graphviz tworzy tutaj

Czy istnieje sposób, aby to wyglądać lepiej?

Odpowiedz

28

Myślę, że najlepiej jest nauczyć się kropki na przykład. Po prostu przeczytaj moje komentarze i chętnie odpowiem, jeśli coś jest niejasne.

jako węzeł bocznej: Podczas Graphviz jest świetny do generowania wykresów dla dużych zbiorów danych, to jest mniej niesamowite rzeczy jak tworzenia diagramów ER-przepływowych znaków i diagramów sekwencji. Jest to możliwe i stosunkowo proste, ale ilość czasu, jaki trzeba poświęcić na zrobienie czegoś dobrego, jest często nieuzasadniona, ponieważ można osiągnąć to samo z narzędziem do modelowania Wsywig-GUI w ułamku sekundy. Jednak czas, który poświęcisz na to, pomoże ci nauczyć się składni i właściwości języka, który naprawdę przydaje się, gdy potrzebujesz wizualizować jakiś duży lub złożony problem (gdzie narzędzia do modelowania GUI byłyby bezużyteczne).


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

Nawiasem mówiąc, [plantUML] (http://plantuml.com/) jest większa niż super tworzenia schematy związane kodu, i opiera się na graphviz. –