使用UserService机制来指定要在Teamcenter工程中注册的功能。这些功能由Teamcenter工程客户端动态调用。在TC使用过程中调用用户自定义的操作,这样做对于TC的扩展是非常方便的,比如常用的开旁路功能。
在这里使用userservice开发一个创建Item对象的例子,开发userservice主要有以下几步:
- 需要修改的基本函数为USERSERVICE_register_methods()
- 在site-name_register_callbacks() 函数内定义:
CUSTOM_register_exit("sertest","USERSERVICE_register_methods(CUSTOM_EXIT_ftn_t)CUST_init_module);
- 在文件xxx.cpp 中编写新的函数CUST_init_module(),注册 userservice
1:使用 USERSERVICE_register_method() 注册 user services
2:定义 user service 函数名称
3:指定输入叁数的数量与数据类型,同时指定输出的数据类型
- 在首选项TC_customization_libraries中进行配置,在Rich Client中进行调用
案例如下:
- 项目目录结构如下:
-
- sertest_register_method.h文件内容如下
#pragma once
#include <ict/ict_userservice.h>
#include <tc/iman.h>
#include <tccore/custom.h>
#include <epm/epm_toolkit_tc_utils.h>
#ifdef __cplusplus
extern "C"
{
#endif
extern DLLAPI int CUST_init_module(int *, va_list);
extern DLLAPI int sertest_register_callbacks();
int createItem(void *retType);
#ifdef __cplusplus
}
#endif
- sertest_register_method.cpp文件内容如下
#include <pie/sample_err.h>
#include <ict/ict_userservice.h>
#include<tc/tc.h>
#include <bom/bom.h>
#include <tccore/aom_prop.h>
#include <tccore/custom.h>
#include <tccore/aom.h>
#include <tccore/item.h>
#include <base_utils/Mem.h>
#include "sertest_register_method.h"
extern DLLAPI int sertest_register_callbacks()
{
int stat = ITK_ok;
CUSTOM_register_exit("sertest", "USERSERVICE_register_methods", (CUSTOM_EXIT_ftn_t)CUST_init_module);
return stat;
}
extern DLLAPI int CUST_init_module(int *decision, va_list args)
{
printf("CUST_init_module\n");
int
stat = ITK_ok,
*argumentList = NULL,
numberOfArguments = 0;
*decision = ALL_CUSTOMIZATIONS;
USER_function_t functionPtr= createItem;
numberOfArguments = 3;
argumentList = (int*)MEM_alloc(numberOfArguments * sizeof(int));
argumentList[0] = USERARG_STRING_TYPE;
argumentList[1] = USERARG_STRING_TYPE;
argumentList[2] = USERARG_STRING_TYPE;
//定义userservice函数名createitem
//functionPtr:指向用户指定函数的指针
//argumentList:用户指定函数的参数数
//argumentList:用户指定的函数的输入参数类型列表
//USERARG_TAG_TYPE:返回值类型
USERSERVICE_register_method("createitem",functionPtr, numberOfArguments,argumentList, USERARG_TAG_TYPE);
MEM_free(argumentList);
return stat;
}
int createItem(void *retType) {
int retcode = ITK_ok;
int status = 0;
tag_t itemTag;
tag_t revTag;
char *itemId = NULL;
char *itemRev = NULL;
char *itemName = NULL;
USERARG_get_string_argument(&itemId);
USERARG_get_string_argument(&itemRev);
USERARG_get_string_argument(&itemName);
printf("\n");
printf(itemId);
printf("\n");
printf(itemRev);
printf("\n");
printf(itemName);
printf("\n");
retcode = ITEM_create_item(itemId, itemName, "Item", itemRev, &itemTag, &revTag);
if (status == retcode)
{
AOM_save(itemTag);
AOM_save(revTag);
}
*((tag_t *)retType) = itemTag;
return retcode;
}
- 在rc中用java代码进行调用
TCUserService userServ = session.getUserService();
Object[] objs = new Object[3];
String itemId = new String("20190505");
String itemRev = new String ("A");
String itemName = new String ("劳动节");
objs[0]=itemId;
objs[1] = itemRev;
objs[2]=itemName;
userServ.call("createitem", objs);