浅谈VB.net结合InventoriLogic在工程中的应用
2016-09-05梁凯旋
梁凯旋
(新疆水利水电勘测设计研究院,乌鲁木齐 830000)
浅谈VB.net结合InventoriLogic在工程中的应用
梁凯旋
(新疆水利水电勘测设计研究院,乌鲁木齐 830000)
利用VB.net面向对象的强大功能和内嵌的iLogic对Inventor进行二次开发,创建自定义用户界面,使交互起来更方便、更直观, 实现自身fx参数表不能实现的功能,从而在实际工作中提高效率。文章介绍了VB.net结合InventoriLogic在工程中的应用。
VB.net;Inventor;iLogic;水利工程;结构模型;水力学计算
0 引 言
VB.net语言继承了VB的特点,即简单易学,功能强大,容易上手,开发周期短 ,而且VB.net最大的优点是完全面向对象,甚至可以与C++相媲美,目前众多行业软件比如AutoCad,Inventor,Civil3D等都提供.Net API二次开发接口,以便丰富自己的函数库,是目前众多流行软件的比较理想的二次开发语言,此外VB.net的开发环境为微软强大的Visual Studio(VS)集成开发平台,借助VS提供的强大的编辑和错误调试功能,使得开发过程能够快速高效的完成[1]。iLogic是嵌入到Inventor中的一个规则驱动程序,通过设定一些规则来达到驱动模型进行修改的目的,只需要写一些简单的代码即可完成一些繁琐的步骤,比较简单易学。
1 VB.net和iLogic的结合
通过VB.net和iLogic的结合,发挥各自的优势,来实现一些特定的功能,减少繁琐的步骤,提高设计的效率。
1.1各自的功能
在VB.net中,主要利用面向对象技术来完成自定义交互界面的创建、一些计算方法或函数的创建、错误的处理等,最后将其封装成一个叫做.dll的文件,这个.dll文件就可以被iLogic调用。
iLogic 起到中间传递的作用,主要完成Inventor模型参数的传递和接收。工作原理是首先将模型中参数名称传递给交互给界面,然后通过窗体内部的计算,最后将计算的值进行接收并赋值给inventor模型中对应的参数名称,从而驱动模型的修改。
1.2如何结合
首先在iLogic环境中引用VB.net生成的.dll程序,其次将inventor模型中fx参数表中的参数名称传递到交互界面中,然后通过调用封装在里面的函数或方法,完成一些特定的计算或分析,并返回需要的参数,然后将参数施加给模型即可[2]。
2 在水工结构中的应用
2.1分析并创建水工结构模型
分析模型由哪几部分构成,需要哪些参数,根据部位一一列举出来。比如:闸底板长,闸底板宽,闸底板厚,边墩厚,中墩厚,闸墩高,孔数,单孔宽,检修门槽宽,检修门槽深等等(见图1),然后创建水闸模型。其中参数名称尽量用英文表示,这样做的目的主要是为了和VB.net代码中的参数名称进行相对应。
2.2定义用户参数
打开inventor的fx参数表,将前面列举出来的参数依次添加到表中,并赋初始值,然后在注释列中添加中文解释,以方便后期进行检查。见图2。
图1 水闸结构模型预览
图2 fx自定义用户参数列表
2.3将自定义参数赋予模型
将fx中的定义好的参数赋给模型参数,以便对模型进行驱动。见图3。
图3 fx模型参数列表
2.4VB.net中的主要代码
'定义公共变量,变量名称要和前面定义的fx用户参数名称保持一致。
Public Class MainForm
Public BaseboardLength As Double'底板长
Public BaseboardThickness As Double '底板厚
Public SingleOrificeWidth As Double '单孔宽
Public OrificeCount As Integer '孔数
Public BaseboardWidth As Double '底板宽
Public MidPierThickness As Double '中墩厚
Public OutsidePierThickness As Double '边墩厚
Public PierHigh As Double '闸墩高
Public RepairGateGrooveWidth As Double '检修门槽宽
Public RepairGateGrooveDepth As Double '检修门槽深
Public RepairGateDistanceToUpper As Double '检修门槽中心线距离上游距离
Public WorkingGateGrooveWidth As Double '弧形门槽宽
Public WorkingGateGrooveDepth As Double '弧形门槽深
Public ArticulatedPositionX As Double '支铰位置X
Public ArticulatedPositionY As Double '支铰位置y
Public WorkingGateGrooveRadius As Double '弧形门槽半径
Public TrafficBridgeWidth As Double '交通桥宽
Public TrafficBridgeThickness As Double '交通桥厚
Public WaterGateLo As Double '水闸净宽
Public WaterQ As Double '水闸过流量
'初始化函数
Private Sub Initialize()
BaseboardLengthTxtbox.Text = BaseboardLength.ToString
BaseboardThicknessTxtbox.Text = BaseboardThickness.ToString
BaseboardWidthTxtbox.Text = BaseboardWidth.ToString
OrificeCountTxtbox.Text = OrificeCount.ToString
SingleOrificeWidthTxtbox.Text = SingleOrificeWidth.ToString
OutsidePierThicknessTxtbox.Text = OutsidePierThickness.ToString
MidPierThicknessTxtbox.Text = MidPierThickness.ToString
PierHighTxtbox.Text = PierHigh.ToString
RepairGateGrooveWidthTxtbox.Text = RepairGateGrooveWidth.ToString
RepairGateGrooveDepthTxtbox.Text = RepairGateGrooveDepth.ToString
RepairGateDistanceToUpperTxtbox.Text= epairGateDistanceToUpper.ToString
WorkingGateGrooveWidthTxtbox.Text = WorkingGateGrooveWidth.ToString
WorkingGateGrooveDepthTxtbox.Text = WorkingGateGrooveDepth.ToString
ArticulatedPositionXTxtbox.Text = ArticulatedPositionX.ToString
ArticulatedPositionYTxtbox.Text = ArticulatedPositionY.ToString
WorkingGateGrooveRadiusTxtbox.Text = WorkingGateGrooveRadius.ToString
TrafficBridgeWidthTxtbox.Text = TrafficBridgeWidth.ToString
TrafficBridgeThicknessTxtbox.Text = TrafficBridgeThickness.ToString
End Sub
'当文本框的内容更新后,重新给变量赋值
Private Sub UpdateValues()
BaseboardLength = Val(BaseboardLengthTxtbox.Text)
BaseboardThickness = Val(BaseboardThicknessTxtbox.Text)
BaseboardWidth = Val(BaseboardWidthTxtbox.Text)
OrificeCount = Val(OrificeCountTxtbox.Text)
SingleOrificeWidth = Val(SingleOrificeWidthTxtbox.Text)
OutsidePierThickness = Val(OutsidePierThicknessTxtbox.Text)
MidPierThickness = Val(MidPierThicknessTxtbox.Text)
PierHigh = Val(PierHighTxtbox.Text)
RepairGateGrooveWidth = Val(RepairGateGrooveWidthTxtbox.Text)
RepairGateGrooveDepth = Val(RepairGateGrooveDepthTxtbox.Text)
RepairGateDistanceToUpper = Val(RepairGateDistanceToUpperTxtbox.Text)
WorkingGateGrooveWidth = Val(WorkingGateGrooveWidthTxtbox.Text)
WorkingGateGrooveDepth = Val(WorkingGateGrooveDepthTxtbox.Text)
ArticulatedPositionX = Val(ArticulatedPositionXTxtbox.Text)
ArticulatedPositionY = Val(ArticulatedPositionYTxtbox.Text)
WorkingGateGrooveRadius = Val(WorkingGateGrooveRadiusTxtbox.Text)
TrafficBridgeWidth = Val(TrafficBridgeWidthTxtbox.Text)
TrafficBridgeThickness = Val(TrafficBridgeThicknessTxtbox.Text)
End Sub
'重写父类 onload 方法
Protected Overrides Sub OnLoad(e As EventArgs)
Initialize()
End Sub
'重写父类的onFormClosed的方法
Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs)
UpdateValues()
End Sub
'包含一些约束判断条件,使所有的数据都在和合理有效的范围之内,以防止模型出现错误。
'门槽深度和边墩厚的判断,包括检修门槽和弧形门槽
Private Sub RepairGateGrooveDepthTxtbox_Leave(sender As Object,e As EventArgs) Handles RepairGateGrooveDepthTxtbox.Leave
If Not (Val(RepairGateGrooveDepthTxtbox.Text) < Val(OutsidePierThicknessTxtbox.Text)) Then
MsgBox("检修门槽的深度过大,已超过边墩厚")
RepairGateGrooveDepthTxtbox.SelectAll()
End If
If Not (Val(RepairGateGrooveDepthTxtbox.Text) < Val(MidPierThicknessTxtbox.Text)) Then
MsgBox("检修门槽的深度过大,已超过中墩厚")
RepairGateGrooveDepthTxtbox.SelectAll()
End If
End Sub
Private Sub WorkingGateGrooveDepthTxtbox_Leave(sender As Object,e As EventArgs) Handles WorkingGateGrooveDepthTxtbox.Leave
If Not (Val(WorkingGateGrooveDepthTxtbox.Text) < Val(OutsidePierThicknessTxtbox.Text)) Then
MsgBox("弧形门槽的深度过大,已超过边墩厚")
WorkingGateGrooveDepthTxtbox.SelectAll()
End If
If Not (Val(WorkingGateGrooveDepthTxtbox.Text) < Val(MidPierThicknessTxtbox.Text)) Then
MsgBox("弧形门槽的深度过大,已超过中墩厚")
WorkingGateGrooveDepthTxtbox.SelectAll()
End If
End Sub
2.5加载到inventor中进行应用
将前面创建好的窗体及代码生成WaterGate.dll文件,并将该文件放到模型的同一目录下,然后打开规则浏览器,创建一个规则,把下面的代码粘贴进去即可。
AddReference "WaterGate.dll"
localTrigger = iTrigger0
Using dlg As New woxing1987.MainForm
dlg.BaseboardLength = BaseboardLength
dlg.BaseboardThickness = BaseboardThickness
dlg.SingleOrificeWidth = SingleOrificeWidth
dlg.OrificeCount = OrificeCount
dlg.BaseboardWidth = BaseboardWidth
dlg.MidPierThickness = MidPierThickness
dlg.OutsidePierThickness = OutsidePierThickness
dlg.PierHigh = PierHigh
dlg.RepairGateGrooveWidth = RepairGateGrooveWidth
dlg.RepairGateGrooveDepth = RepairGateGrooveDepth
dlg.RepairGateDistanceToUpper = RepairGateDistanceToUpper
dlg.WorkingGateGrooveWidth = WorkingGateGrooveWidth
dlg.WorkingGateGrooveDepth = WorkingGateGrooveDepth
dlg.ArticulatedPositionX = ArticulatedPositionX
dlg.ArticulatedPositionY = ArticulatedPositionY
dlg.WorkingGateGrooveRadius = WorkingGateGrooveRadius
dlg.TrafficBridgeWidth = TrafficBridgeWidth
dlg.TrafficBridgeThickness = TrafficBridgeThickness
Dim i As Integer = dlg.ShowDialog()
If i <> vbOK Then Return
BaseboardLength =dlg.BaseboardLength
BaseboardThickness =dlg.BaseboardThickness
SingleOrificeWidth =dlg.SingleOrificeWidth
OrificeCount =dlg.OrificeCount
If OrificeCount=1 Then
' ***中墩阵列***
Feature.IsActive("中墩阵列") = False
' ***中墩弧形门槽拉伸2***
Feature.IsActive("中墩弧形门槽拉伸2") = False
' ***中墩弧形门槽拉伸1***
Feature.IsActive("中墩弧形门槽拉伸1") = False
' ***中墩起始拉伸***
Feature.IsActive("中墩起始拉伸") = False
ElseIfOrificeCount > 1 Then
'***中墩起始拉伸***
Feature.IsActive("中墩起始拉伸") = True
' ***中墩弧形门槽拉伸1***
Feature.IsActive("中墩弧形门槽拉伸1") = True
' ***中墩弧形门槽拉伸2***
Feature.IsActive("中墩弧形门槽拉伸2") = True
' ***中墩阵列***
Feature.IsActive("中墩阵列") = True
End If
BaseboardWidth =dlg.BaseboardWidth
MidPierThickness =dlg.MidPierThickness
OutsidePierThickness =dlg.OutsidePierThickness
PierHigh =dlg.PierHigh
RepairGateGrooveWidth =dlg.RepairGateGrooveWidth
RepairGateGrooveDepth =dlg.RepairGateGrooveDepth
RepairGateDistanceToUpper =dlg.RepairGateDistanceToUpper
WorkingGateGrooveWidth =dlg.WorkingGateGrooveWidth
WorkingGateGrooveDepth =dlg.WorkingGateGrooveDepth
ArticulatedPositionX =dlg.ArticulatedPositionX
ArticulatedPositionY =dlg.ArticulatedPositionY
WorkingGateGrooveRadius =dlg.WorkingGateGrooveRadius
TrafficBridgeWidth =dlg.TrafficBridgeWidth
TrafficBridgeThickness =dlg.TrafficBridgeThickness
End Using
iLogicVb.UpdateWhenDone = True
运行效果见图5,当更改文本框中的值并点击确定按钮后,inventor中的模型会立即发生更改。
图5 在inventor中运行
3 应用扩展
在自定义用户界面中可以包含一些简单的水力学计算,这样就可以不需要通过Excel计算,就可以在同一个界面内完成,另外还可以利用VS集成开发平台构建更复杂,更强大,更友好的交互界面,融合一些材料计算、结构计算等常规的力学内容,使得自定义用户界面元素更丰富,功能更强,甚至还可以结合数据库进行更深层次的二次开发。
4 结 语
总之通过VB.net创建自定义用户界面,不仅可以达到界面友好美观,而且可以很方便的同用户进行交互,比fx参数列表的界面更加友好,更加直观,同时可以扩展更多的专业功能,这一点是f(x)参数表不能达到的。
[1]纽瑟姆.Visual Basic 2012入门经典[M].北京:清华大学出版社,2013:26-38.
[2]陈伯雄,冯伟.Inventor-iLogic程序设计解析与实战[M].北京:化学工业出版社,2014:45-51.
1007-7596(2016)05-0139-04
2016-03-15
梁凯旋(1987-),男,河南许昌人,助理工程师,从事水利工程专业。
TU415
B