NX二次开发-自动将NX标题设置为prt路径

Posted 阿飞的技术博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:\\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日

以上是关于NX二次开发-自动将NX标题设置为prt路径的主要内容,如果未能解决你的问题,请参考以下文章

UG NX二次开发(C#)-获取模型文件的预览图片

UG NX二次开发(C#)-获取模型文件的预览图片

UG NX二次开发(C#)-外部模式-创建一个新的空模型文件

NX二次开发-UFUN另存为part UF_PART_save_as

NX二次开发-UFUN关闭part UF_PART_close

NX二次开发-UFUN打开part UF_PART_open