您的位置:首页 > 其它

GMF:如何在不打开Editor的情况下生成图片

2019-08-02 19:31 260 查看
原文链接:https://www.geek-share.com/detail/2588920220.html

问题

GMF应用中,有时我们希望在不打开*DiagramEditor的情况下,从文件就能生成它的图片

 

解决方案

首先,从文件中构造DiagramImpl实例:

TransactionalEditingDomain domain = GMFEditingDomainFactory.getInstance().createEditingDomain();
IFile pageFile = project.getFile("/diagram/file/path");
DiagramImpl diagramImpl = DiagramModelLoader.getDiagramFromFile(pageFile, domain);

 

然后调用CopyToImageUtil的copyToImageByteArray方法,生成图片的buffer。

try {
CopyToImageUtil copyToImageUtil = new CopyToImageUtil();
byte[] buffer = copyToImageUtil.copyToImageByteArray(diagramImpl, 800, 800, ImageFileFormat.PNG, new NullProgressMonitor(),PreferencesHint.USE_DEFAULTS, true);
return buffer;
} catch (CoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}

copyToImageByteArray会先检查该diagramImpl对应的Editor是否已经打开,如果已经打开,则从Editor中生成图片;否则,它会在一个独立的shell中生成一个Editor,然后从它生成图片,这都是在后台进行的。 但它有个问题,或者说是bug:如果已经打开的Editor和diagramImpl对应的文件并不相同,它也会认为Editor已经打开了,那么,生成的图片就牛头不对马嘴了。解决办法是把以上代码改为:

Shell shell = new Shell();
try {
CopyToImageUtil copyToImageUtil = new CopyToImageUtil();
DiagramEditPart diagramEditPart = copyToImageUtil.createDiagramEditPart(pageDescriptor.getDiagram(),shell, PreferencesHint.USE_DEFAULTS);
Assert.isNotNull(diagramEditPart);
return copyToImageUtil.copyToImageByteArray(diagramEditPart, null, 800, 800, ImageFileFormat.PNG, new NullProgressMonitor(), true);
} catch (CoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
finally {
shell.dispose();
}

其实以上代码参考了copyToImageByteArray的实现

 

Binhua Liu原创,写于2013/8/31。

转载于:https://www.cnblogs.com/Binhua-Liu/p/3292984.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: