SCHEMAT BLOKOWY z kropką / graphviz

Chciałbym zaimplementować następującą makietę z kropką:

makieta do wdrożenia w dot

Póki co mam tyle:

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

Kompiluję TAK:

Dot-Gsplines=brak testu.gv / neato-N-Gsplines=ortho-Tpng-otest.png

To mnie zbliża, ale jest kilka rzeczy, które chciałbym wiedzieć.
  1. Jak mogę dostać klocki na lewo i prawo od Foo, nie tylko w prawo? Jeszcze tego nie rozgryzłem.

  2. Czy to czy możliwe jest konsekwentne umieszczanie etykiet krawędzi nad lub pod krawędzią?

  3. Jak mogę wyrównać węzły prawej ręki w lewo, a węzły lewej strony w prawo? Jedną z możliwości byłoby, aby ich tej samej szerokości, co byłoby w porządku.

Dzięki!!

Aktualizacja:

Bazując na zaakceptowanej odpowiedzi, robię teraz, co jest dokładnie tym, czego potrzebowałem, ponownie wygenerowany przez kropkę piped to neato, jak wspomniano powyżej:

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"];
}
Author: Christoph, 2011-10-28

1 answers

Zaczynasz od tego?

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

Tutaj wpisz opis obrazka

Zauważ, że użyłem spacji niełamliwych jako bezczelny sposób na wyrównanie (myślę, że zrobiłem C-kSpacjaSpacja w vim, prowadzący do Hex 00a0 char)

Możesz również użyć kodu HTML wewnątrz definicji etykiet, dzięki czemu możesz używać czcionek, kolorów i tworzyć "spacje": http://www.graphviz.org/doc/info/shapes.html#html

Przypuszczam, że wyrównywanie etykiet byłoby łatwiejsze z węzłami HTML.

 20
Author: sehe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-13 09:27:16