2016-04-07 1 views
1

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

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

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

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

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

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

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

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

ответ

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 других узлов. Если NodeA в качестве ссылки на другую с именем B, то relatives коллекция B автоматически обновляется с помощью A.

+0

Спасибо за руководство. Но теперь это похоже на вход и выход. Это хорошая идея, чтобы автоматически добавлять ссылки на родственников (в сгенерированном коде), чтобы я мог проходить через график только с помощью одной из ссылок. – zumbie

+0

ou я забыл: и если да, где бы было место для реализации этого двойного добавления (или лучшей синхронизации списков ссылок). BTW: на исходный вопрос ответил, поэтому я отмечаю ваш. еще раз спасибо. – zumbie

+0

Я не уверен, что получил ваше требование. С помощью решения, которое я вам дал, вы можете перейти через график, используя, например, только коллекцию 'reference'.Две коллекции автоматически синхронизируются, если вы поместите элемент в один из двух коллекций, другой будет обновлен. –