【问题标题】:modeling self referencing nodes in EMF and edit them with ECP在 EMF 中对自引用节点进行建模并使用 ECP 对其进行编辑
【发布时间】:2016-04-09 17:03:20
【问题描述】:

我正在尝试使用 EMF 对网络进行建模。 网络应该由相互连接的节点组成。 每个节点都应该有一个或多个与其他节点的连接,例如网状网络。

该模型应可由 EMF 客户端平台 (ECP) 演示应用程序编辑。 当用户创建节点时,在 ECPs model-explorer 中,他/她可以设置与其他节点的连接,最好是在一个列表中。

第一次尝试是自引用,但问题是没有双向自引用。这导致看不到来自对面节点的连接。

我的下一个想法是使用中间连接类,这会导致另一个问题。我想在模型资源管理器中不出现连接类的情况下自动创建此连接。这可以在生成的 EMF 查看器中实现,但不能在我正在使用的 ECP 演示应用程序中实现。

第三个想法:我能想到解决最后一个想法的唯一方法是在节点视图中使用 tableControl 来编辑那里的连接类。但是在模型浏览器中隐藏连接类的问题仍然存在,连接类出现在项目文件夹(最高级别)中,而不是它们的包含类(在我的例子中是网络类)中。

有没有人有一些想法,如何解决我的任何问题?

编辑:附加信息

节点之间的连接按照定义是全双工的。 然后该图应用作最短路径算法的输入。

【问题讨论】:

    标签: eclipse-emf emf eclipse-emf-ecore


    【解决方案1】:

    您的第一次尝试是好的。实际上,您可以在 Ecore 中进行相反的建模。为此,您必须将两个EReferences 建模为同一个对象(因此两个反身引用),然后将您的EReference 之一的属性eOpposite 设置为另一个。

    这是一个带有eOpposite 集的简单元模型:https://repository.genmymodel.com/vincent.aranega/NodeGraph

    在 Ecore-XMI 中,它看起来像这样(注意 eOpposite 值):

    <eStructuralFeatures xsi:type="ecore:EReference" xmi:id="_pwXZhv1pEeW9zv77lynsJg"
        name="references" upperBound="-1" eType="#_pwXZg_1pEeW9zv77lynsJg" eOpposite="#_pwXZiv1pEeW9zv77lynsJg"/>
    
    <eStructuralFeatures xsi:type="ecore:EReference" xmi:id="_pwXZiv1pEeW9zv77lynsJg"
        name="relatives" upperBound="-1" eType="#_pwXZg_1pEeW9zv77lynsJg" eOpposite="#_pwXZhv1pEeW9zv77lynsJg" />
    

    使用此元模型,您可以创建一个包含许多NodeGraph。每个节点可以reference其他节点。如果将 Node A 作为对另一个名为 B 的引用,则 Brelatives 集合将自动更新为 A

    【讨论】:

    • 感谢您的指导。但现在它就像一个输入和输出连接。自动添加对亲属的引用(在生成的代码中)是个好主意,这样我就可以只使用其中一个引用来逐步浏览图表。
    • 我忘记了:如果是这样,实现这种双重添加(或更好地同步参考列表)的地方在哪里。顺便说一句:原来的问题已经回答,所以我标记你的。再次感谢。
    • 我不确定您的要求是否正确。使用我给您的解决方案,您可以仅使用 references 集合逐步浏览图表。两个集合是自动同步的,如果你把一个元素放在两个集合之一中,另一个就会更新。
    • 我的意思是,仅使用references 集合来逐步浏览图表,让我只能在一个方向上进行。例如,如果有一个从Node ANode B 的好方法,但用户通过将Node A 添加到Node Bs 参考集合来建立连接,我将找不到从@987654343 开始的方法@。为了克服这个问题,我正在考虑同步节点本身的两个集合(实例),但是使用 ECP 我很难找到正确的钩子。也许自定义控件是一种解决方案。
    • 好的,我想我明白了。一个解决方案可能是建模一个额外的自反EReference 并将其设置为[0..*]derived。派生的集合被计算并且在 EMF 代码中只生成它们的空方法。这样,在元模型生成的代码中,您可以通过在relativesreferences 之间执行联合来计算新的EReference 值。由于此集合是派生的,因此它将是“只读的”。希望这会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    相关资源
    最近更新 更多