Teamcenter_NX集成開發:UF_UGMGR_invoke_pdm_server函數的使用

来源:https://www.cnblogs.com/huangym1/archive/2023/03/25/17255080.html
-Advertisement-
Play Games

之前瞭解到通過UFUN函數UF_UGMGR_invoke_pdm_server可以調用Teamcenter ITK函數,從而可以獲取及編輯Teamcenter對象。UFUN中有樣例代碼,但是就是不知道怎麼使用,今天下午看了幫助文檔,想到需要把ITK的USER_invoke_pdm_server函數進 ...


之前瞭解到通過UFUN函數UF_UGMGR_invoke_pdm_server可以調用Teamcenter ITK函數,從而可以獲取及編輯Teamcenter對象。UFUN中有樣例代碼,但是就是不知道怎麼使用,今天下午看了幫助文檔,想到需要把ITK的USER_invoke_pdm_server函數進行註冊,就進行測試,沒想到給寫通了。在此記錄代碼調試過程,轉載請註明出處。

註意事項:

  1-需要瞭解Teamcenter Handler註冊過程。

  2-Teamcenter開發方面可以參考微信公眾號:PLMCODE

 

NX工程代碼:

  1 //================================
  2 // UF_UGMGR_invoke_pdm_server
  3 //================================
  4 //tcnx_project
  5 
  6 // Mandatory UF Includes
  7 #include <uf.h>
  8 #include <uf_object_types.h>
  9 #include <uf_draw.h>
 10 #include <uf_part.h>
 11 #include <uf_ugmgr.h>
 12 
 13 #include <NXSigningResource.cpp>
 14 
 15 // Internal Includes
 16 #include <NXOpen/ListingWindow.hxx>
 17 #include <NXOpen/NXMessageBox.hxx>
 18 #include <NXOpen/UI.hxx>
 19 #include <NXOpen/LogFile.hxx>
 20 
 21 // Internal+External Includes\
 22 #include <NXOpen/Annotations.hxx>
 23 #include <NXOpen/Assemblies_Component.hxx>
 24 #include <NXOpen/Assemblies_ComponentAssembly.hxx>
 25 #include <NXOpen/Body.hxx>
 26 #include <NXOpen/BodyCollection.hxx>
 27 #include <NXOpen/Face.hxx>
 28 #include <NXOpen/Line.hxx>
 29 #include <NXOpen/NXException.hxx>
 30 #include <NXOpen/NXObject.hxx>
 31 #include <NXOpen/Part.hxx>
 32 #include <NXOpen/PartCollection.hxx>
 33 #include <NXOpen/Session.hxx>
 34 
 35 #include <NXOpen/PDM_SoaConnectionHandle.hxx>
 36 #include <NXOpen/PDM_PdmSession.hxx>
 37 #include <NXOpen/PDM_PdmSearch.hxx>
 38 #include <NXOpen/PDM_PdmFile.hxx>
 39 #include <NXOpen/PDM_PdmNavigatorNode.hxx>
 40 #include <NXOpen/PDM_PdmPart.hxx>
 41 #include <NXOpen/PDM_PdmSearchManager.hxx>
 42 #include <NXOpen/PDM_SoaQuery.hxx>
 43 #include <NXOpen/PDM_SearchResult.hxx>
 44 
 45 #include <NXOpen/PrintPDFBuilder.hxx>
 46 #include <NXOpen/PlotManager.hxx>
 47 #include <NXOpen/Drawings_DrawingSheet.hxx>
 48 #include <NXOpen/NXObjectManager.hxx>
 49 
 50 // Std C++ Includes
 51 #include <iostream>
 52 #include <sstream>
 53 #include <vector>
 54 #include <string>
 55 #include <algorithm>
 56 #include <tchar.h>
 57 #include <atlconv.h>
 58 #include <shellapi.h>
 59 
 60 #include <windows.h>
 61 #undef CreateDialog
 62 #pragma comment(lib,"shell32.lib")
 63 
 64 #define CREATION_DATE       1
 65 #define MODIFICATION_DATE   2
 66 #define MAX_UGMGR_NAME_LEN 1024
 67 
 68 using namespace NXOpen;
 69 using std::string;
 70 using std::exception;
 71 using std::stringstream;
 72 using std::endl;
 73 using std::cout;
 74 using std::cerr;
 75 
 76 NXOpen::ListingWindow *lw = NULL;
 77 NXOpen::NXMessageBox *mb = NULL;
 78 
 79 #define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
 80 int report_error(char *file, int line, char *call, int code)
 81 {
 82     if (code){
 83         stringstream errmsg;
 84         errmsg << "Error " << code << " in " << file << " at line " << line << endl;
 85         errmsg << call << endl;
 86         cerr << errmsg.str();
 87         throw NXOpen::NXException::Create(code);
 88     }
 89     return(code);
 90 }
 91 
 92 void print(const NXString &);
 93 void print(const string &);
 94 void print(const char*);
 95 int invokePdmServer();
 96 int invokePdmServer()
 97 {
 98     int _errCode = 0;
 99     _errCode = UF_CALL(UF_UGMGR_initialize(0, NULL));
100 
101     char        part_name[MAX_UGMGR_NAME_LEN + 1] = "000015200AA000000";
102     int         output_code = -1;
103     char*       date = NULL;
104 
105     _errCode = UF_CALL(UF_UGMGR_invoke_pdm_server(CREATION_DATE, part_name, &output_code, &date));
106     print("\nAfter calling UF_UGMGR_invoke_pdm_server()\n");
107     print("Part          : " + string(part_name));
108     print("creation date : " + string(date));
109     print("output_code   : " + std::to_string(output_code) + "\n\n");
110     UF_free(date);
111     date = NULL;
112     
113     UF_UGMGR_terminate();
114     return _errCode;
115 }
116 
117 extern "C" DllExport void ufusr( char *parm, int *returnCode, int rlen )
118 {
119     try
120     {
121         invokePdmServer();
122         return;
123     }
124     catch (const NXException& e1)
125     {
126         UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message());
127     }
128     catch (const exception& e2)
129     {
130         UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what());
131     }
132     catch (...)
133     {
134         UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, "Unknown Exception.");
135     }
136 }
137 
138 extern "C" DllExport int ufusr_ask_unload()
139 {
140     return (int)NXOpen::Session::LibraryUnloadOptionImmediately;// 調試用
141     //return (int)NXOpen::Session::LibraryUnloadOptionAtTermination;// 程式發佈用
142     //return (int)NXOpen::Session::LibraryUnloadOptionExplicitly;
143 }
144 
145 void print(const NXString &msg)
146 {
147     if (!lw->IsOpen()) lw->Open();
148     lw->WriteLine(msg);
149 }
150 void print(const string &msg)
151 {
152     if (!lw->IsOpen()) lw->Open();
153     lw->WriteLine(msg);
154 }
155 void print(const char * msg)
156 {
157     if (!lw->IsOpen()) lw->Open();
158     lw->WriteLine(msg);
159 }

