程序员绘图利器dot

原文

作为程序员,我们离不开使用各种图形来描述软件。毕竟,图形描述方法比起直接看代码更加形象,更符合我们的思维方式。大多数的绘图软件,比如viso或者dia,都可以满足一般软件开发中对于绘图的需求了。无论是UML还是其他软件图,使用这些软件来制作都比较得心应手。然而,程序员作为软件的制作者,对于自己使用的软件的要求一般都会比较苛刻。我们总是在问自己,我们所使用的工具是最适合我们的吗?他能为我们带来最高的工作效率吗?

在制作软件图的过程中,我们一般关心的是这些图形的逻辑关系,而不是如何绘制他们(毕竟我们不是在画画)。比如,我们在制作类的派生关系图时,主要想描述的是类之间的派生关系。无论这些类图怎么摆放,只要清晰的表达出意思就可以了。所以我们希望绘图软件能够用最简练的方式让我们描述出图形的逻辑关系,而不用操心最终怎么表现。而且图形软件最好能根据不变的逻辑关系自动产生出想要的图形效果。

对交互方式上,图形软件不仅可以给人直接使用,并且可以给其他程序使用。这样我们就可以在其他软件中方便的加入绘图功能,使其自动化。这就要求图形软件应该尽量使用命令文本的方式,而不是GUI方式交互。如同操作系统的shell,命令行更适合程序员工作。

Dot就是这样一个适合程序员使用的绘图工具。

最早使用dot还是在制作3D engine的bsp/portal编译器时。编译器需要将原始的3D场景进行空间切分,构建一个bsp树,然后合并一些叶节点组成一些完整的空间区域,并为区域之间计算可见性portal。要想形象的看到最终生成的bsp/portal数据,我最终为编译器添加了输出dot的功能。输出后的bsp节点关系图清晰地展示了复杂的数据结构之间的关系,为调试提供了便利性。

自动生成的bsp/portal数据图

我们经常使用的doxygen文档生成工具中的类图,也是用dot自动生成的。

dot本身是Graphviz工具包中的一个工具。我们使用一个文本文件通过dot语法描述图形关系,然后用dot生成最终的图形。dot负责布局我们所描述的图形。就算图形对象非常多,关系非常复杂,dot也能将其布局的非常清楚。dot文件语法非常简单,可以像程序一样手动编写,但是很多时候是通过其他程序生成。

dot文件示例:

digraph
{
node[shape=Mrecord];

subgraph Driver
{
// Drivers.
gcc[label = "gcc(xgcc)"];
gpp[label = "g++"];

// Driver code.
gcc_c[label = "{GCC_SRC/gcc/gcc.c|driver main entry}"];
gcc_objs[label = "GCC_OBJS"];
gccspec_c[label = "{GCC_SRC/gcc/gccspec.c|lang_specific_driver}"];
gppspec[label = "{GCC_SRC/gcc/cp/g++spec.c|lang_specific_driver}"];
gxx_objs[label = "GXX_OBJS"];

gcc_c->gcc_objs;
{gcc_objs gccspec_c}->gcc;
{gppspec gcc_objs}->gxx_objs;
gxx_objs->gpp;
}

}
生成的结果:


参考:http://www.graphviz.org/


  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值