一款用于绘制状态机转换图和流程图的web在线绘图工具

  大型软件系统中离不开各类状态机的处理,日常工作中也涉及到各类事务处理流程;从表现力看文不如表,表不如图;因此日常工作中经常需要绘制各种状态机的状态转换图和流程图,以协助理解代码逻辑和各类事务处理流程等。

  绘制此类图形的常用工具有visio,liberoffice draw等,这些软件采用"所见即所得"的设计思想,完全由手动放置形状、填充文本、绘制线条、拖动箭头指向关系、调整文本格式、调整布局等等。此类工具优点是绘图直观、布局可控;缺点一是需要安装专门的软件;二是过于繁琐,以状态机状态转换图为例,当状态和激励较多时,表示状态的矩形框和表示激励的线条会显得很凌乱,新添加状态或者激励时可能需要重新调整已有状态和激励的布局。

  为了提高绘图效率,同时让绘图在每台电脑上随时可用,以及随时可以访问已经绘制的图形协助代码分析,用python+graphviz开发了状态机在线绘图工具。

  工具以下列格式的文本作为输入:

source:XXX;   trigger:YYY;   destination:ZZZ;  color="red"

  上述文本表示在XXX状态下收到YYY激励会跳转到新的ZZZ状态;color="red"表示该条边绘制为红色,可以设置其他颜色,不设置默认为黑色。

  注意:上述输入文本格式中,source,tigger,destination后面必须要有英文冒号(:)和英文分号(;)。

  只要在输入框内输入多条上述语句,点击按钮即可一键自动绘图,只要有网络访问即可,不需要安装软件,不需要手动绘制各类形状和线条。

  下图是工具绘图的简单示例:

  访问http://www.tasksteper.com:8099/flow/home/;以用户名/密码:testuser1/ testuser1登录;进入“集成工具”项目后;点击“创建条目”;

  概要栏随便填写,输入栏输入以下文本框中的内容;点击“创建”按钮后;在刷新后的界面点击“Graphviz绘图”按钮,即可在页面右侧看到绘制的状态转换图;如下图所示:

  

  输入内容:

source:吃饭;           trigger:goto睡觉;                 destination:睡觉;
source:吃饭;           trigger:goto打豆豆;               destination:打豆豆;
source:睡觉;           trigger:goto打豆豆;               destination:打豆豆;
source:睡觉;           trigger:goto吃饭;                 destination:吃饭;
source:打豆豆;         trigger:goto吃饭;                 destination:吃饭;
source:打豆豆;         trigger:goto睡觉;                 destination:睡觉;

  输出:

  绘图的实现步骤如下:

  1.后台接收输入表单中的文本内容,并根据换行符,将一行内容作为一个字符串;

  2.循环判断每个字符串是否满足如下格式:

source:XXX;   trigger:YYY;   destination:ZZZ;

  若满足,则在dot语言中生成XXX,ZZZ两个节点,以及一条XXX指向ZZZ的边;节点信息记录到node_database中,边信息记录到edge_string中;

  3.所有字符串遍历完成后,根据node_database和edge_string中记录的信息生成用于graphviz绘图的临时dot语言脚本;

  4.在后台调用步骤3生成的dot语言脚本进行绘图,生成图形后并将图形显示在web界面上,随后删除dot语言脚本;

