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#)-外部模式-创建一个新的空模型文件
NX二次开发-UFUN另存为part UF_PART_save_as