Acceleo (Eclipse) で M2T ジェネレーターを開発しています。モデルは基本的に、Papyrus で作成された SysML プロファイルを持つ UML モデルです。Blocks と FlowPorts が含まれます。これらのステレオタイプにアクセスする必要がありますが、リストに表示されていても SysML オブジェクトを取得できないようです (コードの提案)。実際には、Port に関連付けられた FlowPort の「Direction」プロパティにアクセスする必要があります。私はすでにさまざまなフォーラム ( https://www.eclipse.org/forums/index.php/t/452587/を含む) からの提案と回答を試しましたが、無駄でした。
コードを以下に示します。https://www.eclipse.org/forums/index.php?t=msg&th=1060450&goto=1693765&で提案されているように Java サービスを作成しましたが、 port.hasStereotype('FlowPort') は常に false を返します。「FlowPort」の代わりに「SysML::PortAndFlows::FlowPort」も試しました。Eclipse Mars で Acceleo 3.6.2 を使用しています。
...
[template public generateElement(model : Model)]
[comment @main/]
[file ('created.txt', false, 'UTF-8')]
[for(port: Port | model.eAllContents(Port))]
[if(port.hasStereotype('FlowPort'))]
OK
[else]
NOT OK
[/if]
[/for]
[/file]
[/template]
モジュールの作成時に、モジュールに次のメタモデルを含めます。
http://www.eclipse.org/uml2/5.0.0/UML
http://www.eclipse.org/papyrus/0.7.0/SysML
http://www.eclipse.org/papyrus/0.7.0/SysML/Blocks
http://www.eclipse.org/papyrus/0.7.0/SysML/Constraints
http://www.eclipse.org/papyrus/0.7.0/SysML/PortAndFlows
http://www.eclipse.org/emf/2002/Ecore
また、上記のリンクで示唆されているように、Generate.java の registerPackages() に以下を含む必要なパッケージを登録します。
// UML2 profiles
URI uri = URI.createURI("platform:/plugin/org.eclipse.uml2.uml.resources");
uriMap.put(URI.createURI(UMLResource.LIBRARIES_PATHMAP), uri.appendSegment("libraries").appendSegment(""));
uriMap.put(URI.createURI(UMLResource.METAMODELS_PATHMAP), uri.appendSegment("metamodels").appendSegment(""));
uriMap.put(URI.createURI(UMLResource.PROFILES_PATHMAP), uri.appendSegment("profiles").appendSegment(""));
// SysML profiles
uri = URI.createURI("platform:/plugin/org.eclipse.papyrus.sysml");
uriMap.put(URI.createURI(SysmlResource.LIBRARIES_PATHMAP), uri.appendSegment("librairies").appendSegment(""));
uriMap.put(URI.createURI("pathmap://SysML_PROFILES/"), uri.appendSegment("SysML.profile.uml").appendSegment(""));
uriMap.put(URI.createURI("pathmap://SysML_PROFILES/"), uri.appendSegment("model").appendSegment(""));
どんな種類の助けも大歓迎です。