NX二次開發-自動將NX標題設定為prt路徑
阿新 • • 發佈:2021-06-10
方法1
使用windows api SetWindowText
這個方法是2018年的時候,七少大哥告訴我的,
以前七少大哥也蠻熱愛交流技術的,同時也是個喜歡交流分享的人。
這兩年倒是很少看到他了。
在部落格上貼他的程式碼,當年也是徵求過他的。
這個思路是:先獲得NX的視窗控制代碼,然後通過控制代碼設定對話方塊標題內容,用ufstar入口函式,在加個定時器進行實時更新。
編譯出來的dll,直接放到二次開發資料夾startup裡,啟動ug就會自動載入了。
/***************************************************************************** ** 檔名:【NX10_Open_Wizard1.cpp ** NX 10.0二次開發C/C++初始模板 By七少(QQ/微信:70075260,Mail:[email protected]) ** 版本:A,模板修訂日期:2018/12/24 *****************************************************************************/ //編譯之後將dll檔案放在二次開發目錄的startup的目錄內 /*標頭檔案,名稱空間,巨集定義*/ #include <stdarg.h> #include <strstream> #include <iostream> using std::ostrstream; using std::endl; using std::ends; using std::cerr; #include <uf.h> #include <uf_ui.h> #include <uf_assem.h> #include<uf_part.h> #include <uf_exit.h> #include <afxwin.h> #include <windows.h> #include <shellapi.h> #include <winuser.h> #include <atlstr.h> #pragma comment(lib, "User32.lib") #pragma warning(disable:4267) /*獲取當前NX軟體環境*/ static void ECHO(char *format, ...) {char msg[UF_UI_MAX_STRING_NCHARS+1]; va_list args; va_start(args, format); vsnprintf_s(msg, sizeof(msg), UF_UI_MAX_STRING_NCHARS, format, args); va_end(args); UF_UI_open_listing_window(); UF_UI_write_listing_window(msg); UF_print_syslog(msg, FALSE); } /*定義預處理函式*/ #define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X))) /*錯誤資訊檢查*/ static int report_error( char *file, int line, char *call, int irc) { if (irc) { char err[133]; UF_get_fail_message(irc, err); ECHO("*** ERROR code %d at line %d in %s:\n", irc, line, file); ECHO("+++ %s\n", err); ECHO("%s;\n", call); } return(irc); } //char*轉wchar_t wchar_t* CharToWchar(char* c) { wchar_t *m_wchar; int len = MultiByteToWideChar(CP_ACP,0,c,strlen(c),NULL,0); m_wchar = new wchar_t[len + 1]; MultiByteToWideChar(CP_ACP,0,c,strlen(c),m_wchar,len); m_wchar[len] = '\0'; return m_wchar; } //定義控制代碼變數 HWND UGHwnd; //建立回撥函式,獲得NX視窗並設定視窗文字 void CALLBACK MyTimer(HWND hWnd,UINT nMsg,UINT nIDEvent,DWORD dwTime) { //獲取當前工作部件的路徑 char prtpath[MAX_FSPEC_BUFSIZE]; UF_PART_ask_part_name(UF_ASSEM_ask_work_part(), prtpath); //判斷當有工作部件時修改視窗標題 if (UF_ASSEM_ask_work_part() != NULL_TAG) { //獲得NX當前工作檢視視窗控制代碼 HWND UGhwnd =(HWND) UF_UI_get_default_parent(); //找到NX12.0以下版本當前工作檢視視窗控制代碼 HWND hwnd1 = FindWindowEx(UGhwnd, NULL,CharToWchar("MDIClient"), NULL); HWND hwnd2 = FindWindowEx(hwnd1, NULL,NULL, NULL); HWND PartWorkhwnd = FindWindowEx(hwnd2, NULL,NULL, NULL); //找到NX12.0版本當前工作檢視視窗控制代碼 if (PartWorkhwnd == NULL) { PartWorkhwnd = FindWindowEx(UGhwnd, NULL,CharToWchar("NX_SURFACE_WND"), NULL); PartWorkhwnd = FindWindowEx(UGhwnd, PartWorkhwnd,CharToWchar("NX_SURFACE_WND"), NULL); } //輸入控制代碼獲得視窗標題 wchar_t UGBT_A[MAX_FSPEC_BUFSIZE]; GetWindowText(PartWorkhwnd, UGBT_A, 255); //將prt的path轉換為wchar_t並修改NX視窗 wchar_t* s=CharToWchar(prtpath); SetWindowText(UGhwnd, s); } } /***************************************************************************** ** 程式啟用方式 *****************************************************************************/ /*Unigraphics啟動 **此入口點在Unigraphics啟動時啟用應用程式*/ extern DllExport void ufsta( char *param, int *returnCode, int rlen ) { /*初始化API環境*/ if(!UF_CALL(UF_initialize())) { /****************************************************************************/ /*↓↓↓TODO:在這裡填寫您的程式程式碼↓↓↓*/ //獲得NX視窗控制代碼 UGHwnd = (HWND)UF_UI_get_default_parent(); //每隔500ms執行一次回撥函式 SetTimer(UGHwnd, 1, 500, (TIMERPROC)MyTimer); /****************************************************************************/ /*終止API環境 */ UF_CALL(UF_terminate()); } } /***************************************************************************** ** 程式解除安裝方式 *****************************************************************************/ /* 解除安裝處理程式 **這個函式指定什麼時候從NX中解除安裝程式 **如果應用程式註冊了回撥(例如來自MenuScript項或使用者定義物件) **則此函式必須返回“UF_UNLOAD_UG_TERMINATE” */ extern int ufusr_ask_unload( void ) { return( UF_UNLOAD_IMMEDIATELY ); }
方法2
是拿NX內部函式做的,也是轉載的 https://blog.csdn.net/u010145109/article/details/113556947
詳細請看這位大神的部落格,我就不寫了。
以下是這位大神寫的例子
#include <uf.h> #include <uf_ui.h> #include <uf_part.h> #include <uf_attr.h> #include <atlstr.h> void CALLBACK TimerSetTitle(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime);//回撥函式 extern "C" DllExport void ufsta(char *param, int *retCode, int paramLen) //啟動UG就開始監控 { if (UF_initialize()) { return; } SetTimer(NULL, NULL, 1000, (TIMERPROC)TimerSetTitle);//每秒觸發一次 UF_terminate(); } extern "C" DllExport int ufusr_ask_unload() { return (UF_UNLOAD_UG_TERMINATE); } void CALLBACK TimerSetTitle(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime) { char prt0[132] = ""; //當前部件路徑 tag_t DispTag = UF_PART_ask_display_part(); UF_PART_ask_part_name(DispTag, prt0); //獲得顯示部件全路徑 char fileDir[MAX_FSPEC_BUFSIZE]; char fileName[UF_CFI_MAX_FILE_NAME_BUFSIZE]; const char *filePath = prt0; uc4576(filePath, 2, fileDir, fileName);//分割路徑和部件名稱 char str[MAX_FSPEC_BUFSIZE] = "";//使用程式碼獲取當前版本會更好 char NX_app[256] = "";//模組變數 char DesignName[50] = "";//設計員名字 // 如果填寫了設計人員的屬性,讀出並加入到顯示 if (DispTag != NULL_TAG) { int title_type; UF_ATTR_find_attribute(DispTag, UF_ATTR_string, "設計員", &title_type); if (title_type) { UF_ATTR_value_t sValue; char attr_value_string[257] = ""; sValue.value.string = attr_value_string; char AttrTitle[UF_ATTR_MAX_TITLE_LEN + 1]; UF_ATTR_read_value(DispTag, "設計員", UF_ATTR_string, &sValue); if (strlen(sValue.value.string)) sprintf(DesignName, "<%s>", sValue.value.string); } } int module_id; UF_ask_application_module(&module_id);//獲取當前模組 if (module_id == UF_APP_MODELING) {sprintf(NX_app, " 建模 - [%s當前路徑]〓 ", DesignName);} else if (module_id == UF_APP_DRAFTING) {sprintf(NX_app, " 製圖 - [%s當前路徑]〓 ", DesignName);} else if (module_id == UF_APP_CAM) {sprintf(NX_app, " 加工 - [%s當前路徑]〓 ", DesignName);} else if (module_id == UF_APP_GATEWAY) {sprintf(NX_app, " 基本環境 - [%s當前路徑]〓 ", DesignName);} else if (DispTag == NULL_TAG) {sprintf(NX_app, " [沒有部件]");} else {sprintf(NX_app, " [%s當前路徑]〓 ", DesignName);} //其它模組有需要再弄 sprintf(str, "%s%s", NX_app, fileDir); //載入dll auto libugui = LoadLibrary("libugui.dll"); if (libugui) { //宣告函式指標,和匯出dll時標頭檔案中函式型別一致 typedef void(*SetNXTitle)(char* title,int a); SetNXTitle MyFunc; //通過函式名獲取函式在dll中的地址 MyFunc = (SetNXTitle)GetProcAddress(libugui, "?MT_set_ug_title@@YAXPEADI@Z"); if (MyFunc != NULL) { MyFunc(str, 0); } //釋放對dll的引用 FreeLibrary(libugui); } } ———————————————— 版權宣告:本文為CSDN博主「小C-NX」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。 原文連結:https://blog.csdn.net/u010145109/article/details/113556947
阿飛
2021年6月9日