以前的时候学习新东西没有总结的习惯,周末把以前研究的东西翻了翻,稍微总结下。

Scxml是w3c出来的基于状态机的对话脚本语言标准,具体内容可以谷歌到,这里讲述自己开发的一个把scxml转化为可交互图形的程序。

源代码上传到了git  

https://github.com/su6838354/scxml_exec

基本原则是把具有状态机关系的xml语言转换为矩形、矩形之间的线、矩形的子父级关系。

整个模块由下而上分为 5部分

1.Scxml 脚本

2.Parser 层(依赖Tinyxpath)

3.Model 层

4.Layout 层 (Model转化为虚拟图形对象)

5.View 图形(MFC和GDI [ Gdiplus::Graphics]实现 )

Parser层会通过tinyxpth解析scxml脚本并产出Modal对象,并对上层提供getState,getTransitions,GetFinals等接口,接口之间的参数类型就是Model层定义的;

Layout层获取所有的state和transition,然后转化为虚拟图形对象ScxmlRectangle和ScxmlLine等;

View层通过MFC实现,将虚拟图形对象进行描绘和渲染

下面这个是包设计图,UI从LayOut中获得图形信息画图,LayOut从IGetScxmlObject获得解析信息,

Parser层通过Iread可以读取到scxml文件中的元素,ModelFactory将获取的元素转换为自定义对象,提供IGetModel给layout

下面是layout层和parser层的用例图,

layout用于描述自动状态机布局的过程,包含从scxml_parser模块获取对象,根据对象内容计算出整个图形布局

Rectangle Scxml   用于输出图形的中心点、宽度、高度,线条起始点等内容

GetScxmlObject   解析scxml对象,生成矩形和有向线段

Parser描述从scxml格式解析成对象的过程,以及和外部模块之间的关系,

Read scxml     主要用于按照需求读取scxml文件内容,其调用tinyxpath模块执行自定义的xpath语法

create model          将读取的内容构建成对象

Layout的类图如下

Line        线,包含起始点和终点

Rectangle       矩形,包含中心点、宽度、高度

ScxmlLayout         包含所有矩形和线条的数据,拥有计算整个图形布局的方法

Layout时序图

根据scxml对象,执行LayOut算法,生成图形信息

调用scxml_parser模块,获取自定义的scxml对象,生成相应的图形内容,执行布局算法,输出图形信息

Parser 类图如下

Xtinyxpath     调用Xpath语言查找scxml元素

ScxmlParser          调用tinyxpath获取元素,封装为scxmlobject对象

Parser时序图:

scxml文件解析过程     调用tinyxpath模块,实现在C++中内嵌使用xpath语言,按要求获取scxml元素,转化成自定义的对象,用于layout画图

展示效果如下

下面为一个相对复杂的scxml,包含了并行、多层的嵌套关系

scxml 图像展示器 (基于C++ MFC GDI tinyxpath的实现)的更多相关文章

  1. 自己DIY出来一个JSON结构化展示器

    说来也巧,这个玩意,一直都想亲手写一个,因为一直用着各种网上提供的工具,觉得这个还是有些用途,毕竟,后面的实现思路和原理不是太复杂,就是对json的遍历,然后给予不同节点类型以不同的展现风格. 我这次 ...

  2. android 开发 View _13 绘制图片与BitmapShader位图的图像渲染器

    BitmapShader位图的图像渲染器 TileMode 模式 Shader.TileMode.CLAMP 边缘拉伸. Shader.TileMode.MIRROR 在水平方向和垂直方向交替景象, ...

  3. iOS:图像选取器控制器控件UIImagePickerController的详解

    图像选择控制器:UIImagePickerController 功能:用于选取相册或相机等里面的照片. @interface UIImagePickerController : UINavigatio ...

  4. VS下如何建立一个新的MFC程序 网络编程 课设 基于C++ MFC 连接数据库 小应用 小项目浅析展示

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8191036.html 这里不知道会不会有人是真的新手 新新手 不知道怎么 如何建立一个MFC ...

  5. 基于图像切换器(imageSwitcher)的支持动画的图片浏览器

    利用GridView和ImageSwitcher的基本用法 public class MainActivity extends Activity { int[] imageIds = new int[ ...

  6. MFC GDI绘图基础

    一.关于GDI的基本概念 什么是GDI? Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上. 在Wind ...

  7. MFC GDI相关对象

    首先说明几个名词: CDC 是MFC对Wind32 API的设备上下文(DC)进行封装的C++类,由他继承的类包括 CPaintDC(常用)CWindowDC(现在软件基本不用) CClientDC( ...

  8. dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程

    *1 dom4j解析器   1)CRUD的含义:CreateReadUpdateDelete增删查改   2)XML解析器有二类,分别是DOM和SAX(simple Api for xml).     ...

  9. VS2010 MFC GDI+ 实现PNG透明图片显示

    网上找了一些资料学习了一下PNG图的显示,这里总结一下. 参考:http://blog.csdn.net/czyt1988/article/details/7965066 一.VS2010配置GDI+ ...

随机推荐

  1. C++小工具

    1.Doxygen 从源代码生成文档.可以生成在线文档(HTML)和离线手册(以LATEX格式),还可以自动生成各种依赖关系图,继承关系图等.

  2. Hello,DTOS!(上)

    主引导程序是软件还是固件?如果是软件,那么由谁开发?如何开发?主引导程序是软件.因为它不是固化于硬件当中的,并不是在出厂之前已经烧到硬件里面去了.因此它必然是软件.既然是软件,那是谁来开发它呢?就目前 ...

  3. ubuntu配置定时任务crontab何保存退出

    crontab -e配置完成后,如何把保存并退出? 1.Ctrl+o 写入 2.出现“FIile name to Write...”,输入Enter 3.Ctrl+x 保存输出 提示“crontab: ...

  4. LCD12864

    /* LCD Arduino PIN1 = GND PIN2 = 5V RS(CS) = 8; RW(SID)= 9; EN(CLK) = 3; PIN15 PSB = GND; */ #includ ...

  5. Bring JavaScript to your Java enterprise with Vert.x

    转自:https://opensource.com/article/18/4/benefits-javascript-vertx If you are a Java programmer, chanc ...

  6. 通过ALTER DATABASE postgres SET 解决 plv8 plv8.start_proc 问题

    通过plv8.start_proc 我们可以使用类似钩子的改变 ,方便的扩展plv8,比如基于plv8.start_proc 的require 实现 命令 ALTER DATABASE postgre ...

  7. 每日一问:你了解 Java 虚拟机结构么?

    对于从事 C/C++ 程序员开发的小伙伴来说,在内存管理领域非常头疼,因为他们总是需要对每一个 new 操作去写配对的 delete/free 代码.而对于我们 Android 乃至 Java 程序员 ...

  8. Oracle_其他人连接不上自己电脑

    1. 修改文件G:\app\eric\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora文件,listener中的address中加一个你的ip开头的 ...

  9. concurrent (二)AQS

    参考文档: https://www.cnblogs.com/waterystone/p/4920797.html

  10. 亿级Web系统搭建 Web负载均衡的几种实现方式(阿里)

    我还写了两篇详细的 参考:六大Web负载均衡原理与实现 参考:LVS(Linus Virtual Server):三种IP负载均衡方式比较+另三种Web负载均衡方式 其中LVS.HAProxy可以工作 ...