当前位置: 首页 > 知识库问答 >
问题:

添加到emf模型

淳于宏伯
2023-03-14

我有一个基于emf的模型。在模型中,我有一个feature类,我可以向这些feature添加约束。例如,特性A“暗示”特性B。我正在尝试使用emf命令堆栈向特性添加约束。它将约束添加到特征中,但缺少属性。我的代码如下

 public static Object doExecute(Feature contextFeature, FeatureModel featureModel, ComposedAdapterFactory adapterFactory) {


    CreateConstraintDialog dlg = new CreateConstraintDialog(Display.getCurrent().getActiveShell(), contextFeature, featureModel, adapterFactory);
    dlg.open();

    // check if dialog was cancelled:
    if (dlg.getReturnCode() == Window.CANCEL)
        return null;

    Feature selectedFeature = dlg.getSelectedFeature();
    if (selectedFeature == null)
        return null;

    ConstraintType selectedConstraintType = dlg.getSelectedConstraintType();

    Constraint constraint = FmFactory.eINSTANCE.createConstraint();
    constraint.setType(selectedConstraintType);
    constraint.setConstrainedFeature(selectedFeature);
    constraint.setContext(contextFeature);

    EditingDomain editingDomain = AdapterFactoryEditingDomain.getEditingDomainFor(contextFeature);
    Command cmd = AddCommand.create(editingDomain, contextFeature, FmPackage.FEATURE__CONSTRAINTS, constraint);
    editingDomain.getCommandStack().execute(cmd);
    return null;

}
/**
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
 * @generated
 */
public void setContext(Feature newContext) {
    if (newContext != eInternalContainer() || (eContainerFeatureID() != FmPackage.CONSTRAINT__CONTEXT && newContext != null)) {
        if (EcoreUtil.isAncestor(this, newContext))
            throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
        NotificationChain msgs = null;
        if (eInternalContainer() != null)
            msgs = eBasicRemoveFromContainer(msgs);
        if (newContext != null)
            msgs = ((InternalEObject)newContext).eInverseAdd(this, FmPackage.FEATURE__CONSTRAINTS, Feature.class, msgs);
        msgs = basicSetContext(newContext, msgs);
        if (msgs != null) msgs.dispatch();
    }
    else if (eNotificationRequired())
        eNotify(new ENotificationImpl(this, Notification.SET, FmPackage.CONSTRAINT__CONTEXT, newContext, newContext));
}

共有1个答案

江嘉悦
2023-03-14

由于您刚刚创建了constraint实例,因此不需要使用命令来设置它的属性,因为它还没有附加到EMF模型。您可以只调用setter方法。使用命令的地方只是将constraint添加到现有特性中。

不相关,但在执行命令之前,您还应该始终对该命令调用canexecute方法:

CompoundCommand cmd = ....;
if (cmd.canExecute()) {
    editingDomain.getCommandStack().execute( cmd );
}
 类似资料:
  • 我有两个基于同一ecore模型的EMF实例版本。我需要以以下格式准备一个从v1到v2更改的事物列表

  • 我正在XTend中构建一个代码生成器,在那里我已经有了输入模型和元模型。也就是说,我使用ATL为XTend代码生成器生成输入模型(作为转换序列的一部分,以逐步降低抽象级别,而不是立即;这就是我不使用xtext创建语法的原因)。 解决方案: 解决方案正如Sven在我接受的答案中所建议的,但我也想指出,您需要使用genmodel来从元模型生成Java工件。此链接显示了如何:http://www.vog

  • 我知道有几个关于这个主题的QnA。我已经尝试了很多解决方案,我总是得到相同的错误。 我的代码结构如下所示: 请帮忙 亲切的问候

  • 若要添加一个新的表,点击工具栏的 “表”按钮,并点击画布的任意位置。你可以从浏览器的模型选项卡添加一个现有的表,简单地从模型选项卡拖放表到画布。 如果图表符号设置为默认, 图标代表字段为一个主键。而 图标则代表字段为一个索引。 【注意】如果你按住 Control 键并点按字段,你可以选择添加、插入、删除、重命名字段及设置字段为主键。 在画布中表对象的弹出式菜单选项包括: 选项 描述 设计表 在“表

  • 若要添加一个新的表,点击工具栏的 “表”按钮,并点击画布的任意位置。你可以从浏览器的模型选项卡添加一个现有的表,简单地从模型选项卡拖放表到画布。 如果图表符号设置为默认, 图标代表字段为一个主键。而 图标则代表字段为一个索引。 【注意】如果你右击字段,你可以选择添加、插入、删除、重命名字段及设置字段为主键。 在画布中表对象的弹出式菜单选项包括: 选项 描述 设计表 在“表设计器”中编辑表结构,例如

  • 若要添加一个关系,点击工具栏的 “关系”按钮,并拖放子实体到父实体。若要显示或隐藏链接的名标签,简单地在属性窗格中勾选或取消勾选“显示名”选项。 当你移动滑鼠到一个关系连接器时,父和子实体的边界会分别变为绿色和蓝色。 在画布中关系对象的弹出菜单选项包括: 选项 描述 基数在 实体名1 设置基数在实体名1:无、唯一、多个、一或多个、零或一个、零或多个。 基数在 实体名2 设置基数在实体名2:无、唯一