李冰 郭獻禮 張林多 賈文聰


摘 要 爬梯是工業場景中使用率很高的部件,本文基于SolidWorks VBA開發方法針對爬梯進行快速二次開發,實現爬梯部件的參數化建模,用戶通過輸入爬梯高度和傾角等參數即可快速生成對應的爬梯模型,可以極大地提高設計效率和設計質量。此外,本文展示了通過SolidWorks API實現參數化建模的主要代碼,具有一定的參考價值。
關鍵詞 SolidWorks VBA 二次開發 爬梯
中圖分類號:TP391文獻標識碼:A
0引言
三維模型展示效果更加直觀,具有二維圖紙無法比擬的優越性,更有助于提高產品布局的合理性以及方便檢查產品細節是否存在干涉,大大提高了設計的準確性;而且目前市面上絕大部分的三維設計軟件都能夠實現模型與對應圖紙的聯動,從而節省了大量修改圖紙的時間,提高了設計效率。由此可見,三維設計是未來設計發展的必然趨勢。
SolidWorks作為一款主流三維機械設計軟件,其靈活而強大的建模和圖形渲染功能能夠滿足不同層次設計人士的需求,但對于一些差異不大使用率卻較高的部件,傳統的手工交互式建模方式仍然顯得繁瑣,屬于重復勞動,而定制化的開發則可以改善這種狀況,將設計人員從這種大量的重復勞動中解放出來,可以利用更多時間進行更有價值更有意義的工作,進而極大地提高設計效率和設計質量。SolidWorks除了具備參數化驅動的建模功能以外,還提供了豐富的可供二次開發的API(Application Programming Interface)接口,可以使用VBA、Visual Basic、Visual C#和Visual C++等開發工具方便地進行二次開發,用戶在SolidWorks界面上所作的操作均可以通過API編程實現自動化。其中,采用VBA編程的優點是無需安裝外部的開發環境,可以直接在SolidWorks中通過錄制和編輯宏進行二次開發,而且相比其他開發語言,VBA對代碼的修改量最少,可讀性強,易于編寫和后期的維護。爬梯在工業場景中的使用頻率較高,又非完全意義上的標準件,重復建模繁瑣耗時,但可參數化性強,本文采用VBA編程方式進行爬梯模型的二次開發。
1本文用到的API接口介紹
本文在爬梯開發過程中主要用到了插入草圖直線、移動草圖,選擇實體、生成鈑金件、線性陣列實體等5個接口函數,下面分別簡單介紹其功能,詳細用法可以參閱SolidWorks API幫助:
(1)插入草圖直線:SketchManager:CreateLine(Double X1, Double Y1, Double Z1, Double X2, Double Y2, Double Z2)。該函數用于在當前2D或3D草圖中繪制直線,括號中參數為要繪制直線的起點和終點坐標;
(2)移動指定草圖:ModelDocExtension::MoveOrCopy Boolean Copy, Integer NumCopies, Boolean KeepRelations, Double BaseX, Double BaseY, Double BaseZ, Double DestX, Double DestY, Double DestZ。該函數用于移動并且選擇性地復制選中的草圖實體,參數為一些選項開關和起點終點坐標;
(3)選擇實體:ModelDocExtension::SelectByID2(String Name, Type, Double X, Double Y, Double Z, Boolean Append, Integer Mark, Callout Callout, Integer Selec-tOption)。該函數用于選擇指定實體,選擇實體的類型包括基準面、參考平面、坐標軸、草圖,實體點、實體線、實體面、實體特征、注釋等;
(4)生成鈑金件:FeatureManager::InsertSheetMetalBaseFlange2 (Double Thickness, Boolean ThickenDir, Double Radius, Double ExtrudeDist1, Double Ex-turdeDist2, Boolean FlipExtruDir, Integer EndCondition1, Integer EndCondition2, Integer DirToUse, CustomBendAllowance PCBA, Boolean UseDefaultRelief, Integer ReliefType, Double ReliefWidth, Double ReliefDepth, Double ReliefRatio, Boolean UseReliefRatio, Boolean Merge, Boolean UseFeatScope, Boolean UseAutoSelect)。該函數基于法蘭特征生成鈑金件,括號中為一些鈑金參數,如鈑金厚度、彎折半徑等;
(5)線性陣列實體:FeatureManager::FeatureLinearPattern5(Integer Num1, Double Spacing1, Integer Num2, Double Spacing2, Boolean FllipDir1, Boolean FlipDir2, String DName1, String DName2, Boolean GeometryPattern, Boolean Var-yInstance, Boolean HasOffset1, Boolean HasOffset2, Boolean CtrlByNum1, Boolean CtrlByNum2, Boolean FromCentroid1, Boolean FromCentroid2, Boolean RevOffset1, Boolean RevOffset2, Double Offset1, Double Offset2, Boolean D2PatternSeedOnly, Boolean SyncSubAssemblies)。該函數用于線性陣列特征,括號中主要包括陣列個數、陣列間距和陣列方向等參數。
2程序的開發及運行
2.1程序界面設計
進入SolidWorks,新建空白零件,即可通過“工具——宏——新建”新建VBA宏程序,用戶可以通過工具箱在新建的用戶窗口中添加標簽、文本框和按鈕等控件,以滿足需要的功能。這里主要設置了爬梯高度、爬梯傾角、臺階長度、臺階深度、臺階高度等參數,用戶可以根據設計需要將上述設計參數的數值輸入對應的文本框,點擊“生成”按鈕則程序根據用戶輸入的設計參數值生成爬梯模型,點擊“退出”按鈕則退出當前程序窗口。
設計完成的生成爬梯程序窗口如圖1,窗口包含一個框架控件,5個標簽控件,5個文本框控件和兩個按鈕控件:
2.2程錄制和編輯宏
SolidWorks API函數調用包含的參數通常較多,例如“拉伸凸臺/基體”函數FeatureManager::FeatureExtrusion3,它共有23個參數,而在為SolidWorks開發應用程序時,只有API的每個參數都滿足條件,代碼才能夠正確執行,所以通過錄制和編輯宏是一個很好的快速進行SolidWorks二次開發的方法,而且通過預先計劃,多次錄制的方式可以實現較為復雜程序的二次開發。
這里將爬梯模型的錄制過程分為以下6個步驟:
(1)創建平行四邊形草圖1,確定爬梯的高度和傾角;
(2)創建臺階草圖2,確定爬梯臺階長、寬等參數;
(3)根據草圖2生成最底部鈑金臺階;
(4)陣列生成鈑金臺階;
(5)根據草圖1生成臺階一側鈑金側板;
(6)陣列生成另一側鈑金側板,模型完成。
錄制完成后,先對每一段宏命令進行必要的編輯,例如刪除變換視圖的代碼,添加自定義參數的聲明并將其代入特征函數以及添加控件動作等,然后將修改后的宏命令統一整理,經過調試,最終形成一段功能完整的宏命令。
2.3主要功能代碼展示
本文針對爬梯模型的VBA二次開發程序主要實現的是以下幾點功能:
(1)定義爬梯參數的數據類型并從文本框控件獲取參數數值,代碼如下(單引號表示本行為注釋內容,下同):
'定義爬梯高度Hi和傾角An,兩者均為Double Precision數據類型
Dim Hi As Double
Dim An As Double
Hi = CDbl(TextBox1.Text) / 1000
An = CDbl(TextBox2.Text) * (3.141592653 / 180)
'定義臺階長度l0、寬度和b0層高h0,三者均為Double Precision數據類型
Dim l0 As Double
Dim b0 As Double
Dim h0 As Double
l0 = CDbl(TextBox3.Text) / 1000
b0 = CDbl(TextBox4.Text) / 1000
h0 = CDbl(TextBox5.Text) / 1000
其中,CDbl()函數的作用是將輸入文本框中的字符串轉化為Double Precision類型的數據。由于SolidWorks內部運行的單位制仍然是米和弧度,所以需要用表達式將用戶輸入的參數從毫米轉換為米,從角度轉換為弧度。
(2)將定義好的參數代入生成草圖直線和生成鈑金實體等函數,實現草圖和特征的參數化建模,代碼如下:
'創建參數化草圖1
Dim skSegment As Object
Set skSegment = Part.SketchManager.CreateLine(0#, 0#, 0#, Hi / Tan(An), Hi, 0#)
Part.SetPickMode
Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2("Line1", "SKETCHSEGMENT", 0, 0, 0, True, 0, Nothing, 0)
Part.Extension.MoveOrCopy True, 1, True, 0, 0, 0, b0, 0, 0
Part.ClearSelection2 True
Set skSegment = Part.SketchManager.CreateLine(Hi / Tan(An), Hi, 0#, Hi / Tan(An) + b0, Hi, 0#)
Set skSegment = Part.SketchManager.CreateLine(0#, 0#, 0#, b0, 0#, 0#)
Part.ClearSelection2 True
Part.SketchManager.InsertSketch True
'創建參數化鈑金臺階草圖2
boolstatus = Part.Extension.SelectByID2("前視基準面", "PLANE", 0, 0, 0, False, 0, Nothing, 0)
Part.SketchManager.InsertSketch True
Set skSegment = Part.SketchManager.CreateLine(h0 / Tan(An), h0, 0#, h0 / Tan(An) + b0, h0, 0#)
Part.SetPickMode
Part.ClearSelection2 True
Set skSegment = Part.SketchManager.CreateLine(h0 / Tan(An), h0, 0#, h0 / Tan(An), (h0 - 0.05), 0#)
Part.SetPickMode
Part.ClearSelection2 True
Part.SketchManager.InsertSketch True
'生成最底部鈑金臺階
Dim customBendAllowanceData As Object
Set customBendAllowanceData = Part.FeatureManager.CreateCustomBendAllowa-nce()
customBendAllowanceData.KFactor = 0.5
Dim myFeature As Object
Set myFeature = Part.FeatureManager.InsertSheetMetalBaseFlange2(0.0007366, False, 0.0007366, l0, 0.01, False, 0, 0, 1, customBendAllowanceData, False, 0, 0.0001, 0.0001, 0.5, True, False, True, True)
Part.ClearSelection2 True
(3)計算陣列臺階個數并線性陣列鈑金臺階,代碼如下:
Dim num As Integer
Dim num1 As Double
Dim num2 As Integer
Dim h1 As Double
num1 = Hi / Sin(An) / (h0 / Sin(An))
num2 = Int(Hi / Sin(An) / (h0 / Sin(An)))
h1 = h0 / Sin(An)
If num2 >= num1 Then
num = num2 - 1
End If
If num2 < num1 Then
num = num2
End If
boolstatus = Part.Extension.SelectByID2("Line1@草圖1", "EXTSKETCHSEG-MENT", 0, 0, 0, True, 1, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("基體-法蘭1", "SOLIDBODY", 0, 0, 0, True, 256, Nothing, 0)
Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2("Line1@草圖1", "EXTSKETCHSEG-MENT", 0, 0, 0, False, 1, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("基體-法蘭1", "SOLIDBODY", 0, 0, 0, True, 256, Nothing, 0)
Dim swLinearPattern As Feature
Set swLinearPattern = Part.FeatureManager.FeatureLinearPattern5(num, h1, 1, 0.01, False, False, "NULL", "NULL", False, False, False, False, False, False, True, True, False, False, 0, 0, False, False)
boolstatus = Part.Extension.SelectByID2("Line1@草圖1", "EXTSKETCHSEG-MENT", 0, 0, 0, True, 1, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("基體-法蘭1", "SOLIDBODY", 0, 0, 0, True, 256, Nothing, 0)
Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2("Line1@草圖1", "EXTSKETCHSEG-MENT", 0, 0, 0, False, 1, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("基體-法蘭1", "SOLIDBODY", 0, 0, 0, True, 256, Nothing, 0)
Set swLinearPattern = Part.FeatureManager.FeatureLinearPattern5(2, (Hi - h0) / Sin(An), 1, 0.01, False, False, "NULL", "NULL", False, False, False, False, False, False, True, True, False, False, 0, 0, False, False)
其中,Int()為取整函數,將計算得到的臺階個數取整,并通過If條件句調整,最終確定陣列臺階個數。此外,線性陣列方向可以選取草圖線、特征線,也可以設置某平面法線方向,本文在陣列臺階時選取的是沿著爬梯傾斜方向的草圖線,陣列爬梯鈑金側板時設置的是該鈑金平面的法線方向。
2.4程序運行結果
程序經過編輯整理后調試無誤即可運行。打開SolidWorks,新建空白零件,運行生成爬梯宏程序,輸入以下兩組設計參數運行(見圖2)。
點擊“生成”按鈕,即可生成對應的爬梯模型,如圖3所示。
檢查生成的模型可知程序正確運行。
3總結
通過二次開發的方法實現定制部件的參數化建模,可以極大地提高設計效率和設計質量。本文針對工業場景中使用率很高的爬梯部件進行了基于VBA 的SolidWorks二次開發,詳細介紹了通過錄制、修改宏的方法進行快速二次開發的過程。簡單介紹了開發過程中用到的插入草圖直線、移動草圖、選擇實體、生成鈑金件、線性陣列實體等若干SolidWorks API函數,并通過真實的生成爬梯程序代碼展示其功能以及參數化驅動建模的實現,具有較高的實用和參考價值。
作者簡介:李冰,男,1988/08/30,河南鄭州,工作單位:河南衛華重型機械股份有限公司,專業:工程力學,研究方向:結構實驗分析。
參考文獻
[1] SolidWorks公司.SolidWorks高級教程:二次開發與API(2007版)[M].葉修梓,陳超詳編.北京:機械工業出版社,2009.