1783x
001617
2020-01-10

Выбор узлов вдоль линии с помощью интерфейса COM

При считывании результатов поверхности посредством интерфейса COM, получит пользователь одномерное поле со всеми результатами в отдельных узлах КЭ или точках сетки. Чтобы получить результаты по краю поверхности или вдоль линии, находящейся внутри поверхности, необходимо сначала отфильтровать результаты для области линии. В следующей статье будет представлена функция, благодаря которой можно выполнить данную задачу.

Теоретические основы расчета промежутков

Для того, чтобы найти узлы сетки КЭ, находящиеся близко линии или на линии, необходимо рассчитать промежуток от узла до линии. При этом нам дана линия с начальной и конечной точкой (N0 и N1), а также точка P, отступ которой от линии необходимо определить. Распространенным способом расчета данного промежутка является создание плоскости, которая проходит через точку P и перпендикулярна прямой. Для этого необходимо сначала составить подходящее уравнение линии. В этом случае рекомендуется применить параметрическую форму, которая содержит направляющий вектор v. Затем его можно применить для составления уравнения плоскости.

Для опорного вектора A используется начальная точка (радиусный вектор) линии, а для направляющего вектора v - разность двух радиусных векторов. В качестве уравнения плоскости будет применена нормальная форма по указанной выше причине.

Опорный вектор P в данном случае - это результативная точка Pres, подлежащая анализу. Вектор нормали является направляющим вектором прямой, поскольку плоскость перпендикулярна прямой. Прежде чем рассчитать отступ, необходимо определить коэффициент s прямой, по которой плоскость пересекает прямую. Для этого радиусный вектор X в уравнении плоскости заменяется уравнением прямой.

Скорректировано в соответствии с s и

, приводит к следующему уравнению.

Таким образом, теперь можно с помощью уравнения 1 определить точку пересечения S.

Промежуток d между S и Pres определяется посредством величины вектора, соответствующей разности между ними.

На рисунке 01 схематически показаны все перечисленные элементы. Синяя поверхность - это анализируемая поверхность, а красная поверхность представляет собой плоскость сечения, которая была задана с помощью точки Pres и направляющего вектора

. Коэффициент s на рисунке равен в точности 0,5, поэтому пересечение плоскости и линии находится как раз в центре линии.

Выполнение расчета промежутка в программе

После составления формул можно создать соответствующую программу. Для перевода применяется EXCEL VBA. На рисунке 02 показана нумерация элементов.

Сначала необходимо подключится к программе RFEM. Затем выберем интерфейс для данных модели. Поскольку этот алгоритм уже был пояснен в различных статьях (см. ссылки), не будем на нем останавливаться подробно. Ниже приведен исходный код для запуска программы.

Sub selection_test2 ()
    
Dim line_no As Integer
Dim surface_no As Integer
Dim loadcase_no As Integer
Dim d_tol As Double
line_no = 11
surface_no = 1
loadcase_no = 1
d_tol = 0.001
    
' get interface from the opened model and lock the licence/program
Dim iModel As RFEM5.IModel2
Set iModel = GetObject(, "RFEM5.Model")
iModel.GetApplication.LockLicense
    
On Error GoTo e
    
Dim iModelData As RFEM5.IModelData2
Set iModelData = iModel.GetModelData

Перед запуском программы сначала необходимо задать переменные параметры. К ним относятся номер строки line_no, в которой требуется выполнить поиск результатов, и, конечно, номер поверхности surface_no, на которой расположена линия. Кроме того, необходимо задать номер нагружения loadcase_no, к которому относятся результаты. Поскольку выполняется численное вычисление с ограниченной точностью, требуется задать допуск d_tol, который определяет максимальное расстояние между линией и узлом. В данном примере применен допуск, равный один миллиметр.

Так как теперь у нас имеется интерфейс для данных модели (IModelData), то можно сначала выполнить поиск линии, и тем самым ее начальной и конечной точки.

