在我的ecore模型中生成一些孩子

时间:2018-04-16 14:40:12

标签: eclipse emf ecore eclipse-sirius

为了简化我的问题,我制作了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

2 个答案:

答案 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);
}