八进制

少年壮志无烟抽

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  244 随笔 :: 0 文章 :: 3241 评论 :: 14 引用

Eclipse Graphical Modeling Framework (GMF)能 够帮助我们快速构造基于EMF和GEF的图形化编辑器,实际上对于不是很复杂的应用来说,开发人员并不需要了解EMF和GEF就可以使用GMF。这篇帖子 通过从零开始生成一个数据库设计器的全过程,演示了在使用GMF创建应用程序时,构造ecore模型、构造.gmfgraph文件、构造.gmftool 文件、构造.gmfmap文件和生成编辑器的这几个步骤。

一、开发环境

由于目前gmf还没有发布正式版,所以这篇帖子使用的是相对稳定的GMF 1.0M4版本,1.0正式版将在2006年7月初发布。gmf对eclipse平台和一些插件的要求比较高,所以你可能要对你的开发环境进行一些升级更新才能感受gmf带来的方便,具体要求是这样的:Eclipse 3.2M4EMF 2.2.0M4GEF 3.2M4UML2 2.0M2;此外还要下载一个名为ANTLR的包,解压后要把antlr.jar文件放在gmf插件目录的antlr/lib下,这个依赖只是暂时的,gmf正式版发布之前会去掉它。

二、构造ecore模型

因为只是为了演示gmf,这里构造的是一个非常简化的数据库设计器。用户通过设计器可以创建表格,为每个表格增加一些列,定义这些列的属性,以及在 表格之间建立外键关系。所以在ecore模型里应该有Database、Table和Column这几个类,此外还有一个FKRelation类代表表格 之间的连接,在Database类下有一个名为fkrelations的引用用来记录一个数据库设计中所有的这些连接。

创建名为com.my.dbdesigner的Empty EMF Project项目,有多种方式可以创建ecore文件,在gmf的example里有一个例子是ecore文件的图形编辑器,如果你安装了这个例子,可 以在项目的根目录下New->Other->Examples->Ecore Diagram创建名为dbdesigner的文件,这将生成dbdesigner.ecore和dbdesigner.ecore_diagram文 件。我在使用它编辑ecore文件时遇到了一些同步的问题,所以后来还是用eclipseUML来编辑的,不过这只是一个方法问题了。总之,我们这个数据 库设计器的ecore模型如图1所示(如果嫌麻烦,可以点这里下载现成的ecore文件)。


图1 数据库设计器的简化ecore模型图

三、构造.gmfgraph文件

主菜单New->Other->Example EMF Model Creation Wizards->GMFGraph Model创建名为dbdesigner.gmfgraph的文件,向导最后一步中Model Object选择为Canvas,然后按Finish按钮。在编辑器里,把Canvas命名为DBDesignerDiagram,这将成为数据库设计器 的画布。在Canvas下New Child创建一个名为Default的Figure Gallery,Figure Gallery的作用是容纳一些可供重用的Figure。在Figure Galley下创建一个名为BasicRectangle的Rectangle节点,在这个例子里大多数图形只用矩形就够了(除了连接线)。现在,在 Canvas下创建一个名为TableNode的Node节点,它代表数据库设计器里的表格,这个节点的Figure属性选择为刚才定义的 BasicRectangle,见图2,也就是指定在将来生成的数据库设计器里,表格显示为矩形。


图2 TableNode节点

可以想象,现在生成的数据库设计器里已经可以在画布上创建矩形的表格了,那么怎样实现在表格里创建列呢?这稍微麻烦一些,因为表格图形并不是全部面 积都用来放置列,而要留出顶部的一行用来显示表格名称,而且这些列也不是像表格在画布上那样随意放置,而是按由上到下的顺序排放的,这就需要在表格图形里 加一个隔间(Compartment),隔间的概念可以在图3中看到,它的作用就是放置子元素,但隔间本身一般不代表模型中的某个元素。


图3 红色虚线部分所示为表格图形里的隔间

