介绍sml4asy 是Asymptote(简称asy)的一个扩展模块,sml4asy的目标: 能够使用asy语言,快速的绘制UML图。sml的全称是Simple Model Languate。保持简单性,是sml的重要原则。最开始,我就有一个想法,绘制一个UML图,所使用的代码行数不能超过UML图中重要元素的个数。
动机
- 想在latex文档中插入UML图。因为asy代码能够嵌入到latex文档中,然后编译生成包含UML图的pdf文档。但直接使用asy绘制UML太麻烦了,有必要开发一个扩展模块。
- 许多的所见即所得的绘制UML图的工具不够理想,太强调规范的不够灵活,太灵活的又很容易画出不规范的UML图。也许实现一个完美的WYSIWYG的UML工具目标太大了,为什么尝试一下使用编码的方式绘制?
- 我想通过开发这个模块,掌握Asympote语言。最好的学习是使用嘛。
sml4asy链接项目主页:
最新版本下载:
SVN获取最新代码: svn checkout
http://sml4asy.googlecode.com/svn/trunk/ sml4asy-read-only
Asympote相关链接Asympote的主页:
因为Asympte要使用latex,获取一个好用的asympte环境的最直接方式,是得到一个tex发布套装。我在Debian Linux下使用的是Texlive2009(也支持windows), Texlive的主页
还可以使用针对windows平台的Miktex: 还有包含更好中文支持的Ctex套装(基于Miktex) Ctex论坛是是获取更多信息和寻求帮助的好地方:
演示
用例图1
源代码:
import sml;
symbol a = mkactor("Programer"); symbol c = mkcase("Design In UML"); symbol c1 = mkcase("Code in asy"); symbol c2 = mkcase("Complie asy");
dock(0.3*AVG,MID,-45,a,c,hdock(c1,c2)).add();
(a--c).draw(); (c--c1).style(dep).ml("include").draw(); (c--c2).style(dep).ml("include").draw(); |
输出结果:说明:实际的输出结果为eps或者pdf格式的矢量图,这里使用ImageMagick的convert命令转换成了jpeg格式。
显示组合设计模式的一个类图
源代码:
import sml;
symbol data = mkclass(mkcname("Record","type")); symbol dh = mkclass(mkcname("DataHandler","interface",true), blank, mkopers("+PushData(fd:Record)")); symbol sdh = mkclass("StoreHandler"); symbol chd = mkclass("CheckingHandler"); symbol comdh = mkclass(mkcname("CompositeHandler"), "-hdset: DataHandler[]", mkopers("+PushData(fd:Record)")); symbol sdh1 = mkclass("DataBaseImp"); symbol sdh2 = mkclass("CsvFileImp");
vdock(1.5*AVG, LEFT, hdock(1.2*AVG,MID,data,dh), hdock(0.3*AVG,space*1cm,sdh,chd,comdh), hdock(0.2AVG,sdh1,sdh2)).add();
(dh--data).style(dep).ml("use").draw(); (dh--pyw(-2cm)--hv--(new symbol[]{sdh,chd,comdh})).style(rea).draw(); (sdh--pyw(-2cm)--hv--(new symbol[]{sdh1,sdh2})).style(gen).draw(); (comdh--pxw(1cm)--vh--dh).style(com).sl("1").dl("*").draw(); |
输出结果
有嵌套结构的包图
源代码:
import sml;
symbol ld = mkpack(hdock(4bp, mkbox("plead"), mkbox("mlead"), mkbox("nlead")),"lead");
symbol ln = mknote("A smart way to specify line between symbols, " "I like this ideal");
symbol paks= mkpack(hdock(4bp,TOE, mkpack(mkpack("actor"), "symbol"), ld, mkpack("utility")), "sml");
vdock(0.5*AVG,RIGHT,ln,paks).add();
(ln--ld).style(dashline).draw(); |
输出结果:
有托球结构的组件图
源代码
import sml;
symbol scheduler = mkcom(":Scheduler"); symbol im = mkiball("MakeReservations",E); symbol planner = mkcom(":Planner"); symbol ip =mkiball("UpdatePlans",N); symbol gui = mkcom(":TripGUI");
vdock(LEFT,hdock(MID,scheduler,im), hdock(MID,space*1.5cm,planner,ip,gui)).add();
(scheduler--im).draw(); (planner--hv--im).style(req_i).draw(); (planner--ip).draw(); (gui--ip).style(req_i).draw();
|
输出结果
阅读(3333) | 评论(5) | 转发(0) |