李志雄,王宗彥,侯驊玲,張偉
(1. 中北大學(xué) 機(jī)械與動(dòng)力工程學(xué)院, 山西 太原 030051; 2. 山西省起重機(jī)數(shù)字化設(shè)計(jì)工程技術(shù)研究中心, 山西 太原 030051)
隨著SolidWorks在國(guó)內(nèi)應(yīng)用領(lǐng)域的不斷擴(kuò)大,用戶群體也越來(lái)越龐大,其參與企業(yè)新產(chǎn)品研發(fā)與高校科研也越來(lái)越普遍,因此SolidWorks的“本土化”應(yīng)用需求也越來(lái)越大。對(duì)SolidWorks進(jìn)行有針對(duì)性的二次開(kāi)發(fā)成為當(dāng)務(wù)之急。
二次開(kāi)發(fā)是對(duì)軟件用戶化和專業(yè)化的有效手段,可以使軟件更好地為用戶服務(wù),提高CAD軟件的應(yīng)用效率、專業(yè)性,充分發(fā)揮CAD軟件的使用效益,在提高工作效率和工作質(zhì)量等方面有著十分重要的意義[1]。三維軟件的二次開(kāi)發(fā)要遵循工程化、 模塊化、標(biāo)準(zhǔn)化和繼承性等一系列的原則,依據(jù)工程化的思路對(duì)二次開(kāi)發(fā)進(jìn)行統(tǒng)籌規(guī)劃,具體實(shí)現(xiàn)模塊化、標(biāo)準(zhǔn)化和繼承性原則[2]。簡(jiǎn)單地說(shuō)就是在現(xiàn)有的三維軟件上進(jìn)行定制修改,功能擴(kuò)展,以達(dá)到開(kāi)發(fā)者想要的功能。SolidWorks在二次開(kāi)發(fā)后有兩個(gè)主要的應(yīng)用領(lǐng)域,一是特殊化建模,二是獲取SolidWorks文件顯式或隱式的信息。其中,特殊化建模又可分為兩種:使用二次開(kāi)發(fā)在特定條件下的直接建模與裝配;參數(shù)化建模、裝配與生成工程圖。其中前者對(duì)開(kāi)發(fā)者能力要求較高,后者要求較低。因此文中主要探究前者的二次開(kāi)發(fā)方法。
SolidWorks具有開(kāi)放的外部接口,并且在其不斷更新的過(guò)程中也不斷地更新二次開(kāi)發(fā)的接口函數(shù)。Solidworks的API(application programming interface應(yīng)用編程接口)是一個(gè)基于OLE Automation的編程接口,其中包含了數(shù)以百計(jì)的功能函數(shù),這些函數(shù)提供了程序員直接訪問(wèn)Solidworks的能力,可以被VB、C/C++等編程語(yǔ)言調(diào)用[3]。API目的是提供應(yīng)用程序與開(kāi)發(fā)人員基于某軟件或硬件得以訪問(wèn)一組例程的能力,而又無(wú)需訪問(wèn)源碼。SolidWorks API接口函數(shù)庫(kù)是SolidWorks的OLE(object linking and embedding,對(duì)象連接與嵌入)應(yīng)用程序開(kāi)發(fā)接口,用戶可以利用它并通過(guò)支持OLE編程的開(kāi)發(fā)工具,如Visual Basic、VBA(Excel,Access)、C、Visual C++、C++等對(duì)SolidWorks進(jìn)行二次開(kāi)發(fā),建立滿足用戶需求的、專用的SolidWorks功能模塊[4]。通過(guò)調(diào)用SolidWorks API接口函數(shù)開(kāi)發(fā)的專用功能模塊大致有兩種應(yīng)用模式:
1) SolidWorks內(nèi)部運(yùn)行模式,即開(kāi)發(fā)后生成*.DLL的動(dòng)態(tài)鏈接庫(kù)文件,作為插件成為SolidWorks界面中的一部分;
2) 獨(dú)立于SolidWorks存在的*.EXE的可執(zhí)行程序,通過(guò)外部調(diào)用實(shí)現(xiàn)對(duì)SolidWorks的顯式或隱式操作。
SolidWorks可以使用多種編程語(yǔ)言進(jìn)行二次開(kāi)發(fā),C語(yǔ)言、Delphi、Visual C++、C#、Visual Basic6.0、VBA等均可以作為二次開(kāi)發(fā)的工具。目前,較常用的開(kāi)發(fā)工具為Visual C++與Visual Basic6.0。本文所采用的是二次開(kāi)發(fā)工具為Visual Basic6.0。
“宏”的含義就是一系列簡(jiǎn)短命令組成的一段較長(zhǎng)的命令代碼完成某些特定的功能。SolidWorks宏錄制工具可以記錄用戶操作SolidWorks時(shí)的“一舉一動(dòng)”,并將其轉(zhuǎn)化為可編輯的VBA代碼供二次開(kāi)發(fā)人員參考。
根據(jù)相關(guān)項(xiàng)目經(jīng)驗(yàn),總結(jié)了一套SolidWorks二次開(kāi)發(fā)代碼閱讀方法。但需首先了解Visual Basic6.0的【對(duì)象瀏覽器】功能以及SolidWorks API help使用方法。
1) 在取得一段使用VB書(shū)寫(xiě)的二次開(kāi)發(fā)代碼后,應(yīng)首先將檢查該工程是否引用了SolidWorks的常用類型庫(kù)“SolidWorks Constant Type Library”。這個(gè)類型庫(kù)包含了所有公開(kāi)的API接口,以及用于SolidWorks自動(dòng)操作可使用成員[5]。
引用類型庫(kù)之后,選擇菜單中【視圖】/【對(duì)象瀏覽器】,并在“工程/庫(kù)”中選擇“SldWorks”選項(xiàng),對(duì)話框中顯示的就是SolidWorks所有公共接口對(duì)象及其成員(如圖1所示)?!緦?duì)象瀏覽器】包含函數(shù)簡(jiǎn)要說(shuō)明,能夠方便地幫助開(kāi)發(fā)者了解每個(gè)對(duì)象下所有的事件、方法、過(guò)程與屬性。
圖1 VB對(duì)象瀏覽器
2) SolidWorks API help是軟件自帶指導(dǎo)二次開(kāi)發(fā)的幫助文件,它包含并描述了所有SolidWorks對(duì)象及其方法屬性的功能、參數(shù)、返回值含義以及使用范例。每個(gè)函數(shù)的聲明方法及使用范例均有由Visual Basic.net、VBA、C#、C++/CLI語(yǔ)言書(shū)寫(xiě)的版本。此幫助文件本身也提供了索引、搜索、收藏等功能,為開(kāi)發(fā)者全面了解API對(duì)象提供了百科全書(shū)。該幫助文件可通過(guò)選擇【幫助】下拉菜單中的【API幫助】找到,打開(kāi)后如圖2所示。通過(guò)API幫助文件不僅能夠清晰了解各對(duì)象之間的隸屬關(guān)系,而且還可以找到每個(gè)對(duì)象所包含所有屬性、事件、方法的詳細(xì)介紹。如圖3所示就是對(duì)象“TableAnnotation”與其下屬對(duì)象的結(jié)構(gòu)。對(duì)于一些復(fù)雜函數(shù)使用,該幫助文件也提供了大量范例來(lái)輔助。
圖2 API help
圖3 TableAnnotation對(duì)象結(jié)構(gòu)
熟練掌握以上兩種二次開(kāi)發(fā)輔助工具后就具備了二次開(kāi)發(fā)讀與寫(xiě)的基本前提。在VB與VBA編程環(huán)境下SolidWorks二次開(kāi)發(fā)代碼閱讀方法可分為遞進(jìn)式的3種。
1) 于不明含義的函數(shù)處右鍵,選擇“定義”進(jìn)行查看;
2) 于【對(duì)象瀏覽器】中搜索該函數(shù)名,根據(jù)其上級(jí)類對(duì)象在搜索結(jié)果中選擇正確的函數(shù)項(xiàng)進(jìn)行查看;
3) 于SolidWorks API help中進(jìn)行有針對(duì)性查找。對(duì)該函數(shù)進(jìn)行檢索,找到該函數(shù)在API help中的介紹。
由于SolidWorks有一些較深層次的內(nèi)容或新功能不提供二次開(kāi)發(fā)接口,因此直接建模與二次開(kāi)發(fā)相當(dāng)于包含與被包含關(guān)系(兩者的關(guān)系如圖4所示)。這無(wú)形中增加了開(kāi)發(fā)的難度。
圖4 二次開(kāi)發(fā)可操作范圍對(duì)比
開(kāi)發(fā)某項(xiàng)工程前,需挖掘開(kāi)發(fā)內(nèi)容的重點(diǎn)并制定最專業(yè)化、簡(jiǎn)單化的流程。因此,具有良好的建模規(guī)則與習(xí)慣成為編寫(xiě)二次開(kāi)發(fā)代碼的先決條件。以下介紹的是作者從項(xiàng)目經(jīng)驗(yàn)中按照遞進(jìn)原則總結(jié)的兩種二次開(kāi)發(fā)代碼編寫(xiě)方法。
第一種:對(duì)規(guī)劃好的建模或操作步驟進(jìn)行宏錄制并精簡(jiǎn)出宏代碼中的關(guān)鍵函數(shù);
第二種:宏錄制無(wú)果,分解該操作為若干步驟,查找分步驟的相關(guān)函數(shù)并進(jìn)行組合。
雖然宏錄制是一個(gè)便捷有效的二次開(kāi)發(fā)工具,但宏錄制出的代碼不能直接引用。宏記錄了許多諸如視角變化、窗口縮放、用戶誤操作等不必要的命令代碼。多余的代碼需要?jiǎng)h掉才可以提取出有用的函數(shù)供二次開(kāi)發(fā)者參考。剔除多余代碼后,首先需要撤銷已錄制的各項(xiàng)操作,其次單步運(yùn)行精簡(jiǎn)后的代碼以驗(yàn)證剩余函數(shù)的作用。對(duì)于功能不明確的函數(shù)可采用上一節(jié)介紹的閱讀方法進(jìn)行查找了解。最終將所需的關(guān)鍵函數(shù)套用在Visual Basic6.0中,完成二次開(kāi)發(fā)工作。
SolidWorks中某些操作是無(wú)法進(jìn)行宏錄制的,因此代碼精簡(jiǎn)后可能會(huì)出現(xiàn)錄制無(wú)果的情況。這就需要應(yīng)用第二種代碼編寫(xiě)方法(編寫(xiě)流程如圖5所示)。比如某個(gè)操作無(wú)法用一個(gè)單獨(dú)的函數(shù)來(lái)代替,便應(yīng)該將這個(gè)單一的操作分為多個(gè)步驟,通過(guò)鏈接不同的函數(shù)完成該操作。
圖5 SolidWorks二次開(kāi)發(fā)代碼編寫(xiě)方法
首先,通過(guò)對(duì)被操作對(duì)象進(jìn)行一次能夠被宏記錄的選取操作來(lái)獲取該對(duì)象類型,其次進(jìn)入【對(duì)象瀏覽器】中瀏覽此對(duì)象的所有下屬成員,根據(jù)成員名稱與功能梗概確定疑似分步驟函數(shù)。若無(wú)法確定分步驟成員,再通過(guò)API help檢索該對(duì)象所有下屬數(shù)成員(屬性、方法等)的解釋。將功能不確定的疑似分步驟函數(shù)依次通過(guò)幫助文件中的實(shí)例驗(yàn)證并確定其功能。最終,將各分步驟函數(shù)的輸出結(jié)果按需求進(jìn)行串行或并行整合,驗(yàn)證是否能夠分步驟完成該操作。
兩種二次開(kāi)發(fā)代碼編寫(xiě)方法均需要借助API接口進(jìn)行操作,有所不同的是第一種方法對(duì)SolidWorks API help的依賴程度要高于第二種,靈活程度要低于第二種。第二種方法在開(kāi)發(fā)中更加充分地發(fā)揮了人的主觀能動(dòng)性,使二次開(kāi)發(fā)更加有創(chuàng)新的意義。
某制造企業(yè)設(shè)計(jì)部門(mén)使用SolidWorks建模工具并且二維、三維設(shè)計(jì)功能同時(shí)運(yùn)用。該企業(yè)在工作流程管理中缺少工程圖BOM批量導(dǎo)出為Excel工作簿的功能。本文針對(duì)此需求運(yùn)用第2章節(jié)中的第二種代碼編寫(xiě)方法進(jìn)行解決。
此次二次開(kāi)發(fā)的關(guān)鍵是將工程圖中材料明細(xì)表自動(dòng)導(dǎo)出為Excel工作簿。由于此功能可以在SolidWorks中通過(guò)人為操作實(shí)現(xiàn),因此首先采用第一種方法,進(jìn)行一次宏錄制并分析所錄制的代碼。在一張裝配圖的材料明細(xì)表處右鍵【另存為】,選擇文件保存類型為【Excel(*.xls)】即可。但錄制的結(jié)果在去除非必要代碼后只剩一條選擇命令“SelectedByID2”(如圖6中標(biāo)記所示)。
圖6 BOM表另存Excel工作簿宏錄制結(jié)果
由此可見(jiàn),這里需要采取第二種方法將該操作分為若干步驟并依次尋找分步驟的函數(shù)。筆者將該操作分為提取材料明細(xì)表數(shù)據(jù)以及Excel數(shù)據(jù)導(dǎo)入與保存兩大步驟,最終將這兩步驟串行組合即可。第二分步驟還需要運(yùn)用到Excel的二次開(kāi)發(fā),將在下文進(jìn)行簡(jiǎn)述。
在宏錄制的結(jié)果中,經(jīng)過(guò)SolidWorks API help的詳細(xì)查詢,SelectedByID2函數(shù)中加框標(biāo)注的第二個(gè)參數(shù)就是該選中對(duì)象的類型,但此處的類型名稱與該對(duì)象的名稱并不相同。通過(guò)API help中的參數(shù)列表查詢可知該對(duì)象就是上文提到的“TableAnnotation”。
TableAnnotation對(duì)象屬性與函數(shù)中包含有行數(shù)“RowCount”、列數(shù)“ColumnCount”和指定單元格內(nèi)容“Text(Row,Column)”3個(gè)可以組合循環(huán)嵌套來(lái)讀取整張材料明細(xì)表內(nèi)容的函數(shù)。通過(guò)記錄每個(gè)單元格的內(nèi)容以及位置可以將整張表復(fù)制到Excel中去,完成自動(dòng)操作的目的。這種方法非常便捷,并且在數(shù)據(jù)搬動(dòng)的過(guò)程中沒(méi)有數(shù)據(jù)損失,保證了較高的可靠性。
在完成第一分步驟“提取材料明細(xì)表數(shù)據(jù)”后,接下來(lái)就需要對(duì)Excel進(jìn)行二次開(kāi)發(fā)完成Excel數(shù)據(jù)導(dǎo)入與保存的步驟。Excel二次開(kāi)發(fā)的思路與SolidWorks二次開(kāi)發(fā)思路大致是相同的,開(kāi)發(fā)的目的同樣是實(shí)現(xiàn)自動(dòng)輸入及保存工作簿。通過(guò)錄制在不同單元格內(nèi)輸入字符代碼時(shí)的宏,了解Excel二次開(kāi)發(fā)的相關(guān)句法結(jié)構(gòu)以及開(kāi)發(fā)應(yīng)使用的部分接口函數(shù)。使用Visual Basic6.0開(kāi)發(fā)Excel前需將其對(duì)象類型庫(kù)如圖7所示加載至工程中,關(guān)注【對(duì)象瀏覽器】中【Excel】工程/庫(kù)所含有的“Workbook ::Worksheets”、“Worksheet ::Range”、“Range ::Activate”、“Range ::Cells”與“Workbook ::SaveAs”等關(guān)鍵函數(shù)。
圖7 VB引用SolidWorks與Excel對(duì)象類型庫(kù)
工程圖中的材料明細(xì)表數(shù)據(jù)使用以上提取方法后即可保存在指定位置的Excel中,BOM表導(dǎo)出為Excel工作簿程序界面如圖8所示,輸出結(jié)果如圖9、圖10所示。以下是工程圖明細(xì)表提取的關(guān)鍵代碼:
For i = TotleRow To TotleRow + swTable.RowCount - 1 '列循環(huán)
For j = 0 To swTable.ColumnCount - 1 '行循環(huán)
If InStr(1, swTable.Text(i - TotleRow, j), "") Then
InterChangeArr(j, i) = Right(swTable.Text(i - TotleRow _
, j), Len(swTable.Text(i - TotleRow, j)) - Len("")) '給數(shù)組InterChangeArr變量賦值
Else
InterChangeArr(j, i) = swTable.Text(i - TotleRow, j) '給 _數(shù)組InterChangeArr變量賦值
End If
Next
Next
TotleRow = TotleRow + swTable.RowCount '統(tǒng)計(jì)行數(shù)
TotleCol = swTable.ColumnCount '統(tǒng)計(jì)列數(shù)
圖8 BOM表導(dǎo)出為Excel工作簿程序界面
圖9 工程圖內(nèi)明細(xì)表
圖10 明細(xì)表導(dǎo)出為Excel工作簿
簡(jiǎn)要介紹了SolidWorks二次開(kāi)發(fā)的應(yīng)用和發(fā)展情況以及API接口函數(shù)及其對(duì)象的基本結(jié)構(gòu)、開(kāi)發(fā)工具以及對(duì)于開(kāi)發(fā)非常重要的宏錄制工具。詳細(xì)介紹了Visual Basic中【對(duì)象瀏覽器】、SolidWorks API help幫助文件的使用方法以及SolidWorks二次開(kāi)發(fā)代碼的3種遞進(jìn)式閱讀方法。借助使用二次開(kāi)發(fā)解決某企業(yè)實(shí)際問(wèn)題的方式,全方位的介紹了SolidWorks二次開(kāi)發(fā)代碼的2種遞進(jìn)式編寫(xiě)方法。希望通過(guò)對(duì)SolidWorks二次開(kāi)發(fā)的詳盡說(shuō)明能夠?qū)ζ渌S建模工具的二次開(kāi)發(fā)提供借鑒。