zoukankan      html  css  js  c++  java
  • 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:70075260@qq.com)
    **    版本: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:
    ",
                irc, line, file);
            ECHO("+++ %s
    ", err);
            ECHO("%s;
    ", 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] = '';  
        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日

    作者: 阿飞

    出处: https://www.cnblogs.com/nxopen2018/>

    关于作者:专注NX开发、VC++开发、数据库、三维建模领域,请多多赐教!

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可留言(博客文章底部留言)咨询.

  • 相关阅读:
    【leetcode】下一个排列
    【leetcode】配对交换
    【leetcode】两个相同字符之间的最长子字符串
    052-126&127
    052-125
    052-124
    052-123
    052-122
    052-121
    052-120
  • 原文地址:https://www.cnblogs.com/nxopen2018/p/14869183.html
Copyright © 2011-2022 走看看