之前瞭解到通過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分發佈。轉載請註明出處!!!