UG NX二次开发之使用MFC创建dll程序

    NX自带的UI控件也有不少,但是有很多功能受限,但是在Windows用用程序中的控件确有很多,而且功能强大,但是也有一个缺点,就是界面风格与NX的不一样,有种另类的感觉。本文介绍一下用MFC来做NX的二次开发。

我开发时的配置如下:

VS2010+NX8.5

下面说一下大概的过程:

1、VS2010中新建项目,选择MFC DLL,输入名称nx_mfc01,选择项目位置,如下图

 

UG NX二次开发之使用MFC创建dll程序的图1

在下一步中选择“应用程序设置”,把DLL类型设置为“带静态链接的MFC的规则DLL(R)”,然后点【完成】

如下图

 

UG NX二次开发之使用MFC创建dll程序的图2

 

VS自动使用模板生成若干个文件,如下图

 

UG NX二次开发之使用MFC创建dll程序的图3

目前生成的这些文件只是一框架,什么也没做,连个对话框也没有。下面就新建一个对话框。

VS菜单中选择【视图】【资源视图】,在资源视图中点开nx_mfc01可以看到项目中的资源只有一个VS_VERSION_INFO,在这个文件里面可以修改生成的dll程序的属性,这里可以设置也可以不设置,如果对程序的管理比图正规,这里就要修改一下啦。本次介绍就随便修改一下,如下图

 

UG NX二次开发之使用MFC创建dll程序的图4

在资源视图中右击nx_mfc01,选择【添加】【资源】,也可以直接在菜单中添加

在弹出的对话框中选择Dialog,添加其它的东西也可以,然后选择“新建”按钮

 

UG NX二次开发之使用MFC创建dll程序的图5

然后VS自动切换到一个对话框而已界面,在这个界面上可以自己设计想要的对话框样式。如下图

 

UG NX二次开发之使用MFC创建dll程序的图6

本次在界面上布局如下

 

UG NX二次开发之使用MFC创建dll程序的图7

做到这里后,项目里面只是有了一个对话框资源,还没有处理对话框的程序。下面给对话框添加一个类来做交互。

在对话框主界面上右击,选择【添加类】,在弹出的对话框中输入类名为mfcDlg”,其它默认就可以了,如下图

 

UG NX二次开发之使用MFC创建dll程序的图8

然后再在Listview控制上右击,选择【添加变量】,在弹出的对话框中输入变量名“m_list_var

如下图

 

UG NX二次开发之使用MFC创建dll程序的图9

然后双击对话框布局上的确定按钮,VS自动切换到这个按钮的消息处理函数上。如下图

 

UG NX二次开发之使用MFC创建dll程序的图10

如果对MFC比较熟悉,后面这做法就是按MFC程序设计的方法来做。但是到现在为止这个项目还不能在UG中使用,下面来介绍如何把UG的入口函数添加进来。

先在项目的属性中添加NX的头文件路径和链接库

如下:

C/C++,【常规】选项中设置“附加包含目录”为“$(UGII_BASE_DIR)\ugopen

【链接器】,【常规】选项中设置“附加库目录”为“$(UGII_BASE_DIR)\ugopen

【链接器】,【输入】选项中设置“附加依赖项”如下

libufun.lib

libnxopencpp.lib

libnxopencpp_annotations.lib

libnxopencpp_assemblies.lib

libnxopencpp_bodydes.lib

libnxopencpp_cae.lib

libnxopencpp_cam.lib

libnxopencpp_die.lib

libnxopencpp_display.lib

libnxopencpp_drafting.lib

libnxopencpp_drawings.lib

libnxopencpp_facet.lib

libnxopencpp_features.lib

libnxopencpp_fields.lib

libnxopencpp_formboard.lib

libnxopencpp_gateway.lib

libnxopencpp_geometricanalysis.lib

libnxopencpp_geometricutilities.lib

libnxopencpp_issue.lib

libnxopencpp_layer.lib

libnxopencpp_mechatronics.lib

