私が本当に便利だと思う Papyrus の機能の 1 つは、Eclipse UI の外部で UML2 ランタイムを使用して作成された UML モデルをプログラムで調べる機能です。これは、単純なツールを実行して、POI を使用してドキュメントを作成したり、Talend MDM ツールのモデル駆動型構成を記述したりするのに最適です。ただし、モデル ツリーのトラバースと処理は、リソース セットにリソースをロードすることで簡単に実現できますが、.notation ファイル内のダイアグラムの操作はより困難であることがわかっています。
すべてのリソースをロードして .notation ファイルから要素org.eclipse.papyrus.infra.export.ExportAllDiagrams
を見つけることができるポイントに ( のソースを調べることによって) 到達しました。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
してダイアグラムをレンダリングしますが、その時点で に依存してnullDiagramUIRenderPlugin
を返すため失敗します。DiagramUIRenderPlugin.getInstance()
次にorg.eclipse.gmf.runtime.diagram.ui.render.clipboard.DiagramSVGGenerator
、さまざまなEclipseプラグインを初期化する必要があることを確認しましたが、同様の問題がありました。
私は Eclipse プラグイン システムの経験はありませんが、プラットフォームがプラグインをロードして初期化するため、これまでに試みたアプローチを機能させるには Eclipse GUI 環境内で実行する必要があると想定しています。Eclipse ランタイム全体に依存せずに、ダイアグラムを SVG に簡単にレンダリングするために使用できる他の方法はありますか?