Teamcenter Handler工程代碼:

 1 //======================================
 2 // libA2CustStudy_register_callbacks
 3 //======================================
 4 
 5 //=======================
 6 // libA2CustStudy.h
 7 //=======================
 8 #ifndef TCHANDLER_STUDY_H
 9 #define TCHANDLER_STUDY_H
10 
11 #pragma once
12 #include <bom/bom.h>
13 #include <ict/ict_userservice.h>
14 #include <epm\epm_access_control.h>
15 #include <epm\epm_task_template_itk.h>
16 #include <epm\epm.h>
17 #include <epm\epm_toolkit_iman_utils.h>
18 #include <epm/epm_toolkit_tc_utils.h>
19 #include <pie/sample_err.h>
20 #include <tc/tc.h>
21 #include <tc/iman.h>
22 #include <tccore/custom.h>
23 #include <tccore/aom_prop.h>
24 #include <user_exits/user_exits.h>
25 #include <tccore/workspaceobject.h>
26 
27 #include <tccore/aom.h>
28 #include <tccore/item.h>
29 #include <base_utils/Mem.h>
30 
31 #include "register_custom_user_service.h"
32 
33 
34 #ifdef __cplusplus
35 extern "C"
36 {
37 #endif
38 
39     extern DLLAPI int libA2CustStudy_register_callbacks();
40     int libA2CustStudy_invoke_pdm_server(int *decision, va_list args);
41 
42 #ifdef __cplusplus
43 }
44 #endif
45 
46 #endif
 1 //=======================
 2 // libA2CustStudy.cpp
 3 //=======================
 4 #include "libA2CustStudy.h"
 5 
 6 #define CUST_TCHANDLER_STUDY "libA2CustStudy"
 7 
 8 extern DLLAPI int libA2CustStudy_register_callbacks()
 9 {
10     int stat = ITK_ok;
11     stat = CUSTOM_register_exit(CUST_TCHANDLER_STUDY, "USER_invoke_pdm_server", (CUSTOM_EXIT_ftn_t)libA2CustStudy_invoke_pdm_server);
12     stat == ITK_ok ? printf("(libA2CustStudy.dll)-函數libA2CustStudy_invoke_pdm_server返回值為ITK_ok,註冊成功!!!\n") : printf("(libA2CustStudy.dll)-函數libA2CustStudy_invoke_pdm_server返回值不等於ITK_ok,註冊失敗!!!\n");
13     return stat;
14 }
 1 //=======================
 2 // lib_register_custom.cpp
 3 //=======================
 4 #include "libA2CustStudy.h"
 5 
 6 #define CREATION_DATE     1
 7 #define MODIFICATION_DATE 2
 8 
 9 #ifdef __cplusplus
