我正在用(在Eclipse中) Acceleo开发一个M2T生成器。该模型基本上是一个带有在Papyrus中创建的SysML概要文件的UML模型。它包括块和FlowPorts。我必须访问这些构造型,但似乎无法检索任何SysML对象,即使它们出现在list (代码建议)中。实际上,我必须访问与端口关联的FlowPort的‘方向’属性。我已经尝试了各种论坛(包括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。我也尝试了‘SysML::PortAndFlows::FlowPort’而不是‘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(""));任何形式的帮助都是非常感谢的。
发布于 2016-02-11 18:56:26
我也有同样的问题,但用的是UML/MARTE,而不是SysML。
我敢打赌,无论发生什么,port.getAppliedStereotypes()总是返回空列表(当然,即使端口是构造型的)。我还尝试了您所做的一切,但都没有成功,包括再次检查registerPackages方法的javadoc中是否有@generated NOT (每次都会重新生成它)。
我用一些变通方法修复了这个问题。我假设您(和我一样)使用由Papyrus生成的model.uml文件作为转换的输入。这实际上可能是问题的原因,尽管我看不到替代方案。如果您使用文本编辑器打开该文件,您会发现<FlowPort>标记位于<uml:Model>标记之外。这意味着,由于我仍然不能理解的原因,stereotype()方法不能“看到”构造型,并且总是返回null或空列表。这可能是因为他们无法将构造型base_NamedElement与<uml:Model>标记中的xmi:id匹配。
另一方面,如果您定义了一个以FlowPort (而不是模型)作为输入的模板,那么您将能够获得您的构造型元素及其所有属性。
[template public generateElement(aFlowPort: FlowPort)]
[comment @main /]
[comment here you can access to the aFlowPort fields]
[/template]其中,您还可以访问构造型的base_NamedElement属性(即,在您的模型中是构造型FlowPort的Port ),并且您可以使用基本元素的qualifiedName属性来将构造型映射回您的Model中的Port。在实践中,这意味着您必须手动将构造型链接到它们的构造型实体。
笨拙和恼人,但仍然可以完成工作,直到有人提出了一个不那么“繁琐”的解决方案。
https://stackoverflow.com/questions/35093700
复制相似问题