Python Script не может сохранить Connector - Enterprise Architect - PullRequest
1 голос
/ 08 ноября 2019

Я пытаюсь добавить новые коннекторы в модель советника, используя Python. К сожалению, когда мой скрипт запускается, он не добавляет Connector. Тот же сценарий, написанный на Javascript через консоль EA Javascript, может добавить соединитель.

Странно, что сценарий Python не дает сбоя. Он ведет себя так, как будто добавил Connector. Если я обновляю подключенные элементы, кажется, что Соединитель там. Я даже могу получить ConnectorID из консоли Python.

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.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

По какой-то странной причине вам нужно вызвать обновление без скобок.

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

у меня сработало. Я никогда не исследовал почему, я просто привык к советнику ...

NB В коннекторе уже установлено 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). Использование:

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]
1 голос
/ 08 ноября 2019

Наконец-то разобрался. Основная проблема заключалась в том, что мне не хватало следующей строки после определения моего пути:

rep.OpenFile(path)

Из-за этого он не мог подключиться. Должно быть, эта строка была потеряна при устранении неполадок в этом сценарии.

Я думаю, что второстепенная проблема заключалась в том, что моя консоль Python все еще была открыта с предыдущих сессий, и у меня было открыто несколько моделей EA, поэтому была некоторая странность в том, как EAвел себя с подключением к нужной модели (как я уже говорил, я получал обратную связь в сценарии, как будто я был подключен).

Я думаю, что самое большое разочарование здесь заключается в том, что EA любит перезагружать проект каждый раз. В то время, когда я успешно запускаю скрипт Python для репозитория, закрывая все открытые окна в приложении (возможно, для получения изменений). Если EA не отказывается от вашей работы, вы делаете что-то не так!

...