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

Posted

技术标签:

【中文标题】删除 Enterprise Architect 图表中未找到的所有元素【英文标题】:Remove all elements not found in diagram in Enterprise Architect 【发布时间】:2014-01-01 18:53:51 【问题描述】:

我们有一个大型项目,我正在使用 Enterprise Architect 版本 10 将项目中的一个小包逆向工程为 UML,以进行重构。我只想包含将包含在我要创建的图表中的元素(我知道这很愚蠢,但我们不能有 1 个模型来统治它们)。

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

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

谢谢

【问题讨论】:

【参考方案1】:

EA 带有一个名为“Find Orphans”的内置搜索。这将列出所有未出现在图表上的元素。您可以运行此搜索(Ctrl+Alt+A,从第一个列表框中选择“Diagram Searches”,从第二个列表框中选择“Find Orphans”并单击“运行”),选择所有结果(Ctrl+A)并删除所有( Ctrl+Del)。但是,这需要您自担风险 - 模型中的元素没有任何问题,但任何图表中都没有。

【讨论】:

比 (Ctrl + Alt + A) 更小的“手指断裂”是 (Ctrl + F)。但是,找到未使用元素的好技巧。【参考方案2】:

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

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

元素存储在t_object 中,图表对象(一个图表中一个元素的图形表示)存储在t_diagramobjects 中。 t_diagramobjects 中的条目引用了图表 (Diagram_ID) 和正在显示的元素 (Object_ID)。

(如果您是 EA 黑客新手,是的,它们在 API 中称为 Elements,在数据库中称为 Objects。这就是生活中的事实。)

所以:

    找出所有在t_diagramobjects.Object_ID中没有出现的t_object.Object_ID。 遍历这个集合,并使用Repository.GetElementByID()检索每个Element。 使用Repository.GetPackageByID(element.PackageID) 获取元素的包含包。 在 for 循环中使用 GetAt() 旋转包的 Elements 集合,找到 ElementElementID 与您所追求的和 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"

【讨论】:

很高兴知道我可以编写这个脚本。但是,我决定编写一个脚本更容易,该脚本将包含在我感兴趣的源文件中的所有文件复制到一个文件夹中,然后将所有这些文件反转。我不担心我感兴趣的班级的父母,因为他们很少。谢谢。未来我们将朝着整个项目的 1 模型迈进,但我们还没有。【参考方案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) 

它只会返回“没有父母的孤儿”。当然,它可以改进为只返回“没有父母本身就是孤儿的孤儿”,但我不需要那样做一些手工工作......

(通过Control+F/Builder/SQL访问SQL Search界面)

【讨论】:

【参考方案4】:

Enterprise Architect 版本 12 中的用户界面似乎略有改变,可用于查找孤立元素。

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

【讨论】:

以上是关于删除 Enterprise Architect 图表中未找到的所有元素的主要内容,如果未能解决你的问题,请参考以下文章

如何利用 Enterprise Architect画序列图

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

EnterPrise Architect画业务用例图

数据建模的三种分类(来自Enterprise Architect的文档)

将嵌套组件拖放到Sparx Enterprise Architect(EA)中的图表中

EnterPrise Architect画流程图