1

为了简化我的问题,我对我的问题做了一个小模型

在这个模型中,我有一个Plane in a Simulation。我想用一小段代码生成其他一些具有相同子类(MotorTypeOtherClass1OtherClass2 )的平面和相同的值,但MotorType中的数值随着每次迭代而递增。

例如,我有一个由名为“plane1”的平面组成的模拟MotorType = TypeB 的值为 10,还有一个OtherClass1

我想生成 10 个新飞机,OtherClass1具有相同的值和相同的MotorType,但“值”增加了 10。

如何生成我的模拟的一些新平面子代,它是现有平面的副本但参数增加?
是否可以通过右键单击我的飞机复制来使用 Sirius 执行此操作?

我的模型类图
示例 创建模拟示例

4

2 回答 2

2

您可能想在原始模拟上使用EcoreUtil.copy(EObject)来创建副本。

然后,使用 Java EMF API,您可以在副本中导航并随意更改它。

如果您希望每个模拟都在自己的文件中,则必须创建适当的 EMF 资源并将新创建的模拟添加到其内容中,然后再保存。

在您实现了执行上述所有操作的 Java 方法之后,您可以使用Java 服务从 Sirius 图中调用它

于 2018-04-16T15:06:42.593 回答
0

您应该通过扩展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);
}
于 2018-04-23T10:46:41.180 回答