八进制

少年壮志无烟抽

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  231 随笔 :: 0 文章 :: 2955 评论 :: 11 Trackbacks

1、问题:连接线旁边没有文字标签和箭头

文字标签:在gmfmap里的Connection Mappping下增加Label Mapping元素;箭头:在gmfgraph里为Polyline Connection指定一个Polyline Decorator作为source/target decoration,要为这个Decorator创建一些Template Point来决定箭头的形状,例如指定(-1,-1), (0,0), (-1,1)。

2、让一个图形可以在另一个图形里随意改变位置

在gmfgen里把作为容器的那个图形的Gen Compartment里把Listlayout属性改为false。

3、隐藏图形标签文字前的小图标

在gmfgen里把相应的Gen Node Label元素的Element Icon属性改为false(但重新生成gmfgen时这个属性会被覆盖)

4、让标签里同时显示和编辑多个属性

在gmfmap里把相应的Label Mapping元素的View Pattern属性改为类似“属性1:{0},属性2:{1}”的形式。

5、问题:跨Compartment进行连线操作时会创建两条连线

GMF的bug,见https://bugs.eclipse.org/bugs/show_bug.cgi?id=148021,在你的XXXDiagramCanonicalEditPolicy里覆盖方法:

protected boolean shouldHandleNotificationEvent(Notification event) {
    
return false;

6、让Label出现在图元外面

在gmfgraph里定义这个Figure时把Label定义在外面,而非定义为Figure的子元素。

7、在gmfgraph里设置一个Figure使用GridLayout后生成的代码无法正确编译

GMF的bug,见https://bugs.eclipse.org/bugs/show_bug.cgi?id=133279

8、改变Figure的缺省大小

在gmfgraph里为Figure增加Preferred Size子元素;若想让图形尺寸小于40x40象素,要覆盖XXXEditPart里的createNodePlate()方法。在GMF2.0里,使用DefaultSizeFacet,见http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg01546.html

9、禁止用户修改图元的尺寸

在gmfgraph里将此Node的Resize Constraint属性值改为“NONE”(但size-on-drop功能仍存在,也就是用户仍然可以在创建时指定尺寸)。

10、让Compartment在容纳不下子图形时自动显示滚动箭头

在genmodel的GenDiagram元素里改Units属性为“himetric”(经测试对GMF1.0不起作用),见https://bugs.eclipse.org/bugs/show_bug.cgi?id=140789

11、为画布Canvas指定Layout

GMF1.0不支持,需要手工改代码,见https://bugs.eclipse.org/bugs/show_bug.cgi?id=139951

12、Border Item

Border Item是指只能紧贴其他图元运动的图形,GMF1.0可通过打patch实现这个功能,见https://bugs.eclipse.org/bugs/show_bug.cgi?id=124826;GMF2.0开始支持。

13、规定连接线的约束,例如规定source和target不能是同一对象

在gmfmap里定义,在Link Mapping元素下定义Link Constraint元素,缺省使用OCL,见教程http://wiki.eclipse.org/index.php/GMF_Tutorial_Part_2#Link_Constraints;不论使用OCL或是Java,在XXXBaseItemSemanticEditPolicy里会生成LinkConstraint类,在生成command前检查是否满足这些constraint。

14、Audit

定义的constraint出现在com.your.diagram项目的plugin.xml里,作为constraintProvider扩展;为了让这些constraint生效,要在gmfgen的Gen Diagram元素里设定Validate Enabled/Decorator属性值为true,并将优先级(Validation Provider Priority, Validation Decorator Provider Priority)设定为medium(非lowest)才会在Diagram菜单里出现Validate命令。

若是在gmfmap里选择使用Java验证,则在gmfmap里指定的是一个Java方法名,生成代码后,应在XXXValidationProvider类里应实现这个方法。

15、GMF里从EditPart得到Semantic Model

因为GMF里EditPart#getModel()方法得到的是Notation Model里的对象,如Node或Edge,所以可以使用这样的方法得到真正的业务对象:((org.eclipse.gmf.runtime.notation.View) EditPart.getModel()).getElement()或ViewUtil.resolveSemanticElement(view)

16、问题:从gmfgen生成代码时产生java.lang.ClassCastException: org.eclipse.jdt.internal.core.jdom.DOMMethod

删除原先生成的代码中无法编译的类,重新生成。

17、在gmfgraph里定义Polyline的图形

在Rectangle上画Polyline,注意是固定大小的

18、问题:每次重新生成代码后,在plugin.xml里的修改会丢失

GMF1.0里生成代码时不能保留plugin.xml里的任何修改,从GMF2.0开始用户可以在plugin.xml里标记不要覆盖的区域

19、问题:Outline树视图里的节点没有图标

在plugin.xml里找到org.eclipse.gmf.runtime.emf.type.core.elementTypes扩展点,在下面相应的元素里指定icon属性,见http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg00341.html,但我在GMF1.0里测试不起作用,何况每次生成代码时这个文件都会被覆盖。

20、问题:提示java.lang.IllegalStateException: Cannot modify resource set without a write transaction异常

在GMF里修改Model要通过在TransactionalEditingDomain里执行命令完成,GMF提供的RecordingCommand是不错的选择,它为我们提供了Undo支持,我们只要实现执行部分的代码就可以了,下面是一个例子:

TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(myElement);
domain.getCommandStack().execute(
new RecordingCommand(domain) {
    @Override
    
protected void doExecute() {
        //Do anything
    }
});

若是在EditPolicy里需要返回一个Command,用下面的代码:

AbstractTransactionalCommand command = new AbstractTransactionalCommand(TransactionUtil
        .getEditingDomain(myElement), 
"Command Name", Collections.EMPTY_LIST) {
    @Override
    
protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info)
            
throws ExecutionException {
        
//Any modification to the model
        return CommandResult.newOKCommandResult();
    }

}
;

