GMF:如何在不打开Editor的情况下生成图片
问题
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的情况下生成图片的更多相关文章
- 在打开Dreamweaver软件情况下,vs2010 asp项目无法调试
会出现以下情况,只要关闭Dreamweaver就可以正常调试vs2010 asp项目.
- python requests访问https的链接,不打开fiddler的情况下不报错;若是打开fiddler则报ssl错误,请求中添加verify=False,会报警告;若不想看到警告,有3种方式;
import requests# import warnings# warnings.filterwarnings("ignore") #方法一#requests.packages ...
- 在不打开excel的情况下用python执行excel
import win32com.client import time path = r'absolute dir' #比如填文件的绝对路径,比如d:/file/stock.xlsx xl = win3 ...
- [httpd] httpd server 在低负载的情况下对SYN无响应
如题: 两台client通过load balance访问httpd server.两个client交互访问.load balance处于fullnat模式. server在低负载情况下,常常对某一个c ...
- php 502 无错误行和报错文件的情况下使用gdb调试方法
lnmp环境 gdb /usr/local/php5.2/bin/php-cgi /tmp/coredump-php-cgi.20503 source /home/tmp/lnmp1.4-full ...
- 用SignalR 2.0开发客服系统[系列4:负载均衡的情况下使用SignalR]
前言 交流群:195866844 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 用SignalR 2.0开发客服系统 ...
- 在不损坏C盘的情况下为C盘扩容,适用于Win
2016年12月29日14:29:27 参考原文:http://jingyan.baidu.com/article/90808022a6c6b7fd91c80fc8.html 在不损坏磁盘的情况下给某 ...
- 无法在“EntityFramework”已存在的情况下创建影像复制该文件的解决方案
问题产生的原因:你项目正在生成中你就打开浏览器预览了,导致这个问题解决方案:右击重新生成项目,等生成后再打开 “/”应用程序中的服务器错误. 无法在“EntityFramework”已存在的情况下创建 ...
- 什么情况下会用到try-catch
本文不区分语言,只为记录一次有收获的面试. 面试官:什么情况下用到try-catch?程序员:代码执行预料不到的情况,我会使用try-catch.面试官:什么是预料不到的情况呢?程序员:比如我要计算a ...
随机推荐
- Codeforces Round #192 (Div. 2)
吐槽一下,这次的CF好简单啊. 可是我为什么这么粗心这么大意这么弱.把心沉下来,想想你到底想做什么! A 题意:O(-1) 思路:O(-1) #include <iostream> #in ...
- 创建一个LinkedList,然后在其中插入多个值,确保每个值都插入到List中间(偶数中间两个数之一,奇数在正中间)
这是Thinking in java 中的一道题,下面是我的解决方案: package test; import java.util.LinkedList; import java.util.List ...
- ExtJS笔记 Form
A Form Panel is nothing more than a basic Panel with form handling abilities added. Form Panels can ...
- Java内存泄露及性能调优实例
内存泄漏及解决方法 1)系统崩溃前的一些现象 每次垃圾回收的时间越来越长,由之前的10ms延长到50ms左右,FullGC的时间也有之前的0.5s延长到4.5s:FullGC的次数越来越多,最频繁时隔 ...
- fopen w c
http://php.net/manual/en/function.fopen.php
- yield return的用法简介
使用yield return 语句可一次返回一个元素. 迭代器的声明必须满足以下要求: 返回类型必须为 IEnumerable.IEnumerable<T>.IEnumerator 或 I ...
- php应用路径变量问题总结
实际效果测试,不考虑原理! 本地服务器,域名http://d.com,根路径D:\phpnow\vhosts\d.com.yii,相对根目录拥有文件/x.php代码里requeir_once /a/a ...
- 多线程 - CountDownLatch
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 CountDownLatch.由于调用了 countDown() 方法,所以在当前计数到达 ...
- Java学习-046-日志抓取合并后排序问题解决方案之 --- log4j 二次定制,实现日志输出添加延时10ms
自3月25至今,已经好久没有写学习日志了,今天在写日志抓取合并的小方法,发现抓取后的日志并米有依据系统执行的日志顺序排序.日志抓取排列逻辑如下: 通过日志标识,从各个日志文件(例如 use.log,e ...
- freemarker学习
链接: http://swiftlet.net/archives/category/freemarker