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