Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 奇形怪状的箭_C#_Graphviz - Fatal编程技术网

C# 奇形怪状的箭

C# 奇形怪状的箭,c#,graphviz,C#,Graphviz,我有以下代码(使用graphviz4net从C#转换而来): 我正在检查上转换的图像 图像如下: 我在用C语言编程。我有两个问题: 1-如何在C#中固定箭头 2-如何使椭圆在C#中消失 *我知道我可以使用node[shape=none],但我不知道如何在C#中设置它 更新: 现在我得到了以下代码: digraph g { graph [rankdir="LR" ,compound="true" ]; subgraph cluster0 { graph [label="R

我有以下代码(使用graphviz4net从C#转换而来):

我正在检查上转换的图像

图像如下:

我在用C语言编程。我有两个问题:

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"  ];
}
这给了我:

别担心标签问题,我会解决的

C#代码如下:

Graph<State> Graph = new Graph<State> { Rankdir = RankDirection.LeftToRight };
回到外面的世界:

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


stringNewBlock.AddVertex(state);
Graph.AddSubGraph(stringNewBlock);
var subgraphNewBlock=new子图{Label=stringBuilder.ToString()};
stringNewBlock.AddVertex(状态);
添加子图(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;
}
公共覆盖IBlockHandling GenerateLink()
{
foreach(statesDictionary.Values中的var状态)
{
foreach(状态为.GetNextPossibleStateList()的变量nextPossibleState)
{
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=新边(源子图、目标子图);
图.增边(边);
}
}
}
归还这个;
}
然后,我使用以下命令转换为点格式:

    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;
    }
公共覆盖IBlockHandling ConvertdToDot()
{
var writer=新的StringWriter();
新建GraphToDotConverter()。转换(写入程序、图形、新属性Provider());
var result=writer.GetStringBuilder().ToString().Trim();
控制台写入线(结果);
归还这个;
}
我仍然存在的问题是箭头看起来很奇怪。


有什么建议吗?

如果你给你的边缘多一点空间,箭头看起来会很好。实现这一点的最简单方法是使用

结果将是:


<>如果你在使用的GraveZiC C库中不断地讨论如何做这件事,你应该考虑让你的代码生成点代码,然后把它喂给GraveVIZ。点是一个原因;-)

这听起来并不是一个真正的C#问题——它只是一个graphviz问题。我怀疑,当你计算出需要生成什么文本时,生成它的C#代码将是微不足道的。@JonSkeet他已经为此提出了一个问题:
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;
}
    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;
    }
graph [nodesep=2];