Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Python脚本无法保存连接器-企业架构师_Javascript_Python_Enterprise Architect - Fatal编程技术网

Javascript Python脚本无法保存连接器-企业架构师

Javascript Python脚本无法保存连接器-企业架构师,javascript,python,enterprise-architect,Javascript,Python,Enterprise Architect,我正在尝试使用Python向EA模型添加新的连接器。不幸的是,当我的脚本运行时,它没有添加连接器。通过EA Javascript控制台用Javascript编写的相同脚本可以添加连接器 奇怪的是Python脚本没有失败。其行为类似于添加了连接器。如果刷新正在连接的元素,则显示连接器在那里。我甚至可以从Python控制台获得ConnectorID PYTHON: 从win32com.client导入分派 导入操作系统 ea=调度(“ea.App”) rep=ea.Repository path=o

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

奇怪的是Python脚本没有失败。其行为类似于添加了连接器。如果刷新正在连接的元素,则显示连接器在那里。我甚至可以从Python控制台获得ConnectorID

PYTHON:

从win32com.client导入分派
导入操作系统
ea=调度(“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(“,“关联”)
newCon.ClientID=e1.ElementID
newCon.SupplierID=e2.ElementID
newCon.Update()
JAVASCRIPT:

e1=Repository.GetElementByID(121228);
e2=Repository.GetElementByID(120663);
newCon=e1.Connectors.AddNew(“,”关联”);
newCon.ClientID=e1.ElementID;
newCon.SupplierID=e2.ElementID;
newCon.Update();

我希望连接器作为企业架构师中元素上的链接可见-从Python运行时我找不到它,从Javascript运行时我可以找到它。

出于某种奇怪的原因,您需要调用不带大括号的update

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
它是从整体上切下来的,但你可以把它作为开始。Singleton可以在SO(IIRC)的某个地方找到。用法:


出于某种奇怪的原因,您需要调用不带大括号的update

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
它是从整体上切下来的,但你可以把它作为开始。Singleton可以在SO(IIRC)的某个地方找到。用法:

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

rep.OpenFile(path)
正因为如此,它无法连接。在对此脚本进行故障排除时,该行一定丢失了

我认为第二个问题是,我的Python控制台在以前的会话中仍然是打开的,并且我打开了多个EA模型,因此EA在连接到所需模型时的行为有些奇怪(正如我所说,我在脚本中得到反馈,就好像我连接了一样)

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

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

rep.OpenFile(path)
正因为如此,它无法连接。在对此脚本进行故障排除时,该行一定丢失了

我认为第二个问题是,我的Python控制台在以前的会话中仍然是打开的,并且我打开了多个EA模型,因此EA在连接到所需模型时的行为有些奇怪(正如我所说,我在脚本中得到反馈,就好像我连接了一样)


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

谢谢你的回复。我想我找到了答案——我在排除故障时忘记了行:rep.OpenFile(path)。看起来con.update和con.update()现在都在为我工作。感谢您指出额外的clientId.Oops。这是显而易见的。实际上,我使用了一个用于存储库的包装器类,它打开了一个正在运行的实例,并提供了一些额外的功能。听起来很激动人心,想了解一下您使用的包装器吗?谢谢您的回复。我想我找到了答案——我在排除故障时忘记了行:rep.OpenFile(path)。看起来con.update和con.update()现在都在为我工作。感谢您指出额外的clientId.Oops。这是显而易见的。事实上,我使用了一个用于存储库的包装器类,它打开了一个正在运行的实例,并提供了一些额外的功能。听起来很激动人心,想了解一下您使用的包装器吗?