6

こんにちは、ドット言語を使用したUMLシーケンス図が必要です。次の問題があります。次のような問題があります。a、b、c、dを上に直線で、線は下。どうすればそれを達成できますか?

a   b   c   d
|   |   |   | 
|   |   |   |

おそらく、所属するエッジを持つa、b、c、およびdがクラスターであり、クラスターに異なるランクディレクトリを設定することを達成できますか?

編集a、b、c、dの間に見えないエッジを追加することで解決策を見つけましたが、他の解決策はありますか?

4

4 に答える 4

11

意志あるところに道あり!

これは、ドットを使用してそれを行う方法の例です。

digraph SEQ_DIAGRAM {
    graph [overlap=true, splines=line, nodesep=1.0, ordering=out];
    edge [arrowhead=none];
    node [shape=none, width=0, height=0, label=""];

    {
        rank=same;
        node[shape=rectangle, height=0.7, width=2];
        api_a[label="API A"];
        api_b[label="API B"];
        api_c[label="API C"];
    }
    // Draw vertical lines
    {
        edge [style=dashed, weight=6];
        api_a -> a1 -> a2 -> a3;
        a3 -> a4 [penwidth=5, style=solid];
        a4 -> a5;
    }
    {
        edge [style=dashed, weight=6];
        api_b -> b1 -> b2 -> b3 -> b4;
        b4 -> b5 [penwidth=5; style=solid];
    }
    {
        edge [style=dashed, weight=6];
        api_c -> c1;
        c1-> c2 [penwidth=5, style=solid];
        c2 -> c3 -> c4 -> c5;
    }
    // Draws activations
    { rank=same; a1 -> b1 [label="activate()"]; b1 -> c1 [arrowhead=normal]; }
    { rank=same; a2 -> b2 [style=invis]; b2 -> c2 [label="refund()", arrowhead=normal, dir=back]; }
    { rank=same; a3 -> b3 [arrowhead=normal, dir=back, label="place_order()"]; b3 -> c3; }
    { rank=same; a4 -> b4 [label="distribute()", arrowhead=normal]; }
    { rank=same; a5 -> b5 [style=invis]; b5 -> c5 [label="bill_order()", arrowhead=normal]; }
}

レンダリング後、次の画像が生成されます。

シーケンス図

これがどのように達成されたかについて、いくつかの重要なヒントがあります。

  • 各コンポーネントには、形状、高さ、幅のないノードのリストがあります。
  • 各行は同じランクにある必要があります。そうでない場合、DOT は自動ランキングに応じてそれらを配置します。
  • 物事をまっすぐにするために、すべての方向は同じです: a から b から c へ。それらのいくつかを反転させると、DOT がめちゃくちゃになります。矢印の正しい方向を実現する秘訣は、dir エッジ属性を使用することです。
  • エッジの重み属性は、垂直線をまっすぐに保つために非常に重要です。彼らは最大ランクを上回っていなければなりません。ランクが 100 まで深くなる図を作成する必要がある場合、重みは少なくとも 101 でなければなりません。
  • まっすぐな水平線を得るには、各ノードを同じランクに接続する必要があります。そうしないと、DOT が線を曲げます。たとえば、a1 を c1 に接続するには、a1 を b1 に、b1 を c1 に接続します。
于 2019-12-16T20:36:31.243 に答える
8

あなたが説明することdotは、デフォルトで何をするかのようです。

たとえば、次のグラフです。

digraph SO {
  a -> a1 -> a2
  b -> b1 -> b2
  c -> c1 -> c2
  d -> d1 -> d2
} 

次のようになります。

ここに画像の説明を入力

より複雑なグラフがある場合は、 を使用してノードを強制的に同じ高さにすることができますrank=same。例えば:

digraph SO {
  { rank = same
    a b c d
  }

  a -> a1 -> a2 
  b -> b1 -> b2 -> b3 -> b4
  c -> c1 
  d -> d1 -> d2 -> d3
  d2 -> a2
}

次のようになります。

