0

次のコードがあります(graphviz4netを使用してC#から変換):

digraph g {
graph [rankdir="LR" ,compound="true" ];
    subgraph cluster0 {
        graph [label="Ready" ];
        1 [  ];
    };
    subgraph cluster2 {
        graph [label="Paused" ];
        3 [  ];
    };
    1 -> 3 [ ltail="cluster0" ,lhead="cluster2" ,comment="4"  ];
    3 -> 1 [ ltail="cluster2" ,lhead="cluster0" ,comment="5"  ];
}

http://www.graphviz-dev.appspot.com/で変換後の画像を確認しています。

イメージは次のようになります。

Graphvizで変換した画像

私はC#でプログラミングしています。2 つの質問があります。

1 - C# で矢印を修正するには?

2 - C# で楕円を非表示にする方法は?

※node[shape=none]が使えることはわかっているのですが、C#での設定方法がわかりません。

アップデート:

これで、次のコードを取得できました。

digraph g {
graph [rankdir="LR" ,compound="true" ];
    subgraph cluster0 {
        graph [label="Ready\n\nPurchaser:\noperation1,operation2,Supplier:\noperation1,operation3," ];
        1 [ shape="none" ,fontcolor="white"  ];
    };
    subgraph cluster2 {
        graph [label="Paused\n\nPurchaser:\noperation1,operation3,Supplier:\noperation2,operation3," ];
        3 [ shape="none" ,fontcolor="white"  ];
    };
    subgraph cluster4 {
        graph [label="Completed\n\nPurchaser:\noperation4,Supplier:\noperation4," ];
        5 [ shape="none" ,fontcolor="white"  ];
    };
    1 -> 3 [ ltail="cluster0" ,lhead="cluster2" ,comment="6"  ];
    1 -> 5 [ ltail="cluster0" ,lhead="cluster4" ,comment="7"  ];
    3 -> 1 [ ltail="cluster2" ,lhead="cluster0" ,comment="8"  ];
    3 -> 5 [ ltail="cluster2" ,lhead="cluster4" ,comment="9"  ];
}

それは私に与えます:

Graphviz4net

ラベルの問題は心配しないでください。私が解決します。

C# コードは次のとおりです。

Graph<State> Graph = new Graph<State> { Rankdir = RankDirection.LeftToRight };

stringBuilder はサブグラフを生成します

// returns new SubGraph<State>{ Label = stringBuilder.ToString()};
var stringNewBlock = ConvertBlockToSubgraph(state); 

ConvertBlockToSubgraph の内部

foreach (var allowedOperation in allowedOperationList)
            {
                stringBuilder.Append(allowedOperation.Key +":\\n");

                foreach (var operation in allowedOperation.Value)
                {
                    stringBuilder.Append(!operation.Equals(lastAllowedOperation) ? operation + ",": operation);
                }
            }

外の世界に戻る:

var subgraphNewBlock = new SubGraph<State>{ Label = stringBuilder.ToString()};


stringNewBlock.AddVertex(state);
Graph.AddSubGraph(stringNewBlock);

次に、以下を使用して Edge を生成します。

public override IBlockHandling<State> GenerateLinks()
{
    foreach (var state in statesDictionary.Values)
    {
        foreach (var nextPossibleState in state.GetNextPossibleStateList())
        {
            if (statesDictionary.ContainsKey(nextPossibleState))
            {
                var sourceSubGraph = Graph.SubGraphs.Single(x => x.Label.Contains(state.GetMainHeaderName()));
                var destinationSubGraph = Graph.SubGraphs.Single(x => x.Label.Contains(nextPossibleState));
                var edge = new Edge<SubGraph<State>>(sourceSubGraph, destinationSubGraph);
                Graph.AddEdge(edge);
            }

        }
    }

    return this;
}

次に、次を使用して DOT 形式に変換します。

    public override IBlockHandling<State> ConvertDtoToDot()
    {
        var writer = new StringWriter();
        new GraphToDotConverter().Convert(writer, Graph, new AttributesProvider());
        var result = writer.GetStringBuilder().ToString().Trim();

        Console.WriteLine(result);

        return this;
    }

私がまだ抱えている問題は、矢印が奇妙に見えることです。

助言がありますか?

4

1 に答える 1

1

エッジにもう少しスペースを与えると、矢印がきれいに見えます。これを実現する最も簡単な方法は、nodeep 属性を使用することです。

graph [nodesep=2];

結果は次のようになります。

ここに画像の説明を入力

使用している Graphviz C# ライブラリでこれを行う方法について問題が発生し続ける場合は、コードで DOT コードを生成し、それを graphviz にフィードすることを検討する必要があります。DOT がDSLであるのには理由があります ;-)

于 2013-11-02T10:25:15.100 に答える