在我的 ecore 模型中生成一些 child
Generate some child in my ecore model
为了简化我的问题,我制作了一个 problem 的小模型。
在这个模型中,我在 Simulation 中有一个 Plane。我想用一小段代码生成一些其他 Plane 具有相同的 children 类 (MotorType, OtherClass1, OtherClass2) 和相同的值,除了 MotorType 中的数值增加了每次迭代。
对于 example,我有一个由名为 "plane1" 的 Plane 和 MotorType 组成的模拟=TypeB,值为 10,还有一个 OtherClass1.
我想生成 10 架新飞机,OtherClass1 具有相同的值和相同的 MotorType,但 "value" 增加 10.
如何为我的模拟生成一些新平面 child,它是现有平面的副本,但增加了一个参数?
是否可以通过在我的飞机上右键单击复制来使用 Sirius 执行此操作?
Example of my model class diagram
Example of a creation of a simulation
您可能想在原始模拟上使用 EcoreUtil.copy(EObject) 来创建副本。
然后,使用 Java EMF API,您可以在您的副本中导航并根据需要更改它。
如果您希望每个模拟都在其自己的文件中,则必须创建适当的 EMF 资源并在保存之前将新创建的模拟添加到其内容中。
实现完成上述所有操作的 Java 方法后,您可以使用 Java service
从 Sirius 图调用它
您应该通过扩展 EcoreUtil.Copier.
来定义您自己的 EMF 复制器
这样您就可以覆盖默认的 Copier 行为,并使用一些自定义行为处理感兴趣的 EStructuralFeature。
class PlaneCopier extends Copier {
int motorType;
public EObject copy(EObject eObject, int motorType) {
this.motorType = motorType
return super.copy(eObject);
}
@Override
protected void copyAttribute(EAttribute eAttribute, EObject eObject, EObject copyEObject) {
if (eAttribute.equals(YouEMFPackage.Literals.PLANE__MOTOR_TYPE)) {
copyEObject.eSet(YouEMFPackage.Literals.PLANE__MOTOR_TYPE, motorType);
} else {
super.copyAttribute(eAttribute, eObject, copyEObject);
}
}
}
并在循环中使用它:
PlaneCopier copier = new PlaneCopier();
Plane templatePlane = ...
int motorType = 0;
for (var i=0; i<nbPlanes; i++) {
motorType += 10;
newPlane = copier.copy(templatePlane, motorType);
}
为了简化我的问题,我制作了一个 problem 的小模型。
在这个模型中,我在 Simulation 中有一个 Plane。我想用一小段代码生成一些其他 Plane 具有相同的 children 类 (MotorType, OtherClass1, OtherClass2) 和相同的值,除了 MotorType 中的数值增加了每次迭代。
对于 example,我有一个由名为 "plane1" 的 Plane 和 MotorType 组成的模拟=TypeB,值为 10,还有一个 OtherClass1.
我想生成 10 架新飞机,OtherClass1 具有相同的值和相同的 MotorType,但 "value" 增加 10.
如何为我的模拟生成一些新平面 child,它是现有平面的副本,但增加了一个参数?
是否可以通过在我的飞机上右键单击复制来使用 Sirius 执行此操作?
Example of my model class diagram
Example of a creation of a simulation
您可能想在原始模拟上使用 EcoreUtil.copy(EObject) 来创建副本。
然后,使用 Java EMF API,您可以在您的副本中导航并根据需要更改它。
如果您希望每个模拟都在其自己的文件中,则必须创建适当的 EMF 资源并在保存之前将新创建的模拟添加到其内容中。
实现完成上述所有操作的 Java 方法后,您可以使用 Java service
从 Sirius 图调用它您应该通过扩展 EcoreUtil.Copier.
来定义您自己的 EMF 复制器这样您就可以覆盖默认的 Copier 行为,并使用一些自定义行为处理感兴趣的 EStructuralFeature。
class PlaneCopier extends Copier {
int motorType;
public EObject copy(EObject eObject, int motorType) {
this.motorType = motorType
return super.copy(eObject);
}
@Override
protected void copyAttribute(EAttribute eAttribute, EObject eObject, EObject copyEObject) {
if (eAttribute.equals(YouEMFPackage.Literals.PLANE__MOTOR_TYPE)) {
copyEObject.eSet(YouEMFPackage.Literals.PLANE__MOTOR_TYPE, motorType);
} else {
super.copyAttribute(eAttribute, eObject, copyEObject);
}
}
}
并在循环中使用它:
PlaneCopier copier = new PlaneCopier();
Plane templatePlane = ...
int motorType = 0;
for (var i=0; i<nbPlanes; i++) {
motorType += 10;
newPlane = copier.copy(templatePlane, motorType);
}