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

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

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

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

спасибо

4 ответов


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


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

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

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

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

так:

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

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

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

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

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

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


Я знаю, что это старый, но я думаю, что у меня какая-то польза :)

самый простой ответ уже был дан, и это" найти сирот " вещь. Теперь при очистке большого репозитория 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 с помощью Control+F / Builder / SQL)


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

  1. Ctrl + F ,чтобы "найти в проекте".
  2. выберите "Поиск по диаграмме" в раскрывающемся списке категория поиска.
  3. выберите "Найти сирот" из выпадающего списка поиска.
  4. оставьте пустым, чтобы найти всех детей-сирот.
  5. Нажмите кнопку Выполнить нажмите клавишу Ввод.