接收输入表单数据,并生成dot语言进行绘图的python代码如下所示:

 1  def tools_draw_pygraphviz(request, model_instance):
 2      prefix = ‘‘‘digraph graphviz {
 3      graph [
 4          //rankdir = "LR"
 5          //splines=polyline
 6          overlap=false
 7          bgcolor="#FFFFCE"
 8      ];
 9
10      node [
11          fontsize = "16"
12          shape = "ellipse"
13      ];
14
15      edge [
16      ];
17  ‘‘‘
18      edge_string = ‘‘
19      space4 = ‘    ‘
20      space8 = space4 + space4
21      node_database = {}
22      node_database[‘created‘] = []
23      tmpline = ""
24      for tmpchar in model_instance.detail:
25          if tmpchar == ‘\n‘:
26              m = re.search(r‘source: *([^\s].*[^\s]) *;.*trigger: *([^\s].*[^\s]) *;.*destination: *([^\s].*[^\s]) *;(.*)‘, tmpline)
27              if m:
28                  if m.group(1) not in node_database[‘created‘]:
29                      node_database[‘created‘].append(m.group(1))
30                  if m.group(3) not in node_database[‘created‘]:
31                      node_database[‘created‘].append(m.group(3))
32                  n = re.search(r‘(color *= *\"[^\"]*\")‘, m.group(4))
33                  if n:
34                      color_string = ‘, ‘+n.group(1)
35                  else:
36                      color_string = ‘‘
37                  edge_string = edge_string + "\"" + m.group(1) + "\"" + "->" + "\"" + m.group(3) + "\"" + "[ label = \""  + m.group(2) + "\"" +color_string+ "]\n" + space4
38              tmpline = ""
39          else:
40              tmpline = tmpline + tmpchar
41
42      m = re.search(r‘source: *([^\s].*[^\s]) *;.*trigger: *([^\s].*[^\s]) *;.*destination: *([^\s].*[^\s]) *;(.*)‘, tmpline)
43      if m:
44          if m.group(1) not in node_database[‘created‘]:
45              node_database[‘created‘].append(m.group(1))
46          if m.group(3) not in node_database[‘created‘]:
47              node_database[‘created‘].append(m.group(3))
48          n = re.search(r‘(color *= *\"[^\"]*\")‘, m.group(4))
49          if n:
50              color_string = ‘, ‘+n.group(1)
51          else:
52              color_string = ‘‘
53          edge_string = edge_string + "\"" + m.group(1) + "\"" + "->" + "\"" + m.group(3) + "\"" + "[ label = \""  + m.group(2) + "\"" +color_string+ "]\n" + space4
54      for tmp_node in node_database[‘created‘]:
55          tmp_node_string = space4 + "\"" + tmp_node + "\" [\n" + space8 + "label = \"" +  tmp_node + "\"\n" + space8 +  "shape = \"record\"\n" + space4 + "];\n"
56          prefix = prefix + tmp_node_string
57      image_path = ‘/root/virenv_python3/django_for_study/mysite/polls/static/polls/images/‘
58      output_file = image_path + ‘tools_graphviz_‘ + str(model_instance.id) + model_instance.graphviz_format
59      dot_file = image_path + ‘dot_‘ + str(model_instance.id)
60      with open(dot_file,‘w+‘) as f_output:
61          f_output.write(prefix + space4 + edge_string + "\n}")
62      if os.path.exists(output_file):
63          os.remove(output_file)
64      dot_cmd = model_instance.graphviz_style+‘ -T‘+ model_instance.graphviz_format[1:] + ‘ ‘ +  dot_file +‘ -o ‘ + output_file
65      os.system(dot_cmd)
66      os.remove(dot_file)

由上述代码python解析表单输入自动生成的dot脚本如下所示:

digraph graphviz {
    graph [
        //rankdir = "LR"
        //splines=polyline
        overlap=false
        bgcolor="#FFFFCE"
    ];

    node [
        fontsize = "16"
        shape = "ellipse"
    ];

    edge [
    ];
    "吃饭" [
        label = "吃饭"
        shape = "record"
    ];
    "睡觉" [
        label = "睡觉"
        shape = "record"
    ];
    "打豆豆" [
        label = "打豆豆"
        shape = "record"
    ];
    "吃饭"->"睡觉"[ label = "goto睡觉"]
    "吃饭"->"打豆豆"[ label = "goto打豆豆"]
    "睡觉"->"打豆豆"[ label = "goto打豆豆"]
    "睡觉"->"吃饭"[ label = "goto吃饭"]
    "打豆豆"->"吃饭"[ label = "goto吃饭"]
    "打豆豆"->"睡觉"[ label = "goto睡觉"]

}

下图是实际工作中所涉及FC协议的端口状态机跳转流程:

其中红色表示端口开工主流程,蓝色表示端口停工流程;比代码直观许多。

该绘图工具具有以下优势:

1.自动布局自动绘图,避免了手动放置形状、填充文本、绘制线条、拖动箭头指向关系、调整文本格式、调整布局等一系列繁琐的操作;
添加新的状态跳转描述时,只需要点击按钮一键重新绘图即可,不需要关心之前的布局怎样;

2. 代码中的状态转换描述可以轻易的经脚本进行格式化处理为如下格式:
source:XXX; trigger:YYY; destination:ZZZ;
随后将格式化处理后的文本贴入网页就可以一键绘图;对于一些复杂的状态机(比如20+个状态,20+个激励)手动绘制可能需要两天左右,利用脚本预处理并利用网页生成仅需要几分钟;

3.只要能访问网络就随时随地可用,不需要安装visio等绘图工具,节约绘图前等待软件启动的时间;

4.支持设置颜色,将主要流程以颜色区分显示,便于理解;如上图中的端口启动和停止流程分别以红色和蓝色显示。

5.纯文本的输入便于批量修改,比如LLL, MMM, NNN等多个状态下都收到YYY激励,我们需要加上激励编号将YYY修改为YYY(05),在visio等绘图工具中需要手动修改多个状态下YYY激励对应的线条上的描述;使用web绘图工具只需要将输入中的YYY全文替换成YYY(05), 点击按钮重新绘图即可。

原文地址:https://www.cnblogs.com/leituhaomo/p/11784600.html

时间: 2024-08-28 14:31:26

一款用于绘制状态机转换图和流程图的web在线绘图工具的相关文章

在线画图工具绘制流程图怎样画

现在有很多可以在线画图的网站.软件得到了很多人的青睐,并且这些在线画图工具给用户的体验度以及绘制时的感觉都是极佳的一致获得好评,那利用在线画图工具绘制流程图怎样画呢?下面分享的在迅捷画图中绘制流程图的操作方法介绍,希望可以给大家带来帮助. 绘制流程图的注意事项: 1.不同的流程图图形所代表的含义不同,我们可以根据流程图图形准则对流程图进行熟悉. 2.在对框架结构搭建中我们要根据事情的走向对其进行绘制. 绘制流程图方法: 1.首先要进入到该绘制网站中,在新建文件夹中选择流程图进行新建使用,首先要点

如何使用在线画图工具绘制流程图简洁方法介绍

流程图工具绘制流程图是很方便的,利用专业的绘制软件在绘制时间中可以节约很多时间,所以很多会人会选择用这样的方法来绘制思维导图,下面给大家分享利用在线画图流程图工具绘制流程图的简洁方法,希望可以帮助到需要的朋友. 1.下面的操作步骤是在迅捷画图中进行绘制使用的,那首先需要进入到该网站中,之后我们选择首页面中的立即体验就可以开始绘制使用啦. 2.会跳转到用户中心页面中,在左上角可以新建流程图,这里分享的是绘制流程图的操作方法,自然选择流程图进行新建使用. 3.创建好流程图文件之后,它就会自动跳转到在

9款国内外垂直领域的在线作图工具:那些可以替代Visio的应用!【转】

http://www.csdn.net/article/2015-02-12/2823939 摘要:现在越来越多的创业公司都希望提升办公的效率,今天介绍的几款也能提升办公效率,不过它们都属于垂直领域的作图工具:LucidChart.Mockingbird.Creately.DrawAnywhere和ProcessOn等. 现在越来越多的创业公司都希望提升办公的效率,之前在CSDN云计算频道的一篇文章<提升办公效率才是王道!12款国内外企业协作工具推荐>,其中就介绍了很多工具.今天介绍的几款也能

一款简单的基于Web的投票工具(PHP+SQLite 实现)

    最近实现了一个简单的投票工具--小兵投票(下文称"本软件").     本软件是一款简单的基于Web的投票工具,使用 PHP+SQLite 实现.      本软件是一款开源.免费软件. 软件下载地址: https://sourceforge.net/projects/xb-vote/files/latest/download?source=files     用户在系统中注册后,即可以创建投票,或参与投票. 首次使用时,请先注册一个用户名为root的用户,用于管理用户与投票.

10款最佳HTML5绘图工具

HTML5无疑是当前最受宠的一项技术,每个web设计者都在热烈的讨论这种神奇的标记语言的兴起.HTML5是一种学起来毫不费力的标记语言,但它却能提供迷人的.富有艺术性的特征,帮助web设计人员完成他们的构思想象.HTML5对于一个设计人员来说能毫不费力的理解,轻松的掌握. 草绘和制图是设计工作者工作中一个重要的特征.HTML5将会这方面显露出不可限量的前途. 今天,我给web设计人员收集了几款最好的HTML5绘图或涂鸦工具.这些绘图工具大多数是用HTML5画布(Canvas)实现的,部分辅以Ja

十款优秀的在线JavaScript工具介绍

JavaScript是Web开发者不可或缺的一项技能,它可以为你的网站添加丰富的交互功能和绚丽的视觉效果,以此来增强用户体验. 本文整理了10款非常优秀的在线JavaScript代码工具,涵盖编辑.压缩.美化.调试等功能,随时随地使用,大大节省你的开发成本和时间. 1. jsfiddle.net 在线编辑工具——由HTML编辑器.CSS编辑器.JavaScript编辑器和输出界面4个部分组成,你可以方便地进行代码测试. 2. jsbeautifier.org 在线美化工具——该工具可以处理你的凌

5个免费的项目管理工具&amp;7款最流行的在线项目管理工具

1. Collabtive Collabtive是一个基于Web的项目管理系统,非常知名的项目管理软件.提供的功能包括:项目管理,即时聊天工具,任务.文件管理,时间跟踪,多语言支持. 2. Freedcamp 这是另外一个免费项目管理领域的重量级的工具,功能全面,易于使用,有漂亮的UI.号称客户遍布全球超3万,大学30所以上,是不是应该瞧瞧? 3. Project Pier ProjectPier 是一款开源的项目管理程序,基于 PHP+MySQL 架构.用户可以通过 ProjectPier 的

开源、易扩展、方便集成的在线绘图(微服务架构图、网络拓扑图、流程图)工具

一个基于typescript + canvas 实现的开源在线绘图的引擎Topology.采用引擎 + 图形库中间件的思路能够方便.快速的扩展.集成到前端项目.目前暂时实现了基本图形.流程图图形库,能够满足微服务架构图.网络拓扑图和流程图的绘制.后面计划陆续实现活动图/时序图/类图等UML图. 在线体验(因为操作方便问题,暂时没有适配移动端)       产品介绍 为什么重复造轮子 笔者工作中遇到比较多的微服务架构.云资源运维.部署与运维可视化方面的需求 开源.满足自己需求的不多 typescr

15款最好用的新浪短链接(t.cn接口)在线生成工具

短链接已经广泛应用于各种场景,电商,微信,短信等等.那么今天给大家推荐15款t.cn.url.cn的短链接短网址 在线生成工具,都是我从市面数十款短链接短网址生成工具里面挑选的最为简便,最为稳定的短链接短网址生成 工具.废话不多! 1,青梅短网址 网站链接:http://qingmeidwz.cn 青梅短网址是发展的比较成熟的一款在线短网址短链接生成工具,一直是本着“简单,高效,自由,稳定”的理 念.不管是同行业还是用户的口中都有着非常好的口碑. 青梅短网址最大的优点就和他们所倡导的理念一样:“