问题

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。

GMF:如何在不打开Editor的情况下生成图片的更多相关文章

  1. 在打开Dreamweaver软件情况下,vs2010 asp项目无法调试

    会出现以下情况,只要关闭Dreamweaver就可以正常调试vs2010 asp项目.

  2. python requests访问https的链接,不打开fiddler的情况下不报错;若是打开fiddler则报ssl错误,请求中添加verify=False,会报警告;若不想看到警告,有3种方式;

    import requests# import warnings# warnings.filterwarnings("ignore") #方法一#requests.packages ...

  3. 在不打开excel的情况下用python执行excel

    import win32com.client import time path = r'absolute dir' #比如填文件的绝对路径,比如d:/file/stock.xlsx xl = win3 ...

  4. [httpd] httpd server 在低负载的情况下对SYN无响应

    如题: 两台client通过load balance访问httpd server.两个client交互访问.load balance处于fullnat模式. server在低负载情况下,常常对某一个c ...

  5. php 502 无错误行和报错文件的情况下使用gdb调试方法

    lnmp环境 gdb  /usr/local/php5.2/bin/php-cgi  /tmp/coredump-php-cgi.20503 source /home/tmp/lnmp1.4-full ...

  6. 用SignalR 2.0开发客服系统[系列4:负载均衡的情况下使用SignalR]

    前言 交流群:195866844 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 用SignalR 2.0开发客服系统 ...

  7. 在不损坏C盘的情况下为C盘扩容,适用于Win

    2016年12月29日14:29:27 参考原文:http://jingyan.baidu.com/article/90808022a6c6b7fd91c80fc8.html 在不损坏磁盘的情况下给某 ...

  8. 无法在“EntityFramework”已存在的情况下创建影像复制该文件的解决方案

    问题产生的原因:你项目正在生成中你就打开浏览器预览了,导致这个问题解决方案:右击重新生成项目,等生成后再打开 “/”应用程序中的服务器错误. 无法在“EntityFramework”已存在的情况下创建 ...

  9. 什么情况下会用到try-catch

    本文不区分语言,只为记录一次有收获的面试. 面试官:什么情况下用到try-catch?程序员:代码执行预料不到的情况,我会使用try-catch.面试官:什么是预料不到的情况呢?程序员:比如我要计算a ...

随机推荐

  1. Unity3d优化

    检测方式: 一,Unity3D 渲染统计窗口 Game视窗的Stats去查看渲染统计的信息: 1.FPS fps其实就是 frames per second,也就是每一秒游戏执行的帧数,这个数值越小, ...

  2. 想通过加HINT让其走全表扫描

    一个SQL,通过SPM固定它的执行计划,可以通过DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE实现.也可以通地此功能在不修改原SQL的情况下对其加HINT来固定执行计划.D ...

  3. struct大小

    对齐. #include <iostream> using namespace std; struct S1 { int a; char b; char c; }; struct S2 { ...

  4. JS中的特有语句-for in

    <script> /* *js中特有语句for in *for(变量 in 对象)//对对象进行变量的语句 *{ *} */ var arr = [32,80,65]; for(i in ...

  5. 【iCore3 双核心板】例程十五:USB_CDC实验——高速数据传输

    实验指导书及代码包下载: http://pan.baidu.com/s/1gemYjz9 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  6. python logging 配置

    python logging 配置 在python中,logging由logger,handler,filter,formater四个部分组成,logger是提供我们记录日志的方法:handler是让 ...

  7. Objective-C 中类属性(修饰)

    Objective-C 中类属性(修饰) (2013-07-13 14:38:35) 转载▼ 标签: it 分类: IOS笔记 nonatomic: 非原子性访问,对属性赋值的时候不加锁,多线程并发访 ...

  8. SaveData Functions

    Here are some save function for some situations: Yes/No /// <summary> ///保存数据到WCF /// </sum ...

  9. inotify配合rsync实现文件同步

    一.slave端rsync设置在此部署rsync服务和rsync daemon 1.安装rsync   2.配置rsyncd.conf文件#vi /etc/rsyncd.conf配置文件uid = r ...

  10. rabbitmq之partitions

    集群为了保证数据一致性,在同步数据的同时也会通过节点之间的心跳通信来保证对方存活.那如果集群节点通信异常会发生什么,系统如何保障正常提供服务,使用何种策略回复呢? rabbitmq提供的处理脑裂的方法 ...