基于SolidWorks尺寸驅(qū)動(dòng)建模的二次開發(fā)

2014-11-19 吳志林 南京理工大學(xué)機(jī)械工程學(xué)院

  闡述了SolidWorks二次開發(fā)原理,提出了基于零件尺寸遍歷的尺寸驅(qū)動(dòng)建模二次開發(fā)方法并詳細(xì)論述了開發(fā)思路。以VBA為開發(fā)工具,運(yùn)用SolidWorks API技術(shù),實(shí)現(xiàn)了此方法在SolidWorks 中的應(yīng)用。該方法對(duì)傳統(tǒng)的尺寸驅(qū)動(dòng)建模進(jìn)行了改進(jìn),使尺寸驅(qū)動(dòng)建模具有普遍適用性,可大大提高產(chǎn)品設(shè)計(jì)效率。

  引言

  SolidWorks 是一款優(yōu)秀的三維工程軟件,因其操作簡(jiǎn)單、功能強(qiáng)大、具有很好的開放性和兼容性而為廣大機(jī)械設(shè)計(jì)工程師所接受。但SolidWorks 畢竟是國(guó)外軟件,與我國(guó)國(guó)家標(biāo)準(zhǔn)在很多方面有所不同,多年來(lái),針對(duì)SolidWorks 軟件的二次開發(fā)工作從未間斷。

  在系列零件設(shè)計(jì)及形狀相似的模型建模方面,傳統(tǒng)的SolidWorks 的二次開發(fā)主要有兩種:一是使用系列零件設(shè)計(jì)表;二是定制尺寸驅(qū)動(dòng)窗體。這兩種方法都有其不足之處:系列零件設(shè)計(jì)表需要設(shè)計(jì)者先輸入大量特定的尺寸數(shù)據(jù),使用時(shí)若表中沒有需要的系列,仍需要對(duì)模型進(jìn)行重新建模;定制尺寸驅(qū)動(dòng)窗體只針對(duì)某特定形狀的零件,不具有普遍性,例如,定制的平鍵尺寸驅(qū)動(dòng)窗體只能在平鍵建模時(shí)使用,螺栓建模時(shí)將無(wú)法使用。

  本文以SolidWorks 自帶的VBA 為開發(fā)工具,提出了基于SolidWorks 尺寸驅(qū)動(dòng)建模的二次開發(fā)方法,該方法與定制尺寸驅(qū)動(dòng)窗體有相似之處,但在模型針對(duì)性方面做了改進(jìn),使尺寸驅(qū)動(dòng)建模具有普遍性。任何在設(shè)計(jì)時(shí)標(biāo)注了尺寸的模型,都可以使用該方法輕松快速地實(shí)現(xiàn)模型尺寸數(shù)據(jù)更改,從而幫助設(shè)計(jì)者大大提高工作效率。

1、開發(fā)原理

  SolidWorks 二次開發(fā)主要通過(guò)其內(nèi)嵌的API(Application Programming Interface,應(yīng)用程序接口)進(jìn)行,任何基于Windows 系統(tǒng),支持OLE(Object Linking and Embedding,對(duì)象鏈接與嵌入)技術(shù)的編程軟件,如VB、Delphi、VBA、C、VisualC++等都可以對(duì)SolidWorks 進(jìn)行二次開發(fā)。API 就像一個(gè)暗盒,設(shè)計(jì)者只需要在程序中為API 提供相應(yīng)的參數(shù),API 函數(shù)就能輸出相應(yīng)的結(jié)果,而無(wú)需理會(huì)API 內(nèi)部的工作方式。開發(fā)時(shí),開發(fā)者要找到完成所需功能的API 函數(shù),了解該函數(shù)的參數(shù)含義,從而完成二次開發(fā)。

  Solidworks API 對(duì)象是一個(gè)自上而下的多層次的樹形網(wǎng)絡(luò)。如圖1 所示,Sldworks 是根目錄對(duì)象,位于應(yīng)用程序的底層,是訪Solidworks API 所有對(duì)象的入口程序。接口對(duì)Solidworks API 的調(diào)用實(shí)行逐級(jí)尋訪,先調(diào)用能實(shí)現(xiàn)所需功能對(duì)象的父對(duì)象,然后調(diào)用與父對(duì)象相關(guān)的子對(duì)象,如果子對(duì)象所封裝的屬性和方法不能實(shí)現(xiàn)所需要的功能,則繼續(xù)調(diào)用該子對(duì)象的下級(jí)子對(duì)象,如此逐級(jí)遍歷,直到結(jié)束[5]。So1idworksAPI 父對(duì)象與子對(duì)象是包含關(guān)系,不是繼承關(guān)系,父對(duì)象包含子對(duì)象的屬性和方法,子對(duì)象自身不帶有該屬性和方法。二次開發(fā)中,如果沒有按規(guī)則進(jìn)行API逐級(jí)調(diào)用,將無(wú)法實(shí)現(xiàn)所需功能。本文所做二次開發(fā)主要用到了ModelDoc2 對(duì)象的特征管理子對(duì)象Feature 對(duì)象和尺寸管理子對(duì)象Parameter 對(duì)象。