21、问题:创建图元时提示异常“java.lang.IllegalArgumentException: Figure must be a child”

Workaround:注释掉产生异常的setRatio()方法里的全部内容。

22、问题:在AbstractBorderItemEditPart子类的getPrimaryDragEditPolicy()方法里提示ClassCastException异常

在gmfgraph里检查作为BorderItem的那个Node的Resize Constraint属性是否改过,若为缺省的NSEW则对应的editpart不会生成这个方法,对BorderItem(即Affixed Node Side属性不为NONE的Node)来说这个属性虽然设置为NSEW也无法改变大小。相关链接:https://bugs.eclipse.org/bugs/show_bug.cgi?id=155698

23、如何禁用PopupBar和ConnectionHandler功能(鼠标停止在图形上时出现的连线符号)

在需要禁用该功能的EditPart的createDefaultEditPolicies()方法的最后加下面的语句:

//禁用PopupBar
removeEditPolicy(EditPolicyRoles.POPUPBAR_ROLE);
//禁用ConnectionHandler
removeEditPolicy(EditPolicyRoles.CONNECTION_HANDLES_ROLE);

24、使用ConnectionHandler连接到canvas上已存在的图形或创建新的图形

覆盖XXXModelingAssistantProvider里的几个get方法,要连接到已存在的图形覆盖getRelTypesOnSourceAndTarget()方法,创建新的作为源的图形覆盖getRelTypesOnSource()和getTypesForTarget()方法,创建新的作为目标的图形应覆盖getRelTypesOnTarget()和getTypesForSource()方法。具体代码可参考LogicModelingAssistantProvider里的实现。

25、给画布加背景图

http://www.cnblogs.com/bjzhanghao/archive/2007/03/13/673273.html

BTW, 以上所有问题只针对GMF1.0,GMF2.0的gmfmap模型和gmfgen模型与前一版本有所不同,一些问题可能也在GMF2.0里不存在了。

26、使用Label作为一个editpart的figure

