Создание прямых краев в Graphviz

18

Я хочу создать блок-схему (похожую на Visio) с помощью 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
}

Проблема заключается в том, что я делаю это в Graphviz в строке, созданной "USB\nCommand\nArrived" -> "USB\nCommand\nArrived" [label="No" tailport=w headport=n]; выглядит довольно уродливо. Я бы не прочь кривые линии, но эта линия выглядит деформированной. Вы можете видеть, что здесь создает Graphviz.

Есть ли способ сделать это лучше?

    
задан oliverks 19.08.2011 в 02:54
источник

1 ответ

29

Я думаю, что лучше всего изучить точку на примере. Просто прочитайте мои комментарии, и я буду рад ответить, если что-то неясно.

В качестве бокового узла : Хотя Graphviz отлично подходит для создания графиков для больших наборов данных, он менее опасен для создания таких вещей, как диаграммы ER, диаграммы потоков и диаграммы последовательности. Это возможно и относительно прямо вперед, но количество времени, которое вы должны сделать, чтобы что-то получилось, часто необоснованно, потому что вы могли добиться того же самого эффекта с помощью инструмента моделирования Wsywig-GUI за долю времени. Однако время, которое вы проводите, поможет вам изучить синтаксис и свойства языка, который действительно пригодится, когда вам нужно визуализировать какую-то большую или сложную проблему (где инструменты моделирования GUI будут бесполезны).


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;
}

    
ответ дан Ярослав Рахматуллин 13.10.2012 в 04:56
  • Кстати, plantUML более чем потрясающий для создания диаграмм, связанных с кодом, и основан на графике. –  Ярослав Рахматуллин 25.01.2017 в 23:39