SOLIDWORKS強大功能—宏(二)

之前的文章介紹了如何通過SOLIDWORKS軟件的VBA來開發(fā)一個簡單的標(biāo)準(zhǔn)件生成器;后面我們會對這個標(biāo)準(zhǔn)件生成器進(jìn)行進(jìn)一步功能擴充,今天我們來研究另一個問題:SOLIDWORKS裝配體零件遍歷。
SOLIDWORKS裝配體零件遍歷在二次開發(fā)中會經(jīng)常使用,比如:
1.創(chuàng)建裝配體結(jié)構(gòu)BOM,搜索結(jié)構(gòu)的所有層級,并提取每個結(jié)構(gòu)、零件的屬性信息;
2.在裝配體中查找出所有的標(biāo)準(zhǔn)件、特定的零部件;
3.當(dāng)裝配體提示零件中存在被壓縮的特征時,通過遍歷找出被壓縮特征的零部件;
4.遍歷整個結(jié)構(gòu),為每個零件進(jìn)行隨機上色;
5.批量檢查零件屬性的完整性;
那么在SOLIDWORKS VBA開發(fā)中,如何對裝配體結(jié)構(gòu)進(jìn)行完整的遍歷呢?以下是對裝配體遍歷的基本流程:

首先用戶需要先獲取當(dāng)前裝配體結(jié)構(gòu)的子組件,然后通過for循環(huán)遍歷該結(jié)構(gòu)的所有子組件,并且判斷每個子組件是屬于零件還是裝配體,如果是裝配體,則需要對該裝配體進(jìn)行子組件獲取,然后檢查該裝配體的下屬層級…如此往復(fù);
但因為我們無法預(yù)先知道任何一個裝配體結(jié)構(gòu)存在多少個層級,所以也無法判斷需要執(zhí)行多少次for循環(huán),所以我們在這里使用了遞歸的方式來處理該問題。
以下是裝配體遍歷的基本代碼:

在main主函數(shù)中,我們通過 Set swmodel = swApp.ActiveDoc 獲取到當(dāng)前正在被SOLDWORKS打開且處于當(dāng)前顯示界面的裝配體,通過 swmodelComps = swAsm.GetComponents(True) 或者這個裝配體的所有子組件,放到swmodelComps 這個數(shù)組中;
接下來調(diào)用GetAsmChild這個函數(shù),并且將swmodelComps數(shù)組作為變量傳遞到函數(shù)中;
在GetAsmChild函數(shù)中,通過:
For i = 0 To UBound(swmodelComps)
…
Next
語句對獲取到的子組件數(shù)組進(jìn)行遍歷,該遍歷只會搜索結(jié)構(gòu)的一個層級,為了讓遍歷可以搜索結(jié)構(gòu)的所有層級,所以有如下的條件判斷代碼:
If swmodel.GetType = 1 Then
MsgBox (swmodel.GetTitle)
ElseIf swmodel.GetType = 2 Then
swAsm = swmodel
GetAsmChild (swAsm.GetComponents(True))
End If
其中swmodel.GetType = 1 表示該獲取到的一個層級中的其中一條子組件屬于零件;
其中MsgBox (swmodel.GetTitle) 表示將該零件的名稱進(jìn)行顯示;
重點在對子組件屬于裝配體的處理,在swmodel.GetType = 2 的條件(子組件屬于裝配體)中,我們做了如下操作:
GetAsmChild (swAsm.GetComponents(True))
可以看到這是一個函數(shù)調(diào)用,調(diào)用了什么函數(shù)呢?調(diào)用了GetAsmChild,這實際上是調(diào)用了它自身,這種調(diào)用函數(shù)自身的情況就叫做遞歸;
可以看到,雖然函數(shù)相同,但是前后兩個GetAsmChild的變量卻不同,第一次的GetAsmChild作為入口,傳遞的是我們打開的裝配體文件的信息,第二次到第N次,傳遞的則是每一個子組件(子裝配體)的信息,這樣層層嵌套,最終實現(xiàn)裝配體結(jié)構(gòu)的整體的遍歷。
以上是本次SOLIDWORKS VBA裝配體結(jié)構(gòu)遍歷的一些分享,希望能夠幫助大家。