Как я могу создать ссылку на существующие объекты модели? - PullRequest
3 голосов
/ 11 ноября 2010

Я новичок в MDSD / EMF, но добиваюсь больших успехов благодаря поддержке Eclipse.

Я создал игрушечную модель, на которую вчера ответили, как предложил awynne, и я очень близок.Я использую только EMF и его редактор сгенерированного дерева.

Вот краткая сводка моей метамодели EMF:

- EClass: Widget
  - name

- EClass: WidgetReference
  - aWidgetReference : Widget [0..1] Containment = false

- EClass: WidgetContainer
  - myWidgets : Widget [0..*] Containment = true

- EClass: ReferenceContainer
  - myReferences : WidgetReference [0..*] Containment = true

- EClass: TopLevelClass
  - myWidgetContainer    : [1] WidgetContainer    Containment = true
  - myReferenceContainer : [1] ReferenceContainer Containment = true

Теперь происходит то, что происходит в редакторе сгенерированного дерева для моделиЯ создаю все, начиная с TopLevelClass.Я могу успешно создать несколько виджетов в WidgetContainer, и я могу создать одну ссылку WidgetReference в ReferenceContainer и связать ее с конкретным виджетом.

В случае, если кто-то сталкивается с этим, в сгенерированном коде редактора EMF есть ошибка:

Когда я пытаюсь добавить более одной WidgetReference в ReferenceContainer, редактор дерева показывает только первыйWidgetReference под ReferenceContainer.Если я нажимаю на элемент WidgetReferences в дереве, он показывает несколько WidgetReferences в представлении свойств.Это просто не позволит мне увидеть их в дереве, и поэтому не позволит мне выбрать их, чтобы изменить их ссылку, чтобы связать ее с реальным виджетом.

Обходной путь для этого - создать столько ссылок, сколько вам нужно, сохранить и закрыть модель, а затем снова открыть ее.После повторного открытия все ссылки будут показаны.

Спасибо за любую помощь / руководство.

Джефф

Ответы [ 2 ]

4 голосов
/ 11 ноября 2010

Я думаю, что ответ на ваш вопрос связан с идеей «сдерживания».Любой родительский объект, у которого есть ссылка на содержание (contentsment = true в метамодели EMF) на дочерний объект, управляет жизненным циклом этого дочернего объекта.Поэтому, когда дочерний элемент создан, ссылка родителя на этот объект создается автоматически.Если ссылка не относится к типу сдерживания (contentsment = false), вы можете указать ссылку на любой существующий объект модели правильного типа.Я думаю, что вам нужно установить ссылку в качестве содержания = false.

Я не использовал Acceleo, поэтому давайте использовать редактор дерева EMF в качестве примера (концепция также применима к редактору GMF): В редакторе дереваесли родительский объект имеет ссылку на дочерний объект, пользователь может создать дочерний объект, щелкнув родительский элемент правой кнопкой мыши и выбрав «new -> child -> ChildObject».Если ссылка на дочерний элемент НЕ имеет типа сдерживания, пользователь сможет выбрать экземпляры этого объекта, которые уже существуют в модели, щелкнув соответствующее дочернее свойство в окне свойств родительского объекта.

Это помогает?Если это описание сбивает с толку, это может помочь создать игрушечную модель с некоторыми не содержащими ссылки ссылками и сгенерировать для нее редактор EMF.

0 голосов
/ 11 ноября 2010

Я не уверен, что концепция ссылок между моделями в EMF - это то, что вы описываете. Однако в модели вы do можете ссылаться на элементы в других моделях. В редакторе Generic EMF, в котором вы создаете экземпляры модели, вы можете нажать правую кнопку и затем выбрать «Загрузить ресурс ...». Этим новым ресурсом может быть любая другая модель, связанная с вашей моделью (ваша метамодель ссылается на метамодель другой модели).

Вы можете сделать это и на уровне метамодели. В графическом редакторе Ecore вы можете перетаскивать классы из других метамоделей. Они будут синхронизированы.

Я не уверен, однако, если это то, что вы спрашиваете.

...