' get line
Dim ILin As RFEM5.ILine
Set ILin = iModelData.GetLine(line_no, AtNo)
Dim lin As RFEM5.RfLine
lin = ILin.GetData
   
    
' get nodes from line
Dim n(0 To 1) As RFEM5.Node
    
Dim ints() As Integer
ints = strToIntArr(lin.NodeList)
    
Dim iNd As RFEM5.INode
Set iNd = iModelData.GetNode(ints(0), AtNo)
n(0) = iNd.GetData
Set iNd = iModelData.GetNode(ints(UBound(ints, 1)), AtNo)
n(1) = iNd.GetData
    
Set iNd = Nothing

Выберем узлы и линии по отдельности прямо через их интерфейс (INode или ILine). Чтобы извлечь номера узлов из строки символов (RfLine.NodeList), применяется функция strToIntArr, описанная в другой статье (см. ссылки). Она преобразует строку символов в цифровое поле.

С помощью данных точек линии (начальная точка) и (конечная точка), вы можете задать первые параметры уравнения.

Dim v As RFEM5.Point3D
v.X = N(1).X - N(0).X
v.Y = N(1).Y - N(0).Y
v.Z = N(1).Z - N(0).Z
    
Dim A As RFEM5.Point3D
A.X = N(0).X
A.Y = N(0).Y
A.Z = N(0).Z
    
Dim v2 As Double
v2 = v.X ^ 2 + v.Y ^ 2 + v.Z ^ 2
    
Dim P_res As RFEM5.Point3D
Dim s As Double
Dim d As Double

Рассчитываются или подготавливаются направляющий вектор

(v), опорный вектор (A) и масштабное произведение направляющего вектора (v2). Кроме того, нужно определить переменные Pres (P_res) для результативной точки и s для множителя из уравнения линии (1).

Расчет промежутка с помощью цикла

В данном примере была выбрана обработка результатов на основе узлов сетки КЭ. Проверка промежутка происходит с помощью цикла над полем результатов. Сначала необходимо открыть данные результаты через интерфейс ICalculation2, а затем - IResults. Внутри цикла а первую очередь определяется точка Pres с помощью координат конечного значения (для наглядности). Затем мы можем выполнить прямой расчет уравнения (4). После вычисления s можно проверить, является ли значение меньше нуля или больше единицы, так как эти значения лежат вне прямой или до и после прямой. Если значение находится в данном интервале, то промежуток рассчитывается по уравнению (6).

' get results in fe-nodes
Dim iCalc As ICalculation2
Set 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)
    
' loop through stresses and calculate distance to line
Dim i As Integer
For i = 0 To UBound(surfBaStr, 1)
P_res.X = surfBaStr(i).Coordinates.X
P_res.Y = surfBaStr(i).Coordinates.Y
P_res.Z = surfBaStr(i).Coordinates.Z
' calculate factor for line equation of intersection
s = ((P_res.X-A.X)*v.X + (P_res.Y-A.Y)*v.Y + (P_res.Z-A.Z)*v.Z) / v2
        
If s <= 1 + d_tol And s >= 0 - d_tol Then
' calculate distance of intersection point and fe-node
d = ((P_res.X-(A.X+s*v.X))^2
+(P_res.Y-(A.Y+s*v.Y))^2
+(P_res.Z-(A.Z+s*v.Z))^2)^0.5
            
If (d < d_tol) Then
' here you can process the found result point
End If
End If
        
Next i

Для проверки коэффициента s и промежутка d применяется допустимое отклонение, для того, чтобы небольшие неточности не приводили к исключению результата.

Результаты программы

Найденные программой значения отображаются в таблице с округлением до двух десятичных знаков.

σy+ [Н/мм²]Коэффициент s [-]
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 визуальный выбор таким образом становится возможным иным способом через функцию. Например, у программ, которые полностью работают в фоновом режиме, можно таким образом выполнить автоматическую оценку результатов.


Автор

Г-н Гюнтель осуществляет техническую поддержку пользователей Dlubal Software.

Ссылки
Скачивания