libnxopencpp_modldirect.lib

libnxopencpp_motion.lib

libnxopencpp_optimization.lib

libnxopencpp_options.lib

libnxopencpp_pdm.lib

libnxopencpp_physmat.lib

libnxopencpp_positioning.lib

libnxopencpp_preferences.lib

libnxopencpp_routing.lib

libnxopencpp_shapesearch.lib

libnxopencpp_sheetmetal.lib

libnxopencpp_sim.lib

libnxopencpp_tooling.lib

libnxopencpp_userdefinedobjects.lib

libnxopencpp_validate.lib

libnxopencpp_visualreporting.lib

libnxopencpp_weld.lib

libugopenint.lib

libnxopenuicpp.lib

 

然后在项目源文件下新建一个nxInterface.cpp文件。在这个源文件中写入调用对话框的代码

#include "stdafx.h"#include <uf.h>#include <uf_ui.h>#include <uf_exit.h>#include "mfcDlg.h"#include "resource.h"

#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],             msg[133];
       sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",            irc, line, file);        UF_get_fail_message(irc, err);
       UF_print_syslog(msg, FALSE);        UF_print_syslog(err, FALSE);        UF_print_syslog("\n", FALSE);        UF_print_syslog(call, FALSE);        UF_print_syslog(";\n", FALSE);
       if (!UF_UI_open_listing_window())        {            UF_UI_write_listing_window(msg);            UF_UI_write_listing_window(err);            UF_UI_write_listing_window("\n");            UF_UI_write_listing_window(call);            UF_UI_write_listing_window(";\n");        }    }
   return(irc);}
mfcDlg *dlg = NULL;
extern DllExport void ufusr( char *parm, int *returnCode, int rlen ){  AFX_MANAGE_STATE(AfxGetStaticModuleState());    /* Initialize the API environment */    if( UF_CALL(UF_initialize()) )    {        /* Failed to initialize */        return;    }        /* TODO: Add your application code here */  if(dlg == NULL)  {    dlg = new mfcDlg;    dlg->Create(IDD_DIALOG1);  }  if(dlg)  {    dlg->ShowWindow(SW_NORMAL);  }      /* Terminate the API environment */    UF_CALL(UF_terminate());}
extern int ufusr_ask_unload( void ){    //return( UF_UNLOAD_IMMEDIATELY );  return (UF_UNLOAD_UG_TERMINATE);}
extern void ufusr_cleanup (void){  //释放申请的内存  if (dlg)  {    delete dlg;    dlg = NULL;  }      return;}


代码说明:

#include "stdafx.h"一定要放在最前面,不然很可能会出错

nxInterface.cpp文件中用使用是的非模态对话框,对于非模太对话框,要把对话框的指针dlg申明为全局变量,而且ufusr_ask_unload()一定要返回UF_UNLOAD_UG_TERMINATE才行,不然加载对话框程序后会闪退。如果是显示一个模态对话框,就没有这些限制。

 

下面为对话框添加一些动作,将前面确定按钮的消息回调函数修改为下面

void mfcDlg::OnBnClickedOk(){  // TODO: 在此添加控件通知处理程序代码  this->m_list_var.InsertColumn(0,_T("列1"),0,100);  this->m_list_var.InsertColumn(1,_T("列2"),0,100);  this->m_list_var.InsertItem(0,_T("行1列1"));  this->m_list_var.SetItemText(0,1,_T("行1列2"));  this->m_list_var.InsertItem(1,_T("行2列1"));  this->m_list_var.SetItemText(1,1,_T("行2列2"));  uc1601("设置列表视图",1);  //CDialogEx::OnOK();}


最后编译运行,如下图

 

UG NX二次开发之使用MFC创建dll程序的图11

前面修改的属性版本等信息的结果如下图

UG NX二次开发之使用MFC创建dll程序的图12

文章来源:UG NX学习笔记

默认 最新
当前暂无评论,小编等你评论哦!
点赞 评论 收藏
关注