dot/graphvizによるブロック線図のレイアウト

私はドットで次のモックアップを実装したいと思います:

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

私はそうそうコンパイルする:

ドット-Gsplines = none test.gv | neato -n -Gsplines = ortho -Tpng -otest.png

それは私を近づけますが、私が知りたいことがいくつかあります。

  1. Fooの左右だけでなく、どのようにブロックを取得できますか?私はまだそれを理解することができませんでした。

  2. エッジラベルをエッジの上または下に一貫して置くことはできますか?

  3. 右ノードを左に、左ノードを右に揃えるにはどうしたらいいですか? 1つの可能性は、それらを同じ幅にすることです。これは大丈夫です。

ありがとう!!

更新:

受け入れられた答えに基づいて、私は今、私が必要としていた正確に次のことをやっています。

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"];
}
13
これを行うための特別なソフトウェアがあることは知っていますか? Ubuntu Software Centerの "circuit"を検索すると、13件の結果が得られます。そのうちの4件が正しいと思われます。 インクスケープdiaSkencil 、より一般的なベクター図面部門の Xara Xtreme 、物事を動的に生成する必要がある場合は、 pySVG などでPythonを使用することを検討してください
追加された 著者 sehe,
さて、私たちは、起こりうる他の質問にも喜んで対応します。私の情報が終わりにあなたを助けてしまうなら、アップアップを感謝します。
追加された 著者 sehe,
私はそれを動的に行う必要があるので、ドットは私が知っていたすべてでした。私はpySVGをチェックアウトし、それがトリックかどうかを確認します!ありがとう!
追加された 著者 Christoph,
私はpySVGのためにあなたの意見をアップしました。私はそれを使用する必要があるとは思わないが、良いヒント。もう一つはTikzだろう、それは強力に見える。
追加された 著者 Christoph,
警告:直交エッジは現在、エッジラベルを処理していません。 xlabelsを使ってみてください。この問題は何ですか?ありがとう!
追加された 著者 netawater,

1 答え

これはあなたを始めますか?

digraph G {
    graph [rankdir = LR];

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

    Bew[label="{ {clk|syn|mux0|mux1|signal}|\"Bew\" |{out0|out1|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|b}|OR|{a\|b} }"]; Foo:hi -> Gate:a; Foo:lo -> Gate:b; Gate:ab -> Bew:signal; } 

enter image description here

私は、整列を得るための素敵な方法として、改行しないスペースを使用していたことに注意してください(私はそう思いました。) Space Ck はvimで、Hex 00a0 charにつながります)

You can also employ HTML inside the label definitions, so you can use fonts, colors and create 'spacers': http://www.graphviz.org/doc/info/shapes.html#html

私はラベルを整列することは、HTMLノードで簡単になると思います。

19
追加された
大したことではなく、デモ用のICを追加した
追加された 著者 sehe,
乾杯、あなたの進歩を共有してくれてありがとう
追加された 著者 sehe,
うーん、私はそれで遊ぶよ、ありがとう!それは本当に私よりもはるかに複雑ですが、代わりになる可能性があります。 Fooの右側に別のユニットを追加するのは大したことではないと思いますか?
追加された 著者 Christoph,
私の最終的な結果はわずかに異なりますが、それは私が望んだものに私を得たので、あなたの答えを受け入れました。私はコードで質問を更新しました。ありがとう!
追加された 著者 Christoph,