在.gmfgraph里不用创建Node,只用Diagram Label即可;在.gmfmap里,Node Mapping的Diagram Node属性指定为这个Diagram Label,下面的Feature Label Mapping的Diagram Label属性也是这个Diagram Label。在parent使用ListLayout的时候这个方法比较有用。GMF的mindmap例子里的ThreadItem就是这样一个例子。

27、若类A包含B和C,且C继承B,则试图让A的图形同时包含B和C会造成运行时异常,异常信息是无法创建C的View,可能是GMF目前版本的bug。解决办法是建立抽象类D,让B和C都继承D,并且让A包含D。(update 2007/7/23: 有一点像这个bug,异常信息差不多)

28、用渐变色填充非矩形图形

覆盖图形的fillShape()方法,利用swt的Path,但draw2d的graphics对它的支持似乎不好。http://dev.eclipse.org/newslists/news.eclipse.tools.gef/msg13928.html

29、(这条实际是关于EMF的,anyway)为TableViewer增加Drag and Drop支持

非常简单,见下面的代码(tv是TreeViewer的一个实例)

int dndOperations = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
Transfer[] transfers 
= new Transfer[] { LocalTransfer.getInstance() };
tv.addDragSupport(dndOperations, transfers, 
new ViewerDragAdapter(tv));
tv.addDropSupport(dndOperations, transfers, 
new EditingDomainViewerDropAdapter(editingDomain, tv));

30、从EObject得到TransactionalEditingDomain

TransactionalEditingDomain editingDomain = TransactionUtil.getEditingDomain(eobject);

31、让Label换行

.gmfgraph里无法指定Label是否换行,要修改生成的代码:

fFigureXXXFigure = new WrapLabel();
fFigureXXXFigure.setTextWrap(
true);//add this line
fFigureXXXFigure.setText("<>");

另外可以在.gmfgraph里指定需要的布局以便让换行Label更好的显示。给Label设置Margin Border会有问题(Label被推向右侧),可以给Parent图形设置Margin Border,或建一个RectangleFigure来实现设置文字边距的需求。

32、定制Project Exploerer里显示的内容

修改.gmfgen里Gen Navigator节点下面的元素,见http://wiki.eclipse.org/index.php/GMF_Tutorial_Part_4#Project_Navigator

33、可缩放的多边形

在.gmfgraph里定义为Scalable Polygon,和普通Polygon一样要定义template points,每个点的坐标绝对值不是关键,但它们之间的位置关系要保证。我发现绝对值定义得大一些时,得到的结果会更精确。下面是一个可缩放菱形的定义:

<descriptors name="ConditionFigure">
  
  
<actualFigure xsi:type="gmfgraph:ScalablePolygon" name="MyDiamondFigure">
    
<template x="200" y="0"/>
    
<template x="0" y="200"/>
    
<template x="200" y="400"/>
    
<template x="400" y="200"/>
    
<template x="200" y="0"/>
  
</actualFigure>
</descriptors>

34、生成的RCP应用里,保存操作后经常提示“the file has been modifying on the file system...”信息。

GMF太“聪明”了,每次save后都要记录文件修改的timestamp,一旦发现不符则认为有其他程序修改了这个文件。要让RCP应用不检查当前编辑的文件是否被其他程序修改,可覆盖XXXDocumentProvider的isSynchronized()方法,让它直接“return super.isSynchronized(element);”。(但要小心,这有可能造成用户的修改无法被保存的情况。)

35、生成的GMF应用程序里,打印功能是禁用状态。

打开.gmfgen文件,修改Gen Plugin的"Printing Enabled"属性为true,再重新生成代码。这样除了 Print变为可用外,GMF还会生成一个XXXContributionItemProvider类在主菜单上添加Print Preview选项。 http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg02207.html

36、(实际是Eclipse OCL问题)脱离Eclipse环境使用OCL时,报异常java.lang.NoClassDefFoundError: lpg/lpgjavaruntime/RuleAction

Eclipse OCL依赖lpg库(LALR parser generator,使用EPL协议),在RCP里使用OCL需要把net.sourceforge.lpg.lpgjavaruntime这个插件加在dependencies列表里。参考链接