创建一个与TableNode同级的名为ColumnCompartment的Compartment,意即用来放置列的隔间,在属性视图里把它的 Figure属性设置为BasicRectangle。再创建一个名为ColumnChild的同级Child节点,它的Figure属性同样为 BasicRectangle,这个ColumnChild就是作为子元素的列,如图4所示。


图4 ColumnChild节点

如前所述,数据库设计器里允许在不同表格之间创建连接线来表示外键关系,为简单起见,我们用连接线的标签定义作为外键的列名。因为现在我们的 Figure Gallery里只有矩形,所以先要给Figure Gallery增加一个Polyline Connection,命名为BasicPolyline。然后在Canvas下创建一个名为FKConnection的Connection,它的 Figure属性选为BasicPolyline,如图5所示。


图5 FKConnection节点

四、构造.gmftool文件

主菜单New->Other->Example EMF Model Creation Wizards->GMFTool Model创建名为dbdesigner.gmftool的文件,向导最后一步中Model Object选择为Tool Registry,然后按Finish按钮。在Tool Registry下创建Palette,在Palette下创建标题为DBDesigner的Tool Group,在这个Tool Group下为Table和Column分别创建一个Creation Tool,它们将成为数据库设计器中用来创建表格和列的那的两个按钮。同样在这个Tool Group下,为连线也创建一个Creation Tool,如图6所示。


图6 ForeignKey节点

五、构造.gmfmap文件

主菜单New->Other->Example EMF Model Creation Wizards->GMFMap Model创建名为dbdesigner.gmfmap的文件,向导最后一步中Model Object选择为Mapping,然后按Finish按钮。从主菜单GMF Editor里选择“Load Resource...”命令,在对话框里按Browse Workspace按钮,选中我们的dbdesigner.ecore、dbdesigner.gmfgraph和dbdesigner.gmftool 这三个文件,见图7,再按OK关闭对话框。


图7 为定义映射载入需要的资源

在编辑器的Mapping节点下创建一个Canvas Mapping,可以看到在属性视图里它的属性被分为三类,分别对应ecore模型、工具和图形这三个方面,对于Canvas Mapping,必须设置Domain Model、Element和Diagram Canvas这三个属性,值分别为EPackage dbdesigner、EClass Database和Canvas DBDesignerDiagram,它们都是下拉选项,所以很容易确定。

刚才的设置相当于告诉了GMF我们要把Database类映射为画布,现在要告诉GMF我们还要把Table类映射为画布上的矩形,所以要创建另一 个Mapping的子节点Node Mapping,它的属性见图8,注意可能要先选择了Element属性值后Edit Feature属性才可选。


图8 为数据库表格定义Node Mapping

还要告诉GMF表格里要能创建列,因此在Node Mapping下创建Compartment Mapping和Child Node Mapping各一个,前者只要将Compartment属性选择为在.gmfgraph里定义的ColumnCompartment即可;后者的属性如 图9所示,注意Compartment Mapping的Child Nodes属性与Child Node Mapping的Compartment属性是双向的,我们只用定义其中一个方向即可,另一个方向会自动填充。


图9 为列定义Child Node Mapping

最后要处理一下连接线,方法是在Mapping下创建一个Link Mapping,它的属性比较多,见图10。


图10 为外键关系定义Link Mapping

六、生成编辑器

该做的准备工作都已就绪,现在到了激动人心的最后一个步骤了。首先是要生成基本的EMF代码,包括核心模型代码和.Edit代码,因为gmf的图形 化编辑器依赖这两个部分,而EMF传统的Editor部分则并不需要。这个步骤在EMF的帖子里已经介绍过了,这里不再重复。接下来打开 dbdesigner.gmfmap文件,在编辑器里点右键,选择“Create generator model...”命令,在对话框里接受缺省的dbdesigner.gmfgen文件名,按OK确定后就会生成一个.gmfgen文件。打开这个文件, 还是在编辑器里点右键,选择“Create diagram code”命令,这样就会生成图形化编辑器的代码,这些代码放在名为com.my.dbdesigner.gmf.editor的项目中。

