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學習筆記

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

1
1