注    册
密 码 忘记密码
保存密码         取消

图片

更多图片..

日历

统计

统计中,请等候...

统计中,请等候...

黑猫的blog

黑猫的IT播客 
软件设计方法心得、软件项目发布,也包括SimLab的介绍
黑猫的窝窝 
黑猫早期的诗歌

日志

SimLab QT演示版本下载地址

分类:SimLab

SimLab QT演示版本下载地址为:http://erisen.xu.googlepages.com/SimLab.rar

本来计划2006年10月推出SimLab的第一个版本的,可惜由于是用Open Source的QT做的界面,但我又没有打算Open Source Simlab,所以就没有推出。而是在10月又开始在研究其他的GUI库,如GTK和WTL,总之算是学习吧。

需要说明的是,这个仅仅是个演示版,模型比较少,功能方面,包括对图形的操作,undo/redo,cut/past/copy等都做了,save还没做,因为今年主要是在做界面,对图形的操作是去年就完成的,可惜对图形的旋转操作做的不够理想!

由于QT的License的问题,可能不会再使用QT,除非有商业版本的QT,我才会优先选择QT。不过QT确实非常好用,而GTK就难很多,做的界面在windows下很丑,在linux下倒是很好看。

SimLab开发中的一些技术难题

分类:SimLab

在SimLab的开发过程中,确实遇到了很多技术方面的难题,有建模方面的,也有仿真方面的。由于SimLab提供了一个可视化的界面,所以大多数的难题都出在可视化上,具体的,在可视化建模方面,目前有以下一些难题无法解决:

  • 将几个图形添加到一个图形组后,拖动鼠标改变这个图形组的尺寸,组中的图形的尺寸也会改变。问题就在于,当将图形组的尺寸恢复到原来的尺寸时,图形组中的图形却不能恢复到原来的尺寸!有时候图形在图形组中的相对位置也会发生变化。这真的是一个大难题,以前,图形的坐标都是使用int类型的,这种情况尤其明显,现在我将图形的坐标用Double类型的来保存,情况好了很多,基本上不明显了,但仔细看还是有这样的问题存在。不知道有什么好的设计模式可以解决这个问题?
  • Redo/Undo的问题,Redo/Undo有现成的设计模式,我就是使用的这个设计模式来实现的,但问题还是有,和前一个问题差不多,当Redo/Undo次数多了后,图形无法恢复到原来的尺寸,或回到最初的坐标,因为,总会有那么一点点偏差。我想,这和系统绘图方式有关,虽然我使用double类型来保存图形的坐标,但绘图函数却只能接受int类型的参数,在类型转换的过程中,次数多了,就会有误差。不知道使用备忘录模式可否解决这个问题,就是在用户拖动鼠标改变图形时,将图形的所有属性都保存到备忘录中,恢复的时候从备忘录中取出图形的信息就可以了。我正打算试试这个设计模式。
  • 文本编辑的问题。也是一个难题,怎样让用户编辑文字呢?最简单的是弹出一个对话框,让用户在对话框中编辑,之后保存起来就可以了。以前的图形处理软件就是这样来实现的。但我希望实现直接编辑的功能,就像在Visio中一样。目前,找到一种实现方式,就是采用Text控件来实现,当用户需要编辑文字时,显示这个Text控件让用户在控件中输入,不编辑时,将控件隐藏。
  • 连接线,已经解决。找到了一个比较好的连接线模式,在连接两个图形时,可以判断两个图形是否可以连接到一起。

在仿真方面遇到的问题有:

  • 通过用户绘制的一些模型来列举状态方程。可以通过遍历模型层中的模型,根据连接线来找到模型之间的关系。目前,SimLab采用的就是这种方式。但选择那一个模型来作为起始模型进行遍历,却是个大难题。因为不同的起始模型,仿真曲线会有些不同(主要是起始值不同,之后就相同了),所以选择正确的起始模型会很重要的。需要有个好的规则来找到起始模型。
  • 编程语言的问题。SimLab允许用户对每个模型进行编程,之后,再产生一个总的程序源码,在仿真时,要编译、运行这个程序源码来仿真。怎样对程序进行编译呢?可以自定义一个语言来实现,但无疑这是很麻烦的。SimLab打算采用嵌入式的语言,例如Python,来实现这个功能。

惊奇地发现有那么多叫SimLab的软件

分类:SimLab

今天在baidu上使用simlab搜索了一下,发现居然有那么多叫做SimLab的软件,即有国外的又有国内的,功能居然都和我要开发的SimLab很像!以前没有写blog,没有查询这些事情,今天发现居然这么多同名的同类型的软件!真是太晕了!看来我的开发速度太慢了,虽然想法很好,可就是太慢了!唉,软件还是在公司里开发快呀,一个人的力量太有限了!要是能找到有人投资就好了,其实除了SimLab,我还有好的在可视化方面的软件想开发,都是应用在不同的领域。可惜没时间!