如果在执行上面步骤中出现了错误,就要检查那些模型文件是否正确,特别是.ecore文件的package中Ns Prefix和Ns URI这两个属性不应为空,如果错误信息为“java.lang.IllegalStateException: Can't find genFeature for feature 'XXX' in class XXX”则很可能是由于更改了.ecore文件后没有更新.genmodel文件。

运行这个生成的插件后,你就可以通过主菜单File->New->Example->DBDesigner Diagram创建数据库设计了,图11是它的工作界面。功能不错,但在我的机器上响应不是很快。点此下载生成后的项目打包


图11 数据库设计器的运行画面

参考:GMF Tutorial

posted on 2006-02-12 15:30 八进制 阅读(7281) 评论(51)  编辑 收藏 网摘 所属分类: EclipseGMF

评论

#1楼 2006-02-13 10:49 steeven      
玩的越来越精通了 ~

  回复  引用  查看    

#2楼 2006-02-13 16:52 faqi[未注册用户]
是楼主翻译的吗,我看过英文的
  回复  引用    

#3楼[楼主] 2006-02-13 17:49 八进制      
内容类似,但不是翻译。
  回复  引用  查看    

图7中的figure属性应为BasicPolyline
  回复  引用    

应该是图5
  回复  引用    

我也用了那个Ecor diagram插件来画类图,为什么所有的方框都是透明的,从你的 图1上看是有边框的
  回复  引用    

#7楼[楼主] 2006-02-15 16:07 八进制      
谢谢指出,已更正。
图1是用eclipseUML画的,因为用example的编辑器时遇到一些同步方面的问题。

  回复  引用  查看    

#8楼[楼主] 2006-02-16 13:42 八进制      
gmf视频demo: http://www.eclipse.org/gmf/tutorial/viewlets/tutorial.html">http://www.eclipse.org/gmf/tutorial/viewlets/tutorial.html
  回复  引用  查看    

上面那个连接我看不了不知道怎么回事。
还有我照你说的一步步做下来,发现显示有问题,没有边框,完全是透明的,所有插件版本就是你在本文开始的时候所提到的,是不是gmf还不稳定。

  回复  引用    

#10楼[楼主] 2006-02-17 08:46 八进制      
那个连接是国外的服务器,也许需要代理。
是哪里没有边框,也许是我漏掉了什么步骤,你可以下载项目打包对比看看。gmf这个版本一般使用还比较稳定,现在他们主要在修改的是gmf的一些ecore模型,所以以后的milestone版本里可能.gmfgraph等等配置文件的格式会有些变化。

  回复  引用  查看    

我将你提供的例子运行后的样子是这样的
http://www.blogjava.net/images/blogjava_net/pandawang/6945/o_test.jpg
我是在windows下做的,好像gmf的windows版本还不稳定

  回复  引用    

我看到GMF好像就提供了几种图形矩形,椭圆等等
如果我的editor使用一个自已的图形,比如棱形框,作为我的模型元素的figure,用GMF怎么实现呢?

  回复  引用    

#13楼 2006-02-23 23:35 RG[未注册用户]
楼主的eclipse sdk 是什么感观 是在win上的么?


  回复  引用    

#14楼[楼主] 2006-02-24 15:44 八进制      
大漠孤烟: 复杂的图形可以用这些图形组合而来,如果是没有提供的基本图形可以用自定义图形。gmf现在还没最后稳定下来,也许会提供菱形,你可以提交一个feature request给他们。
RG: 是linux :-)

  回复  引用  查看    

@八进制
请问如何定义和使用图形呢?

  回复  引用    

#16楼[楼主] 2006-02-25 23:52 八进制      
自定义图形我还没有试过,组合图形在.gmfgraph的figure gallary里定义,例如用例图的小人符号可以用圆形加几条直线定义出来,等等,定义好的figure就可以交给Node了。
  回复  引用  查看    

