1839x
001617
2020-01-10

通过COM接口选线的节点

如果您通过 COM 接口读取面的结果,您得到的是一个一维场,所有结果都在有限元节点或栅格点处。 要得到面的边缘或线上的结果,必须先过滤掉线所在区域的结果。 下文介绍了用于此步骤的一个功能。

距离计算的理论背景

为了找到线附近或线上的有限元节点,需要计算节点到线的距离。 给出一条线,以及起点和终点(N0和N1 ),以及点到线的距离。 通常的计算方法是,通过点 P 并与该线垂直。 首先必须要建立一个线性相关的方程。 这种情况下我们建议使用参数形式,它包含一个方向向量 v。 可以用它来建立平面方程。

对于支座向量 A,使用线的起点(位置向量),对于方向向量 v,使用两个位置向量的差。 由于上述原因,平面方程采用正常形式。

支座向量 P 就是要分析的结果点 Pres 。 因为平面与该直线正交,所以法向量是该直线的方向向量。 在计算距离之前,需要确定平面与线相交的线的放大系数 s。 为此,平面方程中的位置向量 X 被直线方程代替。

转换为s并起始于

我们得到以下等式。

因此可以用公式 1 来计算交点 S。


S 和 Pres之间的距离 d 通过两者之间的差向量来确定。

图 01 显示了所有列出的构件。 蓝色面是要分析的面,红色面是由点 Pres和方向向量

RWIND 3。 图中的系数s只是0.5,所以平面与线的交点就在线的圆心处。

在程序中实现距离计算

输入公式后, EXCEL VBA 用于转换。 图 02 显示了构件的编号。

首先, 然后,获取模型数据的接口。 关于该功能的详细介绍已经在其他文章中进行了介绍,这里不再详细说明。 下面是启动程序的源代码。

  1. code.vb#

截面 selection_est2()

  1. 将 line_no 设置为全局尺寸
  2. 将surface_no调暗为Integer
  3. loadcase_no As Integer调暗
  4. 尺寸标注作为双精度
  5. 线编号 = 11
  6. 面编号 = 1
  7. loadcase_no = 1
  8. d_tol = 0.001
  9. ' 从打开的模型中获取接口并锁定许可证/程序
  10. 将 iModel 调暗为 RFEM5.IModel2
  11. Set iModel = GetObject(, "RFEM5.Model")
  12. iModel.GetApplication.LockLicense

错误时转到e

  1. Dim iModelData As RFEM5.IModelData2
  2. Set iModelData = iModel.GetModelData
  3. /代码#

在启动程序之前,请定义可变参数。 其中包括要搜索结果的线的线编号(line_no),以及与该线所在面的面的编号(surface_no)。 此外,还需要输入结果所属的荷载工况(loadcase_no)的编号。 由于这是一个精度有限的数值计算,所以需要一个公差(d_tol),它是线和节点之间的最大距离。 本例中使用的容差为 1 毫米。

因为现在可以使用模型数据(IModelData)的接口,所以可以首先搜索线,然后是它的始端和末端点。

  1. code.vb#
  2. ' 得到线
  3. Dim ILin As RFEM5.ILine
  4. Set ILin = iModelData.GetLine(line_no, atno)
  5. Dim lin As RFEM5.RfLine
  6. lin = ILin.GetData
  7. ' 得到相对于线的节点
  8. Dim n(0 到 1) As RFEM5.节点
  9. Dim ints() As Integer
  10. ints = strToIntArr(lin.Nodelist)
  11. 在 iNd As RFEM5.INode 中变暗
  12. Set iNd = iModelData.GetNode(ints(0), 位置编号)
  13. n(0) = iNd.GetData
  14. Set iNd = iModelData.GetNode(ints(UBound(ints, 1)), At编号)
  15. n(1) = iNd.GetData
  16. 集 iNd = 无
  17. /代码#

对于节点和线,您可以直接通过它们的接口(INode 或 ILine)分别得到。 如果想要从字符串 (RfLine.Nodelist) 中提取节点编号,请使用在另一篇文章中介绍的函数 strToIntArr(见相关链接)。 它将字符串转换为整数字段。

现在给定的点

(始端点)和 (终点)您可以设置方程的第一个参数。

  1. code.vb#
  2. Dim v As RFEM5.Point3D
  3. vX = N(1).X - N(0).X
  4. vY = N(1).Y - N(0).Y
  5. vZ = N(1).Z - N(0).Z
  6. Dim A As RFEM5.Point3D
  7. AX = N(0).X
  8. AY = N(0).Y
  9. AZ = N(0).Z
  10. Dim v2 As Double
  11. v2 = vX ^ 2 + vY ^ 2 + vZ ^ 2
  12. 将P_res调暗为RFEM5.Point3D
  13. Dim s As Double
  14. 尺寸标注 d As Double
  15. /代码#

就是方向向量

(v), 支座向量 (A) 和方向向量的比例积 计算 (v2) 开始计算。 此外,还要定义结果点的 Pres (P_res) 和线性公式 (1) 中的系数 s。

正在计算环中的距离

在本例中选择了根据有限元节点处理结果。 在这些结果字段上循环检查距离。 首先,您必须通过 ICalculation2 接口获得这些结果,然后是 IResults。 在这个循环中,首先点 Pres被描述为结果值的坐标。 然后就可以对公式(4)进行直接计算。 在计算出 s 后,可以检查该值是否小于零或大于一,因为这些值位于直线外,或位于直线之前和之后。 用户可以通过公式 (6) 计算距离。

  1. code.vb#
  2. ' 以有限元节点为单位得到结果
  3. 将i计算暗淡为ICalculation2
  4. 设置 iCalc = iModel.GetCalculation
  5. Dim iRes As RFEM5.IResults
  6. Set iRes = iCalc.GetResultsInFeNodes(LoadCaseType, loadcase_no)
  7. Dim surfBaStr() As RFEM5.SurfaceBasicStresses
  8. surfBaStr = iRes.GetSurfaceBasicStresses(surface_no, Atno)
  9. ' 循环应力并计算到线的距离
  10. 第 i 维变暗为整数
  11. For i = 0 指向 UBound(surfBaStr, 1)
  12. P_res.X = surfBaStr(i).Coordinates.X
  13. P_res.Y = surfBaStr(i).坐标.Y
  14. P_res.Z = surfBaStr(i).Coordinates.Z
  15. ' 计算相交的线方程系数
  16. s = ((P_res.XA.X)*vX + (P_res.YA.Y)*vY + (P_res.ZA.Z)*vZ)/v2
  17. If s <= 1 + d_tol 且 s >= 0 - d_tol 则
  18. ' 计算交点与有限元节点的距离
  19. d = ((P_res.X-(A.X+s*vX))^2
  20. +(P_res.Y-(A.Y+s*vY))^2
  21. +(P_res.Z-(A.Z+s*vZ))^2)^0.5
  22. If (d < d_tol) 则
  23. ' 这里您可以处理找到的结果点
  24. End If
  25. End If
  26. 下一个 i
  27. /代码#

该公差适用于系数 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 接口进行可视选择,但可以通过其他方式通过功能实现。 尤其是对于完全在后台运行的程序,可以执行自动结果评估。


作者

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

链接
下载


;