0

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(""));

どんな種類の助けも大歓迎です。

4

1 に答える 1

0

私は同じ問題を抱えていましたが、SysML ではなく UML/MARTE を使用していました。

port.getAppliedStereotypes()何があっても(もちろん、ポートステレオタイプであっても) 、常に空のリストを返すに違いありません。@generated NOTまた、メソッドの javadocに a があるかどうかを再確認するなど、あなたが行ったすべてのことを試しましたが、失敗しましたregisterPackages(毎回再生成されます)。

少し回避策を講じて問題を修正しました。あなたが (私と同じように) Papyrus によって生成された model.uml ファイルを変換の入力として使用すると仮定します。別の方法がわかりませんが、これが実際に問題の原因である可能性があります。<FlowPort>そのファイルをテキスト エディタで開くと、タグがタグの外にあることがわかります<uml:Model>。これは、私がまだ理解できない理由により、stereotype()メソッドがステレオタイプを「見る」ことができず、常に null または空のリストを返すことを意味します。これはおそらく、ステレオタイプbase_NamedElementをタグのxmi:id内側に一致させていないことが原因です。<uml:Model>

一方、(モデルではなく) FlowPort を入力として受け取るテンプレートを定義すると、ステレオタイプ化された要素とそのすべてのプロパティを取得できます。

[template public generateElement(aFlowPort: FlowPort)]
[comment @main /]
[comment here you can access to the aFlowPort fields]
[/template]

base_NamedElement特に、ステレオタイプのプロパティ (つまり、モデルPortでステレオタイプ化されている ) にアクセスしたり、基本要素のプロパティを使用して、ステレオタイプを の にマップしたりできます。実際には、これはステレオタイプをステレオタイプ化されたエンティティに手動でリンクする必要があることを意味します。FlowPortqualifiedNamePortModel

不格好で面倒ですが、誰かが「回避策」の少ない解決策を提示するまで、仕事は完了します。

于 2016-02-11T10:56:26.273 に答える