Компоновка блок-схемы с помощью dot / graphviz

Я хочу реализовать следующий макет с точкой:

макет, который будет реализован в виде точки

Пока что у меня есть вот что:

digraph G {
graph [rankdir = LR, splines=ortho]

  unit [shape=box, width = 2, height = 10];

  more_different_unit [shape=box, height=4];
  other_unit [shape=box, height=4];


  unit -> other_unit [label = "foo"];
  unit -> other_unit [label = "bar"];
  unit -> other_unit [label = "bar"];
  unit -> other_unit [label = "bar"];
  unit -> other_unit [label = "bar"];
  unit -> other_unit [label = "bar"];
  unit -> more_different_unit [label = "bar"];
  unit -> more_different_unit [label = "bar"];
  unit -> more_different_unit [label = "bar"];
  unit -> more_different_unit [label = "bar"];
  unit -> more_different_unit [label = "bar"];
  unit -> more_different_unit [label = "bar"];
}

Компилирую так:

точка -Gsplines = none test.gv | neato -n -Gsplines = ortho -Tpng -otest.png

Это меня приближает, но есть несколько вещей, которые я хотел бы знать.

  1. Как я могу расположить блоки слева и справа от Foo, а не только справа? Я еще не смог этого понять.

  2. Можно ли разместить краевые метки последовательно над или под краем?

  3. Как я могу выровнять правые узлы по левому краю, а левые по правому краю? Можно было бы сделать их одинаковой ширины, что было бы нормально.

Спасибо!!

ОБНОВИТЬ:

Основываясь на принятом ответе, я сейчас делаю то, что мне было нужно, снова сгенерированное через точку, переданную в neato, как упоминалось выше:

digraph G {
    graph [rankdir = LR, splines=ortho];

    node[shape=record];
    Bar[label="Bar", height=2];
    Foo[label="Foo", height=4];

    Bew[label="Bew", height=2];
    Gate[label="Gate", height=2];

    Bar -> Foo [label="Bar2Foo"];
    Bar -> Foo [label="Bar2Foo"];
    Bar -> Foo [label="Bar2Foo"];

    Foo -> Bew [label="Foo2Bew"];
    Foo -> Bew [label="Foo2Bew"];
    Bew -> Foo [label="Bew2Foo"];


    Foo -> Gate [label="Foo2Gate"];
    Foo -> Gate [label="Foo2Gate"];
}

person Christoph    schedule 27.10.2011    source источник
comment
Вы знаете, что для этого есть специализированное программное обеспечение? Поисковая схема в программном центре Ubuntu дает 13 результатов, из которых около 4 кажутся подходящими для работы. Затем есть inkscape, dia, Skencil, Xara Xtreme, в более общем отделе векторных рисунков; Если вам нужно создавать что-то динамически, подумайте об использовании python с pySVG и т.п.   -  person sehe    schedule 28.10.2011
comment
Мне нужно делать это динамически, так что точка - это все, о чем я знал. Я проверю pySVG и посмотрю, поможет ли это! Спасибо!   -  person Christoph    schedule 28.10.2011
comment
Хорошо, мы с радостью ответим на любые другие вопросы, которые могут возникнуть. Буду признателен за голосование, если моя информация в конечном итоге поможет вам.   -  person sehe    schedule 28.10.2011
comment
Я поддержал ваш из-за pySVG. Не думаю, что мне это понадобится, но хороший совет. Другой был бы Тикз, он выглядит мощно.   -  person Christoph    schedule 28.10.2011
comment
он сообщает Предупреждение: Ортогональные кромки в настоящее время не обрабатывают метки кромок. Попробуйте использовать xlabels, в чем проблема? Благодарность!   -  person netawater    schedule 29.01.2015


Ответы (1)


Это поможет вам начать?

digraph G {
    graph [rankdir = LR];

    node[shape=record];
    Bar[label="{ \"Bar\"|{<p1>pin 1|<p2>     2|<p3>     3|<p4>     4|<p5>     5} }"];
    Foo[label="{ {<data0>data0|<data1>data1|<data2>data2|<data3>data3|<data4>data4}|\"Foo\" |{<out0>out0|<out1>out1|<out2>out2|<GND>gnd|<ex0>ex0|<hi>hi|<lo>lo} }"];

    Bew[label="{ {<clk>clk|<syn>syn|<mux0>mux0|<mux1>mux1|<signal>signal}|\"Bew\" |{<out0>out0|<out1>out1|<out2>out2} }"];
    Bar:p1 -> Foo:data0;
    Bar:p2 -> Foo:data1;
    Bar:p3 -> Foo:data2;
    Bar:p4 -> Foo:data3;
    Bar:p5 -> Foo:data4;

    Foo:out0 -> Bew:mux0;
    Foo:out1 -> Bew:mux1;
    Bew:clk -> Foo:ex0;

    Gate[label="{ {<a>a|<b>b}|OR|{<ab>a\|b} }"];

    Foo:hi -> Gate:a;
    Foo:lo -> Gate:b;
    Gate:ab -> Bew:signal;
}

введите описание изображения здесь

Обратите внимание, что я использовал неразрывные пробелы как нахальный способ добиться выравнивания (думаю, я сделал Ck Space Space в vim, что приводит к Hex 00a0 char)

Вы также можете использовать HTML внутри определений меток, чтобы вы могли использовать шрифты, цвета и создавать «разделители»: http://www.graphviz.org/doc/info/shapes.html#html

Я полагаю, выравнивание меток было бы проще с помощью узлов HTML.

person sehe    schedule 27.10.2011
comment
Хм поиграю, спасибо! Это действительно намного сложнее, чем мне нужно, но может быть альтернативой. Думаю, нет ничего страшного в том, чтобы добавить еще один юнит справа от Foo? - person Christoph; 28.10.2011
comment
Ничего страшного, добавлены дополнительные микросхемы для демонстрации - person sehe; 28.10.2011
comment
Принял ваш ответ, поскольку он привел меня к тому, что я хотел, хотя мой конечный результат немного отличается. Я обновил свой вопрос кодом. Спасибо! - person Christoph; 28.10.2011