Uml 删除Enterprise Architect中图表中未找到的所有元素

Uml 删除Enterprise Architect中图表中未找到的所有元素,uml,reverse-engineering,enterprise-architect,Uml,Reverse Engineering,Enterprise Architect,我们有一个大型项目,我正在使用EnterpriseArchitectVersion10将项目中的一个小包反向工程为UML,以便进行重构。我只想包括我将要创建的图中包含的元素(我知道这很愚蠢,但我们不能用一个模型来管理它们) 我想反转所有源代码,然后删除所有没有出现在我的图表中的元素。有办法做到这一点吗?我知道我可以从GUI中找到图表中的任何给定元素,那么至少有一种方法来编写脚本吗 另一种方法是手动选择所有依赖项并仅反转那些文件,我可能最终会这样做 谢谢是的,您可以编写脚本。这会有点牵扯,但可以做

我们有一个大型项目,我正在使用EnterpriseArchitectVersion10将项目中的一个小包反向工程为UML,以便进行重构。我只想包括我将要创建的图中包含的元素(我知道这很愚蠢,但我们不能用一个模型来管理它们)

我想反转所有源代码,然后删除所有没有出现在我的图表中的元素。有办法做到这一点吗?我知道我可以从GUI中找到图表中的任何给定元素,那么至少有一种方法来编写脚本吗

另一种方法是手动选择所有依赖项并仅反转那些文件,我可能最终会这样做


谢谢

是的,您可以编写脚本。这会有点牵扯,但可以做到

没有即时的API支持来查找您要查找的内容,因此您需要进入数据库以查找任何图表中未显示的所有元素。完成此操作后,可以从其包含的包中删除每个这样的元素

元素存储在
t\u object
中,图表对象(一个图表中一个元素的图形表示)存储在
t\u diagramobjects
中。
t\u diagramobjects
中的条目引用了图表(
diagram\u ID
)和正在显示的元素(
Object\u ID

(如果你是EA黑客新手,是的,它们在API中被称为元素,在数据库中被称为对象。这只是生活中的一个事实。)

因此:

  • 查找在
    t\u diagramobjects.object\u ID
    中未出现的所有
    t\u object.object\u ID
  • 循环遍历此集合,并使用
    Repository.GetElementByID()
    ,检索每个
    元素
  • 使用
    Repository.GetPackageByID(element.PackageID)
    获取元素的包含包
  • 在for循环中使用
    GetAt()
    旋转包的
    元素
    集合,找到
    元素
    ,该元素的
    ElementID
    与您要查找的元素匹配,然后
    Delete()
    删除它。不要忘了
    Refresh()
  • 有一个方法
    Repository.SQLQuery()
    ,它允许您对数据库执行
    select
    查询,但您必须解析单个XML字符串的结果

    使用
    Repository.GetElementsByQuery()
    更简单,它返回
    集合中的元素,但这需要将查询预定义为EA搜索。如果使用此选项,可以跳过上面的步骤1和2

    当然,您可以直接进入数据库,只需删除所有未从
    t\u diagramobjects
    中引用的
    t\u object
    行。这是一个非常糟糕的主意,它(我很肯定)会给您留下一个损坏的数据库。当您使用API删除内容时,EA会清理所有引用(因此没有连接器悬空,等等)

    当然,只有在绝对确定没有其他元素没有显示在需要保留的图表中时,才应该释放这样的脚本。因此,为这个项目做一个临时项目可能是个好主意


    最后,请注意,包也是元素,如果您不想通过删除它们所在的包而一次性丢失所有导入的源代码(因为包本身通常不会显示在图表中,是吗?),您可能应该排除
    t\u object.object\u Type
    /
    Element.Type
    “包”

    EA内置了一个名为“查找孤儿”的搜索功能。这将列出未出现在图表上的所有元素。您可以运行此搜索(Ctrl+Alt+A,从第一个列表框中选择“图表搜索”,从第二个列表框中选择“查找孤立项”,然后单击“运行”),选择所有结果(Ctrl+A)并删除所有结果(Ctrl+Del)。但是,这是由您自己承担的风险-模型中的元素没有问题,但任何图表上都没有。

    我知道这很旧,但我认为我有一些贡献:)

    最简单的答案已经给出了,那就是“寻找孤儿”这件事。现在,在清理我继承的一个大型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) 
    
    它只会返回“没有父母的孤儿”。当然,它可以改进为只返回“没有父母本身就是孤儿的孤儿”,但我不需要,可以做一些手工工作


    (您可以通过Control+F/Builder/SQL访问SQL搜索界面)

    Enterprise Architect版本12中的用户界面在查找孤立元素时似乎略有更改

  • 按Ctrl+F键“在项目中查找”
  • 从搜索类别下拉列表中选择“图表搜索”
  • 从搜索下拉列表中选择“查找孤立项”
  • 留空以查找所有孤儿
  • 单击运行或按Enter键

  • 很高兴知道我可以写这个。但是,我决定编写一个脚本,将我感兴趣的源文件中包含的所有文件复制到一个文件夹中,然后将所有这些文件反转,这样做会更容易。我不担心我感兴趣的班级的家长,因为他们很少。谢谢在未来的整个项目中,我们将朝着1个模型前进,但我们还没有做到。比(Ctrl+Alt+A)更小的“断指”是(Ctrl+F)。但是,找到未使用元素的好技巧。