该内容已在博客园发布。Teamcenter_NX集成开发:使用NX、SOA连接Teamcenter - huangym1 - 博客园 (cnblogs.com)
最近工作中经常使用Teamcenter、NX集成开发的情况,因此在这里记录使用NX、SOA连接到Teamcenter的连接方式。
主要操作:
1-初始化UGMGR环境成功后就可以连接到Teamcenter。
2-获取指定ID编码零组件标识和Latest Working(没记错的话应该是最新版本)版本ID。
3-获取版本下相关数据集文件(UGMASTER、UGPART等)。
4-ID、版本、文件类型Encode组成集成环境下NX可以打开的NX部件文件名称,并打开。
5-获取Session,打印Teamcenter当前登录方式(二层或者四层等)及其他信息。
6-关闭打开的零组件并释放内存。
// Mandatory UF Includes
#include <uf.h>
#include <uf_object_types.h>
#include <uf_ugmgr.h>
#include <uf_part.h>
#include <uf_disp.h>
#include <uf_modl.h>
#include <uf_obj.h>
#include <uf_assem.h>
// Internal+External Includes
#include <NXOpen/Annotations.hxx>
#include <NXOpen/Assemblies_Component.hxx>
#include <NXOpen/Assemblies_ComponentAssembly.hxx>
#include <NXOpen/Body.hxx>
#include <NXOpen/BodyCollection.hxx>
#include <NXOpen/Face.hxx>
#include <NXOpen/Line.hxx>
#include <NXOpen/NXException.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/PDM_PdmSession.hxx>
#include <NXOpen/PDM_SoaConnectionHandle.hxx>
#include <teamcenter/soa/client/Connection.hxx>
#include <teamcenter/services/core/DatamanagementService.hxx>
#include <teamcenter/soa/common/Version.hxx>
// Std C++ Includes
#include <iostream>
#include <sstream>
using namespace NXOpen;
using namespace Teamcenter::Soa::Client;
using namespace Teamcenter::Services::Core;
using std::string;
using std::exception;
using std::stringstream;
using std::endl;
using std::cout;
using std::cerr;
void do_it()
{
int err = 0;
UF_UGMGR_tag_t database_part_tag = NULL_TAG;
err = UF_UGMGR_ask_part_tag("000000000AA000082", &database_part_tag);
err = UF_UGMGR_set_config_rule("Latest Working");
UF_UGMGR_tag_t part_revision = NULL_TAG;
err = UF_UGMGR_ask_configured_rev(database_part_tag, &part_revision);
char revision_id[UF_UGMGR_NAME_BUFSIZE] = { 0 };
err = UF_UGMGR_ask_part_revision_id(part_revision, revision_id);
int file_count = 0;
char** file_types = NULL;
char** file_names = NULL;
err = UF_UGMGR_list_part_rev_files(part_revision, &file_count, &file_types, &file_names);
if (file_count <= 0) return;
for (int idx = 0; idx < file_count; idx++){
if (file_names[idx] == NULL)
continue;
char encoded_name[MAX_FSPEC_BUFSIZE] = { 0 };
err = UF_UGMGR_encode_part_filename("000000000AA000082", revision_id, file_types[idx], file_names[idx], encoded_name);
tag_t partTag = NULL_TAG;
UF_PART_load_status_t error_status;
err = UF_PART_open(encoded_name, &partTag, &error_status);
//===================
// 打开零组件后获取Session,不然会报错。也可以获取零组件属性,打开的是图纸还可以导出PDF。
//===================
NXOpen::Session *theSession = NXOpen::Session::GetSession();
NXOpen::Part *displayPart(theSession->Parts()->Display());
NXOpen::PDM::PdmSession *thePdmSession = NULL;
NXOpen::PDM::SoaConnectionHandle *connectHandle = NULL;
Teamcenter::Soa::Client::Connection *tcSoaConnect = NULL;
thePdmSession = theSession->PdmSession();
connectHandle = thePdmSession->GetSoaConnectionHandle();
tcSoaConnect = reinterpret_cast<Teamcenter::Soa::Client::Connection*>(connectHandle->GetHandle());
Teamcenter::Services::Core::DatamanagementService *dmService = Teamcenter::Services::Core::DatamanagementService::getService(tcSoaConnect);
Teamcenter::Soa::Common::Version clientVersion = tcSoaConnect->getClientVersion();
Teamcenter::Soa::Common::Version serviceClient = tcSoaConnect->getServerVersion();
Teamcenter::Soa::Client::Connection::Protocol protocol = tcSoaConnect->getProtocol();
Teamcenter::Soa::Client::Connection::Binding binding = tcSoaConnect->getBinding();
std::cout << "\nclientVersion.getTeamcenterVersion = " << clientVersion.getTeamcenterVersion() << std::endl;
std::cout << "clientVersion.getTeamcenterVersionLabel = " << clientVersion.getTeamcenterVersionLabel() << std::endl;
std::cout << "serviceClient.getTeamcenterVersion = " << serviceClient.getTeamcenterVersion() << std::endl;
std::cout << "serviceClient.getTeamcenterVersionLabel = " << serviceClient.getTeamcenterVersionLabel() << std::endl;
std::cout << "\ntcSoaConnect->getLocale = " << tcSoaConnect->getLocale() << std::endl;
std::cout << "tcSoaConnect->getServerAddress = " << tcSoaConnect->getServerAddress() << std::endl;
std::cout << "tcSoaConnect->getCurrentObjectPropertyPolicy = " << tcSoaConnect->getCurrentObjectPropertyPolicy() << std::endl;
switch (protocol){
case Teamcenter::Soa::Client::Connection::HTTP:
std::cout << "\n\nTeamcenter::Soa::Client::Connection::HTTP" << std::endl;
break;
case Teamcenter::Soa::Client::Connection::TCCS:
std::cout << "\nTeamcenter::Soa::Client::Connection::TCCS" << std::endl;
break;
case Teamcenter::Soa::Client::Connection::IIOP:
std::cout << "\nTeamcenter::Soa::Client::Connection::IIOP" << std::endl;
break;
case Teamcenter::Soa::Client::Connection::TCTP:
std::cout << "\nTeamcenter::Soa::Client::Connection::TCTP" << std::endl;
break;
default:
break;
}
switch (binding){
case Teamcenter::Soa::Client::Connection::REST:
std::cout << "\n\nTeamcenter::Soa::Client::Connection::REST" << std::endl;
break;
case Teamcenter::Soa::Client::Connection::SOAP:
std::cout << "\nTeamcenter::Soa::Client::Connection::SOAP" << std::endl;
break;
default:
break;
}
err = UF_PART_free_load_status(&error_status);
err = UF_PART_close(partTag, 1, 1);
}
UF_free_string_array(file_count, file_names);
UF_free_string_array(file_count, file_types);
file_types = NULL;
file_names = NULL;
}
//===================
// Entry Point
//===================
int main(int argc, char* argv[])
{
try{
const char** dd = (const char**)(argv);
int err = UF_UGMGR_initialize(argc, dd);
do_it();
err = UF_UGMGR_terminate();
return err;
}
catch (const NXException& e1){
cerr << "NXException: " << e1.ErrorCode() << endl;
cerr << e1.Message() << endl;
}
catch (const exception& e2){
cerr << "Exception: " << e2.what() << endl;
}
catch (...){
cerr << "Unknown Exception: " << endl;
}
}
encode:把ID、版本、文件类型编码成NX可以打开的名称。