10 extern "C"
11 {
12 #endif
13 
14     int libA2CustStudy_invoke_pdm_server(int *decision, va_list args)
15     {
16         /***********  va_list for USER_invoke_pdm_server ***********/
17         int  input_code = va_arg(args, int);          /* args 1 */
18         char *input_string = va_arg(args, char *);    /* args 2 */
19         int  *output_code = va_arg(args, int *);      /* args 3 */
20         char **output_string = va_arg(args, char **); /* args 4 */
21         /***********************************************************/
22         printf("\t libA2CustStudy_invoke_pdm_server \n\n");
23         *decision = ALL_CUSTOMIZATIONS;
24 
25         tag_t             item_tag;
26         int               itkfail;
27         WSO_description_t description;
28         char              createDate[WSO_date_size_c + 1];
29         char              modifyDate[WSO_date_size_c + 1];
30         char              objectName[WSO_date_size_c + 1];
31         char              objectType[WSO_date_size_c + 1];
32         char              ownersName[WSO_date_size_c + 1];
33         char              owning_group_name[WSO_date_size_c + 1];
34         char              last_modify_user_name[WSO_date_size_c + 1];
35         char              object_desc[WSO_date_size_c + 1];
36         *output_code = 0;
37         char tmp_output_string[1024] = { 0 };
38 
39         itkfail = ITEM_find_item(input_string, &item_tag);
40         if (itkfail != ITK_ok){
41             printf("Failed to find item %s\n", input_string);
42             *output_code = 1;
43         }
44 
45         itkfail = WSOM_describe(item_tag, &description);
46         if (itkfail != ITK_ok){
47             printf("Failed to get description of the item\n");
48             *output_code = 1;
49         }
50 
51         printf("ITK USER_invoke_pdm_server() routine :\n");
52         printf("INPUT:\n");
53         printf("input_code    : %d\n", input_code);
54         printf("input_string  : %s\n\n", input_string);
55 
56         switch (input_code){
57         case CREATION_DATE:
58         case MODIFICATION_DATE:
59             strcpy_s(object_desc, strlen(description.date_created) + 1, description.description);
60             strcpy_s(createDate, strlen(description.date_created) + 1, description.date_created);
61             strcpy_s(modifyDate, strlen(description.date_modified) + 1, description.date_modified);
62             strcpy_s(objectName, strlen(description.object_name) + 1, description.object_name);
63             strcpy_s(objectType, strlen(description.object_type) + 1, description.object_type);
64             strcpy_s(ownersName, strlen(description.owners_name) + 1, description.owners_name);
65             strcpy_s(owning_group_name, strlen(description.owning_group_name) + 1, description.owning_group_name);
66             strcpy_s(last_modify_user_name, strlen(description.last_modifying_user_name) + 1, description.last_modifying_user_name);
67             sprintf_s(tmp_output_string, "date_created=%s\ndate_modified=%s\nobject_name=%s\nobject_type=%s\nowners_name=%s\nowning_group_name=%s\nlast_modify_user_name=%s\nobject_desc=%s\n",
68                 createDate, modifyDate, objectName, objectType, ownersName, owning_group_name, last_modify_user_name, object_desc);
69             break;
70         default:
71             printf("OUTPUT:該參數 %d 未定義操作!\n", input_code);
72             break;
73         }
74         if (strlen(tmp_output_string) > 0){
75             *output_string = (char*)malloc(sizeof(tmp_output_string));
76             strcpy_s(*output_string, strlen(tmp_output_string) + 1, tmp_output_string);
77             printf("OUTPUT:\n");
78             printf("output_string : %s (%s)\n", *output_string, (input_code == 1) ? "CREATION DATE" : "MODIFICATION DATE");
79             printf("output_code   : %d\n", *output_code);
80         }
81         return ITK_ok;
82     }
83 
84 #ifdef __cplusplus
85 }
86 #endif

 