37、(还是OCL问题)Eclipse OCL实现里,OCL语句里各集合类型与ecore里集合类型的映射:

Collection Type isUnique isOrdered
Bag N N
Sequence N Y
Set Y N
OrderedSet Y Y

所以,如果一个EList在ecore里定义为Unique且Ordered(即缺省定义)时,在OCL里应该用OrderedSet类型,例如:XXX->allInstances()->asOrderedSet()或OrderedSet{object1, object2},等等。

38、在画布上创建一个元素(包括连接)后根据当前模型状态自动设置某属性值:

(GMF允许通过多种语言如ocl、regexp和java来实现初始值的设置,这里以java为例)在xxx.gmfmap文件里,找到这个元素对应的Mapping节点(如Node Mapping或Link Mapping),点右键新建一个Feature Seq Initializer元素,在这个元素上点右键再新建一个Feature Value Spec元素,设置后者的Feature为想要设置的类型,语言选java,在Body属性里输入一个方法名,例如“initialMyFeature”。重新生成.gmfgen和代码,GMF会在名为ElementInitializers.java的文件里生成initialMyFeature()这个空壳方法,实现它即可。

39、新建向导结束后,生成一个非空的模型文件。(Customize新创建的模型文件)

修改XXXDiagramEditorUtil#createInitialModel()方法。

40、在partition diagram里,从shortcut到一个正常节点间的连线在关闭editor后再次打开时丢失(2008.1.4)

原因不明,暂时的解决方法是注释掉XXXCanonicalEditPolicy#refreshConnections()方法里的deleteViews(existingLinks.iterator()),其中XXX代表link元素的父元素,例如Diagram。(这个解决方法有严重问题,会造成Initialize Diagram时丢失全部连接)。新探索出来的解决方法如下,覆盖XXXCanonicalEditPolicy#sholdDeleteView()方法:

/**
* @generated NOT
*/

protected boolean shouldDeleteView(View view) {
    
if(view instanceof Edge){
        Edge edge 
= (Edge)view;
        View sourceView 
= edge.getSource();
        View targetView 
= edge.getTarget();
        
if(sourceView.getEAnnotation("Shortcut")!=null 
                
|| targetView.getEAnnotation("Shortcut")!=null){
            
return false;
        }

    }

    
return true;
}

41、删除右键菜单里不需要的菜单项

在plugin.xml里声明contributionItemProviders扩展点,在popupContribution下指定如下元素:

<popupPredefinedItem id="autoSizeAction"remove="true"/>

一些GMF Runtime定义的ID:deleteFromModelAction, navigateGroup, fileMenu, toolbarArrangeAllAction, addGeoShapesGroup, addGeoShapes2Group

详见org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds

42、在单独的编辑窗口里编辑子图(Diagram Partitioning)

http://wiki.eclipse.org/Diagram_Partitioning

43、在单独的项目(非GMF生成的xxx.diagram项目)里扩展DiagramEditor能识别的adapter类型:

在单独项目的Activator的start()方法里用类似下面的代码,这样就不需要直接修改生成的XXXDiagramEditor#getAdapter()方法了(因为我们希望把定制的内容尽量放在生成的项目以外):