@pandawang
我也遇到同样的问题,即所有的图形都是透明的,看不到线条.我的操作系统是win2k.不知道是不是GMF的问题.

  回复  引用    

#18楼[楼主] 2006-02-26 21:00 八进制      
在dbdesigner.gmfgraph里把Figure Gallary下各图形的outline属性改为true也许可以解决这个问题,请有windows环境的朋友试试有没有效果。
  回复  引用  查看    

#19楼 2006-02-27 00:18 Jin.phd[未注册用户]
@coolriver
and to pandawang,
GMF is using GEF and Draw2D, then Draw2D is built on swt. After swt 3.1, GDI+ is required for Windows platform. winxp has included it, but win2k not. try to download GDI+ lib and install it!

  回复  引用    

#20楼 2006-02-27 00:27 Jin.phd[未注册用户]
to 大漠孤烟XXX,
now, gmf is very fluctuant for using. You can not define very complex figures when using generator tooling(though you can see many other options in figure gallary). But you can get it by hard coding.

  回复  引用    

@Jin.phd
谢谢,可以了:)我下载了gdiplus.dll后,放到win2k系统参数PATH的某个路径下,再运行,就可以显示图像了。

  回复  引用    

@八进制
谢谢,但我这里不行。不知道其他人这样改有没有效果。

  回复  引用    

@coolriver


问一下,怎样让GMF支持TreeViewer?

  回复  引用    

好像做到Create generator model这一步就会抛出一个错误:
!ENTRY org.eclipse.core.jobs 4 2 2006-03-01 17:24:28.213
!MESSAGE An internal error occurred during: "Create generator model...".
!STACK 0
java.lang.IllegalStateException
at org.eclipse.gmf.bridge.genmodel.GenModelMatcher.<init>(GenModelMatcher.java:47)
.....

环境win2000,eclipse还有gmf,gef,uml2等环境跟文章一样。
ecore文件是根据文章提供的连接下载后,导入进系统的。

还有做到图10的时候,containt Feature ,提示的是 ERference fkrelations.

不知道为什么,请指教。

  回复  引用    

@Jin.phd
谢谢。我还有一个问题现在GMF是否支持多视图(模型)间的互操作?
如果模型比较大,可能会在建模语言中加入多层次的建模机制,每一层次都是一个视图,而不同层次之间是需要互操作,并且能保持一致性的。

  回复  引用    

那个可不可以用GMF的画板用swt控件代替可以吗?
  回复  引用    

就是我想 做一个像ve那样的用GMF 容易实现吗?
  回复  引用    

#28楼[楼主] 2006-03-05 09:03 八进制      
爱好者:java.lang.IllegalStateException看看是否genmodel没有更新,reload一下试试。
王明林:因为draw2d上不能直接放swt控件,所以需要自己画,draw2d里也提供了一部分自己的控件。你可以看看ve的代码是怎么做的。

  回复  引用  查看    

#29楼[楼主] 2006-03-05 09:09 八进制      
GMF 1.0M5版本已经出来了,建议大家都使用最新版本,http://download.eclipse.org/technology/gmf/downloads/drops/S-1.0M5-200603031600/index.php">http://download.eclipse.org/technology/gmf/downloads/drops/S-1.0M5-200603031600/index.php
  回复  引用  查看    

m5在win下的显示正常了
  回复  引用    

