Python 脚本无法保存连接器 - Enterprise Architect

Python Script unable to save Connector - Enterprise Architect

我正在尝试使用 Python 向 EA 模型添加新的连接器。不幸的是,当我的脚本 运行s 时,它没有添加连接器。通过 EA Javascript 控制台在 Javascript 中编写的相同脚本能够添加连接器。

奇怪的是 Python 脚本没有失败。它的行为就像添加了连接器一样。如果我刷新正在连接的元素,连接器似乎就在那里。我什至可以从 Python 控制台获取 ConnectorID。

PYTHON:

from win32com.client import Dispatch
import os

ea = Dispatch("EA.App")
rep = ea.Repository
path = os.path.normpath("C:/temp/eaFile.eap")

e1 = rep.GetElementByID(121228)
e2 = rep.GetElementByID(120663)
newCon = e1.Connectors.AddNew("","Association")
newCon.ClientID = e1.ElementID
newCon.SupplierID = e2.ElementID
newCon.Update()

JAVASCRIPT:

e1 = Repository.GetElementByID(121228);
e2 = Repository.GetElementByID(120663);
newCon = e1.Connectors.AddNew("", "Association");
newCon.ClientID = e1.ElementID;
newCon.SupplierID = e2.ElementID;
newCon.Update();

我希望连接器在 Enterprise Architect 中的元素上作为 link 可见 - 当 运行 来自 Python 时我找不到它,我能够从 Javascript.

运行 时找到它

出于某些奇怪的原因,您需要不带大括号调用更新。

e1 = rep.getelementbyguid("{B2F19D81-1475-41f2-BABD-AA66E11FAE10}")
e2 = rep.getelementbyguid("{86DFDB7C-0838-47eb-8402-384701170C34}")
con = e1.connectors.addnew("", "Dependency")
con.supplierId = e2.elementId
con.update

对我有用。我从来没有研究过为什么,我只是习惯了EA的方式...

N.B。连接器已设置 clientId,因此您不需要该分配。


这是我的包装纸的摘录 class

import win32com.client
from singleton import Singleton
import errorlogger
import eacodes
import xml.etree.ElementTree as ET
import re
import os

@Singleton
class Repository:
    def __init__(self):
        try:
            app = win32com.client.GetActiveObject("EA.App")
            self.eaRep = app.Repository
            models = self.eaRep.models
            done = True
        except Exception as e:
            print (e)
            done = False
        if not done:
            logger = errorlogger.ErrorLogger.Instance()
            logger._fatal("Can not find a running EA instance")

        self.base = self.eaRep.connectionstring
        if os.path.exists(self.base):
            path, self.base = os.path.splitext(self.base.lower())
        else:
            self.base = "server"
        self.wildcard = "%" if self.base == ".eap" else "*"

    def query(self, sql):
        root = ET.fromstring(self.eaRep.SQLQuery (sql))
        data = root.getchildren()
        if len(data) == 0: return []
        ds = data[0][0]
        rows = []
        for row in ds:
            cols = []
            for col in row.getchildren(): cols.append(col.text)
            rows.append(cols)
        return rows

它是从整体上剪下来的,但是你可以把它作为一个开始。 Singleton 可以在 SO (IIRC) 的某个地方找到。用法:

rep = Repository.Instance()
e = rep.getElementByGuid("{B2F19D81-1475-41f2-BABD-AA66E11FAE10}")
print e.name
for row in rep.query("SELECT name FROM t_object"):
    print row[0]

终于想通了。 主要问题是我在定义路径后遗漏了以下行:

rep.OpenFile(path)

因此无法连接。一定是在对此脚本进行故障排除时丢失了这一行。

我认为次要问题是我的 Python 控制台在之前的会话中仍处于打开状态,并且我打开了多个 EA 模型,因此 EA 与所需连接的行为方式有些奇怪模型(就像我说的,我在脚本中得到了反馈,就像我已经连接一样)。

我认为这里最大的好处是 EA 喜欢在我每次成功 运行 一个针对存储库的 python 脚本时重新加载项目,关闭所有打开的 windows应用程序(可能用于拾取更改)。如果 EA 没有放弃你的工作,那你就做错了!