Удалите все элементы, не найденные на диаграмме в Enterprise Architect

У нас большой проект, и я использую Enterprise Architect версии 10, чтобы перепроектировать небольшой пакет в проекте в UML для целей рефакторинга. Я хочу включать только элементы, которые будут содержаться в диаграммах, которые я собираюсь создать (я знаю, что это глупо, но мы не можем иметь 1 модель, чтобы управлять ими все).

Я хотел бы отменить все исходники, а затем удалить все элементы, которые не заканчиваются на моих диаграммах. Есть ли способ сделать это? Я знаю, что я могу найти любой элемент в диаграммах из графического интерфейса, так что, по крайней мере, был бы способ script this?

Альтернативой является вручную выбрать все зависимости и отменить только те файлы, которые я могу сделать.

Спасибо

Ответ 1

EA поставляется со встроенным поиском под названием "Найти сирот". Это отобразит все элементы, которые не отображаются на диаграмме. Вы можете запустить этот поиск (Ctrl + Alt + A, выбрать "Поиск диаграмм" из первого списка и "Найти сирот" из второго списка и нажать "Выполнить" ), выбрать все результаты (Ctrl + A) и удалить все ( Ctrl + Del). Однако это на свой страх и риск - нет ничего плохого в том, что элемент находится в модели, но не на каких-либо диаграммах.

Ответ 2

Да, вы можете script это. Это будет немного связано, но это можно сделать.

Нет непосредственной поддержки API для поиска того, что вы ищете, поэтому вам нужно будет зайти в базу данных, чтобы найти все элементы, которые не показаны ни на каких диаграммах. Как только вы это сделаете, вы можете удалить каждый такой элемент из его содержащего пакета.

Элементы хранятся в t_object и объектах диаграммы (графическое представление одного элемента на одной диаграмме) в t_diagramobjects. Запись в t_diagramobjects имеет ссылку на диаграмму (Diagram_ID) и на отображаемый элемент (Object_ID).

(Если вы новичок в взломе EA, да, они называются Elements в API и объектах в базе данных. Просто факт жизни.)

Итак:

  • Найти все t_object.Object_ID, которые не встречаются в t_diagramobjects.Object_ID.
  • Прокрутите этот набор и, используя Repository.GetElementByID(), извлеките каждый Element.
  • Извлеките элемент, содержащий пакет, используя Repository.GetPackageByID(element.PackageID).
  • С помощью пакета Elements с помощью GetAt() в цикле for найдите Element, чей ElementID совпадает с тем, который вы используете, и Delete(). Не забывайте Refresh() коллекцию впоследствии.

Существует метод Repository.SQLQuery(), который позволяет вам выполнить запрос select к базе данных, но вам нужно проанализировать результат из одной строки XML.

Проще использовать Repository.GetElementsByQuery(), который возвращает элементы в Collection, но для этого требуется предопределить запрос как поиск EA. Если вы используете это, вы можете пропустить шаги 1 и 2 выше.

Конечно, вы можете перейти прямо в базу данных и просто удалить все те строки t_object, на которые не ссылаются t_diagramobjects. Это ужасно плохая идея, которая (я уверен) оставит вас с поврежденной базой данных. Когда вы используете API для удаления вещей, EA очищает все ссылки (поэтому никакие разъемы не свисают и т.д.).

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

Обратите внимание, наконец, что пакеты также являются элементами, и если вы не хотите потерять весь свой импортированный источник одним махом, удалив пакет, в котором они находятся (поскольку сам пакет обычно не показан на диаграмме, это?), вы должны, вероятно, исключить t_object.Object_Type/Element.Type "Package".

Ответ 3

Я знаю, что это старо, но я думаю, что мне есть что предложить:)

Самый простой ответ уже дан, и это "Найти сирот". Теперь, читая большой репозиторий EA, который я унаследовал, я заметил, что есть случаи, когда данный объект может отсутствовать на диаграмме, но дочерний объект будет. В этом случае вы не хотите очищать родительский объект или можете потерять его.

Итак, я создал следующий поиск:

select 
    o.ea_guid as CLASSGUID, o.object_type as CLASSTYPE, * 
from 
    t_object o 
where 
        o.Object_Type != 'Package' 
    and
        not exists (select t_diagramobjects.Diagram_ID from  t_diagramobjects where t_diagramobjects.Object_ID = o.object_ID)
    and
        not exists (select t2.OBJECT_ID from t_object t2 where t2.PARENTID=o.OBJECT_ID) 

Он вернет только "сироты, у которых нет родителя". Конечно, его можно было бы улучшить, чтобы возвращать только "сироты, у которых нет родителя, который сам по себе является сиротой", но мне это не нужно, и я мог бы выполнить некоторую ручную работу...

(вы получаете доступ к интерфейсу SQL Search с помощью Control + F/Builder/SQL)

Ответ 4

Пользовательский интерфейс в Enterprise Architect версии 12, по-видимому, немного изменился для поиска сиротских элементов.

  • Ctrl + F для поиска в проекте.
  • Выберите "Поиск диаграмм" в раскрывающемся списке "Категория поиска".
  • Выберите "Найти сирот" из раскрывающегося списка "Поиск".
  • Оставьте пустым, чтобы найти всех сирот.
  • Нажмите "Выполнить" или нажмите "Enter".