陳 科 張 斌
(合肥工業(yè)大學(xué)機(jī)械與汽車工程學(xué)院,安徽230009)
基于MFC的UG二次開發(fā)方法的研究
陳 科 張 斌
(合肥工業(yè)大學(xué)機(jī)械與汽車工程學(xué)院,安徽230009)
介紹了三維繪圖軟件UGNX6.0的二次開發(fā)工具。針對UG/Open API在開發(fā)過程中的不足,分析了如何應(yīng)用MFC對UG進(jìn)行二次開發(fā)的方法,并以具體實例說明如何利用MFC和UG/Open API開發(fā)CAD系統(tǒng)。
UGNX6.0;MFC;UG/Open API;二次開發(fā)
UnigraphicsNX6.0(簡稱UGNX6.0)是通用的大型三維繪圖軟件,是計算機(jī)輔助設(shè)計、輔助制造、輔助工程和產(chǎn)品數(shù)據(jù)管理(CAD/CAM/CAE/PDM)一體化的軟件系統(tǒng)之一,擁有強(qiáng)大的實體造型、曲面造型、虛擬裝配和生成工程圖等設(shè)計功能。但UG是通用支撐軟件系統(tǒng),沒有提供專用產(chǎn)品所需要的完整的計算機(jī)輔助設(shè)計和制造功能。由于機(jī)械產(chǎn)品種類很多,需要對具體產(chǎn)品在UG軟件平臺上進(jìn)行適當(dāng)?shù)亩伍_發(fā),設(shè)計友好的交互界面、實用的功能模塊和方便的專用產(chǎn)品CAD/CAM系統(tǒng)。本文主要介紹如何利用MFC對UG進(jìn)行二次開發(fā)的方法,并以實例說明[1]。
1.1 組成部分
UG軟件的二次開發(fā)模塊提供了較為完整的開發(fā)工具集,可對UG系統(tǒng)進(jìn)行用戶化裁剪和開發(fā),以滿足實際的應(yīng)用需求。UG/Open是一系列UG開發(fā)工具的總稱,是UG軟件為用戶提供的最主要的開發(fā)工具,主要由UG/Open API、UG/Open GRIP、UG/Open MenuScript和UG/Open UIStyler 4個部分組成[2]。
(1)UG/Open API(又稱User Function)是一個允許程序訪問并改變UG對象模型的程序集。UG/Open API封裝了近2 000個UG操作的函數(shù),可以方便地對UG的圖形終端、文件管理系統(tǒng)和數(shù)據(jù)庫進(jìn)行操作,絕大多數(shù)的UG操作都可以用UG/Open API函數(shù)實現(xiàn)。
(2)在UG/Open API工具發(fā)布之前,UG的二次開發(fā)工具是UG/Open GRIP(Graphics Interactive Programming)。GRIP是一種專用的圖形交互編程語言,它與UG系統(tǒng)集成,可以實現(xiàn)UG環(huán)境中的大部分應(yīng)用操作。
(3)UG/Open MenuScript是創(chuàng)建用戶化菜單的工具。MenuScript支持UG主菜單和快速彈出式菜單的設(shè)計和修改,通過它可以改變UG菜單的布局,添加新的菜單項以執(zhí)行用戶應(yīng)用開發(fā)程序。
(4)UG/Open UIStyler是開發(fā)UG對話框的可視化工具,其生成的對話框與UG集成,用戶可以方便、高效地與UG進(jìn)行交互操作。但UIStyler中包含的控件較少,功能有限。
1.2 UG/Open API的使用
UG/Open API(UF)是Unigraphics與外部應(yīng)用程序之間的接口,其程序的源代碼不能被UG直接執(zhí)行,需要通過編譯形成動態(tài)鏈接庫或可執(zhí)行文件后才能發(fā)揮作用。程序使用了UG/Open API函數(shù)在Internal環(huán)境下運(yùn)行的情況。內(nèi)部UF的優(yōu)點是能處理UG的UI對象接口,實現(xiàn)和UG界面的無縫集成并擴(kuò)充UG的特定功能,而且它執(zhí)行時每個步驟都能從UG的客戶窗口中得到動態(tài)反映,方便地實現(xiàn)與用戶的交互、屏幕選取等復(fù)雜操作。
1.3 MFC的使用
MFC(Microsoft Fundament Class)是VC++的一個重要的軟件資源,利用MFC可以方便地實現(xiàn)程序的可視化設(shè)計。與UG自帶的界面開發(fā)工具UIStyler相比,利用MFC設(shè)計對話框更容易,修改和調(diào)試也更方便、快捷。
利用UG/Open API進(jìn)行開發(fā)有很多好處,但也有一些不足,主要表現(xiàn)在下面兩個方面:
(1)字符串處理
UG/Open API基本上采用的是標(biāo)準(zhǔn)C的字符串函數(shù),使用麻煩,容易出現(xiàn)錯誤。使用MFC中提供的CString等類,可大大降低開發(fā)周期。
(2)數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)
UG/Open API中實現(xiàn)復(fù)雜的數(shù)據(jù)結(jié)構(gòu)很困難。使用MFC提供的CList、CMap和CArray等類,對于實現(xiàn)復(fù)雜的數(shù)據(jù)結(jié)構(gòu)非常方便。
1.4 UG調(diào)用方式與工程目錄結(jié)構(gòu)
UG二次開發(fā)程序采用了動態(tài)鏈接庫(DLL)技術(shù),UG內(nèi)部應(yīng)用程序開發(fā)規(guī)定以動態(tài)鏈接庫方式對其進(jìn)行功能擴(kuò)展和應(yīng)用開發(fā)。動態(tài)鏈接庫被映射到其他應(yīng)用程序空間中執(zhí)行,與鏈接它的應(yīng)用程序可以看成是一體的。在Visual C++中將應(yīng)用程序編譯鏈接生成動態(tài)鏈接庫文件(*.dll),UG啟動時會自動加載供用戶菜單調(diào)用,從而實現(xiàn)二次開發(fā)程序與UG平臺的無縫集成。在UG進(jìn)程中,采用菜單觸發(fā)方式調(diào)用DLL的過程如圖1所示。
圖1 DLL調(diào)用過程Figure 1 DLL calling process
在用戶設(shè)定的工程路徑下需要建立UG系統(tǒng)規(guī)定的工程目錄結(jié)構(gòu)。UG啟動時會在規(guī)定目錄中尋找并加載相應(yīng)的程序和資源。UG規(guī)定的目錄有Startup、Application和Udo。Startup目錄存放UG啟動時需加載的動態(tài)鏈接庫文件(*.dll)、菜單腳本文件(*.men)和用戶工具欄腳本文件(*.tbr)。Application目錄存放具體的功能擴(kuò)展程序文件,如UIStyle對話框文件(*.dlg)、工具圖標(biāo)文件(*.bmp)和位圖調(diào)色板文件(*.ubm)。Udo目錄存放用戶定義的數(shù)據(jù)和鏈接等。目錄結(jié)構(gòu)如圖2所示。
圖2 目錄結(jié)構(gòu)Figure 2 Catalog structure
UG應(yīng)用程序調(diào)用MFC,其實質(zhì)是利用MFC創(chuàng)建動態(tài)鏈接庫并被UG調(diào)用。下面以MFC和UG/Open API的協(xié)同開發(fā)為例講述UG二次開發(fā)的一般過程。由于本例需要UG Gateway的支持,因此使用了UG/Open API的Internal環(huán)境。開發(fā)流程如圖3所示。
圖3 開發(fā)流程圖Figure 3 Flow chart of development
2.1 搭建二次開發(fā)平臺
2.1.1 創(chuàng)建工程目錄
新建工程目錄E:UGSecond,并在該路徑下新建文件夾Startup和Application。前者用來存放.dll文件、.men文件和.tbr文件,后者存放.bmp文件。 這兩個文件夾為UG規(guī)定文件夾,應(yīng)確保其名稱拼寫無誤。
2.1.2 注冊工程路徑
利用配置文件法注冊工程路徑。UG規(guī)定了配置文件custom_dirs.dat用于指明用戶的工程路徑,該文件位于路徑“${UGII_BASE_DIR}UGIImenus”。在配置文件中添加工程路徑“E:UGSecond”,當(dāng)UG啟動時,系統(tǒng)檢查該文件中注冊的工程路徑并自動加載該路徑下的所有資源,包括用戶菜單、對話框和動態(tài)鏈接庫等。
2.1.3 設(shè)置VC++環(huán)境
打開Visual C++ 6.0,選擇菜單命令File→New,工程取名為Code,選擇對話框中的Projects選項卡和項目列表框中的MFC AppWizard(dll)項。選擇Regular DLL with MFC statically linked方式創(chuàng)建靜態(tài)鏈接MFC方式的DLL。進(jìn)入VC主界面后,在菜單中選擇Project→Settings...,在Link項Object/library module中加入“l(fā)ibufun.lib”和“l(fā)ibugopenint.lib”兩個庫文件。選擇Tool→Options,在Directories項中將“$UGII_BASE_DIRUGOPEN”分別加入到include files和library files條目中。UGOPEN文件夾存放了UG頭文件和程序在編譯過程中所需要的庫函數(shù)文件。
2.2 創(chuàng)建菜單欄和工具欄
2.2.1 菜單欄
UG/OPEN MenuScript提供了一套用于定義UG菜單的腳本語言。在工程路徑下的Startup文件夾下創(chuàng)建菜單腳本文件DataExtractor.men,并輸入以下代碼:
VERSION 170 (版本號)
EDIT UG_GATEWAY_MAIN_MENUBAR (編輯UG主菜單)
AFTER UG_HELP (第一級菜單位于Help菜單之后)
CASCADE_BUTTON UG_DATAEXTRACTOR (定義第一級菜單ID,下拉菜單)
LABEL 空調(diào)配管數(shù)據(jù)提取 (定義第一級菜單標(biāo)題)
END_OF_AFTER (結(jié)束第一級菜單編輯)
...
2.2.2 工具欄
工具欄文件是以.tbr為擴(kuò)展名的文本文件。在工程路徑下的Startup文件夾下創(chuàng)建菜單腳本文件DataExtractor.tbr,并輸入以下代碼:
TITLE 空調(diào)配管數(shù)據(jù)提取(工具欄標(biāo)題)
VERSION 170(版本號)
DOCK TOP(定義工具欄被導(dǎo)入時的起始位置為頂部)
BUTTON UG_DATAEXTRACTOR_PREPROHELP(工具欄按鈕名稱,與菜單腳本文件中相應(yīng)菜單命令的名稱相同)
LABEL 預(yù)處理幫助(工具按鈕的標(biāo)題)
BITMAP prepro_help.bmp(工具按鈕圖標(biāo)的文件名,位于工程路徑下Application文件夾)
...
UG啟動加載后如圖4所示。
圖4 菜單欄和工具欄Figure 4 Menu bar and tool bar
2.3 MFC對UG/Open API的開發(fā)
2.3.1 添加UG/Open入口函數(shù)
ufsta()是最常用的入口函數(shù),當(dāng)UG啟動時激活該User Exit并執(zhí)行函數(shù)中的內(nèi)容。在Main.cpp文件中添加以下代碼:
extern“C”DllExport void ufsta(char *param,int *returnCord,int rlen)
{
//指明MFC對話框使用DLL本身資源
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if(UF_initialize()!=0) return;
int error_code=0;
...
UF_terminate(); //退出UG環(huán)境
return;
}
2.3.2 MFC與UG應(yīng)用程序接口
由于用戶功能模塊是利用MFC開發(fā)的,因此MFC開發(fā)的程序與UG的應(yīng)用程序之間的接口是必須要解決的問題。但UG/Open API沒有公開提供對MFC的接口,因此要添加回調(diào)函數(shù)和消息映射代碼:
(1)在Main.h中聲明一個激活應(yīng)用的列表結(jié)構(gòu),該結(jié)構(gòu)的實例與用戶菜單文件中激活的應(yīng)用相匹配:
static UF_MB_action_t action_table[ ]={
{“Application_Extractor”,Application_Extractor,NULL},
{NULL,NULL,NULL} };
(2)在App.h中聲明應(yīng)用函數(shù):
UF_MB_cb_status_t Application_Extractor(UF_MB_widget_t widget, UF_MB_data_t client_data, UF_MB_activated_button_p_t button);
(3)在App.cpp中加入回調(diào)函數(shù)的定義體:
UF_MB_cb_status_t Application_Extractor(UF_MB_widget_t widget,
UF_MB_data_t client_data,
UF_MB_activated_button_p_t button)
{
if(UF_initialize() != 0)
{
return (UF_MB_CB_CONTINUE); //確認(rèn)UG/Open API函數(shù)可用
}
/*---enter your callback code here---*/
//加入callback code (MFC和UG/Open API開發(fā)的用戶功能模塊)
UF_terminate();//終止
return(UF_MB_CB_CONTINUE);
}
2.3.3 用戶功能模塊
用戶功能模塊是基于MFC對UG/Open API進(jìn)行的開發(fā),使用了MFC的CString、CList、CMap等類協(xié)助處理數(shù)據(jù),使用了UG/Open API的一些函數(shù)來實現(xiàn)特定的功能。其中實現(xiàn)數(shù)據(jù)提取的函數(shù)有:int UF_CURVE_ask_line_data (),int UF_CURVE_ask_point_data ()等。實現(xiàn)遍歷裝配樹所需函數(shù)有:獲得當(dāng)前工作部件的標(biāo)識UF_ASSEM_ask_work_part(),獲得裝配根節(jié)點文件的事件標(biāo)識UF_ASSEM_ask_root_part_occ()等。
本文探討了利用MFC對三維繪圖軟件UGNX6.0進(jìn)行二次開發(fā)的方法。通過一個完整的例子,介紹了如何利用MFC和UG/Open API開發(fā)一個有菜單、對話框界面等交互環(huán)境的CAD系統(tǒng)。MFC大大擴(kuò)展了UG/Open API的開發(fā)功能,實現(xiàn)了多種類型的人機(jī)交互界面設(shè)計,并充分利用了VC++的資源,能滿足用戶二次開發(fā)CAD系統(tǒng)的需要。
[1] 趙韓,張冰戰(zhàn).UG二次開發(fā)CAD系統(tǒng)MFC的調(diào)用方法研究[J].現(xiàn)代制造工程,2007,(2):52-54.
[2] 黃翔,李迎光.UG應(yīng)用開發(fā)教程與實例精解[M].北京:清華大學(xué)出版社,2005.
[3] 鄭戰(zhàn)光,潘淑琴,等.利用MFC進(jìn)行UG二次開發(fā)的研究[J].計算機(jī)工程與設(shè)計,2007,28(23):5787-5791.
[4] 吳占陽,侯忠濱,等.UG二次開發(fā)技術(shù)研究[J].現(xiàn)代機(jī)械,2005,(5):48-50.
[5] 應(yīng)建勇.UG二次開發(fā)中MFC調(diào)用方法的研究[J].機(jī)電產(chǎn)品開發(fā)與創(chuàng)新,2005,18(6):102-103.
[6] 劉雅博,陳拂曉,等.MFC在UG二次開發(fā)CAD系統(tǒng)中的應(yīng)用[J].金屬成形工藝,2004,22:39-41.
Research for UG Secondary Development Method based on MFC
ChenKe,ZhangBin
The secondary development tool of 3D drawing software UGNX6.0 is introduced in this paper. For the inadequateness of UG/Open API during development, a method how to use MFC in the secondary development of UG is analyzed, and a concrete example is given to explain how to develop a CAD system by MFC and UG/Open API.
UGNX6.0;MFC;UG/Open API;the secondary development
TP291.7
A
2010—03—15
陳科,男,教授,博士生導(dǎo)師,從事現(xiàn)代設(shè)計理論、機(jī)械CAD/CAE和人工神經(jīng)網(wǎng)絡(luò)等方面研究。
張斌,男,碩士研究生,研究方向為數(shù)字化設(shè)計與制造。
編輯 杜青泉