王 帥 劉武發(fā) 鄭 鵬
(鄭州大學(xué)機(jī)械與動力工程學(xué)院 河南 鄭州 450001)
榫卯結(jié)構(gòu)作為中華民族獨特的工藝制造,有著悠久的歷史。被海外華人視為國粹的紅木家具正是運用了這種巧妙的結(jié)構(gòu),整套家具不使用一根鐵釘卻能使用上百甚至上千年,堪稱人類輕工制造史上的奇跡。采用榫卯結(jié)構(gòu)進(jìn)行連接的家具比用鐵釘連接的更加結(jié)實耐用,具有許多鐵釘做不到的功能,可有效限制木件之間各個方向的扭轉(zhuǎn),保障了連接結(jié)構(gòu)的穩(wěn)定性。
中國傳統(tǒng)家具中的榫卯結(jié)構(gòu)種類繁多,結(jié)構(gòu)復(fù)雜,依靠傳統(tǒng)建模方式工作量大且效率低下,同樣類型的結(jié)構(gòu)僅有尺寸不同卻需要重新建模。目前,對于榫卯結(jié)構(gòu)的研究絕大多數(shù)都圍繞在樣式設(shè)計、結(jié)構(gòu)設(shè)計[1]和受力分析[2]上,而對榫卯結(jié)構(gòu)的參數(shù)化設(shè)計和計算機(jī)輔助設(shè)計應(yīng)用研究較少[3-4]。
因此為了提高設(shè)計資源的利用率,提高建模效率,減少重復(fù)勞動,本課題基于SolidWorks二次開發(fā)對傳統(tǒng)家具中的榫卯結(jié)構(gòu)進(jìn)行參數(shù)化設(shè)計,生成榫卯家具零件參數(shù)化模型庫,對榫卯結(jié)構(gòu)的標(biāo)準(zhǔn)化、參數(shù)化設(shè)計具有一定的現(xiàn)實意義。
Windows平臺為SolidWorks的二次開發(fā)提供了大量OLE技術(shù)和COM技術(shù)的應(yīng)用程序接口,并且SolidWorks采用面向?qū)ο蟮姆椒?所有函數(shù)都是有關(guān)對象的方法或?qū)傩訹5],SolidWorks API中具有上百個函數(shù),支持VB、VBA、Delphi、Visual C++等對其進(jìn)行操作和調(diào)用,開發(fā)人員可以通過調(diào)用SolidWorks API函數(shù)對SolidWorks軟件進(jìn)行相應(yīng)的操作控制,以實現(xiàn)目標(biāo)三維圖形的繪制和所需功能的擴(kuò)展與定制,完成二次開發(fā)。
SolidWorks插件是通過調(diào)用API函數(shù)所編寫的ActiveX DLL文件,DLL(Dynamic Link Library)文件為動態(tài)鏈接庫文件,又叫“應(yīng)用程序拓展”,通過使用DLL,可以實現(xiàn)程序的模塊化,減少資源的占用率。基于COM技術(shù)生成的DLL程序代碼執(zhí)行效率高,可以動態(tài)鏈接到應(yīng)用程序,使得調(diào)用程序更加方便快捷,還能夠在SolidWorks界面中添加工具條、下拉菜單、自定義屬性頁等功能,實現(xiàn)了與SolidWorks軟件的無縫銜接。
SolidWorks API SDK為開發(fā)人員提供了插件開發(fā)的相關(guān)模板和文件,包含VB.NET、C#.NET和C++模板,以VB.NET模板為例,其結(jié)構(gòu)分類如圖1所示。
圖1 SolidWorks API SDK插件模板結(jié)構(gòu)圖
在提供的模板中,為方便開發(fā)人員使用,已經(jīng)按照功能對其進(jìn)行模塊化劃分,具體分類如下:
(1) Local Variables模塊:用于變量的聲明。
(2) SolidWorks Registration模塊:用于插件的注冊,在注冊表中添加插件的GUID,每個插件的GUID各不相同,SolidWorks通過該值對插件進(jìn)行識別。
(3) ISwAddin Implementation模塊:用于插件的卸載和添加,通過API函數(shù)完成與插件的連接和斷開。
(4) UI Methods模塊:用于用戶的自定義設(shè)計,可以實現(xiàn)菜單欄,工具欄的添加和設(shè)置。
(5) UI Callbacks模塊:用于回調(diào)函數(shù)的編寫,執(zhí)行按鈕被觸發(fā)后的事件。
(6) Event Methods模塊:用于用戶和SolidWorks的交互。
(7) Event Handlers模塊:交互事件的函數(shù)。
在插件的開發(fā)中,UI Methods、UI Callbacks模塊是最常用的,開發(fā)人員可通過此模塊進(jìn)行命令按鈕以及回調(diào)函數(shù)設(shè)置。
首先,需要手動安裝位于SOLIDWORKS安裝目錄下apisdk文件夾中的API SDK軟件開發(fā)工具包,安裝完成后,即可在Visual Studio中使用模板新建AddIn插件程序。操作流程如圖2所示。
圖2 模板使用流程
在SolidWorks API中,通過調(diào)用CreateCommandGroup2和CreateFlyoutGroup2方法,可完成菜單欄和工具欄的創(chuàng)建;調(diào)用CreateFileFromResourceBitmap方法添加圖標(biāo)選項;調(diào)用AddCommandItem2和AddCommandItem分別為命令組和彈出式菜單添加子項。以AddCommandItem方法為例,說明函數(shù)中各參數(shù)的意義和用法,如表1所示,其他API函數(shù)參見SolidWorks API幫助文檔。
表1 AddCommandItem方法返回與輸入?yún)?shù)
菜單項和工具欄創(chuàng)建完成后,設(shè)置其回調(diào)函數(shù)以執(zhí)行觸發(fā)命令后的動作。在參數(shù)化系統(tǒng)設(shè)計中已創(chuàng)建多個窗體,啟動該窗體就是執(zhí)行菜單事件的響應(yīng)。利用sub創(chuàng)建回調(diào)函數(shù),用Function創(chuàng)建函數(shù)以顯示控制項的狀態(tài)。以CreateSunMao()為例,具體代碼如下:
Dim TaskPanWinForm As Form1=NewForm1()
TaskPanWinForm.Show()
系統(tǒng)插件UI界面如圖3所示。
實現(xiàn)SolidWorks二次開發(fā)參數(shù)化建模主要有兩種方法[6]:
(1) 編程法(程序驅(qū)動法) 編程法是指零件的整個設(shè)計建模過程全部由編程實現(xiàn),通過調(diào)用API函數(shù),來實現(xiàn)模型的繪制和修改,此過程不需要繪制零件模板,應(yīng)用程序從頭到尾執(zhí)行所編制的代碼,從無到有地生成目標(biāo)模型,此方法需要調(diào)用大量API函數(shù),需要開發(fā)人員熟練掌握API的功能、方法及屬性,操作難度較大,適用于參數(shù)較多或者形狀變化較大的零部件產(chǎn)品。
(2) 尺寸驅(qū)動法 尺寸驅(qū)動法是指在已建立模型的基礎(chǔ)上,不改變原有的拓?fù)潢P(guān)系,將所標(biāo)注的尺寸視為變量,通過修改標(biāo)注的尺寸值,來達(dá)到重建模型的目的,進(jìn)而得到一系列結(jié)構(gòu)相同但是尺寸不同的零部件模型,此過程不需要開發(fā)人員掌握大量API函數(shù),僅掌握打開文檔(opendoc6)、參數(shù)修改(Parameter)、模型重建(EditRebuild3)等幾個簡單的函數(shù)即可。此方法相較于編程法省去了代碼繪制模型的步驟,建模效率更高,但是需提前建立模塊化、局部標(biāo)準(zhǔn)化模型庫,適用于結(jié)構(gòu)相同,尺寸不同的系列零部件產(chǎn)品[6]。
由于傳統(tǒng)家具中帶有榫卯結(jié)構(gòu)的零部件種類繁多且結(jié)構(gòu)復(fù)雜、樣式各有特點,故采用編程法與尺寸驅(qū)動法相結(jié)合,對其進(jìn)行參數(shù)化設(shè)計。榫卯結(jié)構(gòu)參數(shù)化設(shè)計流程如圖4所示。
圖4 榫卯結(jié)構(gòu)參數(shù)化設(shè)計流程
在榫卯結(jié)構(gòu)的零部件中,一部分結(jié)構(gòu)固定、樣式變化不大,如攢邊結(jié)角榫里的大邊、抹頭、穿帶,桌案類家具常用卡子花等零件采用尺寸驅(qū)動法,首先程序從零件模型庫中選中指定參數(shù)化的三維模型,獲取該零件的驅(qū)動參數(shù),再確定尺寸約束,用戶通過用戶界面修改關(guān)鍵參數(shù)以重建模型,通過約束條件判斷生成的模型是否合理,結(jié)合Access數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)的更新,彈出提示對話框,若滿足要求,保存模型,退出程序;一部分樣式多變、結(jié)構(gòu)不一的零件,如燕尾榫(分為全隱式、半隱式、全透式、斜肩式四種)、直角榫(榫頭可分為十字型、U型、L型等多種類型)、走馬銷(分為單斜面和雙斜面兩種)等采用編程法,通過newpart方法新建文檔,調(diào)用API繪圖函數(shù),用if語句進(jìn)行樣式選擇,用戶通過輸入?yún)?shù)來進(jìn)行新模型的繪制。
在眾多榫卯結(jié)構(gòu)中,燕尾榫被稱為“萬榫之母”,無論是抽屜架格的明扣暗扣,還是小木作家具中串銷掛銷,都利用燕尾榫的力學(xué)原理。燕尾榫是公認(rèn)最牢固的榫接方式,也是抗拉性最強(qiáng)的榫卯結(jié)構(gòu)之一。燕尾榫參數(shù)化設(shè)計中,尾榫與頭榫的比例、榫頭錐角的錐度、燕尾頭和插接頭的數(shù)量都決定著拼接的牢固程度,而木材的長寬高決定著燕尾榫整體零件的尺寸,因此,將以上參數(shù)作為設(shè)計的驅(qū)動參數(shù),通過修改以上參數(shù)來生成不同尺寸類型的燕尾榫。其具體尺寸如圖5所示,各尺寸之間約束關(guān)系如下:
a=(L/n-2H/m)/(k+1)b=2H/m+ac=ka
式中:L代表木板長度;H代表木板厚度;n代表燕尾頭或插接頭個數(shù);m代表榫頭錐度比值(例如1:6,m=6);k代表頭榫和尾榫寬度比(例如頭榫小頭/尾榫小頭=1:4,k=4);a代表頭榫小頭;b代表頭榫大頭;c代表尾榫小頭。
圖5 燕尾榫榫頭簡圖
程序?qū)崿F(xiàn)步驟:
(1) 連接SolidWorks軟件,新建零件文檔。
swApp=CreateObject("Sldworks.application")
//得到sw對象
swApp.Visible=True
//sw軟件打開可見
Part=swApp.NewPart
//新建零件文檔
(2) 繪制基本外形特征,根據(jù)木板整體參數(shù)繪制出起始木板結(jié)構(gòu)。
Part.SketchManager.InsertSketch(True)
//繪制草圖
Part.SketchManager.CreateCornerRectangle(0,0,0,L1,D1,0)
Part.FeatureManager.FeatureExtrusion2(True,False,False,0,0,H1,…)
(3) 樣式選擇。常用的燕尾榫可分為全隱式、半隱式、全透式、斜肩式四種,通過分析幾種燕尾榫的結(jié)構(gòu)特征,區(qū)分其結(jié)構(gòu)層次,歸納其成型順序,可知四種燕尾榫的基本結(jié)構(gòu)相同,全隱式、半隱式、斜肩式燕尾榫均以全透式燕尾榫結(jié)構(gòu)為基礎(chǔ),在其基本特征上的增材與變形。故采用編程法繪圖時先調(diào)用ISketchSegment::EqualSegment方法、ISketchManager::CreateLinearSketchStepAndRepeat方法、ISketchManager::CreateLine方法、IFeatureManager::FeatureCut3方法繪制出全透式燕尾榫的基本結(jié)構(gòu),根據(jù)所輸入的參數(shù),如燕尾榫頭或插接頭的數(shù)目,榫頭的錐度生成目標(biāo)模型,再結(jié)合if語句,判斷所進(jìn)行的變形類型,調(diào)用相應(yīng)繪圖函數(shù)進(jìn)行繪制。用戶界面如圖6所示。
If CheckBox2.Checked=True Then
Part.Extension.SelectByID2("","face",L1,H/2,0,False,0,Nothing,0)
Part.SelectionManager.GetSelectedObject6(1,-1)
SkSeg.EqualSegment(swSketchSegmentType_e.swSketchSegmentType_sketchpoints,n-1)
…
Line1=Part.SketchManager.CreateCenterLine(-H,(n-1)*L/n,0,0,(n-1)*L/n,0)
Line2=Part.SketchManager.CreateLine(0,(n-1)*L/n,0,0,(n-1)*L/n+a/2,0)
…
Selectmer=Part.SelectionManager
Selectda=Selectmer.CreateSelectData()
Selectda.Mark=1
Line2.Select4(True,Selectda)
Part.SketchMirror()
Part.FeatureManager.FeatureCut3(True,False,False,0,0,H,0,False,…)
在傳統(tǒng)榫卯家具的組成結(jié)構(gòu)中,幾乎所有家具都由框架和面板組成。如柜架類家具中的柜門和架面、椅凳類家具中的椅面凳板、桌案類家具中的桌面等均用到了框類與板的組合,攢邊結(jié)角榫在家具結(jié)構(gòu)中起到了重要作用。攢邊結(jié)角榫(如圖7-圖8所示)屬于綜合性部件結(jié)構(gòu),通常由“大邊”、“抹頭”、“面心板”、“穿帶”組合拼接而成,其中:兩端長且出榫稱為“大邊”,兩端短且鑿眼稱為“抹頭”,“穿帶”橫插過“面心板”與“大邊”相接,形成一個受力均勻、拆卸方便、結(jié)構(gòu)牢固的統(tǒng)一整體。此類零件結(jié)構(gòu)固定,樣式變化較小,故適合采用尺寸驅(qū)動法對其進(jìn)行參數(shù)化設(shè)計。
圖7 攢邊結(jié)角榫裝配界面
圖8 大邊參數(shù)化設(shè)計界面
考慮到攢邊結(jié)角榫通常成組出現(xiàn),故參數(shù)化設(shè)計中首先確定組合中各構(gòu)件之間的尺寸約束關(guān)系,例如面心板短邊長等于抹頭內(nèi)邊長,穿帶凸臺尺寸等于面心板凹槽尺寸等。然后確定單個構(gòu)件的尺寸關(guān)系,確定驅(qū)動參數(shù),將從動參數(shù)在用戶界面予以顯示。最后,調(diào)用IModelDoc2::Parameter方法進(jìn)行參數(shù)修改,重新刷新,保存零件即可。
程序?qū)崿F(xiàn)步驟:
(1) 連接SolidWorks軟件,打開零件庫中的模型。
swApp=CreateObject("Sldworks.application")
Part=swApp.OpenDoc6(FilePath,1,0,"",myErr,myWar)
(2) 確定尺寸約束關(guān)系,獲取指定參數(shù)并修改。
L1=Val(TextBox1.Text)/1000
//大邊長度即為桌面長度
Part.Parameter("D1@草圖1").systemvalue=L1
D1=3*L1/16
//大邊寬度
…
Part.Parameter("D1@草圖10").systemvalue=H3
D2=2*D1/5
Part.Parameter("D1@草圖12").systemvalue=D2
(3) 重建模型,并保存。
Part.EditRebuild3()
Part.Save3(1,Errors,Warnings)
本文以VB.NET為開發(fā)工具,針對不同榫卯結(jié)構(gòu)分別采取了尺寸驅(qū)動法和編程法建模,實現(xiàn)了基于SolidWorks二次開發(fā)的中國傳統(tǒng)家具中的榫卯結(jié)構(gòu)零部件的三維參數(shù)化建模。該參數(shù)化設(shè)計系統(tǒng)以插件的形式嵌入到SolidWorks軟件中,運行效率高,與用戶交互性好,同時也縮減了傳統(tǒng)家具中的榫卯結(jié)構(gòu)零部件的設(shè)計周期,減少了設(shè)計人員的重復(fù)勞動,對于繼承和弘揚我國非物質(zhì)文化遺產(chǎn)的榫卯技藝具有一定的意義,為后續(xù)的榫卯家具產(chǎn)品的系列化、標(biāo)準(zhǔn)化設(shè)計和生產(chǎn)奠定了基礎(chǔ)。