2013-10-29 133 views
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/轉換後的圖像。

的形象是這樣的:

Image converted with Graphviz

我在C#編程。我有2個問題:

1 - 如何修復C#中的箭頭?

2 - 如何使橢圓在C#中消失?

*我知道我可以使用node [shape = none],但我不知道如何在C#中設置它。

UPDATE:

現在我已經得到了下面的代碼:

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

然後我生成的邊緣:

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

這個問題我還是期待奇怪的箭頭。

有什麼建議嗎?

+1

這聽起來不像是一個真正的C#問題 - 它只是一個graphviz問題。我懷疑,當你計算出需要生成的文本時,生成它的C#代碼將變得微不足道。 –

+0

@JonSkeet他已經爲此打開了一個問題:http://stackoverflow.com/questions/19384408/graphviz-4net-to-dot-conversion – Potherca

回答

1

如果你給你的邊緣更多的空間箭頭看起來很好。實現這一目標的最簡單方法是使用nodesep attribute

graph [nodesep=2]; 

其結果將是:

enter image description here

如果你一直運行到有關如何做到這一點的Graphviz的C#庫你的問題使用時,您應該考慮讓代碼生成DOT代碼並將其提供給graphviz。 DOT是一個DSL有一個原因;-)