何 超
(中安(天津)航空設(shè)備有限公司,天津 300300)
隨著COM技術(shù)與網(wǎng)絡(luò)技術(shù)的快速發(fā)展,通過(guò)組件技術(shù)開(kāi)發(fā)CAD系統(tǒng)的應(yīng)用程序已經(jīng)成為主流[1].在COM框架下,客戶(hù)能夠開(kāi)發(fā)出不同類(lèi)別但功能特定的組件,然后按需要將它們像堆積木似的拼裝在一起,從而構(gòu)成復(fù)雜的應(yīng)用系統(tǒng)[2].在現(xiàn)代CAD系統(tǒng)中,隨著數(shù)據(jù)種類(lèi)與數(shù)據(jù)量的與日俱增,數(shù)據(jù)信息已從CAD系統(tǒng)中獨(dú)立出來(lái),形成了獨(dú)立于CAD應(yīng)用程序外的數(shù)據(jù)庫(kù),這樣有利于不同應(yīng)用程序之間的數(shù)據(jù)交換,使應(yīng)用程序和數(shù)據(jù)相對(duì)獨(dú)立,有助于數(shù)據(jù)的維護(hù)與拓展補(bǔ)充,并協(xié)調(diào)CAD開(kāi)發(fā)平臺(tái)進(jìn)行有效的監(jiān)控等功能[3-4].
本文即是結(jié)合COM組件技術(shù),采用3層C/S結(jié)構(gòu),針對(duì)UG花鍵軸參數(shù)信息數(shù)據(jù)庫(kù)系統(tǒng)的開(kāi)發(fā)進(jìn)行研究,以期通過(guò)本次研究?jī)?nèi)容更好地解決花鍵軸數(shù)據(jù)信息的科學(xué)管理與安全維護(hù)等問(wèn)題,從而更好地保障零件設(shè)計(jì)時(shí)參數(shù)調(diào)用工作的順利進(jìn)行.
系統(tǒng)總體結(jié)構(gòu)為3層C/S結(jié)構(gòu)[5],主要包含客戶(hù)層、中間層和數(shù)據(jù)層3個(gè)層次內(nèi)容.其中:客戶(hù)層主要完成菜單、用戶(hù)界面以及中間層的實(shí)際調(diào)用,通過(guò)COM組件完成對(duì)數(shù)據(jù)庫(kù)信息進(jìn)行操作的功能,包含信息的顯示、入庫(kù)、修改、刪除以及查詢(xún)等功能;中間層主要完成數(shù)據(jù)庫(kù)信息的操作功能;數(shù)據(jù)層主要完成花鍵軸信息的存儲(chǔ),更好地為中間層提供數(shù)據(jù)支持[6].綜上,系統(tǒng)總體結(jié)構(gòu)如圖1所示.
圖1 系統(tǒng)總體結(jié)構(gòu)
2.1.1 開(kāi)發(fā)環(huán)境設(shè)置
首先創(chuàng)建自定義文件夾HJZ,在該文件夾中創(chuàng)建Startup和Database兩個(gè)子文件夾,其中:Startup用于存放自定義的菜單以及DLL文件;Database用于存放花鍵軸參數(shù)信息庫(kù)文件,隨后注冊(cè)環(huán)境變量[7],如圖2所示.
圖2 注冊(cè)環(huán)境變量
2.1.2 自定義菜單
主要在Startup子文件內(nèi)創(chuàng)建菜單文件app.men.其中:Actions后面為菜單要執(zhí)行的動(dòng)作;A、B依次為主次菜單名.啟動(dòng)UG后,則會(huì)出現(xiàn)如圖3所示的所開(kāi)發(fā)系統(tǒng)UG菜單.
圖3 系統(tǒng)UG菜單
VERSION 120
EDIT UG_GATEWAY_MAIN_MENUBAR
BEFORE UG_HELP
CASCADE_BUTTONThree_Tier_COM
LABEL基于COM組件的花鍵軸三層數(shù)據(jù)庫(kù)系統(tǒng)的開(kāi)發(fā)//A
END_OF_BEFORE
MENUThree_Tier_COM
BUTTONDataBase
LABEL我的花鍵軸數(shù)據(jù)庫(kù)系統(tǒng)//B
CTIONSDBSystem_act
END_OF_MENU
通過(guò)Access建立花鍵軸零件數(shù)據(jù)庫(kù)文件spline_shaft.mdb,如圖4所示.由圖4可知,花鍵軸信息主要包含10個(gè)字段,分別為編號(hào)、直徑1、直徑2、齒數(shù)、齒寬、有效長(zhǎng)度、內(nèi)孔直徑、內(nèi)孔深度、軸直徑、軸長(zhǎng)度.最后將建立的數(shù)據(jù)庫(kù)文件復(fù)制到Database子文件夾中.
圖4 花鍵軸信息數(shù)據(jù)庫(kù)
創(chuàng)建COM組件框架時(shí),一般按照以下步驟進(jìn)行[8]:
1) 通過(guò)VC向?qū)е械腁TL COM AppWizard創(chuàng)建COM服務(wù)器框架工程;
2) 通過(guò)“Insert”選擇“NEW ATL Object”啟動(dòng)ATL COM AppWizard 來(lái)加入對(duì)COM對(duì)象的支持;
3) 通過(guò)選擇“Simple Object”并單擊“Next”按鈕,在“Short Name”下輸入名稱(chēng)DataOper,以及在“Interface”下輸入IDataOper;
4) 添加方法到接口IDataOper中,并在接口的實(shí)現(xiàn)文件CDataOper.cpp中依據(jù)功能添加方法的實(shí)現(xiàn)代碼:
STDMETHODIMPCDataOper::Open(BSTR source, BSTR USER, BSTR pwd)
{return S_OK;}
5) 添加COM組件代碼(代碼略);
6) COM組件的編譯、連接以及注冊(cè).
在VC環(huán)境下創(chuàng)建應(yīng)用程序開(kāi)發(fā)框架,新建項(xiàng)目DB_Fun.在程序框架內(nèi),插入對(duì)話(huà)框資源以便設(shè)置用戶(hù)界面的對(duì)話(huà)框.對(duì)所建立的對(duì)話(huà)框資源添加對(duì)話(huà)框類(lèi)與成員函數(shù),建立過(guò)程如圖5所示.隨后添加對(duì)應(yīng)類(lèi)與類(lèi)函數(shù)程序代碼,設(shè)置UG/Open API函數(shù)路徑,如圖6所示.
圖5 添加對(duì)話(huà)框類(lèi)與成員函數(shù)
圖6 設(shè)置UG/Open API函數(shù)路徑
最后將編譯后的.DLL文件復(fù)制到Startup子文件中.現(xiàn)以入庫(kù)功能函數(shù)為例,介紹如下:
voidCDBSystem::OnButtonInput()//入庫(kù)函數(shù);
{CDBOper InputDlg;
InputDlg.mark=0;
if(InputDlg.DoModal()==IDOK)//入庫(kù)對(duì)話(huà)框打開(kāi)成功;
{ //一系列對(duì)應(yīng)的花鍵軸參數(shù);
CString num=InputDlg.num;
float D1=InputDlg.D1;
float D2=InputDlg.D2;
int Z=InputDlg.Z;
float B=InputDlg.B;
float L=InputDlg.L;
float D=InputDlg.D;
float D_L=InputDlg.D_L;
float shaft_D=InputDlg.shaft_D;
float shaft_D_L=InputDlg.shaft_D_L;
if(num=="") //提示不能輸入編號(hào)為空的齒輪參數(shù);
{ MessageBox("編號(hào)不能為空!","提示",MB_ICONWARNING+MB_OK);
InputDlg.m_num.SetFocus();return;}
try{HRESULT hr =pDB->OpenCommand();
if (FAILED(hr))
{MessageBox("OpenCommandfailed");return;}
CString str;
str.Format("insert into spline_shaft
(編號(hào),直徑1,直徑2,齒數(shù),齒寬,有效長(zhǎng)度,內(nèi)孔直徑,內(nèi)孔深度,軸直徑,軸長(zhǎng)度)values('%s',%f,%f,%d,%f,%f,%f,%f,%f,%f)",num,D1,D2,Z,B,L,D,D_L,shaft_D,shaft_D_L);
.......;//其他操作設(shè)置;}}
通過(guò)VC向?qū)е械摹癢in32 Dynamic_Link Library”創(chuàng)建DLL框架,項(xiàng)目名稱(chēng)為T(mén)hree_Tier_UG_APP.隨后添加注冊(cè)程序代碼:
//交互方法;
staticUF_MB_cb_status_t DBSystem_act(
UF_MB_widget_t widget,
UF_MB_data_t client_data,
UF_MB_activated_button_p_t call_button );
staticUF_MB_action_t actionTable[] =
{{"DBSystem_act",DBSystem_act}, { NULL, NULL, NULL }};
extern "C"DllExport void ufsta( char *param, int *returnCode, int rlen )//UG入口函數(shù)ufsta;
{ /*初始化API環(huán)境 */
int errorCode = UF_initialize();
if ( 0 ==errorCode )
{int status;//設(shè)置整型變量;
//實(shí)際操作;
status=UF_MB_add_actions( actionTable );
print_error( "UF_MB_add_actions", status );
errorCode = UF_terminate();//釋放API調(diào)用;}
PrintErrorMessage( errorCode );//輸出任何有誤信息;}
最后進(jìn)行編譯連接操作,首先將DB_Fun.lib先復(fù)制到Three_Tier_UG_APP目錄中,同時(shí)需在Three_Tier_UG_APP.dsw工程中申明“extern"C" DllExport void DB_Fun();”.然后還需設(shè)置UG/Open API路徑以及添加.lib文件,最后將生成的.DLL文件復(fù)制到Startup文件中即可.
首先啟動(dòng)UG5.0,點(diǎn)擊“我的花鍵軸數(shù)據(jù)庫(kù)系統(tǒng)”菜單,此時(shí)會(huì)出現(xiàn)如圖7所示的開(kāi)發(fā)系統(tǒng)主界面.主界面中包含顯示、入庫(kù)、修改等功能按鈕,當(dāng)點(diǎn)選“顯示”按鈕時(shí),即可獲得如圖8所示的通過(guò)COM組件獲取花鍵軸數(shù)據(jù)庫(kù)中的參數(shù)信息.
圖7 開(kāi)發(fā)系統(tǒng)主界面
圖8 經(jīng)由COM組件獲取花鍵軸數(shù)據(jù)庫(kù)
亦可實(shí)現(xiàn)參數(shù)信息入庫(kù)、修改等操作,以花鍵軸數(shù)據(jù)信息入庫(kù)功能為例,其實(shí)現(xiàn)過(guò)程如圖9~10所示.經(jīng)過(guò)測(cè)試,整個(gè)開(kāi)發(fā)系統(tǒng)運(yùn)行結(jié)果良好,基本的數(shù)據(jù)管理功能均可實(shí)現(xiàn),滿(mǎn)足了初始開(kāi)發(fā)時(shí)的目的要求.
圖9 輸入花鍵軸參數(shù)值
圖10 入庫(kù)效果
本文通過(guò)COM組件技術(shù)實(shí)現(xiàn)UG環(huán)境下花鍵軸參數(shù)信息庫(kù)的開(kāi)發(fā).實(shí)踐表明,利用COM組件的高度獨(dú)立性和程序集成特點(diǎn),將COM組件引入到CAD系統(tǒng)的二次開(kāi)發(fā)工作中去,極大地提高了CAD系統(tǒng)的開(kāi)發(fā)效率,增強(qiáng)了CAD軟件跨系統(tǒng)跨平臺(tái)的通用性,大大縮短開(kāi)發(fā)周期.
隨著COM技術(shù)的發(fā)展,在今后的實(shí)際應(yīng)用中,作為分布式應(yīng)用系統(tǒng)開(kāi)發(fā)的基礎(chǔ)平臺(tái),COM組件技術(shù)將日益受到客戶(hù)的重視,其必將在分布式系統(tǒng)應(yīng)用領(lǐng)域中發(fā)揮越來(lái)越重要的角色與功能.