汪 林,杜玉祥,何雪浤
(東北大學(xué) 機(jī)械工程與自動(dòng)化學(xué)院,遼寧 沈陽 110819)
在日趨激烈的市場(chǎng)競(jìng)爭(zhēng)環(huán)境下,為適應(yīng)現(xiàn)代技術(shù)發(fā)展和產(chǎn)品更新的要求,如何實(shí)現(xiàn)產(chǎn)品的產(chǎn)品的快速設(shè)計(jì)是復(fù)雜機(jī)械產(chǎn)品研究的重點(diǎn)。目前典型的快速化設(shè)計(jì)的理論和方法有:模塊化設(shè)計(jì)、參數(shù)化設(shè)計(jì)、產(chǎn)品族設(shè)計(jì)及可重構(gòu)設(shè)計(jì)等[1]。參數(shù)化設(shè)計(jì)是產(chǎn)品設(shè)計(jì)規(guī)格化和系列化的一種簡(jiǎn)單、高效的方法。其通常是在保持模型原有拓?fù)浣Y(jié)構(gòu)不變的前提下,針對(duì)關(guān)聯(lián)參數(shù)做幾何約束建模和求解來實(shí)現(xiàn)有效的智能參數(shù)驅(qū)動(dòng)方法[2]。
SolidWorks是Windows平臺(tái)下的一款優(yōu)秀的特征造型軟件,其設(shè)計(jì)功能強(qiáng)大且操作較為簡(jiǎn)單,因而得到了非常廣泛的應(yīng)用。同時(shí),有許多學(xué)者[3-4]對(duì)其參數(shù)化建模功能進(jìn)行了研究并取得了一定成果。其中,絕大多數(shù)的研究都是針對(duì)單個(gè)零部件進(jìn)行的,通常是利用SolidWorks中系列零件設(shè)計(jì)表并結(jié)合ACCESS等數(shù)據(jù)庫實(shí)現(xiàn)參數(shù)化設(shè)計(jì)[5-6],而對(duì)復(fù)雜裝配體的參數(shù)化建模很少涉及,且有所涉及的研究也基本沒有對(duì)裝配體參數(shù)化建模的具體過程和方法進(jìn)行介紹。針對(duì)此現(xiàn)狀,以VC++為開發(fā)工具,采用SolidWorks二次開發(fā)的異步模式,對(duì)大型裝配體參數(shù)化建模的方法進(jìn)行了研究,并實(shí)現(xiàn)了大型裝配體剪叉式升降平臺(tái)的參數(shù)化建模。
在SolidWorks中參數(shù)化建??梢酝ㄟ^兩種方法實(shí)現(xiàn),一種方法是用戶根據(jù)需要直接用程序生成需要的模型,稱為完全程序化參數(shù)建模;另一種方法是利用已有的模型,通過修改模型參數(shù)的方法得到需要的模型,稱為參數(shù)修改法建模[4]。對(duì)于大型裝配體的參數(shù)化建模,由于其模型相對(duì)復(fù)雜,使用完全程序化建模是很難實(shí)現(xiàn)的,故一般只能選用參數(shù)修改法建模。采用參數(shù)修改法建模通常需要事先建立好模型庫,并保存在程序所指向的目錄下,當(dāng)需要使用時(shí)由程序調(diào)用模型文件。參數(shù)修改建模對(duì)模型庫的要求是比較高的,在零件建模過程中需要綜合考慮尺寸的標(biāo)注方式,盡量避免尺寸參數(shù)間產(chǎn)生制約效應(yīng),而在裝配過程中需要充分考慮各零件之間的相互約束關(guān)系,為其添加合適的約束方程。模型庫處理完畢后即可通過程序?qū)δP偷南嚓P(guān)零件進(jìn)行尺寸修改和重建,其中可變參數(shù)可以通過對(duì)話框輸入、數(shù)據(jù)庫導(dǎo)入或直接從程序的計(jì)算結(jié)果獲得。最終通過程序?qū)崿F(xiàn)整個(gè)裝配體的重建。因此,裝配體參數(shù)修改建模的總體流程可總結(jié),如圖1所示。
圖1 裝配體參數(shù)化建模的總體流程Fig.1 Overall Process of Parameterized Modeling of Assembly
SolidWorks模型庫的預(yù)處理主要是對(duì)后期需要進(jìn)行尺寸修改的零件的相關(guān)尺寸進(jìn)行參數(shù)鏈接和方程式約束,然后對(duì)各級(jí)裝配體中相關(guān)的尺寸進(jìn)行方程式約束,最終確保相關(guān)尺寸發(fā)生變化后總裝配體的重建不會(huì)發(fā)生錯(cuò)誤。在進(jìn)行模型處理前,需要對(duì)模型的拓?fù)浣Y(jié)構(gòu)進(jìn)行仔細(xì)的分析。在模型裝配及添加幾何方程式的過程中,都需要充分考慮零件尺寸修改后整個(gè)裝配體模型的聯(lián)動(dòng)效果。通常以零件—子裝配體—總裝配體的層次進(jìn)行處理,以剪叉式升降平臺(tái)為例,其處理順序?yàn)椋簡(jiǎn)蝹€(gè)零件(剪叉臂、鉸點(diǎn)銷軸等)—單層剪叉結(jié)構(gòu)—整個(gè)剪叉結(jié)構(gòu)—剪叉式升降平臺(tái)。在零部件繁多的情況下,此過程一般是很難一步到位的,需要進(jìn)行反復(fù)的修正才能實(shí)現(xiàn),包括幾何約束關(guān)系的修改和裝配關(guān)系的修正等。
SolidWorks是Windows平臺(tái)下優(yōu)秀的特征造型軟件,其設(shè)計(jì)功能強(qiáng)大且操作較為簡(jiǎn)單,因而得到了非常廣泛的應(yīng)用。SolidWorks提供了OLE(對(duì)象的嵌入與鏈接)應(yīng)用程序開發(fā)接口(API),包含有數(shù)以百計(jì)的功能函數(shù),為程序員提供了直接訪問SolidWorks的能力。用戶可以使用支持OLE編程的開發(fā)工具,如VB、VC++、VBA、Delphi等對(duì) SolidWorks API函數(shù)進(jìn)行調(diào)用。
接口處理是SolidWorks二次開發(fā)的關(guān)鍵技術(shù)之一,是開發(fā)工具能夠?qū)崿F(xiàn)對(duì)SolidWorks軟件的API函數(shù)進(jìn)行調(diào)用的前提。VC++對(duì)SolidWorks的二次開發(fā)大致有兩種方法:一種是通過VC++編寫DLL程序在SolidWorks中添加菜單項(xiàng)的方式,直接在SolidWorks的界面下實(shí)現(xiàn)對(duì)模型的特定操作;另一種則是所有操作命令菜單都在集中在VC++的MFC模塊,通過SolidWorks API函數(shù)的調(diào)用來實(shí)現(xiàn)軟件各項(xiàng)操作,即所謂的異步模式。針對(duì)這兩種方法,其接口的處理有所不同。前者是通過VC++生成插件來進(jìn)行開發(fā)的。SolidWorks2009之前的版本通過其提供的一個(gè)SWizard.awx的向?qū)С绦蛏蒁LL框架,在此框架下即可進(jìn)行SolidWorks的二次開發(fā)。而其后的版本,SWizard.awx向?qū)С绦蚧疽烟蕴?,取而代之的是一個(gè)API-SDK二次開發(fā)工具包。而后者主要是通過將SolidWorks提供的API函數(shù)庫導(dǎo)入VC++中,然后就可以直接在VC++中調(diào)用SolidWorksAPI函數(shù)實(shí)現(xiàn)其二次開發(fā)。下面以VC++6.0為例,就異步模式的接口技術(shù)的操作步驟進(jìn)行介紹。
首先,在VC++中選擇MFCAppWizard(exe)新建一個(gè)工程。接下來是在類向?qū)е型ㄟ^添加類型庫的方式在SolidWorks安裝目錄下找到sldworks.tlb文件加載SolidWorks類型庫。添加完成后會(huì)發(fā)現(xiàn)Header Files中多了sldworks.h文件,在Resource Files中多了sldworks.cpp文件。至此,基本上SolidWorksAPI函數(shù)都已經(jīng)導(dǎo)入到了該工程中,接下來就可以進(jìn)行二次開發(fā)的編程了。但還需在工程頭文件中手動(dòng)添加SolidWorks安裝路徑下的swpublished.tlb和swconst.tlb文件,以確保編程時(shí)能夠?qū)olidWorks文檔類型及其它一些常量進(jìn)行定義,具體的添加命令為:
#import"D:\ProgramFiles\SOLIDWORKS\swpublished.tlb"raw_interfaces_only,raw_native_types,no_namespace,named_guids
#import"D:\Program Files\SOLIDWORKS\swconst.tlb"raw_interfaces_only,raw_native_types,no_namespace,named_guids。
以上是VC++6.0與SolidWorks之間的接口處理技術(shù),其它版本的VC++軟件的接口處理原理和方法基本相同。
零件尺寸的修改是通過VC++調(diào)用SolidWorks API函數(shù)編程實(shí)現(xiàn)的,編程方法大致有兩種:一種是為零件添加一個(gè)尺寸配置,配置中包含有該零件需要修改的所有尺寸參數(shù),具體操作方法可參考文獻(xiàn)[7];另一種是直接修改零件的標(biāo)注尺寸。這兩種方法各有利弊。采用添加配置的方法會(huì)將每次設(shè)置的參數(shù)都保存在零件的系列設(shè)計(jì)表中,但這也會(huì)使得文件隨著使用次數(shù)的增多而占用更大的內(nèi)存,而且隨著配置數(shù)據(jù)的增多會(huì)容易造成混亂。采用直接修改零件標(biāo)注尺寸的方法可以很好的避免文件占用內(nèi)存過大的弊端,但是采用該方法修改后的零件將失去原有尺寸的記錄。采用的是直接修改標(biāo)注尺寸的方法,其編程流程可總結(jié),如圖2所示。
圖2 零件尺寸修改的編程流程Fig.2 Programming Process of Modify the Dimensions of the Parts
另外,裝配體重建的編程相對(duì)簡(jiǎn)單,利用SolidWorks的自動(dòng)重建功能,在打開裝配體模型后通過一個(gè)重建命令即可實(shí)現(xiàn)其中的零部件尺寸的更新。具體的編程流程可總結(jié)為,如圖3所示。
圖3 裝配體模型重建的編程流程Fig.3 Programming Process of Assembly Model Reconstruction
下面以一個(gè)剪叉式升降平臺(tái)為例,說明如何通過編程修改SolidWorks零件的尺寸以及如何實(shí)現(xiàn)整個(gè)裝配體模型的重建。在此僅以修改剪叉式高空作業(yè)平臺(tái)的SolidWorks模型中的剪叉臂尺寸為例,來說明整個(gè)參數(shù)化建模的過程。剪叉臂的三維圖,如圖4所示。
圖4 剪叉臂模型Fig.4 Scissor Arm Model
模型預(yù)處理后的剪叉臂截面長(zhǎng)、寬、厚及臂長(zhǎng)的標(biāo)注對(duì)象的名稱分別為:A@草圖1、B@草圖1、S@草圖1和L@凸臺(tái)-拉伸1。在后面程序?qū)Τ叽鐓?shù)進(jìn)行修改時(shí)需要首先獲取這些標(biāo)注對(duì)象,然后再調(diào)用API函數(shù)對(duì)其值進(jìn)行設(shè)置。在VC++與SolidWorks的接口已經(jīng)連接成功的前提下,在VC+中是可以直接調(diào)用API函數(shù)進(jìn)行編程的。首先,在工程中建立對(duì)話框并添加edit控件、圖片控件等,并對(duì)相應(yīng)的控件添加變量,本例的最終對(duì)話框,如圖5所示。接下來進(jìn)入代碼編寫界面。程序編寫完成后,在剪叉臂參數(shù)設(shè)置窗口的編輯框中輸入需要修改的尺寸值后,點(diǎn)擊“確定”按鈕,即可完成對(duì)剪叉臂尺寸的修改和更新。最后,在裝配體窗口中點(diǎn)擊“生成模型”按鈕,則整個(gè)裝配體中修改過的零件將會(huì)進(jìn)行更新,從而得到重建模型。其中部分程序代碼如下:
//剪叉臂參數(shù)設(shè)置
ISldWorksm_SldWorks;//定義 SolidWorks對(duì)象
IModelDoc pModelDoc;//定義 ModelDoc對(duì)象
longtype=swDocPART;//定義文檔類型為零件
BOOL panduan=m_SldWorks.CreateDispatch("SldWorks.Applica
tion",NULL);//運(yùn)行 SolidWorks軟件
_bstr_t fileName(_T("C:\****\剪叉上下叉管 1.SLDPRT"));//定義文件名
UpdateData(TRUE);//獲得編輯框輸入的數(shù)據(jù)
inta=m_a.GetBuffer(0);
intb=m_b.GetBuffer(0);
ints=m_s.GetBuffer(0);
intl=m_l.GetBuffer(0);
CStringpath=(LPCTSTR)fileName;//定義文件路徑
LPDISPATCH modDisp=m_SldWorks.OpenDoc(path,type);
pModelDoc.AttachDispatch (modDisp);//獲 得 IModelDoc 對(duì) 象
m_pModelDoc
IPartDoc partDoc(modDisp);//獲得 IPartDoc對(duì)象
//剪叉臂截面長(zhǎng)A的參數(shù)設(shè)置
LPDISPATCHpDim_a=pModelDoc.Parameter("A@ 草圖 1");//獲得
尺寸參數(shù)A
IDimension Dime_a(pDim_a);//獲得 IDimension 對(duì)象 Dime_a
Dime_a.SetValue(a);//將尺寸設(shè)置為編輯框輸入值 A
//剪叉臂截面寬B的參數(shù)設(shè)置
**********;
//剪叉臂截面長(zhǎng)S的參數(shù)設(shè)置
**********;
//剪叉臂臂長(zhǎng)L的參數(shù)設(shè)置
**********;
partDoc.EditRebuild();//零件重建
pModelDoc.SaveAsSilent(path,type);//保存文件
m_SldWorks.CloseDoc(path);//關(guān)閉打開的文件
m_SldWorks.ExitApp();//關(guān)閉 SolidWorks
裝配體重建的編程流程大體與修改零件尺寸的前半部分相似。在調(diào)用打開SolidWorks軟件后,通過OpenDoc函數(shù)打開裝配體文件,然后通過一個(gè)重建命令實(shí)現(xiàn)整個(gè)模型的重建。程序的部分代碼如下:
longtype=swDocASSEMBLY;//定義文檔類型為裝配體
**************;//調(diào)用 SolidWorks軟件
_bstr_tfileName(_T("C:\****\剪叉式升降平臺(tái)總裝.SLDASM"));//定義文件名
pModelDoc=m_SldWorks.OpenDoc(fileName,type);//打開裝配體文件
pModelDoc.EditRebuild3(); //重新生成模型
其中“C:\****\剪叉上下叉管 1.SLDPRT”和“C:\****\剪叉式升降平臺(tái)總裝.SLDASM”中的****為零件和裝配體文件的存放路徑。另外,為便于對(duì)修改結(jié)果進(jìn)行觀察,可以將程序運(yùn)行后SolidWorks的圖形界面通過截圖的方式嵌入到對(duì)話框中,具體代碼如下:
CStringsFileBmp;//定義位圖文件路徑
intwz1=path.Find('.',0);//將位圖放置在零件文件路徑
sFileBmp=path.Mid(0,wz1)+".bmp";//添加位圖后綴
CRectrect;
m_pic.GetClientRect(&rect);
pModelDoc.SaveBMP ((LPCTSTR)sFileBmp,rect.Width (),rect.Height());//保存位圖文件
m_pic.SetBitmap((HBITMAP)::LoadImage(::AfxGetInstanceHandle(),sFileBmp,IMAGE_BITMAP,rect.Width(),rect.Height(),LR_LOADFROMFILE));//加載位圖文件
運(yùn)行程序,輸入相關(guān)參數(shù)值,最終結(jié)果,如圖5所示。示例中兩次參數(shù)設(shè)置的剪叉臂尺寸A分別為100和200,從圖5(a)可以看出兩者運(yùn)行結(jié)果的差別。從圖5(b)的局部放大圖可看出修改剪叉臂尺寸后整個(gè)裝配體模型的變化。
圖5 零件尺寸修改前后的模型對(duì)比Fig.5 The Comparison of Models Before and After Modify Parts Dimensions
介紹了一種以VC++為開發(fā)工具、以SolidWorks為造型軟件的大型裝配體的參數(shù)化建模方法,并對(duì)其中的關(guān)鍵技術(shù)進(jìn)行了闡述,包括裝配體模型庫的處理、SolidWorks二次開發(fā)的異步模式的接口技術(shù)及具體的編程流程等。并且通過某型號(hào)的剪叉式升降平臺(tái)的參數(shù)化建模實(shí)例進(jìn)行了具體演示。應(yīng)用該參數(shù)化建模方法得到的設(shè)計(jì)平臺(tái),能夠?qū)崿F(xiàn)當(dāng)對(duì)相關(guān)設(shè)計(jì)參數(shù)進(jìn)行修改時(shí),其它的相關(guān)尺寸能夠進(jìn)行自動(dòng)更新,最終實(shí)現(xiàn)整個(gè)裝配體的重建。使用該參數(shù)化建模方法,能夠大大提高系列化三維裝配體設(shè)計(jì)和優(yōu)化的效率,減輕設(shè)計(jì)人員的工作量,具有一定理論和實(shí)際意義。