摘 要: 闡述了SolidWorks二次開發(fā)原理,提出了基于零件尺寸遍歷的尺寸驅(qū)動建模二次開發(fā)方法并詳細(xì)論述了開發(fā)思路。以VBA為開發(fā)工具,運(yùn)用SolidWorks API技術(shù),實(shí)現(xiàn)了此方法在SolidWorks中的應(yīng)用。該方法對傳統(tǒng)的尺寸驅(qū)動建模進(jìn)行了改進(jìn),使尺寸驅(qū)動建模具有普遍適用性,可大大提高產(chǎn)品設(shè)計效率。
關(guān)鍵詞: 尺寸遍歷; 尺寸驅(qū)動; VBA; 二次開發(fā)
中圖分類號:TP391 文獻(xiàn)標(biāo)志碼:A 文章編號:1006-8228(2013)01-14-03
Secondary development of dimension-driven model construction based on Solidworks
Wu Zhilin, Zhang Kaihuan
(School of Mechanical Engineering, Nanjing University of Science and Technology, Nanjing, Jiangsu 210094, China)
Abstract: The basic principles of secondary development of SolidWorks are introduced. A dimension-driven and dimension-traversal method of building models is proposed. Using VBA as the development tool,this method is achieved based on SolidWorks API technology. The traditional secondary development of SolidWorks is improved based on dimension-driven model which makes the modeling process easier and improves the efficiency of product design.
Key words: dimension-driven; dimension- traversal; VBA; secondary development
0 引言
SolidWorks是一款優(yōu)秀的三維工程軟件,因其操作簡單、功能強(qiáng)大、具有很好的開放性和兼容性而為廣大機(jī)械設(shè)計工程師所接受。但SolidWorks畢竟是國外軟件,與我國國家標(biāo)準(zhǔn)在很多方面有所不同,多年來,針對SolidWorks軟件的二次開發(fā)工作從未間斷。
在系列零件設(shè)計及形狀相似的模型建模方面,傳統(tǒng)的SolidWorks的二次開發(fā)主要有兩種:一是使用系列零件設(shè)計表;二是定制尺寸驅(qū)動窗體[1-2]。這兩種方法都有其不足之處:系列零件設(shè)計表需要設(shè)計者先輸入大量特定的尺寸數(shù)據(jù),使用時若表中沒有需要的系列,仍需要對模型進(jìn)行重新建模;定制尺寸驅(qū)動窗體只針對某特定形狀的零件,不具有普遍性,例如,定制的平鍵尺寸驅(qū)動窗體只能在平鍵建模時使用,螺栓建模時將無法使用。
本文以SolidWorks自帶的VBA為開發(fā)工具,提出了基于SolidWorks尺寸驅(qū)動建模的二次開發(fā)方法,該方法與定制尺寸驅(qū)動窗體有相似之處,但在模型針對性方面做了改進(jìn),使尺寸驅(qū)動建模具有普遍性。任何在設(shè)計時標(biāo)注了尺寸的模型,都可以使用該方法輕松快速地實(shí)現(xiàn)模型尺寸數(shù)據(jù)更改,從而幫助設(shè)計者大大提高工作效率。
1 開發(fā)原理
SolidWorks二次開發(fā)主要通過其內(nèi)嵌的API(Application Programming Interface,應(yīng)用程序接口)進(jìn)行,任何基于Windows系統(tǒng),支持OLE(Object Linking and Embedding,對象鏈接與嵌入)技術(shù)的編程軟件,如VB、Delphi、VBA、C、Visual C++等都可以對SolidWorks進(jìn)行二次開發(fā)[3]。API就像一個暗盒,設(shè)計者只需要在程序中為API提供相應(yīng)的參數(shù),API函數(shù)就能輸出相應(yīng)的結(jié)果,而無需理會API內(nèi)部的工作方式。開發(fā)時,開發(fā)者要找到完成所需功能的API函數(shù),了解該函數(shù)的參數(shù)含義,從而完成二次開發(fā)。
Solidworks API對象是一個自上而下的多層次的樹形網(wǎng)絡(luò)。如圖1所示[4],Sldworks是根目錄對象,位于應(yīng)用程序的底層,是訪問Solidworks API所有對象的入口程序。接口對Solidworks API的調(diào)用實(shí)行逐級尋訪,先調(diào)用能實(shí)現(xiàn)所需功能對象的父對象,然后調(diào)用與父對象相關(guān)的子對象,如果子對象所封裝的屬性和方法不能實(shí)現(xiàn)所需要的功能,則繼續(xù)調(diào)用該子對象的下級子對象,如此逐級遍歷,直到結(jié)束[5]。So1idworks API父對象與子對象是包含關(guān)系,不是繼承關(guān)系,父對象包含子對象的屬性和方法,子對象自身不帶有該屬性和方法。二次開發(fā)中,如果沒有按規(guī)則進(jìn)行API逐級調(diào)用,將無法實(shí)現(xiàn)所需功能。
本文所做二次開發(fā)主要用到了ModelDoc2對象的特征管理子對象Feature對象和尺寸管理子對象Parameter對象。
2 開發(fā)思路
用戶在SolidWorks建模過程中標(biāo)注的尺寸,SolidWorks會自動為其生成在該零件中惟一的尺寸名稱。特征樹中零件特征分為二維特征“草圖x”和三維特征“拉伸x/切除x/旋轉(zhuǎn)x等”兩類(x為數(shù)字,下同)。每次執(zhí)行由二維草圖生成三維特征的操作時, SolidWorks通常僅自動生成一個三維尺寸名稱,一般為“D1@拉伸1”、“D1@旋轉(zhuǎn)1”的形式;二維草圖中的尺寸數(shù)量則由設(shè)計者標(biāo)注的多少決定,例如用戶在“草圖2”中標(biāo)注了三個尺寸,則SolidWorks為三個尺寸生成的名稱分別為“D1@草圖2”、“D2@草圖2”和“D3@草圖2”。因此,通過遍歷零件特征讀取各個特征包含的尺寸數(shù)目,就可以在程序中還原尺寸數(shù)據(jù)名稱,然后為各個尺寸賦值,重建模型。
尺寸驅(qū)動建模開發(fā)流程如圖2所示,啟動SolidWorks后,判斷是否有零件被打開。如果有,則獲得當(dāng)前零件的名稱,供遍歷特征及尺寸驅(qū)動建模時使用;如果沒有,提示用戶打開零件。程序獲得零件名稱之后,開始對零件的特征樹進(jìn)行遍歷。因?yàn)樘卣鳂渲小皞渥ⅰ薄ⅰ白⒔狻?、“光源”、“材質(zhì)”、視圖基準(zhǔn)面、“原點(diǎn)”等特征不具備尺寸特征,API遍歷特征樹的順序又為從上到下依次進(jìn)行,且零件特征緊接“原點(diǎn)”特征之下,所以遍歷過程中判斷當(dāng)前特征是否為“原點(diǎn)”,如果為“原點(diǎn)”,則在下一次的遍歷中開始遍歷零件的各個特征及特征所包含的尺寸數(shù)目。
遍歷特征并判斷該特征包含尺寸數(shù)目時,通過判斷“選擇尺寸時返回值是否為真”來實(shí)現(xiàn)。例如,零件模型特征樹中有“草圖1”,“草圖1”中含有x個用戶標(biāo)注的尺寸,程序通過循環(huán),從選擇“D1@草圖1”開始判斷選擇 “Dy@草圖1”時返回值的真假,當(dāng)1≤y≤x時,返回值為真,說明尺寸存在,當(dāng)y=x+1時返回值為假,說明尺寸不存在,并停止在“草圖1”特征的尺寸遍歷,從而獲得“草圖1”包含的尺寸數(shù)目。
遍歷出各個特征所包含的尺寸數(shù)目之后,分別將其存儲于數(shù)組,然后根據(jù)各個特征的名稱及所包含的尺寸數(shù)目,動態(tài)加載尺寸驅(qū)動窗體,并在窗體上顯示每個尺寸名稱及相應(yīng)的尺寸數(shù)據(jù)輸入框。用戶輸入相應(yīng)尺寸的數(shù)值并確定,程序即可通過調(diào)用Solidworks API函數(shù),自動完成尺寸驅(qū)動建模。
3 開發(fā)示例
⑴ 建立尺寸驅(qū)動窗體,如圖3所示。需指出的是,本文是在VBA環(huán)境下進(jìn)行的二次開發(fā),VBA不支持控件數(shù)組,所以要事先在窗體中建立足夠多的控件,程序運(yùn)行時再由尺寸數(shù)量決定顯示多少組控件。當(dāng)然,VBA與VB極其相似,用戶還可以在VB環(huán)境中進(jìn)行二次開發(fā),或者在VBA環(huán)境中編寫類模塊實(shí)現(xiàn)控件數(shù)組功能,但這些不是本文重點(diǎn),在此不再贅述。
⑵ 主程序關(guān)鍵代碼。
Public swApp As SldWorks.SldWorks
Public swmodel As SldWorks.ModelD-oc2
Public k As Integer
Sub main() ‘主程序過程
Dim swFeature As SldWorks.Feature
…… ‘省略一般變量聲明
j=1
Set swApp=Application.SldWorks ‘建立SolidWorks對象
swApp.SetUserPreferenceToggle swShowDimensionNames, True
‘在零件模型中點(diǎn)擊草圖時,顯示尺寸名稱。這樣做是為了在草圖尺寸數(shù)目較多的情況下,方便用戶查閱尺寸名稱所對應(yīng)的零件特征尺寸。
If Not swApp Is Nothing Then
Set swmodel=swApp.ActiveDoc‘獲得當(dāng)前活動文檔。
If swmodel=Nothing Then
‘判斷是否有文檔被打開
MsgBox \"請先打開零件。\"
Exit Sub
‘如果沒有零件被打開,跳出過程。
End If
str=swmodel.GetTitle
‘獲得當(dāng)前活動文檔的零件名稱,尺寸驅(qū)動建模時會用到該字符串變量。
If Not swmodel Is Nothing Then ‘如果當(dāng)前有文檔被打開,開始遍歷。
Set swFeature=swmodel.FirstFeature
‘獲得特征樹中的第一個特征。
While Not swFeature Is Nothing
‘如果特征存在,判斷特征類型。
Featname=swFeature.Name ‘獲得特征名稱。
If Featname=\"原點(diǎn)\" Then
bltz=True
‘只有bltz為true時,才會遍歷特征所包含的尺寸數(shù)。
GoTo tiaozhuan
‘“原點(diǎn)”特征無尺寸,可以直接遍歷下一特征。
End If
i=1 ‘從“D1@特征x”開始遍歷。
bl=True ‘為選擇尺寸的返回值賦初始值,啟動循環(huán)。
If bltz=True Then
While bl ‘bl值為true時,即尺寸存在時循環(huán)。
str1=\"D\" i ‘生成尺寸名稱字符串。
bl=swmodel.Extension.SelectByID2(str1 \"@\"
Featname \"@\"str\".SL-DPRT\",\"DIMENSION\",
0.015427,0.03894,0.006118,F(xiàn)alse,0,Nothing,0)
‘當(dāng)尺寸被選擇,即尺寸存在時,bl值為true,進(jìn)行下一次遍歷。
i=i+1
Wend
a(j)=i-2 ‘記錄第j個特征包含尺寸數(shù)目,便于在尺寸驅(qū)動窗
體中還原尺寸名稱。
b(j)=Featname ‘記錄第j個特征的特征名稱,便于在尺寸
驅(qū)動窗體中還原尺寸名稱。
j=j+1
End If
tiaozhuan:
Set swFeature=swFeature.GetNextFeature
‘獲得下一個特征。
Wend
End If
For i=1 To j-1
k=k+a(i)
‘獲得尺寸數(shù)目的總數(shù)。
Next
Frm1.Show 0
‘加載非模態(tài)的窗體。當(dāng)模型的尺寸較多時,只有當(dāng)尺寸驅(qū)動窗體為非模態(tài),用戶才可以查看尺寸名稱對應(yīng)的模型特征;若窗體為模態(tài)的,窗體將顯示在Solidworks界面的最前端,且在窗體卸載之前,SolidWorks無法響應(yīng)窗體以外的任何操作。
End If
End Sub
⑶ 尺寸驅(qū)動窗體代碼。
Private Sub UserForm_Initialize() ‘窗體初始化。
……
‘省略變量聲明聲明及控件位置調(diào)整部分,該部分用戶可根據(jù)控件大小自行調(diào)整。
For i=30 To k+1 Step-1
Frm1.Controls(\"label\" i).Visible=False
Frm1.Controls(\"textbox\" i).Visible=False
‘根據(jù)尺寸的總數(shù)目決定顯示多少組標(biāo)簽及文本框,本程序預(yù)置了30組,用戶可以根據(jù)需要增加或減少。
Next
n=1
For i=1 To j-1
For m=1 To a(i)
Frm1.Controls(\"label\" n).Caption=\"D\" m \"@\" b(i)
‘使用標(biāo)簽顯示尺寸名稱。
n=n+1
Next
Next
For i=1 To k
strb(i)=Frm1.Controls(\"label\" i).C-aption
sng(i)=swmodel.Parameter(strb(i) \"@\" str).SystemValue
Frm1.Controls(\"textbox\" i).Text=sng(i)*1000
‘在文本框中顯示相應(yīng)的尺寸數(shù)值,供用戶輸入新數(shù)值時參照。
Next
End Sub
Private Sub Cmd1_Click()
……‘省略聲明部分。
For i=1 To k
strb(i)= Frm1.Controls(\"label\" i).C-aption
‘獲得尺寸名稱并賦值于數(shù)組。
Next
For i=1 To k
swmodel.Parameter(strb(i) \"@\" str).SystemValue=
Val(Frm1.Controls(\"text-box\" i).Text)/1000
‘將相應(yīng)文本框中的數(shù)值賦值于相應(yīng)尺寸。
Next
swmodel.EditRebuild
‘重建模型。
Set swmodel=Nothing
‘釋放對象型變量。
Set swApp=Nothing
Unload Frm1 ‘卸載窗體。
End Sub
⑷ 程序運(yùn)行示例如圖4所示。對比程序運(yùn)行前界面圖3可以看出,程序運(yùn)行時,會根據(jù)零件的特征樹(圖4上部分)自動生成相應(yīng)的尺寸驅(qū)動窗體(圖4下部分),使用戶對模型的更改變得非常方便。
4 結(jié)束語
本文指出了傳統(tǒng)的基于SolidWorks對系列零件及形狀相似、尺寸不同的零件模型二次開發(fā)方面存在的不足,提出了基于SolidWorks尺寸遍歷的尺寸驅(qū)動建模二次開發(fā)方法。運(yùn)用SolidWorks API技術(shù),以SolidWorks自帶VBA為開發(fā)工具,實(shí)現(xiàn)了該方法在SolidWorks中的應(yīng)用,使得尺寸驅(qū)動建模能夠針對任何模型方便地進(jìn)行尺寸數(shù)據(jù)的更改,適用性得到了極大的提高,這對提高產(chǎn)品設(shè)計效率,縮短產(chǎn)品設(shè)計周期具有重要意義。
參考文獻(xiàn):
[1] 張莉.基于solidworks平臺的二次開發(fā)技術(shù)[J].計算機(jī)時代,2003.10:31-32
[2] 江有永,曾忠,范衛(wèi)高,曹志全.標(biāo)準(zhǔn)件庫的表格化制作[J].機(jī)械制造,2003.41(464):26-27
[3] 徐國權(quán),黃志超.基于SolidWorks的參數(shù)化設(shè)計二次開發(fā)研究[J].機(jī)械設(shè)計與研究,2007.23(1):68-70
[4] Solidworks公司.Solidworks API二次開發(fā)[M].機(jī)械工業(yè)出版社,2005.
[5] 呂曉燕,賈海英,張曉鐘.基于VB對SolidWorks二次開發(fā)方法的研究[J].機(jī)械設(shè)計與制造,2005.3:114-116