距离计算的理论背景
为了找到线附近或线上的有限元节点,需要计算节点到线的距离。 给出一条线,以及起点和终点(N0和N1 ),以及点到线的距离。 通常的计算方法是,通过点 P 并与该线垂直。 首先必须要建立一个线性相关的方程。 这种情况下我们建议使用参数形式,它包含一个方向向量 v。 可以用它来建立平面方程。
对于支座向量 A,使用线的起点(位置向量),对于方向向量 v,使用两个位置向量的差。 由于上述原因,平面方程采用正常形式。
支座向量 P 就是要分析的结果点 Pres 。 因为平面与该直线正交,所以法向量是该直线的方向向量。 在计算距离之前,需要确定平面与线相交的线的放大系数 s。 为此,平面方程中的位置向量 X 被直线方程代替。
转换为s并起始于
因此可以用公式 1 来计算交点 S。
S 和 Pres之间的距离 d 通过两者之间的差向量来确定。
图 01 显示了所有列出的构件。 蓝色面是要分析的面,红色面是由点 Pres和方向向量
在程序中实现距离计算
输入公式后, EXCEL VBA 用于转换。 图 02 显示了构件的编号。
首先, 然后,获取模型数据的接口。 关于该功能的详细介绍已经在其他文章中进行了介绍,这里不再详细说明。 下面是启动程序的源代码。
- code.vb#
截面 selection_est2()
- 将 line_no 设置为全局尺寸
- 将surface_no调暗为Integer
- loadcase_no As Integer调暗
- 尺寸标注作为双精度
- 线编号 = 11
- 面编号 = 1
- loadcase_no = 1
- d_tol = 0.001
- ' 从打开的模型中获取接口并锁定许可证/程序
- 将 iModel 调暗为 RFEM5.IModel2
- Set iModel = GetObject(, "RFEM5.Model")
- iModel.GetApplication.LockLicense
错误时转到e
- Dim iModelData As RFEM5.IModelData2
- Set iModelData = iModel.GetModelData
- /代码#
在启动程序之前,请定义可变参数。 其中包括要搜索结果的线的线编号(line_no),以及与该线所在面的面的编号(surface_no)。 此外,还需要输入结果所属的荷载工况(loadcase_no)的编号。 由于这是一个精度有限的数值计算,所以需要一个公差(d_tol),它是线和节点之间的最大距离。 本例中使用的容差为 1 毫米。
因为现在可以使用模型数据(IModelData)的接口,所以可以首先搜索线,然后是它的始端和末端点。
- code.vb#
- ' 得到线
- Dim ILin As RFEM5.ILine
- Set ILin = iModelData.GetLine(line_no, atno)
- Dim lin As RFEM5.RfLine
- lin = ILin.GetData
- ' 得到相对于线的节点
- Dim n(0 到 1) As RFEM5.节点
- Dim ints() As Integer
- ints = strToIntArr(lin.Nodelist)
- 在 iNd As RFEM5.INode 中变暗
- Set iNd = iModelData.GetNode(ints(0), 位置编号)
- n(0) = iNd.GetData
- Set iNd = iModelData.GetNode(ints(UBound(ints, 1)), At编号)
- n(1) = iNd.GetData
- 集 iNd = 无
- /代码#
对于节点和线,您可以直接通过它们的接口(INode 或 ILine)分别得到。 如果想要从字符串 (RfLine.Nodelist) 中提取节点编号,请使用在另一篇文章中介绍的函数 strToIntArr(见相关链接)。 它将字符串转换为整数字段。
现在给定的点
- code.vb#
- 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
- Dim v2 As Double
- v2 = vX ^ 2 + vY ^ 2 + vZ ^ 2
- 将P_res调暗为RFEM5.Point3D
- Dim s As Double
- 尺寸标注 d As Double
- /代码#
就是方向向量
正在计算环中的距离
在本例中选择了根据有限元节点处理结果。 在这些结果字段上循环检查距离。 首先,您必须通过 ICalculation2 接口获得这些结果,然后是 IResults。 在这个循环中,首先点 Pres被描述为结果值的坐标。 然后就可以对公式(4)进行直接计算。 在计算出 s 后,可以检查该值是否小于零或大于一,因为这些值位于直线外,或位于直线之前和之后。 用户可以通过公式 (6) 计算距离。
- code.vb#
- ' 以有限元节点为单位得到结果
- 将i计算暗淡为ICalculation2
- 设置 iCalc = iModel.GetCalculation
- Dim iRes As RFEM5.IResults
- Set iRes = iCalc.GetResultsInFeNodes(LoadCaseType, loadcase_no)
- Dim surfBaStr() As RFEM5.SurfaceBasicStresses
- surfBaStr = iRes.GetSurfaceBasicStresses(surface_no, Atno)
- ' 循环应力并计算到线的距离
- 第 i 维变暗为整数
- For i = 0 指向 UBound(surfBaStr, 1)
- P_res.X = surfBaStr(i).Coordinates.X
- P_res.Y = surfBaStr(i).坐标.Y
- P_res.Z = surfBaStr(i).Coordinates.Z
- ' 计算相交的线方程系数
- s = ((P_res.XA.X)*vX + (P_res.YA.Y)*vY + (P_res.ZA.Z)*vZ)/v2
- If s <= 1 + d_tol 且 s >= 0 - d_tol 则
- ' 计算交点与有限元节点的距离
- 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
- If (d < d_tol) 则
- ' 这里您可以处理找到的结果点
- End If
- End If
- 下一个 i
- /代码#
该公差适用于系数 s 和距离 d 的检查,这样任何小的错误都不会导致结果被排除在外。
程序结果
程序计算得出的数值四舍五入到小数点后两位小数,并在表格中显示。
σy+ [N/mm²] | 系数 s [-] |
---|---|
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 接口进行可视选择,但可以通过其他方式通过功能实现。 尤其是对于完全在后台运行的程序,可以执行自动结果评估。