获取节点在graphviz中的位置
Getting position of nodes in graphviz
我在 C# 中使用 graphviz 作为库。我找到了一个有助于从 gvc.dll 和 cgraph.dll here.
导入函数的解决方案
我想要做的是获取节点在渲染图中的位置。在研究 library guide 之后,我在 RenderImage 函数中使用了这个解决方案:
if (gvLayout(gvc, g, layout) != SUCCESS)
throw new Exception("Layout failed.");
if (gvRender(gvc, g, "dot", IntPtr.Zero) != SUCCESS)
throw new Exception("Render failed.");
IntPtr np = agnode(g, "1", 0);
if (np == IntPtr.Zero)
throw new Exception("Node not found.");
string pos = agget(np, "pos");
我定义了 agget 函数如下:
[DllImport(LIB_GRAPH, CallingConvention = CallingConvention.Cdecl)]
public static extern string agget(IntPtr node, string attribute);
一切正常,但是在执行agget函数后,调试中止,提示:执行过程意外退出。但没有抛出异常。
我的代码有什么问题?
也许我可以使用像这样的宏:ND_pos?但我找不到它,也不知道如何在 C# 中声明它(使用 DllImport)。
或者也许在渲染图之后我可以从点文件中检索信息?如果可以,我该怎么做?
我设法使用 RenderFile 解决了它。
我将渲染的点文件导出到另一个点文件,然后从中读取。
if (gvRenderFilename(gvc, g, "dot", path) != SUCCESS)
throw new Exception("Render failed.");
string text = File.ReadAllText(path);
我在 C# 中使用 graphviz 作为库。我找到了一个有助于从 gvc.dll 和 cgraph.dll here.
导入函数的解决方案我想要做的是获取节点在渲染图中的位置。在研究 library guide 之后,我在 RenderImage 函数中使用了这个解决方案:
if (gvLayout(gvc, g, layout) != SUCCESS)
throw new Exception("Layout failed.");
if (gvRender(gvc, g, "dot", IntPtr.Zero) != SUCCESS)
throw new Exception("Render failed.");
IntPtr np = agnode(g, "1", 0);
if (np == IntPtr.Zero)
throw new Exception("Node not found.");
string pos = agget(np, "pos");
我定义了 agget 函数如下:
[DllImport(LIB_GRAPH, CallingConvention = CallingConvention.Cdecl)]
public static extern string agget(IntPtr node, string attribute);
一切正常,但是在执行agget函数后,调试中止,提示:执行过程意外退出。但没有抛出异常。
我的代码有什么问题? 也许我可以使用像这样的宏:ND_pos?但我找不到它,也不知道如何在 C# 中声明它(使用 DllImport)。 或者也许在渲染图之后我可以从点文件中检索信息?如果可以,我该怎么做?
我设法使用 RenderFile 解决了它。 我将渲染的点文件导出到另一个点文件,然后从中读取。
if (gvRenderFilename(gvc, g, "dot", path) != SUCCESS)
throw new Exception("Render failed.");
string text = File.ReadAllText(path);