Teamcenter零組件屬性截圖:

 

 

工程調試運行GIF動圖:

 

 2023年03月25日 16點52分發佈。轉載請註明出處!!!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文已經收錄到Github倉庫,該倉庫包含電腦基礎、Java基礎、多線程、JVM、資料庫、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分散式、微服務、設計模式、架構、校招社招分享等核心知識點,歡迎star~ Github地址 Spring的優點 通過控制反轉 ...
  • 電腦編程說到底還是程式員的思維體現,人情世故也會反映在代碼的邏輯上, 寫代碼就如學做人一樣,從哪裡來到哪裡去 ...
  • SpringBoot整合MyBatis/Plus 1.SpringBoot整合MyBatis 1.1整合案例 需求:整合SpringBoot和Mybatis,向資料庫中查詢數據。 項目結構: 1.1.1創建資料庫和表 -- 創建資料庫 DROP DATABASE IF EXISTS springbo ...
  • 概述 JWT,Java Web Token,通過 JSON 形式作為 Web 應用中的令牌,用於在各方之間安全地將信息作為 JSON 對象傳輸,在數據傳輸過程中還可以完成數據加密、簽名等相關處理 JWT 的作用如下: 授權:一旦用戶登錄,每個後續請求將包括 JWT,從而允許用戶訪問該令牌允許的路由, ...
  • 題目:數組反轉 要求: 把數組的內容反轉。 如:arr{ 11 , 22 , 33 , 44 , 55 , 66 } --> { 66 , 55 , 44 , 33 , 22 , 11 }。 思路-1 通過具體實例得,每一次都是將 arr[i] 和 arr[arr.length - 1 -i] 交換 ...
  • 原創:扣釘日記(微信公眾號ID:codelogs),歡迎分享,非公眾號轉載保留此聲明。 問題發生 上上周,看到一位老哥找我們組同事聯調介面,不知道是什麼問題,兩人坐一起搞了快1個小時,看起來好像有點複雜。 突然,老哥發出一聲卧槽,"我傳參里的+號,到你這怎麼變成了空格!",這個聲音很大,我明顯的聽到 ...
  • 一些用戶界面 數據文件 (XML) 參考: 該主題關聯文檔可以查看Data Files. 上一章,我們通過CSV文件添加了數據。當需要添加數據格式簡單時,用CSV格式還是很方便的,當數據格式更複雜時(比如視圖架構或者一個郵件模板),我們使用XML格式。比如包含HTML tags的 help fiel ...
  • 使用 VLD 記憶體泄漏檢測工具輔助開發時整理的學習筆記。本篇介紹在 QT 中使用 VLD 時,無記憶體泄漏時的輸出報告解析。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...