1. 前言
Teamcenter Engineering(TCEng)是UGS 公司开发的专门为企业提供产品数据管理的PDM(Product Data Management)软件系统,由一个窗口工作界面、一组实用程序、一个集成开发工具包ITK(INTEGRATION TOOLKIT)和一个关系数据库管理系统(ORACLE)组成,支持建立、存储、检索和管理在产品研发过程中使用的各种数据,对于产品设计、制造、测试等过程中的各种数据及相关的组织信息提供了集成的、安全的、可控制的多种访问路径。该系统采用C/S 结构,其客户端和服务器端均能够进行二次开发以满足用户的特殊需求。其中,客户端使用JAVA 语言开发的用户界面层,同样它的二次开发也使用JAVA 语言;服务器端的二次开发则要利用ITK 工具包及C 语言,ITK 实质上就是一套经过封装的C 语言程序集。利用ITK 可以开发报表、客户化TCEng 接口、定制新窗体等。
报表的自动化生成对企业成功实施PDM 系统有着重要意义。尽管TCEng 中PSE 程序处理BOM 方面功能非常强大,但缺乏对各类清单的输出和打印功能,另外,由于企业内部各类报表都有固定的模版和格式,比如产品(组件、部件)按装配关系排列的全套图样清单;表示产品(组件、部件)组成部分的代号、名称数量和材料等的清单;对产品及其组成部分按需要进行分类,整理汇总而编制的清单等都有固定的格式。报表系统既要统计出符合要求的数据,又要使生成的报表符合规定的格式,并且要嵌入TCEng 系统运行,实现无缝集成。本文对这些功能的开发过程进行了详细的阐述,以期对当前从事TCEng二次开发的人员有所帮助。本文的开发基于我院目前应用的Teamcenter EngineeringV9.1 版本,对其他版本的开发同样具有借鉴意义。
2. 二次开发方法
2.1 开发工具及环境搭建
客户端开发需要的工具为JDK1.4.2 或更高;JAVA 集成开发环境(IDE)如:Eclipse,JBuilder 等。JBuilder 是一种非常不错的JAVA 开发工具,但价格昂贵;Eclipse 是一个完全免费的开源项目,同Eclipse 提供了plug-in 的功能,并且Eclipse在资源占用率、响应速度方面都较JBuilder 更为出色,在开发中选用了Eclipse。
从Eclipse 官方网站www.eclipse.org 中可以下载到最新的压缩包。使用前需要首先安装JDK,并设置JAVA_HOME 及CLASSPATH 环境变量的值,然后解压缩到指定的目录就可以了。在Windows 平台下,例如JDK 安装在C:\j2sdk 目录下,Eclipse 安装在D:\eclipse 目录下。先设置环境变量JAVA_HOME=C:\j2sdk,然后运行D:\eclipse 下的eclipse.exe 即可。Eclipse启动后需配置外部库文件、源文件夹名和输出文件夹名等,外部库文件路径为%PORTAL_ROOT%portal.jar,PORTAL_ROOT是指TCENG PORTAL 的安装路径,源文件夹名和输出文件夹名可以分别设为src 和classes。然后使用File-〉New-〉Project,这样,新建的工程下就有两个文件夹,源文件夹src 和输出文件夹classes。
服务器端的二次开发要利用ITK 工具包及C 语言,需要安装VC,并设置MSDEV_HOME 环境变量的值。利用ITK 开发时,经常要用到以下几个目录(TCENG_ROOT 是指TCENG 的安装路径):
1)可执行文件:在%TCENG_ROOT%\bin 目录下;
2)头文件:在%TCENG_ROOT%\include 目录下;
3)库文件:在%TCENG_ROOT%\lib 目录下;
4)编译和连接脚本及ITK 程序示例:在%TCENG_ROOT%\sample 下;
2.2 客户端的二次开发
TCENG 客户端(portal)的二次开发分为注册程序和开发程序两个阶段。对portal 开发而言,注册程序是一个至关重要的环节。所谓注册程序,就是要在TCENG 的界面上的某个程序组内增添程序入口,用于启动新开发的程序。不论是二次开发,还是portal 自身的原开发,都是通过这一注册机制调用属性文件来定义应用程序的实现类(classes)、启动图标、本地化标题等。
2.2.1 注册程序
注册程序的具体实现步骤如下:
1)在PORTAL 界面上增加一个新组 :
在PORTAL 安装路径下找到Portal_user.properties 文件(或使用Portal.properties 文件,前者具有更高优先权),在GROUPS=IMAN,IMANAdministrator,Utilities 的行末增加新组名, 假设为mytools , 如下所示:
“GROUPS=IMAN,IMANAdministrator,Utilities,mytools”。
重新启动Portal 后可看到新增的组mytools,在组内可加入按钮以调用客户程序。如果不需要增加新的组,可直接进行第二步。
2)在组中加进客户程序:
a. 运行Utilities 组内的快速向导(Application Wizard),然后输入应用程序名称,假设为mypro,并按下一步(Next)。
b. 在左边拉开某个组,比如刚创建的组mytools,使客户程序的按钮加入到该组,按下一步。
c. 输入客户程序的包名,例如“com.mycom.mypro”,缺省值是“com.mypro”。然后单击某适当目录,系统将在该目录下自动建立与包名对应的子目录,并使所有与该客户程序相关的源文件在该子目录下生成。
系统在目录mypro 中自动生成六个文件:
mypro.properties 、mypro_user.properties 、MyproApplication.java 、
MyproApplicationMenuBar.java、MyproApplicationPanel.java、MyproApplicationToolBar.java。
前两个文件是程序注册文件,用户可使用mypro_user.properties 也可使用mypro.properties来注册程序,前者可覆盖后者。系统自动使用后者。
后四个文件分别创建了四个应用类。要集成到portal 的程序要有一个基类,它应是类AbstractAIFUIApplication 的子类。
d. 按下一步后接受缺省的类名,按下一步,再按“Yes”按钮以创建新类。然后用单击方式选择Portal 的安装目录,在这个路径中含有portal.jar 等TCEng 的JAVA 类库。按下一步后系统显示“成功创建程序”。这时portal_user.properties 系统注册文件自动修改,完成客户程序的注册。
2.2.2 开发程序
经过注册之后的新程序只是一个框架,并不能执行任何功能。程序开发阶段就是对前述空壳源文件进行代码编写、调试、编译的过程。所需要的工具就是java 语言的编译环境,包括JDK 或Eclipse 这样的java 集成开发环境(IDE)等。本文直接运用JDK1.4.2 和IDE 工具Eclipse 进行开发。
当开发完成后,用%JAVA_HOME%\bin\javac 命令编译客户程序,然后用%JAVA_HOME%\bin\jar 命令打包java 类、图标文件、属性文件等。当然,也可以直接使用IDE 工具进行编译。最后,编辑portal.bat 文件,将客户程序(如Mypro.jar)包含到portal.jar 之前,如下所示:
Set JAVA_COMMAND_LINE=%JAVA_COMMAND% -DIMAN_DATA=%IMAN_DATA% %JAVA_HEAP_SIZE%
-classpath “%IPR%;…%IPR%\Mypro.jar;…%IPR%\portal.jar;…%CLASSPATH%”。
2.3 服务器端的二次开发
服务器端的二次开发主要是动态链接库libserver_exits.dll 和libuser_exits.dll,部署在%TCENG_ROOT%\bin 目录下。环境设置及开发过程以libserver_exits.dll 为例说明如下:
1)建立新文件夹server_exits;
2)在server_exits 目录下创建所需的程序文件;
3)把%TCENG_ROOT%\sample 目下的compile.bat 和link_server_exits.bat 以及%TCENG_ROOT%\sample\userservice 目录下的user_server_exits.c 和user_server_exits.h 拷贝到新建的server_exits 目录下;
4)启动TCEng Menu 到TCENG Dos 环境下;也可以通过set 命令设置;
5)编译:compile –DIPLIB=libserver_exits *.c;
6)连接:link_server_exits。经过以上步骤,在server_exits 目录下生成libserver_exits.dll 文件,将之拷贝到%TCENG_ROOT%\bin 目录下即可。
3. 基于Teamcenter Engineering报表系统的设计实现
3.1 系统设计思想
由于报表系统嵌入PDM 系统运行,二次开发工作既有客户端的界面设计,也要在服务器端进行二次开发实现数据提取及处理。该系统的设计思路是:采用客户/服务器模式,利用TCEng portal 端提供的API 在portal 窗口工作界面上增加报表输出的菜单项,并开发类似PSE 中BOM 树形结构的选择界面供用户选择要输出的子部件;在服务器端开发动态链接库libserver_exits.dll,每个菜单命令响应对应Dll 模块里面的某个主功能函数,动态链接库实现将需要的数据按要求排序汇总后提取到系统临时文件目录下的中间文本文件中;最后,利用脚本来处理将中间文本文件的数据写入到已定制好的Word 模版或Excel 模版中。脚本和模版可以放在数据集中,调用时先把脚本和模版从数据集中导出到临时文件目录下,动态链接库放在%TCENG_ROOT%\bin 目录下,客户端二次开发的jar 包部署在portal.jar 之前。
3.2 软件架构
基于对报表系统的报表系统由三个模块实现:界面交互部分是Java 实现的,提取数据到中间文本文件是由C 实现的,把中间文本文件中的数据读取到定制的word 模版或excel 模版中是由VBA 脚本实现的,如图1 所示。 (图片)
图1 系统架构 主程序主要是响应交互界面上的“确定”按钮,主要功能是接收用户选择的BOMLine,并获得动态链接库服务句柄,将BOMLine 转换为Object 对象之后,调用动态库中处理函数,然后将已定义好的word 模板文件或excel 模版文件(根据用户在界面上的选择而定)和脚本文件从数据集中导出到临时文件目录下,利用java 的runtime.exec()方法执行脚本文件,由脚本来处理将中间文本文件的数据写入到word 模版文件或excel 模版文件,格式为:wscript.exe + 脚本文件 + 中间文本文件 + 要生成的word 或excel 文件 + word 或excel 模版文件,并在客户端直接打开生成的word 或excel 文件。
3.3 关键技术及解决方案
3.3.1 交互界面的设计
由于报表汇总涉及到汇总单层BOM 和多层BOM,而PSE 中的BOM 树形结构列出的是该产品下的所有装配信息,没有提供对单层BOM 的选择功能,所以有必要通过二次开发实现单BOM 的所有层汇总、多BOM 的单层汇总、多BOM 的所有层汇总。实现方式为通过带有复选框的树形结构形式在界面上显示该BOMLine 下的子BOMLine 信息供用户选择。当选择单个BOMLine 及该BOMLine 下的所有下层BOMLine 时,可实现单BOM 的所有层汇总;当选择多个BOMLine 而不选择其下一级BOMLine 时,可实现多BOM 的单层汇总;当选择多个BOMLine 及这些BOMLine 下的所有下层BOMLine 时,可实现多BOM 的所有层汇总。
3.3.2 统计信息的获取
报表汇总中需要提取的信息可分为三部分,这三部分信息的提取都是通过ITK 函数实现的。一类信息是在当前的BOMLine 属性中的,这是BOMLine 的固有属性,如bl_quantity 表示当前BOMLine 的数量属性,这些在PSE 中可以进行添加或者修改;另一部分是BOMLine 所代表的item revision 本身属性,如创建日期、创建人等,这些信息可以通过AOM_ask_value_()函数获得其值;第三部分信息存在于当前BOMLine 所代表的item revision 的form 中,当用TCEng缺省的item 类型创建一个零部件时,在查看器中显示的代号、名称等就属于form 信息,可以在浏览器中查看或者修改。要提取form 中包含的信息,首先必须通过当前的BOMLine 获取item revision,然后通过item reivision 获取本item 的form,最后通过此form 的AOM_ask_value_()函数来获得form 属性。其代码实现一般如下:
获取BOMLine 的属性bl_quantity:
ifail = AOM_ask_value_string(bomline, "bl_quantity", &quantity );
获取form 的属性Part_No:
ifail=ITEM_list_rev_attachs_of_type(item_rev_tag,ITEM_item_master_atth,&number_found,&objects);
for(i=0;i{
ifail = WSOM_ask_object_type(objects[i].attachment,object_type);
if((strcmp(object_type,"ItemRevision Master") == 0)&& (found == 0))
{
found=1;
form=objects[1].attachment;
break;
}
}
if(found ==1)
ifail = AOM_ask_value_string(form,"Part_No",&partno);
3.3.3 client 端与server 端的通讯机制
UserService 机制可实现在client 端调用TCEng 系统中注册的程序,并且UserService 在通讯层不需要任何的协议约束,只需关注server 端和client 端的函数即可。
通过UserService实现在client端调用TCEng中注册的函数,需要如下三个步骤:
1)在server端注册用户指定的函数:
UserService 模块包含的ITK 函数USERSERVICE_register_methods()可以实现在TCEng 系统server 端注册用户自定义的函数,通过编辑user_server_exits.c 文件中的USERSERVICE_register_methods()函数实现,需要用户提供要注册的函数名、函数指针、输入的参数个数、输入参数的类型及返回值的类型。其代码实现一般如下
extern int USERSERVICE_register_methods()
{
USER_function_t create = createItemTest;
int nArgs=2;
int returnValueType;
int *inArgTypes;
inArgTypes = (int *)SM_alloc_persistent(nArgs*sizeof(int));
inArgTypes[0] = USERARG_STRING_TYPE;
inArgTypes[1] = USERARG_STRING_TYPE;
returnValueType = USERARG_TAG_TYPE;
USERSERVICE_register_method("createItemTest", create, nArgs, inArgTypes,
returnValueType);
}
其中,createItemTest 为用户自定义的函数名;create 为用户自定义函数的指针;nArgs 为输入的参数个数;inArgTypes为输入参数的类型列表;returnValueType 为返回值的类型。
2)创建用户自定义的函数:
在server 端用户自定义的函数中,利用ITK 函数USERARG_get__argument() 获取client 端的输入参数。其代码实现一般如下:
int createItemTest( void *retValue )
{
int status = ITK_ok;
tag_t itemTag = NULLTAG;
tag_t revTag = NULLTAG;
char *itemId=NULL;
char *itemName=NULL;
/* Get the first argument supplied by the user from the client */
status = USERARG_get_string_argument( &itemId );/* Get the second argument supplied by the user from the client */
status = USERARG_get_string_argument( &itemName );
if ( status == ITK_ok )
{
/* call necessary ITK functions to create an item and get the item tag */
….
….
….
}
/* retValue will be sent back to the client program */
*( (tag_t *) retValue ) = itemTag;
return status;
}
3)在client端调用注册的函数:
当用户自定义的函数在server端注册完毕后,在client端可通过UserService的对象调用该函数。例如要调用createItemTest,其代码实现一般如下:当用户自定义的函数在server端注册完毕后,在client端可通过UserService的对象调用该函数。例如要调用createItemTest,其代码实现一般如下:
IMANUserService aUserServ = sessionObj.getUserService()
objs = new Object[2];
String itemId = new String("testItemId");
String itemName = new String("testName");
objs[0]=itemId;
objs[1]=itemName;
IMANComponent itemComp =
(IMANComponent)aUserServ.call("createItemTest",objs);
4. 结束语
目前有关TCEng 二次开发的资料相对较少,本文就TCEng 二次开发的有关问题做了分析,并在此基础上完成了报表系统的开发。报表的自动汇总功能已经上线运行,受到了设计人员的好评,利用报表汇总功能可以快捷、方便地生成图样目录、明细表和各类汇总表,满足了设计人员的特殊需求,为PDM 系统在设计部门的全面推广铺平了道路。文中提供的实施思路和方法已得到实践验证,能为其它用户进行客户化开发时所借鉴。
4/26/2011
|