#31楼 2006-03-13 12:28 maob[未注册用户]
我在使用GMF时出现以下问题,不知是何缘故?
org.eclipse.emf.ecore.xmi.DanglingHREFException: The object 'org.eclipse.emf.codegen.ecore.genmodel.impl.GenFeatureImpl@72a9b1 (property: Editable, notify: true, children: false, createChild: false, propertyCategory: null, propertyFilterFlags: null, propertyDescription: null)' is not contained in a resource.
at org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl.handleDanglingHREF(XMLHelperImpl.java:645)
at org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl.getHREF(XMLHelperImpl.java:670)
at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveHref(XMLSaveImpl.java:2014)
at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveHRefSingle(XMLSaveImpl.java:2057)
at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveFeatures(XMLSaveImpl.java:1331)
at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveElementID(XMLSaveImpl.java:2360)
at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveElement(XMLSaveImpl.java:971)
at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveElement(XMLSaveImpl.java:857)
at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveContainedSingle(XMLSaveImpl.java:2076)
at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveFeatures(XMLSaveImpl.java:1311)
at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveElementID(XMLSaveImpl.java:2360)
at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveElement(XMLSaveImpl.java:971)
at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveElement(XMLSaveImpl.java:857)
at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveContainedMany(XMLSaveImpl.java:2089)
at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveFeatures(XMLSaveImpl.java:1317)
at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveElementID(XMLSaveImpl.java:2360)
at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.writeTopObject(XMLSaveImpl.java:560)
at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.traverse(XMLSaveImpl.java:494)
at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.save(XMLSaveImpl.java:221)
at org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl.doSave(XMLResourceImpl.java:196)
at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:930)
at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:850)
at org.eclipse.gmf.internal.codegen.popup.actions.TransformToGenModel$1.save(TransformToGenModel.java:161)
at org.eclipse.gmf.internal.codegen.popup.actions.TransformToGenModel$1.run(TransformToGenModel.java:130)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:58)

  回复  引用    

#32楼[楼主] 2006-03-13 22:33 八进制      
"not contained in a resource",可能是ecore文件有问题,或者试试reload一下genmodel文件。这里有一个常见问题列表,看看有没有帮助吧:http://wiki.eclipse.org/index.php/GMF_Troubleshooting_Guide">http://wiki.eclipse.org/index.php/GMF_Troubleshooting_Guide
GMF版本正在快速变化中,想尝鲜的朋友可要有耐心,各种插件的版本一定要配套。

  回复  引用  查看    

#33楼 2006-03-26 11:58 maob[未注册用户]
在使用GMF 1.0.M5版本时,在由.gmfgen生成.diagram时,出现了编译错误,
the type org.eclipse.workspace.AbstractEMPOperation cannot be resloved.It is indirectly referenced from required .class files
不知是何缘故,

  回复  引用    

#34楼[楼主] 2006-03-26 21:26 八进制      
是不是eclipse版本不对?
  回复  引用  查看    

#35楼 2006-03-27 22:40 maob[未注册用户]
能否在gmf重添加自己定义的Figure,比如图片等?
我发现在gmf中Figure类都是gmf自己的包中自定义的,好像生成的代码中没有Figure包

  回复  引用    

#36楼 2006-04-13 21:05 cupea[未注册用户]
我用M5的打不开视图,不知道怎么回事?


!ENTRY org.eclipse.jface 4 2 2005-04-14 19:56:46.562
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.jface".
!STACK 0
java.lang.NoSuchFieldError: objects
at org.eclipse.gmf.runtime.emf.core.internal.resources.GMFHandler.validateCreateObjectFromFactory(GMFHandler.java:116)
at org.eclipse.emf.ecore.xmi.impl.XMLHandler.createObjectFromFeatureType(XMLHandler.java:1882)
at org.eclipse.emf.ecore.xmi.impl.XMLHandler.createObject(XMLHandler.java:1754)
at org.eclipse.emf.ecore.xmi.impl.XMLHandler.handleFeature(XMLHandler.java:1566)
at org.eclipse.emf.ecore.xmi.impl.XMLHandler.processElement(XMLHandler.java:868)
at org.eclipse.emf.ecore.xmi.impl.XMIHandler.processElement(XMIHandler.java:80)
at org.eclipse.emf.ecore.xmi.impl.XMLHandler.startElement(XMLHandler.java:846)
at org.eclipse.emf.ecore.xmi.impl.SAXWrapper.startElement(SAXWrapper.java:90)

  回复  引用    

