3376x
001639
2020-07-20

使用VBA将多肋肋梁转换为面模型

Wenn eine Rippe Teil einer nichtlinearen Bemessung ist oder biegesteif an folgende Wände übergeht, sollte statt eines Stabes eine Fläche für die Modellierung verwendet werden. Damit die Rippe dennoch als Stab bemessen werden kann, wird ein Ergebnisstab mit der richtigen Exzentrizität benötigt, welcher die Flächenschnittgrößen in Stabschnittgrößen transformiert.

因为使用结果杆件对基于面的肋进行建模比创建对肋的杆件更加复杂,所以下面的程序使用EXCEL-VBA程序将基于杆件的肋转换成面模型,包括结果杆件。

要将筋转换为面模型,需要执行以下步骤:

  1. 读出肋的参数(截面,方向等)
  2. 创建肋面
  3. 创建结果梁
  4. 删除肋构件

在下文中,我们将摘录整个源代码的摘要。 您可以在本文末尾下载完整的代码。

读取肋参数

在程序界面中可以选择要变形的肋。 为此必须使用EnableSelections功能。 只要将EnableSelections激活为true,就只能从RFEM中读取选择的元素。 所选杆件的读数看起来像这样。

'获取活动模型的界面
设置iMod = iApp.GetActiveModel
        
'获取(结构)模型数据接口
将iModData设为RFEM5.IModelData2
设置iModData = iMod.GetModelData
        
'获得选定的成员
iModData.EnableSelections True

Dim mems()为RFEM5.Member
Dim selMem as RFEM5.Member
内存= iModData.GetMembers
selMem = mems(0)

iModData.EnableSelections False

肋的建模需要以下参数:

  • 肋截面,面编号和有效宽度
  • 肋的方向
  • 肋材

在RFEM中,肋是杆件类型。 通过COM接口进行编程时,必须通过两个不同的接口获取肋的数据。 一方面,杆件的接口,另一方面肋的接口。 肋的接口可以通过IModelData.GetRib获得。 GetRib期望通过Member.RibNo包含在杆件中的肋骨编号。

'获取肋的参数
'####################
Dim iRb As RFEM5.IRib
设置iRb = iModData.GetRib(selMem.RibNo,AtNo)

Dim selRb如RFEM5.Rib
selRb = iRb.GetData

Dim rbCrsc如RFEM5.RibCrossSection
rbCrsc = iRb.GetRibCrossSection

肋的界面包含两个不同的元素: 基本的肋数据通过肋结构和肋截面数据通过肋截面。 肋包含面编号,肋的位置和有效宽度。 RibCrossSection包含内部钢筋截面的描述和尺寸,RF-CONCRETE杆件(ITCU)也使用。

此外还需要定向,可以通过杆件的局部轴系统进行定向。 您可以通过杆件接口访问轴系。 IMemer.GetLocalCoordinateSystem函数返回CoordinateSystem结构。

昏暗舒适作为RFEM5.CoordinateSystem
cozy = 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 侧正的直肋创建。 由于肋也可以位于斜面上,因此您应该使用杆件方向创建面。 在局部杆件坐标系下的变量coffey包含了局部z轴cosy.AxisZ的方向向量,以及三个值x,y和z。 对该矢量进行归一化,以便乘以肋的高度,它表示肋底边的距离和方向。 对于肋面的边界线,该向量乘以肋高度,并添加到始端和末端节点。 由此得出肋面底部边缘线的两个末端节点。 请注意:肋的高度也为有效宽度的一半。 为简化起见,仅使用肋截面的第一面(在局部坐标系中为-y)的表面厚度(UpperLeftFlangeThickness)。 节点可用后,可以生成边界线和肋面。

'创建/计算节点
'####################
Dim nodes()为RFEM5.Node
节点= selNodes
nodes(0).no = index_n + 1
nodes(1).no = index_n + 2
昏暗h_rib作为双
h_rib =(rbCrsc.Depth-rbCrsc.UpperLeftFlangeThickness/2)
节点(0).X =节点(0).X + h_rib * cosy.AxisZ.X
节点(0).Y =节点(0).Y + h_rib * cosy.AxisZ.Y
节点(0).Z =节点(0).Z + h_rib * cosy.AxisZ.Z
节点(1).X =节点(1).X + h_rib * cosy.AxisZ.X
节点(1).Y =节点(1).Y + h_rib * cosy.AxisZ.Y
节点(1).Z =节点(1).Z + h_rib * cozy.AxisZ.Z

'创建线
'############
暗线(0至2)为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)

