• 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。

  • 相关阅读:
    WPF数据绑定机制是如何实现
    C#自定义特性的使用
    MVVMLight学习笔记(一)---MVVMLight概述
    C# Autofac学习笔记
    EFCodeFirst快速搭建入门
    SQL having与where用法区别
    EventWaitHandle 类
    C# EF 使用 (CodeFirst模式)
    wmi 远程启动程序
    Centos 7 的一些 基础知识
  • 原文地址:https://www.cnblogs.com/Binhua-Liu/p/3292984.html
Copyright © 2020-2023  润新知