如何在eclipse之外导出GMF图?

时间:2015-02-10 11:16:57

标签: papyrus

我发现Papyrus非常有用的功能之一是能够通过在Eclipse UI之外使用UML2运行时以编程方式查询它创建的UML模型。这非常适合运行简单的工具,例如,使用POI生成文档或为Talend MDM工具编写模型驱动的配置。但是,虽然通过加载资源集中的资源可以轻松地遍历和处理模型树,但是操作.notation文件中的图表已经证明是一个更大的挑战。

我已经明确了(通过检查org.eclipse.papyrus.infra.export.ExportAllDiagrams的源代码),我可以在其中加载所有资源并从.notation文件中找到Diagram元素:

    File uml = new File(model + ".uml");
    File di = new File(model + ".di");
    File notation = new File(model + ".notation");
    URI umlUri = URI.createFileURI(uml.getAbsolutePath());
    URI diUri = URI.createFileURI(di.getAbsolutePath());
    URI notationUri = URI.createFileURI(notation.getAbsolutePath());

    final ModelSet resourceSet = new ModelSet();

    resourceSet.getPackageRegistry().put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
    resourceSet.getPackageRegistry().put(NotationPackage.eNS_URI, NotationPackage.eINSTANCE);

    resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl());
    resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("notation", new XMIResourceFactoryImpl());
    resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);

    try {
        resourceSet.getLoadOptions().put(XMLResource.OPTION_DEFER_IDREF_RESOLUTION, true);
        resourceSet.getLoadOptions().put(XMLResource.OPTION_DEFER_ATTACHMENT, true);

        resourceSet.getResource(diUri, true);
        resourceSet.getResource(umlUri, true);
        resourceSet.getResource(notationUri, true);

        List<Diagram> diagrams = new ArrayList<Diagram>();
        for (Iterator<Notifier> i = resourceSet.getAllContents(); i.hasNext();) {
            Notifier n = i.next();
            if (n instanceof Diagram) {
                diagrams.add((Diagram) n);
            }
        }

        //export(diagrams);
    } finally {
        // Unload the resource set so that we don't leak loads of UML content in the CacheAdapter
        unload(resourceSet);
    }

但是,ExportAllDiagrams类最终使用org.eclipse.gmf.runtime.diagram.ui.render.util.CopyToImageUtil来呈现图表,此时它会失败,因为它依赖于DiagramUIRenderPluginDiagramUIRenderPlugin.getInstance()返回null。

然后我看了一下org.eclipse.gmf.runtime.diagram.ui.render.clipboard.DiagramSVGGenerator,但是在初始化各种eclipse插件时需要遇到类似的问题。

我没有Eclipse插件系统的经验,但我假设平台加载并初始化插件,因此,到目前为止尝试的方法需要在Eclipse GUI环境中运行才能工作。有没有其他方法可以用来轻松地将图表呈现给SVG而不依赖于整个Eclipse运行时?

0 个答案:

没有答案