1783x
001617
2020-01-10

通过COM接口选线的节点

Wenn man über die COM-Schnittstelle die Ergebnisse einer Fläche ausliest, so erhält man ein eindimensionales Feld mit allen Ergebnissen an den FE-Knoten oder Rasterpunkten. Um die Ergebnisse am Rand einer Fläche oder entlang einer Linie innerhalb der Flächen zu erhalten, müssen die Ergebnisse im Bereich der Linie herausgefiltert werden. Im Folgenden wird eine Funktion vorgestellt, welche diese Aufgabe übernehmen kann.

距离计算的理论背景

为了找到在线上或附近的有限元节点,需要计算该节点到线上的距离。 已给定直线的起点和终点(N0和 N1 ),以及要确定其到线的距离的点。 计算该距离的一种常用方法是跨过一个平面,该平面通过点 P 并垂直于直线。 为此首先要建立一个合适的线性方程。 在这种情况下,我们建议使用参数形式,其中包含方向向量 v。 可以用它来设置平面方程。

支座向量 A 为线的起点(位置向量),方向向量 v 为两个位置向量的差值。 由于上述原因,平面方程采用标准形。

需要分析的结果点Pres得到支持向量 P。 因为平面与直线正交,所以法向量就是直线的方向向量。 在计算距离之前,必须先确定平面与线的交点对线的系数 s。 将平面方程中的位置向量 X 替换为直线方程。

根据 s 和

进行调整后,得出以下公式。

因此,可以使用公式 1 确定交点 S。

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

图 01 显示了所有列出的单元的示意图。 蓝色面是要分析的面,红色面是截面,该截面由点Pres和方向向量

设置。 图像中的系数 s 仅为 0.5,因此平面和线的交点恰好是线的中心。

在程序中实现距离计算

一旦公式可用,您可以创建相应的程序。 使用 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
调暗为双
调暗为双

计算或准备方向向量

(v)、支持向量 (A)和方向向量 (v2)的标度积。 此外,还定义了线性方程 (1) 中结果点的变量 Pres (P_res ) 和系数。

计算循环距离

在本例中选择了根据有限元节点来处理结果。 距离的检查在结果区域内循环进行。 首先,您必须通过 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,900,0
17,280.1
12,790.2
8,430.3
4,170.4
-0.040.5
-4.250.6
-8.510.7
-12.870,8
-17.360.9
-21.981.0

作为比较,结果图中相应线上的值显示在图 03 中。

很明显,这些值相同并且 100% 匹配,或者所有值都位于线上。

小结

创建了一个利用向量计算方法找到沿线节点的程序。 使用该算法不仅可以搜索结果,还可以搜索所有其他几何元素。 这一点特别有用,因为在 COM 接口中可视化选择是不可能的,但是可以通过其他功能进行。 特别是可以对完全在后台运行的程序进行结果自动评估。


作者

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

链接
下载