距离计算的理论背景
为了找到在线上或附近的有限元节点,需要计算该节点到线上的距离。 已给定直线的起点和终点(N0和 N1 ),以及要确定其到线的距离的点。 计算该距离的一种常用方法是跨过一个平面,该平面通过点 P 并垂直于直线。 为此首先要建立一个合适的线性方程。 在这种情况下,我们建议使用参数形式,其中包含方向向量 v。 可以用它来设置平面方程。
支座向量 A 为线的起点(位置向量),方向向量 v 为两个位置向量的差值。 由于上述原因,平面方程采用标准形。
需要分析的结果点Pres得到支持向量 P。 因为平面与直线正交,所以法向量就是直线的方向向量。 在计算距离之前,必须先确定平面与线的交点对线的系数 s。 将平面方程中的位置向量 X 替换为直线方程。
根据 s 和
因此,可以使用公式 1 确定交点 S。
S 和 Pres之间的距离 d 通过两者之间的差值的矢量量来确定。
图 01 显示了所有列出的单元的示意图。 蓝色面是要分析的面,红色面是截面,该截面由点Pres和方向向量
在程序中实现距离计算
一旦公式可用,您可以创建相应的程序。 使用 EXCEL VBA 进行转换。 图 02 显示了单元的编号。
首先,需要连接到 RFEM。 然后,获取模型数据的接口。 由于在其他文章中已经介绍了该方法(见链接),在此不再赘述。 以下是启动程序的源代码。
子选择_test2()
Dim line_no 作为整数
Dimsurface_no 作为整数
将荷载工况变暗为整数
将 d_tol 调暗为双精度
线编号 = 11
面_编号 = 1
荷载工况编号 = 1
d_tol = 0.001
' 从打开的模型中获取接口并锁定许可证/程序
Dim iModel As RFEM5.IModel2
Set iModel = GetObject(, "RFEM5.Model")
iModel.GetApplication.LockLicense
出错时转到 e
Dim iModelData As RFEM5.IModelData2
设置 iModelData = iModel.GetModelData
在启动程序之前,定义可变参数。 其中包括要搜索结果的线的线编号(line_no),当然还包括该线所在面的面编号(surface_no)。 此外,您需要结果所属的荷载工况的编号 (loadcase_no)。 因为这是一个精度有限的数值计算,所以需要一个容差 (d_tol),它指定线和节点之间的最大距离。 在该示例中使用的公差为 1 毫米。
因为现在模型数据的接口 (IModelData) 可用,所以您可以首先搜索线,因此也可以搜索它的起点和终点。
' 获取行
Dim ILin As RFEM5.ILine
设置 ILin = iModelData.GetLine(line_no, AtNo)
调光尺寸 RFEM5.RfLine
lin = ILin.GetData
' 从线上获取节点
Dim n(0 to 1) As RFEM5.Node
Dim ints() 为整数
ints = strToIntArr(lin.NodeList)
Dim iNd As RFEM5.INode
设置 iNd = iModelData.GetNode(ints(0), AtNo)
n(0) = iNd.GetData
Set iNd = iModelData.GetNode(ints(UBound(ints, 1)), AtNo)
n(1) = iNd.GetData
设置 iNd = 无
节点和线都可以通过其接口(INode 或 ILine)直接获取。 要从字符串 (RfLine.NodeList) 中提取节点编号,请使用另一篇文章中介绍的 strToIntArr 函数(见链接)。 它将字符串转换为整数字段。
Dim v As RFEM5.Point3D
vX = N(1).X - N(0).X
vY = N(1).Y - N(0).Y
vZ = N(1).Z - N(0).Z
Dim A As RFEM5.Point3D
AX = N(0).X
AY = N(0).Y
AZ = N(0).Z
将 v2 调暗为双精度
v2 = vX ^ 2 + vY ^ 2 + vZ ^ 2
Dim P_res As RFEM5.Point3D
调暗为双
调暗为双
计算或准备方向向量
计算循环距离
在本例中选择了根据有限元节点来处理结果。 距离的检查在结果区域内循环进行。 首先,您必须通过 ICalculation2 接口获得这些结果,然后是 IResults。 在循环中,为了清楚起见,首先用结果值的坐标描述点Pres 。 然后可以直接进行公式(4)的计算。 计算 s 后,可以检查该值是否小于零或大于 1,因为这些值位于直线的外部或之前和之后。 在该范围内的距离按照公式(6)计算。
' 得到 fe-节点中的结果
Dim iCalc As ICalculation2
设置 iCalc = iModel.GetCalculation
Dim iRes as RFEM5.IResults
设置 iRes = iCalc.GetResultsInFeNodes(LoadCaseType, loadcase_no)
Dim surfBaStr() As RFEM5.SurfaceBasicStresses
surfBaStr = iRes.GetSurfaceStresses(surface_no, AtNo)
' 遍历应力并计算到线的距离
Dim i 作为整数
对于 i = 0 到 UBound(surfBaStr, 1)
P_res.X = surfBaStr(i).Coordinates.X
P_res.Y = surfBaStr(i).Coordinates.Y
P_res.Z = surfBaStr(i).坐标.Z
' 计算相贯线方程的系数
s = ((P_res.XA.X)*vX + (P_res.YA.Y)*vY + (P_res.ZA.Z)*vZ)/v2
如果 s <= 1 + d_tol 并且 s >= 0 - d_tol 那么
' 计算交点到 fe-节点的距离
d = ((P_res.X-(A.X+s*vX))^2
+(P_res.Y-(A.Y+s*vY))^2
+(P_res.Z-(A.Z+s*vZ))^2)^0.5
如果 (d < d_tol) 则
' 在这里可以对找到的结果点进行处理
End If
End If
接下来我
该公差用于检查系数 s 和距离 d,以便任何微小的误差都不会导致结果被排除。
课程结果
程序计算得出的数值保留在小数点后两位,显示在表格中。
σy+ [N/mm²] | 系数 [-] |
---|---|
21,90 | 0,0 |
17,28 | 0.1 |
12,79 | 0.2 |
8,43 | 0.3 |
4,17 | 0.4 |
-0.04 | 0.5 |
-4.25 | 0.6 |
-8.51 | 0.7 |
-12.87 | 0,8 |
-17.36 | 0.9 |
-21.98 | 1.0 |
作为比较,结果图中相应线上的值显示在图 03 中。
很明显,这些值相同并且 100% 匹配,或者所有值都位于线上。
小结
创建了一个利用向量计算方法找到沿线节点的程序。 使用该算法不仅可以搜索结果,还可以搜索所有其他几何元素。 这一点特别有用,因为在 COM 接口中可视化选择是不可能的,但是可以通过其他功能进行。 特别是可以对完全在后台运行的程序进行结果自动评估。