【问题标题】:Python Script unable to save Connector - Enterprise ArchitectPython 脚本无法保存连接器 - Enterprise Architect
【发布时间】:2019-11-09 18:14:42
【问题描述】:

我正在尝试使用 Python 将新连接器添加到 EA 模型。不幸的是,当我的脚本运行时,它没有添加连接器。通过 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 中作为元素上的链接可见 - 从 Python 运行时我无法找到它,但从 Javascript 运行时我能够找到它。

【问题讨论】:

    标签: javascript python enterprise-architect


    【解决方案1】:

    由于某些奇怪的原因,您需要在没有大括号的情况下调用更新。

    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 的方式......

    注意连接器已经设置了clientId,因此您不需要该分配。


    这是我的包装类的摘录

    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
    

    它是从整体中删除的,并且遗漏了部分,但您可以将其作为开始。可以在 SO (IIRC) 上的某处找到 Singleton。用法:

    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)。看起来 con.update 和 con.update() 现在都在为我工作。感谢您指出额外的 clientId。
    • 糟糕。那是显而易见的。实际上,我为存储库使用了一个包装类,它打开了一个正在运行的实例并提供了一些附加功能。
    • 听起来令人兴奋,想了解一下您使用的包装纸吗?
    【解决方案2】:

    终于明白了。 主要问题是我在定义路径后缺少以下行:

    rep.OpenFile(path)
    

    因为它不会连接。在对该脚本进行故障排除时一定丢失了这一行。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多