不过,用baidu搜索的时候,我的关于simlab的blog排在第一,呵呵,也算是安慰吧!

SimLab工作原理

分类:SimLab

SimLab按照如下的方式工作:
  1. 用户使用SimLab建模
  2. 用户对每个模型列举方程
  3. SimLab分析模型之间的关系,列举状态方程
  4. 根据状态方程画出仿真曲线
目前,SimLab已经具备建模的功能,根据状态方程画仿真曲线的功能也有了,但根据模型之间的关系来自动创建状态方程,却还在开发过程中。通过用户绘制的一些图形来建立状态方程确实是个难点,不过目前已经有了解决方案。

SimLab通过使用embedded Python来提供编程语言,让用户给每个模型列举方程,这种方法是可行的,也是简便的,比直接开发一个脚本语言来支持模型编程要简单很多。

各个GUI版本的SimLab

分类:SimLab

正像SimLab简介中所说的一样,SimLab曾经使用过好几个GUI框架来提供GUI界面,不过建模库和仿真库却是使用的标准C++,否则就不会那么好移植了。其中,MFC,查不多是最早开发时,使用的的GUI架构,这其中,还支持GDI+,可惜考虑到MFC不能跨平台移植,所以开发了一段时间后,就放弃使用MFC了,它的简易的界面如下:

图1.VC版本的SimLab,连接线已经实现了

后来,采用wxWidgets,主要是因为它的跨平台移植性很好,又是免费的,且可以和windows上提供的一些平台结合使用,例如GDI+,在wxWidgets中也可以使用,下图是使用了wxWidgets+GDI+的界面:

图2. wxWidgets+GDI+的SimLab,消除了图形锯齿

使用wxWidgets最后版本的界面如下,有点仿照20-sim的意思:

图3. wxWidgets最终版本的SimLab

而QT版本的界面如下:

图4. QT版本的SimLab

如果不出什么意外,SimLab将最终采用QT来开发。而在使用QT的过程中,我发现,QT的绘图效率非常高,都不用额外使用双缓冲,拖拽图形也不会产生闪烁,而使用MFC和wxWidgets,都必须使用双缓冲,甚至是GDI+,也不例外。而QT在绘图时,可以很方便地实现GDI+的功能,消除锯齿后,其速度要比使用GDI+来消除图形锯齿快很多,所以,使用QT确实有很多好处,其跨平台的特性就不用说了,著名的linux的界面就是用QT来开发的。而且使用QT做自定义的界面比其他两个框架都容易的多。

SimLab简介

分类:SimLab

SimLab是我花了大约5年的时间,利用业余的时间,独立开发的一个建模、仿真的软件。开发它的初衷,主要是在大学作课题时,使用了一个建模、仿真的软件20-sim(http://www.20-sim.com),这个软件支持键图和方块图的建模与仿真,用在自动控制的仿真分析上比Matlab更有精度,例如对空中加油的仿真分析,用Matlab建模就不行,但用20-sim却可以。我的课题,就是使用20-sim来作的建模、仿真分析。由于国内没有类似的软件,我就想开发一套这样的软件,但直到毕业后,才开始着手开发。其实在学校的时候,只是作了一些研究工作,写的程序后来都推翻了,后来重新设计架构,里面使用了很多设计模式,算是练练手吧。

开发时间,虽然说是5年,其实总共加起来,估计还不到半年,因为中间开发都没有进度压力,况且有时候又工作很忙,实际上,也就只有五一、十一有点时间开发,所以进度很慢。不过架构却是在3年前,也就是在我第一个公司的时候,就做完了的,现在做的,就是界面,期间换了好几个GUI框架,什么c++ builder、MFC、wxWindows,现在刚在今年五一,将界面又换成了QT,不过目前的软件,使用预编译宏,所以这几个GUI框架都还是支持的,之所以这样换,是因为为了可以将软件移植到Linux或其他操作系统,所以C++ builder及MFC肯定不能用,wxWindows使用了好长一段时间,后来移植到Linux的时候一看,发现有些控件和windows上的效果不同,所以现在使用QT,因为使用QT,开发自绘控件比其他都容易一些,就像Java一样,不过,使用QT有一个不好之处就是,它licence不是那么自由,虽然现在有open source的。不过我已经渐渐喜欢上了QT,之因为它做界面真的可以像使用Java那样随心所欲,而且都是使用模式设计。

目前SimLab的界面有点像微软的visio,不过visio之不过是用来建模的,但Simlab却是用来建模及仿真的。SimLab目前的建模水平,却具备了visio大部分的功能。

更多日志..