在我的 ecore 模型中生成一些 child

Generate some child in my ecore model

为了简化我的问题,我制作了一个 problem 的小模型。

在这个模型中,我在 Simulation 中有一个 Plane。我想用一小段代码生成一些其他 Plane 具有相同的 children 类 (MotorType, OtherClass1, OtherClass2) 和相同的值,除了 MotorType 中的数值增加了每次迭代。

对于 example,我有一个由名为 "plane1" 的 PlaneMotorType 组成的模拟=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);
}