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')