Teamcenter_NX集成开发:使用NX、SOA连接Teamcenter

该内容已在博客园发布。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可以打开的名称。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值