2、開發(fā)思路

  用戶在SolidWorks 建模過(guò)程中標(biāo)注的尺寸,SolidWorks 會(huì)自動(dòng)為其生成在該零件中惟一的尺寸名稱。特征樹中零件特征分為二維特征“草圖x”和三維特征“拉伸x/切除x/旋轉(zhuǎn)x 等”兩類(x 為數(shù)字,下同)。每次執(zhí)行由二維草圖生成三維特征的操作時(shí),SolidWorks 通常僅自動(dòng)生成一個(gè)三維尺寸名稱,一般為“D1@拉伸1”、“D1@旋轉(zhuǎn)1”的形式;二維草圖中的尺寸數(shù)量則由設(shè)計(jì)者標(biāo)注的多少?zèng)Q定,例如用戶在“草圖2”中標(biāo)注了三個(gè)尺寸,則SolidWorks 為三個(gè)尺寸生成的名稱分別為“D1@草圖2”、“D2@草圖2”和“D3@草圖2”。因此,通過(guò)遍歷零件特征讀取各個(gè)特征包含的尺寸數(shù)目,就可以在程序中還原尺寸數(shù)據(jù)名稱,然后為各個(gè)尺寸賦值,重建模型。

Solidworks對(duì)象模型

圖1 Solidworks對(duì)象模型

尺寸驅(qū)動(dòng)建模開發(fā)流程

圖2 尺寸驅(qū)動(dòng)建模開發(fā)流程

  尺寸驅(qū)動(dòng)建模開發(fā)流程如圖2 所示,啟動(dòng)SolidWorks 后,判斷是否有零件被打開。如果有,則獲得當(dāng)前零件的名稱,供遍歷特征及尺寸驅(qū)動(dòng)建模時(shí)使用;如果沒有,提示用戶打開零件。程序獲得零件名稱之后,開始對(duì)零件的特征樹進(jìn)行遍歷。

  因?yàn)樘卣鳂渲?ldquo;備注”、“注解”、“光源”、“材質(zhì)”、視圖基準(zhǔn)面、“原點(diǎn)”等特征不具備尺寸特征,API 遍歷特征樹的順序又為從上到下依次進(jìn)行,且零件特征緊接“原點(diǎn)”特征之下,所以遍歷過(guò)程中判斷當(dāng)前特征是否為“原點(diǎn)”,如果為“原點(diǎn)”,則在下一次的遍歷中開始遍歷零件的各個(gè)特征及特征所包含的尺寸數(shù)目。遍歷特征并判斷該特征包含尺寸數(shù)目時(shí),通過(guò)判斷“選擇尺寸時(shí)返回值是否為真”來(lái)實(shí)現(xiàn)。例如,零件模型特征樹中有“草圖1”,“草圖1”中含有x 個(gè)用戶標(biāo)注的尺寸,程序通過(guò)循環(huán),從選擇“D1@草圖1”開始判斷選擇“Dy@草圖1”時(shí)返回值的真假,當(dāng)1≤y≤x 時(shí),返回值為真,說(shuō)明尺寸存在,當(dāng)y=x+1 時(shí)返回值為假,說(shuō)明尺寸不存在,并停止在“草圖1”特征的尺寸遍歷,從而獲得“草圖1”包含的尺寸數(shù)目。遍歷出各個(gè)特征所包含的尺寸數(shù)目之后,分別將其存儲(chǔ)于數(shù)組,然后根據(jù)各個(gè)特征的名稱及所包含的尺寸數(shù)目,動(dòng)態(tài)加載尺寸驅(qū)動(dòng)窗體,并在窗體上顯示每個(gè)尺寸名稱及相應(yīng)的尺寸數(shù)據(jù)輸入框。用戶輸入相應(yīng)尺寸的數(shù)值并確定,程序即可通過(guò)調(diào)用Solidworks API函數(shù),自動(dòng)完成尺寸驅(qū)動(dòng)建模。

4、結(jié)束語(yǔ)

  本文指出了傳統(tǒng)的基于SolidWorks 對(duì)系列零件及形狀相似、尺寸不同的零件模型二次開發(fā)方面存在的不足,提出了基于SolidWorks 尺寸遍歷的尺寸驅(qū)動(dòng)建模二次開發(fā)方法。運(yùn)用SolidWorks API 技術(shù),以SolidWorks 自帶VBA 為開發(fā)工具,實(shí)現(xiàn)了該方法在SolidWorks 中的應(yīng)用,使得尺寸驅(qū)動(dòng)建模能夠針對(duì)任何模型方便地進(jìn)行尺寸數(shù)據(jù)的更改,適用性得到了極大的提高,這對(duì)提高產(chǎn)品設(shè)計(jì)效率,縮短產(chǎn)品設(shè)計(jì)周期具有重要意義。