моделирование самоссылающихся узлов в EMF и редактирование их с помощью ECP

Я пытаюсь смоделировать сеть с помощью EMF. Сеть должна состоять из узлов, соединенных друг с другом. Каждый узел должен иметь одно или несколько соединений с другими, как в ячеистой сети.

Модель должна быть доступна для редактирования демонстрационным приложением EMF Client Platforms (ECP). Когда пользователь создает узлы, в обозревателе модели ECP он/она может установить соединения с другими узлами, желательно в виде списка.

Первой попыткой была ссылка на себя, но проблема в том, что нет двунаправленных ссылок на себя. Это приводит к тому, что соединение с противоположным узлом не видно.

Моей следующей идеей было использовать промежуточный класс соединения, что приводит к другой проблеме. Я хотел бы создать это соединение автоматически, чтобы класс соединения не появлялся в обозревателе модели. Этого можно было бы добиться в сгенерированном средстве просмотра EMF, но не в демонстрационном приложении ECP, которое я использую.

Третья идея: единственный способ, которым я могу придумать решение последней идеи, - это использовать tableControl в представлении узла, чтобы отредактировать там класс соединения. Но тогда проблема с сокрытием класса соединения в обозревателе моделей остается и класс соединения появляется в папке проекта (самый высокий уровень), а не в содержащем их классе (в моем случае сетевой класс).

У кого-нибудь есть идеи, как решить любую из моих проблем?

изменить: дополнительная информация

Соединения между узлами по определению полнодуплексные. Затем этот граф следует использовать в качестве входных данных для алгоритма поиска кратчайшего пути.


person zumbie    schedule 07.04.2016    source источник


Ответы (1)


Ваша первая попытка — удачная. На самом деле, в Ecore можно смоделировать наоборот. Для этого вам нужно смоделировать два EReferences по отношению к одному и тому же объекту (то есть две рефлексивные ссылки), а затем установить свойство eOpposite одного из ваших EReference на другое.

Вот простая метамодель с набором 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" />

С помощью этой метамодели вы можете создать Graph, который содержит множество Node. Каждый узел может reference других узлов. Если Node A является ссылкой на другое имя B, коллекция relatives B автоматически обновляется A.

person Vincent Aranega    schedule 08.04.2016
comment
Спасибо за направление. Но теперь это как вход и выход связи. Это хорошая идея, чтобы автоматически добавлять ссылки на родственников (в сгенерированном коде), чтобы я мог пройти через график, только используя одну из ссылок. - person zumbie; 09.04.2016
comment
ou я забыл: и если да, то где было бы место для реализации этого двойного добавления (или лучше синхронизации списков литературы). Кстати: на исходный вопрос дан ответ, поэтому я отмечаю ваш. еще раз спасибо. - person zumbie; 09.04.2016
comment
Я не уверен, что правильно понял ваше требование. С решением, которое я вам дал, вы можете пройти через график, используя, например, только коллекцию references. Две коллекции автоматически синхронизируются, если вы поместите элемент в одну из двух коллекций, другая будет обновлена. - person Vincent Aranega; 11.04.2016
comment
Я имею в виду, что использование только коллекции references для перемещения по графику позволяет мне делать это только в одном направлении. Если, например, будет хороший путь от Node A к Node B, но пользователь устанавливает соединение, добавляя Node A к Node Bs справочной коллекции, я не найду путь, начав с Node A. Чтобы преодолеть эту проблему, я думал о синхронизации двух коллекций самой ноды (экземпляров), но с ECP у меня проблемы с поиском правильного хука. Возможно, настройка элемента управления была бы решением. - person zumbie; 11.04.2016
comment
Хорошо, я думаю, я понял. Решение может состоять в том, чтобы смоделировать экстрарефлексивный EReference и установить его как [0..*] и derived. Производные коллекции вычисляются, и в коде EMF генерируются только их пустые методы. Таким образом, в коде, сгенерированном метамоделью, вы можете вычислить новое значение EReference, выполнив объединение между relatives и references. Поскольку эта коллекция является производной, она будет доступна только для чтения. Надеюсь это поможет. - person Vincent Aranega; 11.04.2016