1. 程式人生 > 其它 >NX二次開發-自動將NX標題設定為prt路徑

NX二次開發-自動將NX標題設定為prt路徑

方法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日