`
airu
  • 浏览: 270794 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论

graphviz画UML类图

 
阅读更多

说到画图,我们可能首先想到photoshop 这样的工具,不一定人人都是学美术的,但是作为程序员,偶尔画个图,以方便更好的表达技术,那是很常有的事情,实际上画图的工具很多很多。这里,我要介绍一种和他们都不一样的工具, graphviz。

 

What is Graphviz?

Graphviz is open source graph visualization software. Graph visualization is a way of representing structural information as diagrams of abstract graphs and networks. It has important applications in networking, bioinformatics,  software engineering, database and web design, machine learning, and in visual interfaces for other technical domains. 

 

这段话来自 www.graphviz.org  官网。这里定义的很多,graphviz是一个开源做图软件,她能画结构化的抽象和网络图形,在网络,生物信息学,软件工程,数据库和web设计,机器学习, 可视化接口等众多其他技术领域都有应用。

 

这里也说明了,你要是想画一副《蒙娜丽莎》,那是不太可能了。我这里也只是使用她来画我们熟悉的UML类图。

 

关于graphviz,你可以从他的官网得到所有信息,所以这里,我们主要是注重如何用它来实现UML类图。如果你对其他图形感兴趣,可以随便一搜索,可以得到一大堆让你惊讶的东西。

graphviz有很多布局方式,我们常用的是DOT,有层级的有向图布局方式。

接下来就是准备工作:

操作系统:windows

编辑器:gvim

程序下载:http://www.graphviz.org/Download_windows.php

就这些足矣。之所以用gvim,这里有个技巧待会再说。

 

gvim只是windows下的vim,我们可以不用,使用文本编辑器即可。

打开文本编辑器:输入

 

digraph G {
}

 这就定义了一个图。注意 digraph 是规定。必须这么写。

接下来,我们要定义图形中的元素,对于UML类图,类都是矩形,不是圆的。所以接下要定义节点:

digraph G{
    node[shape=record]
}

 node就是图中节点,保留关键字,shape表示形状,record是一种形状,就是矩形方块。中括号表示对node的定义。

接下来便可以定义具体的类了。这里我们来画一个UML的策略模式。也就是Strategy模式的UML

一个策略是包含在上下文Context中的,这样Contex改变了,那么策略也就变了。也就是锦囊妙计不是随便用,而是根据环境来用。Context中有调用策略的方法strategy,可能还有一些其他的方法,姑且称为contextInterface ,好了,基本这样,就可以写了

digraph G{
    node[shape=record]
    Context[
        label="{Context| +strategy : Strategy\l|+contextInterface()\l"}
    ]

 这里,对Context的定义,Context是用户自定义的节点(Context 写成什么没关系,label不能写错)。使用了node属性,其中的label属性是一个字符串,这里 | 表示换行 \l 也是空行的意思,占用一个空行。注意使用了{}把内容括起来。

 

接下来,我们定义策略接口Strategy,同时再定义几个具体不同策略的实现类。

digraph G {
    node[shape=record]
    Context[labell="{Context| +strategy : Strategy\l| +contextInterface()\l}"]
    Strategy[ label="{Strategy|\l|+algorithmInterface()\l}"]
    ca[label="{ConcreteStrategyA|\l|+algorithmInterface()\l}"]
    cb[label="{ConcreteStrategyB|\l|+algorithmInterface()\l}"]
    cc[label="{ConcreteStrategyC|\l|+algorithmInterface()\l}"]
}

  似乎快完成了。还差各个图形节点之间的关系。也就是类之间的关系。

关系很简单,我们只需这样

digraph G {  
    node[shape=record]  
    Context[label="{Context| +strategy : Strategy\l| +contextInterface()\l}"]  
    Strategy[ label="{Strategy|\l|+algorithmInterface()\l}"]  
    ca[label="{ConcreteStrategyA|\l|+algorithmInterface()\l}"]  
    cb[label="{ConcreteStrategyB|\l|+algorithmInterface()\l}"]  
    cc[label="{ConcreteStrategyC|\l|+algorithmInterface()\l}"]  
    
    Strategy -> Context
    ca->Strategy 
    cb->Strategy
    cc->Strategy

}

 可是对于UML图来说,这些连线是有特殊要求的,比如,继承是带空心箭头的实线,而Context和Strategy之间是聚合关系,棱形空心箭头。好吧,graphviz中是有对边的定义的。请看:

digraph G {    
    node[shape=record]    
    Context[label="{Context| +strategy : Strategy\l| +contextInterface()\l}"]    
    Strategy[ label="{Strategy|\l|+algorithmInterface()\l}"]    
    ca[label="{ConcreteStrategyA|\l|+algorithmInterface()\l}"]    
    cb[label="{ConcreteStrategyB|\l|+algorithmInterface()\l}"]    
    cc[label="{ConcreteStrategyC|\l|+algorithmInterface()\l}"]    
      
    edge[
        arrowhead="odiamond", style="filled"
    ]
    Strategy -> Context  

    edge[ arrowhead="onormal", style="filled"]
    ca->Strategy   
    cb->Strategy  
    cc->Strategy 

 

你也许想说,这也太简单了。确实,如果你想看看还有些什么shape,什么style可以去graphviz的官网一查便知。于是,我们像,大概可以看看是什么效果了吧。

保存文件,打开命令提示符,使用命令

dot strategy.dot Tpng -o strategy.png && stragegy.png

dot是布局方式, T  是生成的图片模式 -o表示输出文件。

 

已经有模有样了,可是可能还和我们心中的不太一样。我们希望接口Strategy在顶端。

digraph G {    
    node[shape=record]   
    {rank=same;Conext;Strategy}
    Context[label="{Context| +strategy : Strategy\l| +contextInterface()\l}"]    
    Strategy[ label="{Strategy|\l|+algorithmInterface()\l}"]    
    ca[label="{ConcreteStrategyA|\l+algorithmInterface()\l}"]    
    cb[label="{ConcreteStrategyB|\l+algorithmInterface()\l}"]    
    cc[label="{ConcreteStrategyC|\l+algorithmInterface()\l}"]    
      
    edge[
        arrowhead="odiamond", style="filled"
    ]
    Strategy -> Context  

    edge[ arrowhead="onormal", style="filled"]
    ca->Strategy   
    cb->Strategy  
    cc->Strategy 
}

 这个rank是表示节点之间的关系,比如一上一下,或者一左一右,或者是相同的高度。

可惜还是不理想。这是,我们可以加个注释,对Context的document解释

digraph G {    
    node[shape=record]    
	{rank=same;Context;Strategy}
    Context[label="{Context| +strategy : Strategy\l| +contextInterface()\l}"]   	docs[
	  style="filled", color="gold",	label="Strategy AlgorithmInterface()"
	] 
    edge [ arrowhead="none", style="dashed"]
    Context->docs
    Strategy[ label="{Strategy|\l|+algorithmInterface()\l}"]    
    ca[label="{ConcreteStrategyA|\l+algorithmInterface()\l}"]    
    cb[label="{ConcreteStrategyB|\l+algorithmInterface()\l}"]    
    cc[label="{ConcreteStrategyC|\l+algorithmInterface()\l}"]    
      
    edge[
        arrowhead="odiamond", style="filled"
    ]
    Strategy -> Context  

    edge[ arrowhead="onormal", style="filled"]
    {rank=same;ca;cb;cc;docs}
    ca->Strategy   
    cb->Strategy  
    cc->Strategy 
}

 注释背景是金色的。终于,我们的UML画出来,看起来是不是和你想像的一样呢?



 

 

好了,现在讲讲为什么用gvim,首先在windows下,gvim很强大。如果是linux就直接用vim了

找到安装路径,例如: C:\Program Files (x86)\Vim

看到_vimrc 文件,打开,在末尾插入一句

noremap <F5> :!dot "%:p" -Tpng -o %:r.png && %:r.png <CR>

这里是吧F5键映射到 后面的语句了。<CR>便是换行回车。也就是说当你编辑好一个dot文本以后,就可以直接按F5,然后就帮你把你所想的图形描述转化成图片,并且用windows默认的图片浏览器打开。

方便吧。哈哈。

 

以上只是对类图的很简单的一个实现,如果你对graphviz感兴趣,那么就赶紧动手吧。

 

 

  • 大小: 15.6 KB
分享到:
评论

相关推荐

    umpledot:使用GraphViz绘制UML类图-开源

    `umpledot`是一个开源项目,它结合了Umple和GraphViz两个强大的工具,帮助开发者更方便地绘制UML类图。 Umple是一种开源的建模语言,它扩展了面向对象编程的概念,提供了额外的特性如状态机、动态图、代码生成和...

    graphvizuml:使用 Graphviz 绘画 UML 图

    利用 Graphviz 去生成 UML 类图有几个好处:用文本表示图,容易更新,容易做版本管理。能自动排布节点位置,在大型复杂的图特别方便。统一文档风格。实际上,文档生成工具 也是采用 Graphviz 生成类图的。不过,我们...

    cpp-C源代码自动分析工具得到UML类图和函数间调用关系网图

    本主题将围绕“cpp-C源代码自动分析工具得到UML类图和函数间调用关系网图”这一主题进行展开,介绍如何利用工具来可视化和理解C++代码的结构。 UML(统一建模语言)是一种标准化的建模语言,用于软件工程中的系统...

    Eclipse插件,JAVA类反向生成UML类图AmaterasUML_1.3.4

    在Java开发过程中,理解代码结构和关系往往需要用到UML(统一建模语言)类图,AmaterasUML就是这样一个Eclipse插件,能够帮助开发者将已有的Java代码反向工程为UML类图,便于理解和设计。 标题中的"Eclipse插件,...

    class2pic:C ++源代码自动分析工具,得到UML类图和函数间调用关系网图

    C ++源代码自动分析工具,得到UML类图,函数间调用关系网图及相关文档 配置:--java 自行配置JDK --graphviz sudo apt install graphviz --libclang sudo apt-get install libclang-dev sudo ln -s /usr/lib/llvm...

    java源码uml-JavaParser:从Java源代码生成UML类图

    在Java项目中,通过JavaParser将源代码转换为UML类图,可以直观地展示类之间的关系,便于理解和维护代码。 要使用JavaParser生成UML类图,首先需要了解以下概念: 1. **抽象语法树(AST)**:AST是对源代码结构的...

    java源码uml-tags2uml:从源代码生成UML类图。对于ctags支持的所有面向对象语言,通过GraphvizDOT从Exubera

    类图 概述 用于将 ctags 支持的所有面向对象语言从标记文件转换为 , 到 的命令行工具 输入文件是一个标签文件,由--fields==+latinK -ctags 使用--fields==+latinK 。 输出文件是一个 Graphviz,其名称通过程序选项...

    解决Cannot find Graphviz

    Graphviz是一款开源的图形绘制软件,主要用于自动布局图表,如流程图、网络图和UML图等。在Java开发环境中,尤其是使用IntelliJ IDEA这样的集成开发环境(IDE)时,Graphviz常被用来配合PlantUML插件生成各种类型的...

    graphviz-2.38与PlantUML结合使用

    PlantUML则是一个基于文本的工具,允许用户通过简单的文本描述来创建各种类型的UML(统一建模语言)图表,如类图、用例图、序列图、状态图等。PlantUML的一个显著优点是它可以嵌入到各种文档中,如Markdown、...

    java源码uml-UML-Parser:该项目旨在将Java源代码转换为UML类图

    java源码uml UML解析器 CMPE202个人项目提交者:Pranjali...安装了graphviz-2.38.msi,该文件用于查看在上述步骤中生成的类图图像。 在单一系统上运行jar的说明: 从附件文件(GoogleFolderLinkToZip.pdf)中提供的链接

    java源码uml-UML-Parser:Java源代码,可从.java文件生成UML类图

    Java源代码,用于从.java文件生成UML类图。 运行umlparser.jar文件的步骤: 在系统上安装Graphviz。 转到终端-&gt;导航到umlparser.jar所在的目录-&gt;输入:java –jar umlparser.jar 例如:java -jar /Users/ABC/Desktop...

    graphviz.rar

    在软件开发领域,尤其是面向对象编程中,它常被用来可视化类图和其他类型的uml图。在Windows系统中,如果你使用的是IntelliJ IDEA这样的集成开发环境,并且已经安装了PlantUML插件,那么为了能够正确地预览和生成...

    youemel:一种从 Matlab 代码生成 GraphViz UML 图的工具,带有返回代码的超链接。-matlab开发

    它通过使用 GraphViz 提供的类似 HTML 的表格符号来构建 UML 表示,这些表示在代码中嵌入了指向相关位置的超链接。 例如,一个 UML 类属性,“MyClass”的“myProp”将带您到在“MyClass”中定义“myProp”的确切...

    Ruby on Rails 3/4/5模型和控制器UML类图生成器。 (`brew / port / apt-get install graphviz`在使用前!)-Ruby开发

    RailRoady RailRoady生成Rails 3/4/5模型(ActiveRecord,Mongoid,Datamapper)和控制器UML图作为跨平台.svg文件以及DOT语言。 代码基于原始的“铁路” gem,修补程序RailRoady RailRoady生成Rails 3/4/5模型...

    Doxygen + Graphviz 很强大啊

    这可能包括如何配置Doxygen以利用Graphviz生成类图、调用图,以及如何编写DOT文件来定制特定的图表样式。 在提供的文件列表中,有一个名为"showJSP.dot"的文件。这很可能是用DOT语言编写的,用于描述JSP(Java...

    graphviz-2.38.rar

    3. 创建UML类图、状态图和序列图。 4. 展示网络和互联网的拓扑结构。 5. 设计电路和硬件布局。 6. 生物信息学中的基因调控网络和蛋白质相互作用图。 总之,Graphviz凭借其强大的图形生成能力、灵活的dot语言和多样...

    解决IDEA【Cannot find Graphviz】问题 graphviz-2.38.zip

    IDEA,全名IntelliJ IDEA,是Java开发常用的集成开发环境,它支持通过Graphviz来生成和展示程序的依赖关系图或类图。然而,有时用户可能会遇到IDEA提示“Cannot find Graphviz”的错误,这意味着IDEA无法找到...

    Diagrams:基于Roslyn的项目,用于生成UML序列图

    这可能涉及使用图形库如Graphviz或自定义的绘图算法,以确保生成的图表清晰、易读,能够有效地表达代码的逻辑。 6. **开发工具集成**: 这个项目可能作为一个开发工具的插件或独立应用,允许开发者在编写代码的...

    graphviz-2.27.20100816.0445.zip

    类图是UML(统一建模语言)的一部分,它在软件工程中用于描绘系统中的类以及它们之间的关系。通过类图,开发者能够清晰地理解系统的结构,进行设计决策,并且可以逆向生成代码,即从已有的类图自动生成源代码,这...

    Windows下Intellij IDEA 插件 PlantUML 所需要的依赖 Graphviz

    - 将光标置于PlantUML代码块内,按`Alt+Shift+U`(或使用右键菜单的“PlantUML”-&gt;“Preview Diagram”)即可看到生成的UML类图。 通过以上步骤,你就能在Windows下的IntelliJ IDEA中顺利使用PlantUML插件,并借助...

Global site tag (gtag.js) - Google Analytics