带点/ graphviz的方框图布局

时间:2011-10-27 22:00:07

标签: graphviz dot graph-layout

我想用dot实现以下模型:

mockup to be implemented in dot

到目前为止,我有这么多:

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

我这样编译:

  

dot -Gsplines = none test.gv | neato -n -Gsplines = ortho -Tpng -otest.png

这让我很接近,但我想知道一些事情。

  1. 我如何在Foo的左右两侧获得块,而不仅仅是右边的块?我还没弄清楚。

  2. 是否可以将边缘标签一直放在边缘上方或下方?

  3. 如何将右侧节点对齐,左侧节点对齐?一种可能性是使它们具有相同的宽度,这是可以的。

  4. 谢谢!

    更新:

    基于已接受的答案,我现在正在执行以下操作,这正是我所需要的,再次通过点线传输到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"];
    }
    

1 个答案:

答案 0 :(得分:22)

这会让你入门吗?

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

enter image description here

    
  

请注意,我使用不间断空格作为一种厚颜无耻的方式来获得对齐(我想,我做了 Ck Space Space < / kbd> 在vim中,导致Hex 00a0 char)

您还可以在标签定义中使用HTML,这样您就可以使用字体,颜色和创建“间隔符”:http://www.graphviz.org/doc/info/shapes.html#html

我认为使用HTML节点对齐标签会更容易。