#37楼 2006-05-17 14:22 steeven      
dtp里面有model.sql,现成的ecore,定义的很全面。

but, GMF生成不出来 :( 不支持多层package, 去掉package好像还有问题。。。郁闷中。

  回复  引用  查看    

#38楼 2006-05-28 07:34 fatbird[未注册用户]
请问eclipse的版本重要吗? 我用的是3.2.0 RC6, 但是新生成的eclipse就是不能运行wizard. 你的eclipse是什么版本?
  回复  引用    

#39楼[楼主] 2006-06-05 17:06 八进制      
对,gmf对eclipse、emf和gef的版本比较敏感,最好按照下载页面的要求配置。
  回复  引用  查看    

老兄玩得真好,后悔今天才来到您的博客。
请教一个问题,如何在Package View和Navigator里列出的工程上,执行单击或者双击,就能获得选择的工程或其下文件的实际路径?
谢谢,谢谢。

  回复  引用    

抱歉,我没说清楚,其实我打算做个插件练练手,但在上面所说的情形遇到了麻烦,请您帮帮忙。谢谢。
  回复  引用    

#42楼[楼主] 2006-06-09 17:29 八进制      
有一个名叫easy struts的插件,它带了一个easy explorer,它的功能和你说的差不多,你可以参考它的代码。http://easystruts.sourceforge.net/">http://easystruts.sourceforge.net/
  回复  引用  查看    

谢谢老兄,这就去试验......
  回复  引用    

#44楼 2006-08-28 22:32 qiulu[未注册用户]
请问有什么途径可以使创建的模型的属性不能被用户修改(最好能够根据用户的权限有选择的修改)??
  回复  引用    

#45楼 2006-09-15 14:55 juliet[未注册用户]
@cupea
我这边也出现了java.lang.NoSuchFieldError: objects 这个问题。
不知道怎么解决的啊?

  回复  引用    

你好,我想请教一个问题:

想以Shape的例子来学习整个GMF过程包含基础建模部份(ecore)
但网上怎么搜都搜不到Shape原来的ecore
我是不是可以逆向工程将原来的Shape代码生成类别图
再使用GMF导入这个类别图来实现这个例子呢?
这样做结果可以和Shape一样吗?

  回复  引用    

#47楼 2009-01-14 16:41 chuju[未注册用户]
八进制大师,你好.我是gmf新手.在跟着你写的例子做的时候有一些问题.在建.gmfgraph的时候我在figure gallary 里面建立好了regtangle 和 connection.但我在建table node 的时候点开他的figure属性的下拉列表是空的(也就是我不能给它添加figure这个属性).我不知道这是为什么.请帮忙,谢谢.
  回复  引用    

八进制,你好.在生成.gmfgraph和.gmftool的时候wizard中都会让选择一个diagram elment. 什么样的元素应该被选择为"Diagram Element"呢?
  回复  引用    

#49楼[楼主] 2009-01-18 23:34 八进制      
选择为diagram element的对象在生成gmf程序后对应一个矩形,在palette里对应一个工具项。
  回复  引用  查看    

#50楼[楼主] 2009-01-18 23:37 八进制      
@chuju
gmf2.0里要在figure gallary下面建立figure descriptor,每个figure descriptor里再建rectangle, ellipse等图形,你说的那个figure属性下拉框列出的就是所有figure descriptor。

  回复  引用  查看    

#51楼 2009-03-04 08:36 HI[未注册用户]
八进制先生:
我照着你讲的做下去,可是在我的EMF环境中,(.gmfgraph)编辑器的canvas>new Child下没有Child类型的项。(.gmfmap)编辑器的Mapping>也没有Node Mapping项.
清问下这是什么原因,是安装插件有什么问题吗?(我安装的GMF是1.0.0正式版,ocl,validation.query,transaction四个依赖插件我都装上了呀)

  回复  引用    

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 329266


相关文章:

相关链接: