转载

GMF图形框架设计器简单验证

本文仅总结简单验证GMF的过程。

GMF工程使用术语“toolsmith”来指代那些使用GMF来构建插件的开发者,而“user”通常指那些利用这些插件并同时也是开发者的人。在一个可用的透视图中,GMF以内部方式构建出来的“模型”的数量和种类应该在很大程度上是隐藏的。然而,大多数toolsmith都对台面之下正在发生什么感兴趣(注:好奇心重是天性,呵呵),所以在本文中我们将对每一个模型都给出一个详细的描述。

下图展示了在进行基于GMF应用开发时所需要使用的主要构件和模型。GMF的核心是一个概念模型(concept of a graphical definition model)。该模型包含了那些将会出现在基于GEF的runtime中,且与图形元素相关联的各种信息,而这些信息是与那些提供描述和编辑功能的领域模型(domain model)没有直接关联的。工具定义模型(tooling definition model)是一个可选组件,它可以用来设计palette(注:就是我们用VE时常常会看到的选择组件用的面板)以及其他实用组件(菜单,工具栏,等等)。

GMF图形框架设计器简单验证

我们希望图形化或工具组件的定义可以在面对不同的领域时仍然能正常工作。例如,UML的类图有很多counterpart,而所有这些conterpart的基本外观和结构都是十分相似的。GMF的一个目标就是允许一个图形化定义可以被很多领域复用。通过使用一个独立的映射模型来将图形定义和工具定义连接到所选择的领域模型,GMF漂亮的完成了这一目标。

一旦定义了合适的映射,GMF就会提供一个生成器模型(generator model)来帮助用户确定在生成阶段(generation phase)需要定义的各种实现细节。一个基于生成器模型编辑器插件将会作为这一过程的产生品,并将导致最终的模型[final model]的产生。最终模型也称为图形运行时[diagram runtime](或“符号”)模型。当一个用户工作在一个图形上时,该runtime将会把符号和领域模型桥接起来,并同时提供持久化和序列化功能(注:以上提到的这几种模型都有实物对应,现在先不必细究)。这个runtime的一个很重要的方面是它提供了一个基于服务的方法来使用EMF和GEF,并且能通过non-generated式的应用程序来进行调整。

对于GMF框架进行图形编辑器的初步学习可以参考如下三个地方的文档

1) http://gmfsamples.tuxfamily.org/wiki/doku.php?id=gmf_tutorial1

2) http://www.ibm.com/developerworks/library/os-ecl-gmf/index.html

3) http://wiki.eclipse.org/Graphical_Modeling_Framework/Tutorial/Part_1

对于GMF的安装,可以直接在Eclipse Markets里面进行搜索和自动下载安装,我用的是Eclipse Jee Mars版本,因此搜索到的是GMF的3.0版本,下载完成后即在新建项目里面就能够找到建立GMF Project。

整个过程里面的核心步骤建议描述如下

a. 明确你需要设计的图形编辑器的核心领域模型,这个是基础的基础,对于EMF Model的建立我们仍然推荐是首先建立相应的Java接口文件,然后在新建EMF Model的时候选择到对于的Package进行导入。

b. 在.ecore文件里面可以看到导入的领域模型。

c. 右键点击.ecore文件,运行Initialize ecore_diagram diagram file后可以导入类图图形文件。

d. 选择.genmodel文件,在树浏览跟目录右键Generate Model Code后会生成模型类型文件。

e. 同样的操作我们可以分别生成edit code和editor code相应的类文件。

f. 在GMF Dashboard中点击Tool Def Model旁边的Derive来生成GMF的Tool定义文件

g. 在GMF Dashboard中点击Graph Def Model旁边的Derive来生成GMF的Graph定义文件

h. 点击combine,对上面生成的文件进行集成,同时最终生成Map映射文件

i. 点击Transform操作,生成gmfgen文件

j. 点击Generate diagram editor文件会生成相应的编辑器代码。

具体的详细步骤在前面给出的链接参考里面有详细的说明,在本文不再重复。其中的一些关键点说明如下

对于模型对应的Java接口类设计要注意,如果是类似于MindMap或Class类图这类图形设计器,那么Java接口类是可以不专门定义Connector对象的。但是如果是设计类似流程图这类应用,则建议是对于连接线要单独定义一个接口对象。对于整个图形需要定义一个主接口,但是该接口类在后续的Graph和Tool模型设置中都是不需要显示出来的。

几个核心模型文件再简要说明如下,其中.ecore文件是核心的领域模型文件,即最终的领域模型是存储在这个文件里面的。tool文件定义标准的图形设计器的toolbox内容,而对于Graph模型文件则是定义相信的每个图形样式信息,包括外形,线条,底色等各种信息。而对于Map文件则是将上面三个文件进行映射以形成一个完整的整体。有了这些模型文件的定义,才能给最终生成Diagram项目,最终我们的插件运行项目,即代码自动生成出来的Diagram项目里面。

整个在设计和实现的过程中出现两个重要的问题,具体解决如下:

1)在最后一步 gen editor gen model的时候有报错

具体原因是要更新到GMF的3.3版本,在安装最新软件地方输入

http://download.eclipse.org/modeling/gmp/gmf-tooling/updates/dev-snapshots/3.3/

可以下载到最新的3.3版本安装包。


Problems while generating code

Exception (Boolean expected (was: org.eclipse.ocl.ecore.internal.OCLStandardLibraryImpl$1)!:in CodeStyle, line 18) while generating code

Boolean expected (was: org.eclipse.ocl.ecore.internal.OCLStandardLibraryImpl$1)!:in CodeStyle, line 18

这个问题是eclipse本身的一个bug,解决方法是需要找到.genmodel文件,在属性面板中将compliance level属性从8.0设置为6.0,设置完成后可以成功生成代码。

3) 插件具体的运行

选择在Eclipse里面运行一个插件项目,即新增加一个插件,注意在plugin列表的选择中,按照链接网页的说法只选择了Target Platform中的一部分包的时候无法成功运行,如果使用默认的所有包都选择才能能够最终运行插件项目。

原文  http://blog.sina.com.cn/s/blog_493a84550102w5ur.html
正文到此结束
Loading...