为了简化我的问题,我制作了problem的小模型。
在这个模型中,我在 Simulation 中有一个 Plane 。我想用一小段代码,一些其他 Plane 生成相同的子类( MotorType , OtherClass1 , OtherClass2 )和除 MotorType 中的数值之外的相同值,每次迭代都会增加。
对于example,我有一个由名为" plane1"的 Plane 组成的模拟,其中 MotorType = TypeB,其值为10,和 OtherClass1 。
我想生成10个新平面,其中 OtherClass1 具有相同的值和相同的 MotorType ,但是使用"值"增加10。
如何生成我的模拟的新平面子,它是现有平面的副本,但增加了参数?
是否可以通过右键单击我的飞机来复制天狼星?
Example of my model class diagram
Example of a creation of a simulation
答案 0 :(得分:2)
您可能希望在原始模拟中使用EcoreUtil.copy(EObject)来创建副本。
然后,使用Java EMF API,您可以在副本中导航并根据需要进行更改。
如果您希望每个模拟都在自己的文件中,则必须创建相应的EMF资源,并在保存之前将新创建的模拟添加到其内容中。
在实现了完成上述所有操作的Java方法后,您可以使用Java service
从Sirius图表中调用它答案 1 :(得分:0)
您应该通过扩展EcoreUtil.Copier来定义自己的EMF复印机。
这样,您可以覆盖默认的复制器行为,并使用某些自定义行为处理感兴趣的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);
}