Graphviz是一个强大的图形可视化工具,它可以帮助以图形化的方式展示复杂的数据结构,如状态机或流程。本文将介绍如何在项目中集成Graphviz,以生成描述状态机或流程的图形。
Graphviz的输入是一个称为dot文件的简单文本文件,它使用自己的语法以文本方式描述图形布局。可以通过以下链接了解有关DOT语言的更多信息:。
将Graphviz功能集成到项目中主要有两种方式:调用Graphviz提供的外部程序dot.exe,并通过文件系统进行数据传输;或者封装Graphviz的库,并在内存中进行数据传输。本文将基于Graphviz 2.38版本展示这两种方法。
首先,需要下载并解压Graphviz的Windows版本。可以从以下链接下载:[下载链接]。下载的文件包含了库和dot.exe命令行程序,用于从dot图形文件生成图像文件。
下载并解压后,需要从/release/bin文件夹中提取以下文件,这些文件是运行dot.exe并从dot图形生成图像所必需的。
接下来,将测试Graphviz是否正常工作。首先,在文件夹中打开命令窗口,并运行以下命令:
dot.exe –c
这将更新config6文件,该文件包含了Graphviz可以使用的库的配置信息。如果该文件不存在或不是最新的,Graphviz(gvc.dll)可能会出现异常。
现在,可以通过在记事本中创建一个包含以下内容的dot文件来测试dot.exe:
digraph g{
A->
B
label = "Graph";
labelloc = top;
labeljust = left;
}
将其保存为testgraph.dt(使用.dt而不是.dot,因为Windows会将其识别为Office模板)。
然后,在命令行中运行:
dot.exe –Tjpg –O testgraph.dt
如果一切正常,将创建一个jpg文件:testgraph.dt.jpg(所以.dt实际上并不需要)。
在这两种情况下,都需要将所需的外部(Graphviz文件)添加到Visual Studio项目中。按照以下步骤操作:
在Visual Studio项目中创建一个名为“external”的映射,然后通过文件资源管理器复制上述所有文件,包括dot.exe和config6。
接下来,在Visual Studio中,右键点击映射,选择“添加现有项”,转到外部文件夹,并将文件类型从“Visual C#文件”更改为所有文件(*.*)。现在文件将显示出来,选择所有文件(包括dot.exe和config6),然后选择添加。
现在,所需的外部文件已经添加到项目中,可以继续研究这两种方法。
Visual Studio已经将所需的外部文件添加到项目中,但它们在构建过程中不会被复制。因此,选择所有文件(包括dot.exe),并将属性设置为“始终复制”。
现在,每次构建时,包括dot.exe在内的支持文件都会被复制到输出文件夹下的/external目录中(dot.exe可以从命令行运行)。
基本上,有一个输入:
String graphVizString = @"
digraph g{ label=""Graph""; labelloc=top;labeljust=left;}"
;
想要的是一个位图。因此,需要创建一个名为“FileDotEngine”的类,如下所示:
public static class FileDotEngine
{
public static Bitmap Run(string dot)
{
string executable = @".\external\dot.exe";
string output = @".\external\tempgraph";
File.WriteAllText(output, dot);
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.FileName = executable;
process.StartInfo.Arguments = string.Format("{0} -Tjpg -O", output);
process.Start();
process.WaitForExit();
Bitmap bitmap = null;
using (Stream bmpStream = System.IO.File.Open(output + ".jpg", System.IO.FileMode.Open))
{
Image image = Image.FromStream(bmpStream);
bitmap = new Bitmap(image);
}
File.Delete(output);
File.Delete(output + ".jpg");
return bitmap;
}
}
在调用方,只需要以下代码就可以将其作为位图使用:
Bitmap bm = FileDotEngine.Run(graphVizString);
当调用FileDotEngine.Run时,应用程序将启动一个外部进程(dot.exe),将字符串作为输入文件传递给它。然后dot.exe会在磁盘上创建图像,之后应用程序再次读取图像,并将其导入为位图。
Visual Studio已经将所需的外部文件添加到项目中,但它们在构建过程中不会被复制。因此,选择所有文件,除了dot.exe,并将属性设置为“始终复制”。
现在,每次构建时,除了dot.exe之外的支持文件都会被复制到输出文件夹下的/external目录中(dot.exe不能从命令行运行)。
现在,创建一个名为“Graphviz”的新类,内容如下:
public static class Graphviz
{
public const string LIB_GVC = @".\external\gvc.dll";
public const string LIB_GRAPH = @".\external\cgraph.dll";
public const int SUCCESS = 0;
// 省略其他代码...
}