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

Техническая статья

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

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

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

\mathrm{Прямая}\;\mathrm{Line}\;\mathrm G:\;\overset\rightharpoonup{\mathrm X}\;=\;\overset\rightharpoonup{\mathrm A}\;+\;\mathrm s\;\cdot\;\overset\rightharpoonup{\mathrm v}\;(1)\\\mathrm{где}\\\mathrm A\;=\;{\mathrm N}_0\\\mathrm v\;=\;{\mathrm N}_1\;-\;{\mathrm N}_0

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

$\mathrm{Плоскость}\;\mathrm E:\;0\;=\;(\overset\rightharpoonup{\mathrm X}\;-\;\overset\rightharpoonup{\mathrm P})\;\cdot\;\overset\rightharpoonup{\mathrm n}\;(2)\\\mathrm{где}\\\overset\rightharpoonup{\mathrm n}\;=\;\overset\rightharpoonup{\mathrm v}\\\overset\rightharpoonup{\mathrm P}\;=\;\overset\rightharpoonup{{\mathrm P}_{\mathrm{res}}}$

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

$(1)\;\mathrm{in}\;(2):\;0\;=\;((\overset\rightharpoonup{\mathrm A}\;+\;\mathrm s\;\cdot\;\overset\rightharpoonup{\mathrm v})\;-\;\overset\rightharpoonup{\mathrm P})\;\cdot\;\overset\rightharpoonup{\mathrm n}\;(3)$

Преобразованием s и с помощью $\overset\rightharpoonup{\mathrm n}\;=\;\overset\rightharpoonup{\mathrm v}$ мы получим следующее уравнение.

$\mathrm s\;=\;\frac{(\overset\rightharpoonup{\mathrm P}\;-\;\overset\rightharpoonup{\mathrm A})\;\cdot\;\overset\rightharpoonup{\mathrm v}}{(\overset\rightharpoonup{\mathrm v}\;\cdot\;\overset\rightharpoonup{\mathrm v})}\;(4)$

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

$\overset\rightharpoonup{\mathrm S}\;=\;\overset\rightharpoonup{\mathrm A}\;+\;\mathrm s\;\cdot\;\overset\rightharpoonup{\mathrm v}\;(5)$

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

$\mathrm d\;=\;\left|\overset\rightharpoonup{{\mathrm P}_{\mathrm{res}}}\;-\;\overset\rightharpoonup{\mathrm S}\right|\;(6)$

На рисунке 01 схематически показаны все перечисленные элементы. Поверхность синего цвета - это анализируемая поверхность, а поверхность красного цвета представляет собой плоскость пересечения, заданную с помощью точки Pres и направляющего вектора $\overset\rightharpoonup{\mathrm v}$. Коэффициент s на рисунке равен в точности 0,5, поэтому пересечение плоскости и линии находится как раз в центре линии.

Pисунок 01 - Схематическое изображение компонентов для расчета отступа

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

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

Pисунок 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, описанная в другой статье (см. ссылки). Она преобразует строку символов в цифровое поле.

Теперь с помощью данных точек линии $\overset\rightharpoonup{{\mathrm N}_0}$  (start point) and $\overset\rightharpoonup{{\mathrm N}_1}$ (конечная точка) мы можем задать первые параметры уравнения.

    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

Рассчитаем либо зададим направляющий вектор $\overset\rightharpoonup{\mathrm v}$ (v), опорный вектор $\overset\rightharpoonup{\mathrm A}$ (A) и скалярное произведение направляющего вектора $\overset\rightharpoonup{\mathrm v}\cdot\;\overset\rightharpoonup{\mathrm v}$ (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.

Pисунок 03 - Диаграмма результатов на анализируемой линии

Очевидно, что значения одинаковы и получено совпадение на 100%, то есть все значения были найдены на линии.

Резюме

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

Ключевые слова

Интерфейс COM Считывать результаты поверхности Считывать результаты вдоль линии Найти узлы вдоль линии Автоматическая оценка результатов Выбор через интерфейс COM

Загрузки

Ссылки

Контакты

У вас есть какие-либо вопросы по нашим программам или вам просто нужен совет?
Тогда свяжитесь с нами через бесплатную поддержку по электронной почте, в чате или на форуме или ознакомьтесь с различными решениями и полезными предложениями на страницах часто задаваемых вопросов.

+49 9673 9203 0

info@dlubal.com

RFEM Основная программа
RFEM 5.xx

Основная программа

Программное обеспечение для расчета конструкций методом конечных элементов (МКЭ) плоских и пространственных конструктивных систем, состоящих из плит, стен, оболочек, стержней (балок), тел и контактных элементов

Цена первой лицензии
3 540,00 USD
RFEM Прочие
RF-COM 5.xx

Дополнительный модуль

Программируемый интерфейс (API), основанный на технологии COM

Цена первой лицензии
580,00 USD
RSTAB Основная программа
RSTAB 8.xx

Основная программа

Программное обеспечение для расчета конструкций рам, балок и ферм, выполняющее линейные и неьинейные расчеты внутренних сил, деформаций и опорных реакций

Цена первой лицензии
2 550,00 USD
RSTAB Прочие
RS-COM 8.xx

Дополнительный модуль

Программируемый интерфейс (API), основанный на технологии COM

Цена первой лицензии
580,00 USD