'创建面
'#############
Dim surf as RFEM5.Surface
surf.BoundaryLineCount = 4
surf.BoundaryLineList = str(selLine.no)+“,” + str(lines(0).no)+“,” + str(lines(2).no)+“,” + str(lines(1)。否)
surf.Comment =“ rib”
surf.GeometryType = PlaneSurfaceType
surf.MaterialNo = selCrsc.MaterialNo
surf.Thickness.Type = ConstantThicknessType
surf.Thickness.Constant = rbCrsc.WebThickness
surf.StiffnessType = StandardStiffnessType
surf.no = index_s + 1

变量index_n,index_1,index_s包含RFEM中相应元素的最后一个索引。 请参阅本文末尾的源代码下载,以确定索引。

创建结果梁

所产生的梁像肋一样由两个单元组成: 标准结构的杆件,以及附加数据ResultBeam。 因为只能通过杆件接口对附加数据进行修改,所以必须首先创建杆件。然后通过IMember接口进行数据传输。 由于杆件通常必须是偏心的,因此起点和端部节点是直接在剪切中心创建的,没有杆件偏心。 偏心系数保存在RibCrossSection中。 因此,您可以复制原始肋的始端和末端节点并将其作为基础。 使用局部杆件坐标系的方向向量y和z,可以将复制的节点移动到正确的位置。 在以后的设计中,结果梁还需要有一个截面,首先从原来的肋上复制。 然后从RibCrossSection导入截面描述,然后将CrossSection.TextID清空,否则将使用它创建截面,而不是使用CrossSection.Description中的字符串。

'为结果杆件创建节点并计算偏心距
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)

'创建截面
Dim resCrsc As RFEM5.CrossSection
resCrsc = selCrsc
resCrsc.description = rbCrsc.description
resCrsc.no = index_c + 1
resCrsc.TextID =“”

'创建成员
Dim resMem as RFEM5.Member
resMem.LineNo = resLine.no
resMem.no = index_m + 1
resMem.Type = ResultBeamType
resMem.StartCrossSectionNo = resCrsc.no
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

创建杆件(节点、线、截面和面)后,必须确定并传递结果梁的参数。 结果梁对其他单元(杆件,面,实体)的内力进行积分,然后根据位置将其转换为杆件内力。 为了包含正确的单元,结果梁有两个基本选项。 您可以指定要积分的单元,还可以通过实体(圆柱或长方体)限制积分范围。 在这种情况下,使用新的筋面数量和有效宽度的面数量(如果有)。 作为积分区域,选择了一个长方体(在局部查看)。 RibCrossSection中的值再次用作值。 请注意,在缺少有效宽度的情况下,仍然必须使用集成宽度,这样才能使肋骨上方的地板正确集成。 因此,附加宽度必须为面厚度的一半。

'设置结果梁参数
'#######################
Dim resBeam格式为RFEM5.ResultBeam
昏暗的iResBeam为RFEM5.IResultBeam
设置iResBeam = iModData.GetMember(resMem.no,AtNo).GetExtraData
resBeam = iResBeam.GetData

'设置集成单元
如果selRb.SurfaceNoSide1然后
resBeam.IncludeSurfaces = str(selRb.SurfaceNoSide1)&“,”
End If
如果selRb.SurfaceNoSide2然后
resBeam.IncludeSurfaces = resBeam.IncludeSurfaces&str(selRb.SurfaceNoSide2)&“,”
End If
resBeam.IncludeSurfaces = resBeam.IncludeSurfaces&str(surf.no)

'设置积分区域
resBeam.Integrate = InsideCuboidGeneral
Dim resBeamParam(0到3)为Double
'+ y,-y,+ z,-z
如果selRb.WidthSide2然后
resBeamParam(0)= selRb.WidthSide2-rbCrsc.Eccentricity.Y
Else
resBeamParam(0)= 0.5 * rbCrsc.WebThickness-rbCrsc.Eccentricity.Y
End 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函数删除任何元素。 同样,由于修改了元素,因此必须使用“准备/完成”修改块。

'删除肋
'##########
iModData.PrepareModification
iModData.DeleteObjects MemberObject,str(selMem.no)
iModData.FinishModification

小结

简单来说,肋作为杆件并不能覆盖所有复杂模型的所有方面。 杆件肋的创建非常简单,因此这里展示的程序结合了杆件肋的创建和更详细的面肋设计与显示。 除了已知的杆件(IMember)接口之外,我们还引入了接口IRib,该接口可以访问肋截面。 我们还读取了杆件的局部坐标系,并使用矢量计算创建了肋的面。

前景

程序中有细化选项。 例如,您可以考虑肋的位置(上,下,中)。 另一种选择是在曲线上延伸到锥形肋甚至是肋。


作者

Günthel 先生为Dlubal 软件客户提供技术支持。

链接
下载