Acceleo M2T(无法访问我的 matamodele 属性,引用 ..)

Acceleo M2T (Cannot access to the my matamodele attributes , references .. )

我正在 Acceleo(在 Obeo Designer 中)开发 M2T 生成器。 我已经基于 *.ecore (pfe.ecore) 创建了我的元模型,然后我在运行时 (MyModels.pfe) 使用 Sirius 创建了一个实例模型。

现在我正在尝试使用 Accelo 生成 MyModels.pfe 的 java 代码 - class 根是 InterationSpatiale。

我想为图表中的每个 classes 生成一个 *.java 这是我的 generate.mtl 文件

 [comment encoding = UTF-8 /]
[module generate('http://www.example.org/pfe')/]
[template public generateElement(myinteractionspatiale : 
InteractionSpatiale)]
[comment @main/]
[file (myinteractionspatiale.name.concat('.java'), false, 'UTF-8')]

public class [myinteractionspatiale.name/] {

[for (aEAttribute : ecore :: EAttribute | 
 myinteractionspatiale.eClass().eAllAttributes)]
   [aEAttribute.eType.instanceClassName/] [aEAttribute.name/];
[/for]
[for (aEReference : EReference 
|myinteractionspatiale.eClass().eAllReferences)]
  [aEReference.eReferenceType.name/] [aEReference.name/];
[/for]
[for (aEAttribute : EAttribute | 
myinteractionspatiale.eClass().eAllAttributes)]
  public [aEAttribute.eType.instanceClassName/] 
  get[aEAttribute.name.toUpperFirst()/] () {
    return this.[aEAttribute.name/];
  }
 [/for]
 [for (aEAttribute : EAttribute | 
 myinteractionspatiale.eClass().eAllAttributes)]
   public void set[aEAttribute.name.toUpperFirst()/] 
   ([aEAttribute.eType.instanceClassName/] [aEAttribute.name/]) {
    this.[aEAttribute.name/] = [aEAttribute.name/];
  }
 [/for]

 [for (aEReference : EReference | 
 myinteractionspatiale.eClass().eAllReferences)]
   public [aEReference.eReferenceType.name/] 
  get[aEReference.name.toUpperFirst()/] () {
    return this.[aEReference.name/];
  }
 [/for]

 [for (aEReference : EReference | 
  myinteractionspatiale.eClass().eAllReferences)]
  public void set[aEReference.name.toUpperFirst()/] 
  ([aEReference.eReferenceType.name/] [aEReference.name/]) {
    this.[aEReference.name/] = [aEReference.name/];}
 [/for]

[for (aEOperation : EOperation | 
myinteractionspatiale.eClass().eAllOperations)]
  public [aEOperation.eType.instanceClassName/] [aEOperation.name/] () {
    }
[/for]

}
 [/file]

[/template]

我得到的生成文件App.java是

public class App {

java.lang.String name;
Entite entite;
Evenement evenement;
SystemeCoordonnees systemecoordonnees;
TacheSysteme tachesysteme;
RelationSpatiale relationspatiale;
InteractionSpatiale interactionspatiale;
public java.lang.String getName () {
    return this.name;
}
public void setName (java.lang.String name) {
    this.name = name;
}

public Entite getEntite () {
    return this.entite;
}
public Evenement getEvenement () {
    return this.evenement;
}
public SystemeCoordonnees getSystemecoordonnees () {
    return this.systemecoordonnees;
}
public TacheSysteme getTachesysteme () {
    return this.tachesysteme;
}
public RelationSpatiale getRelationspatiale () {
    return this.relationspatiale;
}
public InteractionSpatiale getInteractionspatiale () {
    return this.interactionspatiale;
}

public void setEntite (Entite entite) {
    this.entite = entite;
}
public void setEvenement (Evenement evenement) {
    this.evenement = evenement;
}
public void setSystemecoordonnees (SystemeCoordonnees systemecoordonnees) 
{
    this.systemecoordonnees = systemecoordonnees;
}
public void setTachesysteme (TacheSysteme tachesysteme) {
    this.tachesysteme = tachesysteme;
}
public void setRelationspatiale (RelationSpatiale relationspatiale) {
    this.relationspatiale = relationspatiale;
}
public void setInteractionspatiale (InteractionSpatiale 
interactionspatiale) {
    this.interactionspatiale = interactionspatiale;
}
}

但是我真正想要的是为模型MyModels.pfe的每个class创建一个文件,而不仅仅是模型java的文件根 class.

请检查 MyModels.pfe 以了解我想要生成的内容。 ScreenShot of MyModels.pfe

非常感谢任何有关如何迭代并为每个 class 及其属性和值[EFixe.java、EMobile.java ...][=13 生成文件的帮助=]

aEClass : InteractionSpatiale

具有误导性,您应该将其命名为类似 myInteractionSpatiale 的名称,因为您的参数是 InteractionSpatiale 的一个实例(在 Java/Acceleo 键入的意义上)。

在 EMF 类型的意义上,您的 myInteractionSpatiale 是一个 EObject,它是您在元模型中定义的 EClass“InteractionSpatiale”的一个实例 pfe.ecore

我了解到您想迭代此 EClass 的属性:

myInteractionSpatiale.eClass().getAllAttributes()

最后一条评论的替代方案(不是最优化的)

对于每个 class ,我在主模块中创建一个 let 块来调用不同的模板:

[let p : EFixe = myInteractionSpatiale.entite->any(oclIsKindOf(EFixe)) ]
[generateEntiteFixe (p)/]
[/let]

此致