如何通过脚本从XMI正确导入完整的企业架构师项目?

2024-10-01 07:51:16 发布

您现在位置:Python中文网/ 问答频道 /正文

从一个正在运行的EA实例和一个打开的空项目(只包含一个空的根节点)开始,我试图编写一个简单的脚本,从.xmi文件导入一个完整的EA项目。我知道使用GUI可以很容易地完成,但我需要将该功能用于另一个问题

当我用GUI导入EA项目的.xmi时,我收到一条消息说

'XMI包含一个可以放置在项目浏览器根级别的模型。按“是”以根模型导入,按“否”以放置在所选包的下

并且可以选择这样做。(通过将项目从EA导出到.xmi,创建了.xmi文件)

当我运行脚本(见下文)时,它似乎选择了其中一个选项,这取决于我不知道的内容。主要是将导入项目的根节点置于已存在的空根节点下的节点。因此,项目结构混乱不堪

以下是脚本:

repo = eaApp.Repository
root = repo.Models[0]
projectInterface = repo.GetProjectInterface() 
newPkgGUID = projectInterface.ImportPackageXMI(root.PackageGUID, XMISourcePath, 1, 1) # actual import

我基本上想做的是,我总是想将导入项目的根节点放在根级别,但似乎无法访问从GUI操作时弹出的对话框

对这个问题有什么建议吗

脚本是用Python编写的


Tags: 文件项目实例模型功能脚本消息节点
2条回答

要做到这一点,您可能需要一些变通方法

  • 创建一个临时包以在其中进行导入
  • 在这个临时包中导入您的xmi文件
  • 导入后,在temp packagePackages集合中获取新包
  • 将新包的ParentID设置为0
  • Update()您的新软件包
  • RefreshModelView(0)以在项目浏览器中查看新模型结构

我刚刚测试过这个。为了加载XMI,您需要运行

newPkgGUID = projectInterface.ImportPackageXMI(root.PackageGUID, XMISourcePath, 1, 0)

所以条带GUID为零!这将在不询问的情况下替换模型的内容。完成后,浏览器中的模型将折叠,所有内容都将被替换。做那种事时你应该小心

现在,如果您的导入包含一个根节点,您将被迫执行一些额外的工作。EA将根作为视图放置在空的新根下。不太好

作为一些解决方法,您可能首先读取XMI并修改其中的根GUID,使其与新模型相同。该GUID为(例如,在该导出中)

<XMI.content>
    <UML:Model name="EA Model" xmi.id="MX_EAID_16B64057_C8E3_4697_A31B_3ABB87DB4D64">
        <UML:Namespace.ownedElement>
            <UML:Class name="EARootClass" xmi.id="EAID_11111111_5487_4080_A7F4_41526CB0AA00" isRoot="true" isLeaf="false" isAbstract="false"/>
            <UML:Package name="Model" xmi.id="EAPK_16B64057_C8E3_4697_A31B_3ABB87DB4D64" isRoot="true" isLeaf="false" isAbstract="false" visibility="public">

在上面的最后一行(在XMI的最开始)。使用Python很容易做到。您只需要创建一个临时文件,以便在以后的导入中使用。还请注意,格式与本机EA GUID不同。因此,原始EA GUID应该是{16B64057-C8E3-4697-A31B-3ABB87DB4D64}


旧答案

基本上,这是一个半生不熟的Sparx典型API。但是,您需要通过发出查询在包中查找目标GUID

repository.SQLQuery("SELECT ea_guid FROM t_packages WHERE ea_guid = '%s'" % guid)

如果结果返回一行,您就知道目标alread存在,并且您已经做出相应的反应。这意味着您必须导入到找到的包中。你也可以做一个

p = repository.getPackageByGUID(guid) 

以确定正确的导入包

让我感到奇怪的是,您使用的是Strip GUID,在任何情况下,它都应该创建一个与您放置位置无关的导入的新副本。我认为如果选中了Strip guid,对话框不会弹出

注意:条带GUID意味着EA将为任何内容创建元素。这是用于创建副本(如模式)。如果要恢复,则必须而不是启用条带GUID!这将使EA用该GUID替换现有元素(事实上,它有点复杂,但基本上就是这样)

相关问题 更多 >