我有一个基于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));
}
由于您刚刚创建了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:无、唯一