基于VBA的SolidWorks快速二次开发实现爬梯部件的参数化建模
2020-06-15李冰郭献礼张林多贾文聪
李冰 郭献礼 张林多 贾文聪
摘 要 爬梯是工业场景中使用率很高的部件,本文基于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.