//Register adapters for ERM reports and charts
Platform.getAdapterManager().registerAdapters(new IAdapterFactory() {

    
/**
     * 
@see org.eclipse.core.runtime.IAdapterFactory
     
*/

    
public Object getAdapter(Object adaptableObject, Class adapterType) {
        ErmDiagramEditor editor 
= (ErmDiagramEditor) adaptableObject;
        Process process 
= (Process) editor.getDiagram().getElement();
        
if (adapterType == IRiskImportancePage.class{
            
return new RiskImportancePage(process);
        }
 else if (adapterType == IRiskDrillDownPage.class{
            
return new RiskDrillDownPage(process);
        }


        
return null;
    }


    
/**
     * 
@see org.eclipse.core.runtime.IAdapterFactory
     
*/

    
public Class[] getAdapterList() {
        
return new Class[] { IRiskImportancePage.class, IRiskDrillDownPage.class };
    }


}
, ErmDiagramEditor.class);


(更多内容见GMF分类

posted on 2006-10-26 23:46 八进制 阅读(4798) 评论(65)  编辑 收藏 所属分类: EclipseGMF

评论

还是您强!您伟大:)
“2、让一个图形可以在另一个图形里随意改变位置

在gmfgen里把作为容器的那个图形的Gen Compartment里把Listlayout属性改为false。”这个问题我看了一天文档都不知道怎么回事:(

在您这儿都已经给我们指点迷津了:)

谢谢啊


  回复  引用    

#2楼 [楼主] 2006-11-07 13:36 八进制      
因为我也是走弯路过来的,所以希望大家有新的常见问题也可以提交在这里方便刚接触GMF的朋友们。
  回复  引用  查看    

请问,哪儿有gmfgraph文件编辑的指南?或者说相关的介绍?

谢谢:)
  回复  引用    

#4楼 [楼主] 2006-11-28 20:39 八进制      
GMF wiki上有一些:
http://wiki.eclipse.org/index.php/GMF_Tutorial_Part_2
安装GMF后Eclipse帮助里还有些内容。

  回复  引用  查看    

#5楼 [楼主] 2006-11-28 20:54 八进制      
GMF New and Noteworthy:
http://wiki.eclipse.org/index.php/GMF_New_and_Noteworthy

  回复  引用  查看    

Thanks :)
  回复  引用    

#7楼  2006-12-04 21:50 707 [未注册用户]
请问:compartment默认为分为上下部分,怎么分为左右部分呢,即用一条竖线将figure隔开
  回复  引用    

在GMF中,如何才能用代码添加一个节点呢?

例如,A、B为两类节点,我想实现在添加A节点的同时再A下方自动添加B节点

我应该从哪儿下手?

请指点:)


谢谢!
  回复  引用    

#9楼 [楼主] 2006-12-05 14:15 八进制      
to 707: 见http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg00388.html
to 凝血神抓: 我想你可以在AEditHelper里覆盖getConfigurationCommand()方法,实现方法参考GMF Logic例子的CircuitEditHelper等。
  回复  引用  查看    

Thanks:)
  回复  引用    

#11楼  2006-12-10 23:18 qiulu [未注册用户]
请问在Audit中定义constraint,使用OCL语句或者Java语句能不能帮我找点例子??Please~~

  回复  引用    

#12楼 [楼主] 2006-12-12 13:44 八进制      
gmf的新闻组里有一些,emft新闻组里应该也有。另外,用java不需要例子吧。
  回复  引用  查看    

#13楼  2007-01-19 12:42 keke [未注册用户]
请问,我想做双击figure后出来一个diagram,上显示其属性,但属性修改后如何能保持同步啊..
  回复  引用    

您好

能不能请您介绍一下The Eclipse Tabbed Properties View?

最近要做这个方面的,可是只能找到"http://www.eclipse.org/articles/Article-Tabbed-Properties/tabbed_properties_view.html"这一篇文档, 希望您能提供更多的介绍和帮助

谢谢!
  回复  引用    

