Nokta/graphviz ile blok şeması düzeni

Aşağıdaki maketi dot ile uygulamak istiyorum:

mockup to be implemented in dot

Şimdiye kadar bu kadar var:

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

Ben böyle derlerim:

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

Bu beni çok yaklaştırıyor ama bilmek istediğim birkaç şey var.

  1. Sadece sağa değil, Foo'nun soluna ve sağına nasıl blok alabilirim? Bunu henüz çözemedim.

  2. Kenar etiketlerini tutarlı bir şekilde kenarın altına veya altına koymak mümkün müdür?

  3. Sağdaki düğümleri sola ve soldaki düğümleri sağa nasıl hizalayabilirim? Bir olasılık da onları aynı genişlikte yapmak olabilirdi ki bu da sorun değil.

Teşekkürler!!

GÜNCELLEŞTİRME:

Kabul edilen cevaba göre, şu anda tam olarak ihtiyacım olan, yine yukarıda belirtildiği gibi neato'ya yönlendirilen noktadan üretilen noktalardan oluşan aşağıdakileri yapıyorum:

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
Bunu yapmak için özel bir yazılım olduğunu biliyorsunuz, değil mi? Ubuntu Yazılım Merkezinde "devre" araması, yaklaşık 4 tanesi iş için doğru gibi görünen 13 sonuç verir. Sonra, inkscape , dia , Skencil , daha genel Vektör Çizimler bölümünde, Xara Xtreme ; Dinamik olarak bir şeyler oluşturmanız gerekirse, python'u pySVG ve benzerleriyle kullanmayı düşünün
katma yazar sehe, kaynak
Tamam, ortaya çıkabilecek diğer soruları memnuniyetle ele alacağız. Bilgilerim sonunda size yardım ederse son derece memnun olurum.
katma yazar sehe, kaynak
Dinamik olarak yapmak zorundayım, bu yüzden nokta bildiğim kadarıydı. Yine de pySVG'yi kontrol edeceğim ve bunun işe yarayıp yaramadığını göreceğim! Teşekkürler!
katma yazar Christoph, kaynak
PySVG yüzünden seninkini aştım. Kullanmam gerektiğini düşünmüyorum ama iyi bir ipucu. Bir diğeri Tikz olurdu, güçlü görünüyor.
katma yazar Christoph, kaynak
Uyarı: Ortogonal kenarlar şu anda kenar etiketlerini işlemez. Etiketleri kullanmayı deneyin, bu sorun ne? Teşekkürler!
katma yazar netawater, kaynak

1 cevap

Bu sizi başlattı mı?

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

Hizalamayı elde etmek için kırılmayan boşlukları arsız bir yol olarak kullandığımı unutmayın (sanırım CkSpace Space vim’de, Hex 00a0 char’e götürür)

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

Etiketleri hizalamanın HTML düğümleriyle daha kolay olacağını varsayalım.

19
katma
Önemli değil, demo için daha fazla 'IC eklendi.
katma yazar sehe, kaynak
Şerefe ve ilerlemenizi paylaştığınız için teşekkür ederiz
katma yazar sehe, kaynak
Hmm ben onunla oynayacağım, teşekkürler! Gerçekten ihtiyacım olandan çok daha karmaşık, ama bir alternatif olabilir. Sanırım Foo'nun sağına başka bir ünite eklemek önemli değil.
katma yazar Christoph, kaynak
Cevabımı kabul ettim, çünkü istediğim şeyi elde etmemi sağladı. Sorumu kodla güncelledim. Teşekkürler!
katma yazar Christoph, kaynak