ここに画像の説明を入力

ただし、abcおよびdを特定の順序にしたい場合は、提案したように目に見えないエッジを使用する必要があると思います。dotガイドはこれを推奨しています:

ノードが同じランクに制約されている場合、エッジの重みも役割を果たします。これらのノード間の重みが 0 でないエッジは、ランク全体で可能な限り同じ方向 (左から右、または回転した図面では上から下) に向けられます。この事実は、必要に応じて非表示のエッジ ( style="invis") を配置することにより、ノードの順序を調整するために利用される可能性があります。

于 2009-09-29T08:53:16.230 に答える
7

mscgen (メッセージ シーケンス チャート ジェネレーター) を試すことができます

簡単な図は example.msc です。

msc {

A,B;

--- [label="Start", ID="1"];

A->B [label="signal"];
A<-B [label="signal"];

}

$: mscgen -T png -o example.png -i example.msc.

それは素晴らしいシーケンス図を生成することです。

ありがとう、スリカント・キャタム

于 2011-01-09T15:11:39.440 に答える
1

提案#1 - PlantUML

PlantUML は Graphviz を使用するため、1 つのオプションは単純に PlantUML を使用することです。たとえば、PlantUML では、これは...

@startuml
Bob -> Alice : hello
@enduml

...このようにレンダリングされます...

PlantUML でレンダリングされたシーケンス図の例

上の図はhttp://plantuml.com/plantuml/...でレンダリングされたもので、ドキュメントで PlantUML シーケンス図を読むことができます。また、PlantUMLはコマンド ラインからも使用でき、PlantUMLプラグインは多くの一般的な IDE で利用できます

提案#2 - ネイト

Graphviz & NEATO (PDF)も使用できます。たとえば、この有向グラフ...

digraph sequenceDiagramExample {
  bobHead [ label="Bob" pos="0,1.5!" shape="record" ];
  bobPoint0 [ pos="0,0.75!" shape="point" width="0" ]
  bobFoot [ label="Bob" pos="0,0!" shape="record" ];
  aliceHead [ label="Alice" pos="1,1.5!" shape="record" ];
  alicePoint0 [ pos="1,0.75!" shape="point" width="0" ]
  aliceFoot [ label="Alice" pos="1,0!" shape="record" ];
  bobHead -> bobPoint0 -> bobFoot [ dir="none" style="dashed" ]
  aliceHead -> alicePoint0 -> aliceFoot [ dir="none" style="dashed" ]
  bobPoint0 -> alicePoint0 [ label="hello" labelloc="c" style="solid" ]
}

そして、コマンドラインから NEATO (Graphviz と一緒にインストールされます) 経由でレンダリングします...

...このようにレンダリングされます...

NEATO レンダリングされたシーケンス図の例

NEATO を使用して上記の画像をレンダリングするには、次の手順を実行します。

  1. Graphviz に付属の NEATO をインストールします (少なくとも Mac で を使用する場合はインストールします$ brew install graphviz # requires Homebrew) 。
  2. digraph sequenceDiagramExample {...}上記のコードを というテキスト ファイルに配置します。sequenceDiagramExample.dot
  3. コマンド ラインから を実行する$ neato -Tpng sequenceDiagramExample.dot -o sequenceDiagramExample.pngと、次の名前の PNG ファイルが生成されます。sequenceDiagramExample.png
  4. PNG を表示:)

neatoプロのヒント -をdot実行可能ファイルと混同しないでください

  • neato要素の配置方法をきめ細かく制御したい場合は、おそらく使用したいものです (コメントで別の視点を歓迎します!)
  • neatoレンダリングとレンダリングを混同しないでくださいdot(Graphviz にも含まれています)。
  • dotたとえば、 (eg ) を使用して提案 #2 の有向グラフをレンダリングする$ dot -Tpng sequenceDiagramExample.dot -o sequenceDiagramExample.pngと、これが生成されます...

ここに画像の説明を入力

于 2018-11-25T18:15:35.143 に答える