#15楼  2007-01-31 09:54 areslp [未注册用户]
您好,关于第15点
15、GMF里从EditPart得到Semantic Model
我想在运行时动态改变图形的属性,我在launch里写的,图形对应editpart已经取到,但是再获取真正对象的时候出错,最后跑到private void runEventLoop(Window.IExceptionHandler handler, Display display) 里死循环了,能指点一下吗,谢谢!
launch代码如下:
public void launch(ISelection selection, String mode) {
// TODO 自动生成方法存根
try {
IWorkbenchPage page = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getActivePage();
IEditorPart ieditorpart = page.getActiveEditor();

MindmapDiagramEditor editor = (MindmapDiagramEditor) ieditorpart;
editor.setFocus();
Object o = editor.getAdapter(GraphicalViewer.class);
GraphicalViewer view = (GraphicalViewer) o;
List editparts = view.getContents().getChildren();
Iterator it = editparts.iterator();
while (it.hasNext()) {
EditPart editpart = (EditPart) it.next();
if (editpart instanceof StateNodeEditPart) {
StateNodeEditPart realeditpart = (StateNodeEditPart) editpart;
Object temp = realeditpart.getModel();
EObject r = ViewUtil.resolveSemanticElement((View) temp);
}
if (editpart instanceof TopicEditPart) {
TopicEditPart realeditpart = (TopicEditPart) editpart;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
  回复  引用    

#16楼 [楼主] 2007-01-31 22:04 八进制      
sorry,不清楚是什么原因,lunch()方法是在哪里用的?从GraphicalViewer里取editpart试试用GraphicalViewer#getEditPartRegistry()呢?
  回复  引用  查看    

#17楼  2007-02-06 23:15 lulu [未注册用户]
看了你的文章后收获很大。
试着做了几个例子,现在我想显示一个Table,其他的图形还可以拖入单元格,遇到了很大的困难,
能给点建议,感激不尽。
  回复  引用    

#18楼 [楼主] 2007-02-08 14:17 八进制      
你可以参考这篇http://www.cnblogs.com/bjzhanghao/archive/2005/05/20/159423.html
  回复  引用  查看    

#19楼  2007-03-23 17:24 apm120 [未注册用户]
.ecore 和 .ecore_diagram 两个文件中,当我编辑.ecore 文件并保存时DocumentProvider.setDocumentContent() 这个方法对保存文件起了作用..
但是当我编辑.ecore_diagram文件时,却不知道gmf在哪个类中对文件进行了保存..? 是在哪个policy类中吗? 急待你的回答.
thanks .
  回复  引用    

请问如何使用GEF开发GUI BUILDER呢?有没有这方面的相关例子呢?谢谢!
  回复  引用    

#21楼  2007-03-26 17:10 黄伟 [未注册用户]
我的环境是Eclipse3.2.1,emf2.2.1.gef3.2.1,jdk1.4.2,gmf1.0.1,怎么没有新建map model的向导,只有gmftool和gmfgraph向导,而且在other下
  回复  引用    

#22楼  2007-03-27 16:27 apm120 [未注册用户]
@黄伟
你的问题我也遇到过,环境配置的不对吧。
配置环境里你安装了EMFT工具了没?

  回复  引用    

#23楼  2007-04-18 17:51 顾勇 [未注册用户]
急:请问eclipse中的“错误日志”视图和“问题”视图的ID是多少??
谢谢。不胜感激。
  回复  引用    

#24楼  2007-08-27 16:27 amber [未注册用户]
@apm120

我的gmftool和gmfgraph也在other下,你说要往配置环境里装emft,这是个什么工具呀

  回复  引用    

#25楼  2007-08-31 10:33 z [未注册用户]
31、让Label换行

.gmfgraph里无法指定Label是否换行,要修改生成的代码:


fFigureXXXFigure = new WrapLabel();
fFigureXXXFigure.setTextWrap(true);//add this line
fFigureXXXFigure.setText("<>");

我现在在一个node里建了两个Feature Label Mapping,想让第二个换行,使用这个吗?我加到了我的nodeEditpart.java中,但是不管用。
  回复  引用    

#26楼  2007-09-06 17:15 刘东亮 [未注册用户]
如何让标签出现在图形的外边能不能说的具体点 怎么试验都不行 是不是你的方法太陈旧了
  回复  引用    

#27楼  2007-09-06 17:29 刘东亮 [未注册用户]
楼主那个让label出现在图形外边的方法是不是您老人家做梦的时候想出来的呢 不好使 失败
  回复  引用    

#28楼  2007-09-07 13:59 我贼傻 [未注册用户]
期待楼主回答上边的问题 怎么让label出现在图形的外边
  回复  引用    

#29楼  2007-09-20 16:11 z [未注册用户]
hi,如何能让node里的多个label不居中,而都靠在图形的左边?Thanks
  回复  引用    

#30楼 [楼主] 2007-09-20 18:10 八进制      
在代码里改nodefigure的layout
  回复  引用  查看    

#31楼  2007-09-21 11:07 z [未注册用户]
thanks,但是,有了Flow layout之后,node本身的属性和我加的Compartment的属性就在一个矩形中了,如何能像没有layout一样,使eclipse3.3中的node有一条线把本身的属性和compartment的属性分开?
  回复  引用    

#32楼  2007-09-30 16:34 z [未注册用户]
怎么能让一个node上的多个label前面的图片不同?
谢谢
  回复  引用    

#33楼 [楼主] 2007-10-03 15:05 八进制      
每个label应该对应一个editpart吧,修改editpart的代码可以改变label的图标显示。
  回复  引用  查看    

#34楼  2007-10-08 13:14 z [未注册用户]
非常感谢你的建议,但是这个问题可能需要对生成的代码有很大的改动,我目前的状况不宜这么做。同时还有一个比较重要的问题想请教你,如何能让在运行这个程序的初始,就能有一个在右侧tool中的图形已经画在画布中。
  回复  引用    

#35楼  2007-12-09 18:15 willoo [未注册用户]
请问,GMF里的每一个图元是不是具有唯一编号id?在编辑器保存之后的XML文件中,对应于每一个图元,都有id编号,这个编号在程序中如何获取?
  回复  引用    

#36楼 [楼主] 2007-12-09 23:22 八进制      
如果.ecore文件里指定了使用id(让EClass包含的id属性为true的EAttribute),则xml文件里使用id标识引用,否则使用顺序标识例如“//@schools.3 //@teachers.4”
  回复  引用  查看    

#37楼  2007-12-10 23:31 willoo [未注册用户]
thanks. 现在我想在GMF之上扩展一些我自己的功能,我如何能够通过图元editpart获取它的id号码呢?(在建模的时候,model包中的类没有提供getID,setID等方法)
  回复  引用    

#38楼 [楼主] 2007-12-12 17:10 八进制      
建模的时候要自己建立id属性,并且设置为ID=true(id属性的ID属性),这样就有getId()和setId()了。
  回复  引用  查看    

#39楼  2007-12-27 03:13 veles [未注册用户]
请问一下楼主,刚刚我用 在gmfgen里把作为容器的那个图形的Gen Compartment里把Listlayout属性改为false。 这个方法修改为什么不管用呢?还是只能在开始的位置。
还有一个问题想请教,如何在一个node中添加两个compartment呢?在添加一个的时候我用的是FlowLayout.
  回复  引用    

#40楼  2007-12-27 03:16 veles [未注册用户]
还有个问题,我在compartment中添加图形后图形的大小都是固定的,怎么可以让用户修改大小呢?恳请楼主解答。
  回复  引用    

#41楼 [楼主] 2007-12-27 09:39 八进制      
Listlayout修改为false后重新生成代码了吗?另外也可能是设置layout的问题。
  回复  引用  查看    

#42楼  2007-12-27 17:59 veles [未注册用户]
楼主当时怎么设置的layout啊?用的是那种layout?
另外如果我想在一个矩形node里面有两个compartment应该用哪种layout呢?我看了你推荐的http://dev.eclipse.org/newslists/news.eclipse.modeling.gmf/msg00388.html 但是用这里的方法生成diagram之后连compatment都加不上去了。恳请解答一下。
  回复  引用    

#43楼 [楼主] 2007-12-28 12:56 八进制      
我觉得应该用flowlayout,看一下gmf的graphical ecore editor例子会有帮助,那里的EClass都是有多个compartment的。
  回复  引用  查看    

#44楼  2008-01-29 09:50 zhanglei.pku      
请问一个Compartment Layout的问题:
我希望给compartment设定一个特定的layout.
但是我试了很多的改法都没成功。

具体地,
在gmfgen中选择了Listlayout修改为false后,
得到了
public class xxxCompartmentEditPart extends DefaultCompartmentEditPart{
...
public IFigure createFigure() {
ResizableCompartmentFigure result = (ResizableCompartmentFigure) super.createFigure();
result.setTitleVisibility(false);
result.setLayoutManager(new FlowLayout()); // 指定Flowlayout
return result;
}

在这里创建了一个可变大小的compartmentfigure,
我指定其Layout为flowlayout或者toolbarlayout,但是都没有效果
compartment内的元素仍可任意移动。

之后,我觉得可能改错地方了。尝试如下
ToolbarLayout myTL = new ToolbarLayout();
( (FreeformViewport) ( (AnimatableScrollPane) result.getChildren().get(1) ).getChildren().get(0)).setLayoutManager(myTL);
//result.getChildren().get(1) ==> AnimatableScrollPane

还是不行。

btw: 在 newslist上面我看到你的thread
"But it seems that when I add any layout(for example FlowLayout) to comp1/comp2, I couldn't add any child into it in generated application. "
这个问题我也遇到了,想问问怎么解决的。

希望八进制博主可以指点一下。

Thansk in advance.

zhanglei
  回复  引用  查看    

#45楼  2008-03-19 11:35 HB [未注册用户]
博主,问一个问题:
你在40上写的那个问题.
View sourceView = edge.getSource();
View targetView = edge.getSource();
第二个错了吧,getTarget()?
我现在碰到的问题应该跟这个有点像.
子图创建完毕后,再次打开时有时候会出现(是有时候,不是一直)子图里面的结点上的连接消失,结点位置变化.
用你这个方法好像还是不能解决问题.
请赐教
  回复  引用    

#46楼 [楼主] 2008-03-30 17:14 八进制      
to zhanglei.pku: 抱歉我对compartment也很没办法。
to HB: 对,确实写错了,谢谢你帮我发现了一个潜在bug :-)
你的问题要能够重现才好找到解决办法。
我报告的问题链接但一直没有解决:https://bugs.eclipse.org/bugs/show_bug.cgi?id=214569
  回复  引用  查看    

当我在执行“create generator model...”操作时,提示这个错误:“Top level node 'Containment Feature' must be available in the diagram
'Domain Element' or its super-class”,请问该如何解决?.gmfmap文件的Validate检查是没有错误的。
  回复  引用    

#48楼 [楼主] 2008-04-16 22:00 八进制      
可能需要重新生成一遍.gmfgen文件。
  回复  引用  查看    

谢谢回复,不过“create generator model...”操作不就是重新生成.gmfgen文件的吗?我在.gmfmap文件中创建了5个Top Node Reference节点,在做“create generator model...”操作finish的时候被提示有4个上面的错误,如果只保留其中一个特定的节点,“create generator model...”操作是没有问题的,所以我怀疑是我的.ecore文件内容有误。不知道是否方便帮忙给看一下。或告之在实现多个Top Node时应该在.ecore中注意什么。
  回复  引用    

上个问题请无视,是我搞错了关系,另外4个节点不应该跟第一个节点是同一级别而同为Top Node,所以报错了...另外还想问个问题:怎么定义一个link才能使它连接任意不同类型的节点?或者连接两个特定不同类型的节点?
  回复  引用    

还有一个问题是:怎么才能让Palette上的节点变灰且不可用?好像gmftool文件里没有相关的设置,希望八进制博主可以指点一下。

  回复  引用    

#52楼 [楼主] 2008-04-19 16:59 八进制      
让需要连接的节点都继承自同一个类即可。
不知道toolentry是否能变灰,因为我没看到这个类里有相关方法。
  回复  引用  查看    

多谢指点!
  回复  引用    

#54楼  2008-04-24 19:23 hbb [未注册用户]
我想实现类似于GMF框架中那个右键点击一个ecore文件,其中有一项initialize ecore_diagram diagram file,然后GMF通过分析那个ecore文件生成一张图的功能.
感觉无从下手,不知道博主对这个功能有没有什么建议.
  回复  引用