因为使用结果杆件对这样基于面的肋进行建模比创建“肋”类型的杆件复杂得多,下面的 EXCEL-VBA 程序将把基于肋的杆件转换为面模型,包括结果杆件。 [SCHOOL.INSTITUTION]
将肋杆件转换为面模型需要按照以下步骤操作:
- 读取肋参数(截面、方向等)
- 创建肋面
- 创建结果梁
- 删除肋杆件
在下文中,我们将举例说明整个源代码的节选。 您可以在本文的末尾下载完整的代码。
读取肋参数
只需从程序界面中选择要变形的肋,即可进行变形。 EnableSelections 选择功能 只要 EnableSelections 的值为 true,只有选定的单元会从 RFEM 中读取。 所选杆件的信息显示如下。
' get interface of active model
Set iMod = iApp.GetActiveModel
' get interface of (structural) model data
Dim iModData As RFEM5.IModelData2
Set iModData = iMod.GetModelData
' get selected member
iModData.EnableSelections True
Dim mems() As RFEM5.Member
Dim selMem As RFEM5.Member
mems = iModData.GetMembers
selMem = mems(0)
iModData.EnableSelections False
肋的建模需要输入以下参数:
- 肋截面、面编号和有效宽度
- 肋方向
- 肋材料
在 RFEM 中,肋是一种杆件类型。 通过 COM 接口进行编程意味着必须通过两种不同的接口来获取肋的数据。 这里给杆件和肋提供了接口。 肋的接口可以通过 IModelData.GetRib 获得。 GetRib 通过 Member.Rib No 获取杆件中包含的肋编号。
' get parameters of rib
' #####################
Dim iRb As RFEM5.IRib
Set iRb = iModData.GetRib(selMem.RibNo, AtNo)
Dim selRb As RFEM5.Rib
selRb = iRb.GetData
Dim rbCrsc As RFEM5.RibCrossSection
rbCrsc = iRb.GetRibCrossSection
与肋连接的部分有两种: 分别是肋结构体和肋截面设置肋的基本数据。 肋选项卡包含面的编号,肋的位置和有效宽度。 .
杆件的局部坐标系为杆件局部坐标系。 用户可以通过杆件接口访问杆件的坐标系。 IMemer.GetLocalCoordinateSystem 函数返回坐标系统结构。
Dim cosy As RFEM5.CoordinateSystem
cosy = iModData.GetMember(selMem.no, AtNo).GetLocalCoordinateSystem(0#).GetData
GetLocalCoordinateSystem 仍然需要杆件的 x 位置,这里已经设置为 0.0 或起点。 除了上述参数外,还需要考虑杆件的材料,可以通过杆件的截面来确定。
Dim selCrsc As RFEM5.CrossSection
selCrsc = iModData.GetCrossSection(selMem.StartCrossSectionNo, AtNo).GetData
创建肋面
在程序中最初只计算位于 z 轴正方向上的直的肋骨。 由于肋可以位于倾斜的平面上,所以面的创建应使用杆件方向。 杆件局部坐标系的变量 cosy 包含了局部坐标轴 cosy.AxisZ 的方向向量及其三个值,x,y,z。 这个向量被标准化,乘以肋的高度,就是肋下边缘的方向和距离。 对于肋面的边界线,该向量乘以肋的高度,然后分别加上始端和末端节点。 在肋面下边缘线上定义了两个末端节点。 注意:肋高包括有效宽度的一半面厚度。 为简化计算,这里只使用肋截面的第一条侧(局部坐标系为-y)的面厚度(上翼缘厚度)。 设置好节点后,就可以开始建模了。
- code.vb#
' 创建/计算节点
Dim nodes() As RFEM5.Node
nodes = selNodes
节点(0).no = index_n + 1
节点(1).no = index_n + 2
尺寸标注 h_rib As Double
h_rib = (rbCrsc.Depth - rbCrsc.UpperLeftFlangeThickness/2)
节点(0).X = 节点(0).X + h_rib * cosy.AxisZ.X
nodes(0).Y = nodes(0).Y + h_rib * cosy.AxisZ.Y
nodes(0).Z = nodes(0).Z + h_rib * cosy.AxisZ.Z
节点(1).X = 节点(1).X + h_rib * cosy.AxisZ.X
nodes(1).Y = nodes(1).Y + h_rib * cosy.AxisZ.Y
nodes (1) .Z = nodes (1) .Z + h_rib * cozy.AxisZ.Z
' 创建线
' ############
暗线(0到2) As RFEM5.RfLine
lines(0).no = index_l + 1
lines(1).no = index_l + 2
lines(2).no = index_l + 3
lines(0).Nodelist = str(selNodes(0).no) + "," + str(nodes(0).no)
lines(1).Nodelist = str(selNodes(1).no) + "," + str(nodes(1).no)
lines(2).Nodelist = str(nodes(0).no) + "," + str(nodes(1).no)
' 创建面
' ##############
曲面遮阳棚 与 RFEM5.Surface
surf.BoundaryLinecount = 4
surf.BoundaryLinelist = str(selLine.no) + "," + str(lines(0).no) + "," + str(lines(2).no) + "," + str(lines(1).没有)
surf.Comment = "肋"
surf.GeometyType = PlaneSurfaceType
surf.材料编号 = selCrsc.材料编号
surf.Thickness.Type = ConstantThicknessType
surf.Thickness.Constant = rbCrsc.WebThickness
surf.StiffnessType = StandardStiffnessType
surf.no = index_s + 1
- /代码#
变量 index_n、index_l、index_s 包含了 RFEM 中相应单元的最后一个索引。 确定指数的方法请参见本文末尾的源代码下载。
创建结果梁
结果梁与肋一样,由两个单元组成: 以及标准结构杆件和结果梁的附加数据。 您只能通过杆件接口修改附加数据,所以必须先创建杆件;那么您可以通过 IMember 接口传输数据。 由于杆件通常需要偏心,因此直接在杆件偏心的剪切中心处创建始端和末端节点。 偏心距保存在 RibCrossSection 中。 这样可以复制原始肋的始端和末端节点作为基准使用。 您可以使用来自杆件局部坐标系的 y 和 z 方向向量将复制的节点移动到正确的位置。 用户可以在以后的计算中选择结果梁截面,该截面首先是复制自原来的肋梁截面。 然后,从 RibCrossSection 导入截面描述,并将 CrossSection.TextID 清空,否则在创建截面时将使用该描述,而不是 CrossSection.Description 中的字符串。
- code.vb#
' 为结果杆件创建节点并计算偏心
Dim resNodes() As RFEM5.Node
resNodes = selNodes
resNodes(0).no = index_n + 3
resNodes(1).no = index_n + 4
resNodes(0).X = selNodes(0).X + rbCrsc.Eccentricity.Z * cosy.AxisZ.X + rbCrsc.Eccentricity.Y * cosy.AxisY.X
resNodes(0).Y = selNodes(0).Y + rbCrsc.Eccentricity.Z * cosy.AxisZ.Y + rbCrsc.Eccentricity.Y * cosy.AxisY.Y
resNodes(0).Z = selNodes(0).Z + rbCrsc.Eccentricity.Z * cosy.AxisZ.Z + rbCrsc.Eccentricity.Y * cosy.AxisY.Z
resNodes(1).X = selNodes(1).X + rbCrsc.Eccentricity.Z * cosy.AxisZ.X + rbCrsc.Eccentricity.Y * cosy.AxisY.X
resNodes(1).Y = selNodes(1).Y + rbCrsc.Eccentricity.Z * cosy.AxisZ.Y + rbCrsc.Eccentricity.Y * cosy.AxisY.Y
resNodes(1).Z = selNodes(1).Z + rbCrsc.Eccentricity.Z * cosy.AxisZ.Z + rbCrsc.Eccentricity.Y * cosy.AxisY.Z
' 创建线
Dim resLine As RFEM5.RfLine
resLine.no = index_l + 4
resLine.Nodecount = 2
resLine.Type = PolylineType
resLine.Nodelist = str(resNodes (0).no) & , & str(resNodes (1).no)
' 创建截面
尺寸标注 resCrsc As RFEM5.CrossSection
resCrsc = selCrsc
resCrsc.description = rbCrsc.description
resCrsc.编号 = index_c + 1
resCrsc.TextID = ""
' 创建杆件
尺寸标注 As RFEM5.Member
resMem.Line编号 = resLine.编号
resMem.no = index_m + 1
resMem.Type = 结果梁类型
resMem.StartCrossSection编号 = resCrsc.编号
resMem.Rotation = selMem.Rotation
' 发送数据到 RFEM
' ###################
iModData.PrepareModification
- iModData.SetNodes 节点
- iModData.SetLines 线
- iModData.SetSurface
- iModData.SetNodes resNodes
- iModData.SetLine resLine
- iModData.SetCrossSection resCrsc
- iModData.SetMember resMem
iModData.FinishModification
- /代码#
在创建完杆件(以及节点、线、截面和面)后,需要计算结果梁的参数,并传递给结果梁。 结果梁集成了其他杆件(杆件、面、实体)的内力,并根据它们的位置转换为杆件内力。 要在结果梁中包含正确的单元,有两种基本的选择。 用户可以指定需要被积分的单元,也可以通过面(圆柱或长方体)限制积分范围。 如果有的话,将使用新的肋面的编号和有效宽度的面的编号。 选择长方体作为积分区域,可以在 +/- y- 和 +/- z- 方向上定义(局部视图)。 这里将再次使用 RibCrossSection 的值作为数值。 请注意,在缺少有效宽度的情况下,仍必须使用积分宽度,以便正确地对肋上方的楼板进行积分。 因此,附加宽度必须是面厚度的一半。
- code.vb#
' 设置结果梁参数
Dim resBeam As RFEM5.ResultBeam
将 iResBeam 调暗为 RFEM5.IResultBeam
Set iResBeam = iModData.GetMember(resMem.no, At No).GetExtraData
resBeam = iResBeam.GetData
' 集集成元素
If selRb.Surface NoSide1 则
- resBeam.IncludeSurfaces = str(selRb.Surface NoSide1) & ,
End If
If selRb.Surface NoSide2 则
- resBeam.IncludeSurfaces = resBeam.IncludeSurfaces & str(selRb.Surface NoSide2) &,
End If
resBeam.IncludeSurfaces = resBeam.IncludeSurfaces & str(surf.no)
' 设置积分区域
resBeam.Integrate = WithinCuboidGeneral
Dim resBeamParam(0 To 3) As Double
' +y, -y, +z, -z
If selRb.WidthSide2 则
- resBeamParam(0) = selRb.WidthSide2 - rbCrsc.Eccentricity.Y
Else
- resBeamParam(0) = 0.5 * rbCrsc.WebThickness - rbCrsc.Eccentricity.Y
End If
If selRb.WidthSide1 则
- resBeamParam(1) = selRb.WidthSide1 + rbCrsc.Eccentricity.Y
Else
- resBeamParam(1) = 0.5 * rbCrsc.WebThickness + rbCrsc.Eccentricity.Y
End If
resBeamParam(2) = rbCrsc.Depth
resBeamParam(3) = rbCrsc.Depth
resBeam.Parameters = resBeamParam
' 向 RFEM 发送新的结果梁参数
iModData.PrepareModification
iResBeam.SetData resBeam
iModData.FinishModification
- /代码#
删除肋杆件
由于新的肋是由面创建的,所以现在可以删除该杆件(旧的肋)。 您可以使用 IModelData 接口的 DeleteObjects 函数删除任何单元。 同样,由于单元已被修改,您必须使用准备/完成修改块。
- code.vb#
' 删除肋
'##########
iModData.PrepareModification
iModData.DeleteObjects MemberObject, str(selMem.no)
iModData.FinishModification
- /代码#
概述总结
很简单,对于一个较简单的杆件,仅仅使用肋杆件并不能覆盖所有的问题。 创建肋杆件的操作非常简单,因此这里介绍的软件将将肋杆件的简单创建与面作为杆件的详细建模和显示相结合。 除了已知的杆件接口(IMember)外,我们还介绍了 IRib 接口,该接口提供了肋截面等功能。 此外,我们还读取了杆件的局部坐标系,并通过矢量计算创建了肋的面。
前景
在程序中有细化的选项。 例如肋条的位置(上、下、中)。 另一种选择是扩展到变截面肋 或者 曲线肋。