我们正在对EA存储库中的数据进行一些自定义报告 - 即我们直接从存储库数据库中获取数据。问题是,我们还需要将绑定到指定元素的图表导出到单独的文件中 - 我正在尝试使用Java API来执行此操作。我想知道的是,我是否可以使用api连接到当前正在运行的EA实例,或者是否需要启动一个新实例(这会显着降低速度)。
或者还有其他方法可以实现这一目标吗?我是EA自动化界面的新手,所以我很感激任何提示。
答案 0 :(得分:2)
似乎可以使用JACOB和这个黑客:
爪哇:
import java.lang.reflect.Constructor;
import org.sparx.App;
import com.jacob.activeX.ActiveXComponent;
public class TestJava {
public static void main(String[] args) throws Exception {
ActiveXComponent c=ActiveXComponent.connectToActiveInstance ("EA.App");
Constructor<?> appConstructor=Class.forName("org.sparx.App").getDeclaredConstructor(long.class);
appConstructor.setAccessible(true);
App app=(App)appConstructor.newInstance(c.m_pDispatch);
app.GetRepository().GetConnectionString();
System.out.println(app.GetRepository().GetPackageByGuid("{9C9D301B-B54D-44fb-898A-0412497D39AA}").GetName());
}
}
Groovy的:
import org.sparx.App
import com.jacob.activeX.ActiveXComponent
ActiveXComponent c=ActiveXComponent.connectToActiveInstance ("EA.App")
println c.m_pDispatch
App app=new App(c.m_pDispatch);
println app.GetRepository().GetConnectionString()
println app.GetRepository().GetPackageByGuid("{9C9D301B-B54D-44fb-898A-0412497D39AA}").GetName()
答案 1 :(得分:1)
使用.Net,您可以使用System.Runtime.InteropServices
连接到正在运行的实例我不确定是否存在与Marshal.getActiveObject()
相当的Java
这是repository wrapper EA Addin Framework中连接到当前正在运行的实例的代码。
using System.Runtime.InteropServices;
/// Creates a model connecting to the first running instance of EA
public Model(){
object obj = Marshal.GetActiveObject("EA.App");
global::EA.App eaApp = obj as global::EA.App;
this.initialize(eaApp.Repository);
}
如果您有多个正在运行的实例,那么它似乎连接到第一个打开的实例。
答案 2 :(得分:0)
没有办法在EA API中连接EA客户端的运行实例。 EA的设计是客户端/服务器(服务器是数据库),因此没有多大意义。
但是,使用EA的脚本引擎也可以从EA内部获得自动化界面。相同的API,支持VBScript,JavaScript和JScript。
如果您在API中使用DocumentGenerator类,则可以结合您提到的两个任务 - 创建报告并将图表导出到文件。本身无法导出任何文件,但是如果您使用它意味着您自己遍历模型结构而不是让EA的内置文档生成工具为您执行此操作,并且您可以轻松添加一些图表 - 将文件导出到该代码。