erwin提供了api,但没有说明Java如何调用erwin,可以能得到详细的帮助和解答,谢谢。

erwin提供了api,但没有说明Java如何调用erwin,怎么通过Java程序调用Erwin的api,需要能给出具体详细的方案

1、ERWIN API介绍
ERWIN的API叫SCAPI ,全称是Script Client API,是ALLFUSION DM 的一部分,可用于客制化插件开发和第三方工具。
SCAPI的逻辑分层如下:
Application Tier
Model Directory Tier
Session Layer
Model Data Tier

相关文档如下:
ERWIN安装目录下的Doc\ERwin_API_Ref.pdf,里面的介绍很全面,并有用C#和VB操作的相关代码,英文文档。
[url=http://dl.iteye.com/topics/download/e5ef8847-d155-36a7-a3e2-154fcf00b9de]ERPWIN API 使用指南[/url],中文文档,不过里面的示例代码看着有点乱

2、相关细节
由于导出的模型中的Definition属性中已经有中文名(从数据库中的comment导出的),这里实现只需将对应的Entity和Attribute的名字改为对应的definition中的内容即可。
我是使用的python和pywin32调COM接口来实现的

#创建COM对象
scapi = win32.Dispatch('AllFusionERwin.SCAPI')
#建立与持久装置中模型的连接
scPUnit = scapi.PersistenceUnits.Add(filename,"RDO=yes")
#建立存取内存中模型数据的连接
scSession = scapi.Sessions.Add()
scSession.Open(scPUnit,0,0)
#事务控制
scTranId = scSession.BeginTransaction()
#获取所有Entity模型对象
scMObjects = scSession.ModelObjects.Collect(scSession.ModelObjects.Root,'Entity',1)
for scObj in scMObjects:
#取Definition属性的值
scDefineName = scObj.Properties('Definition').Value
#对象名赋值
scObj.Properties('Name').Value = scDefineName
#获取该Entity的所有Attribute对象
scAttrObjects = scSession.ModelObjects.Collect(scObj,'Attribute',1)
#Attribute名的修改与上面类似
...
scSession.CommitTransaction(scTranId)
#另存为一个新的文件
scPUnit.Save(newfilename,'OVF=yes')

#!/usr/bin/python  
# -*- coding: UTF8-*-  
# robot_lei  
import win32com.client  
import re  
  
  
# 创建COM对象  
#scapi = win32com.client.Dispatch('AllFusionERwin.SCAPI')  
scapi = win32.Dispatch('AllFusionERwin.SCAPI')
# conn=win32com.client.Dispatch('ADODB.Connection')  
# 建立与持久装置中模型的连接  
# 源文件  
filename = "D:\\yssmodel1.erwin"  
# 目标文件  
newfilename = "D:\\yssmodel1p.erwin"  
scPUnit = scapi.PersistenceUnits.Add(filename, "RDO=yes")  
# 建立存取内存中模型数据的连接  
scSession = scapi.Sessions.Add()  
scSession.Open(scPUnit, 0, 0)  
# 事务控制  
scTranId = scSession.BeginTransaction()  
# 获取所有Entity模型对象  
scMObjects = scSession.ModelObjects.Collect(scSession.ModelObjects.Root, 'Entity', 1)  
for scObj in scMObjects:  
    # 取Definition属性的值  
    try:  
        scDefineName = scObj.Properties('Definition').Value  
    except Exception as ex:  
        scDefineName = ''  
    try:  
        scName = scObj.Properties('Name').Value  
    except Exception as ex:  
        scName = ''  
    # 对象名赋值  
    # print "His scName is %s" % scName  
    # print "His scDefineName is %s" % scDefineName  
    scObj.Properties('Physical_Name').Value = scName  
    scObj.Properties('Name').Value = scDefineName  
    # 获取该Entity的所有Attribute对象  
    scAttrObjects = scSession.ModelObjects.Collect(scObj, 'Attribute', 1)  
    for scAttrObj in scAttrObjects:  
        # scAttrDefineName = scAttrObj.Properties('Definition').Value  
        # scAttrName = scAttrObj.Properties('Name').Value  
        try:  
            scAttrDefineName = scAttrObj.Properties('Definition').Value  
        except Exception as ex:  
            scAttrDefineName = ''  
        try:  
            scAttrName = scAttrObj.Properties('Name').Value  
        except Exception as ex:  
            scAttrName = ''  
        # 对象名赋值  
        scAttrObj.Properties('Physical_Name').Value = scAttrName  
        # 注释可能带有括号之类的 这边做了特殊处理,不要处理的直接注释掉if代码即可  
        if scAttrDefineName != '':  
            scAttrDefineName = scAttrDefineName.replace('(', '(')  
            is_find = re.findall(r'\(', scAttrDefineName)  
            if is_find:  
                scAttrDefineName = re.findall(r'(.*?)\(', scAttrDefineName)  
                scAttrDefineName = scAttrDefineName[0]  
        scAttrObj.Properties('Name').Value = scAttrDefineName  
scSession.CommitTransaction(scTranId)  
# 另存为一个新的文件  
scPUnit.Save(newfilename, 'OVF=yes')