Principes théoriques du calcul de la distance
La distance du nœud à la ligne doit être calculée pour trouver les nœuds EF proches ou sur la ligne. On dispose de la ligne avec les points de début et de fin (N0 et N1) et du point P. La distance entre ce point et cette ligne doit être déterminée. Une méthode classique pour calculer cette distance consiste à étendre un plan de sorte à ce qu'il passe par le point P et soit perpendiculaire à la ligne. Pour ce faire, une équation linéaire appropriée doit d'abord être définie. Dans ce cas, il est recommandé d'utiliser la forme de paramètre qui contient un vecteur de direction v. Ce vecteur peut être utilisé pour définir l'équation du plan.
Le point de départ (vecteur de position) de la ligne est utilisé pour le vecteur d'appui A et la différence des deux vecteurs de position pour le vecteur de direction v. La forme normale est utilisée comme équation du plan pour la raison mentionnée ci-dessous.
Le vecteur d'appui P est ici le point de résultat Pres à analyser. Le vecteur normal est le vecteur de direction de la ligne droite, car le plan est orthogonal à cette ligne. Avant de pouvoir calculer la distance, le facteur s de la ligne droite au point d'intersection avec le plan doit être déterminé. Pour ce faire, le vecteur de position X dans l'équation du plan est remplacé par l'équation de la ligne droite.
Converti en s et à partir de
Il est ainsi possible de déterminer le point d'intersection S à l'aide de l'Équation 1.
La distance d entre S et Pres est déterminée à l'aide de la valeur vectorielle de la différence entre les deux points.
La Figure 01 montre la représentation schématique de tous les éléments mentionnés ici. La surface bleue est la surface à analyser et la surface rouge le plan de coupe, qui est défini par le point Prés et le vecteur de direction
Implémentation du calcul de la distance dans un programme
Une fois les formules disponibles, vous pouvez créer le programme correspondant. EXCEL VBA est utilisé pour la conversion. La Figure 02 montre la numérotation des éléments.
Une connexion avec RFEM est d'abord nécessaire. Ensuite, l'interface est récupérée pour les données du modèle. Cette procédure ayant déjà été présentée dans divers autres articles (voir les « Liens » au bas de cet article), elle n'est pas détaillée ici. Le code source pour démarrer le programme est le suivant :
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
Les paramètres variables doivent être définis avant de lancer le programme. Il s'agit notamment du numéro line_no de la ligne pour laquelle les résultats sont recherchés et du numéro surface_no de la surface où se trouve la ligne. De plus, le numéro loadcase_no du cas de charge auquel les résultats appartiennent est également nécessaire. Comme il s'agit d'un calcul numérique avec une précision limitée, une tolérance d_tol est requise afin de définir la distance maximale entre la ligne et le nœud. Une tolérance d'un millimètre est utilisée dans cet exemple.
L'interface des données du modèle (IModelData) est désormais disponible et il faut alors rechercher la ligne, ainsi que ses points de début et de fin.
' 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
Les nœuds et la ligne sont tous obtenus directement via leur interface (INode ou ILine). La fonction strToIntArr décrite dans un autre article de la liste ci-dessous permet d'extraire les numéros de nœud de la chaîne (RfLine.NodeList). Elle convertit la chaîne en un champ de type entier.
Avec les points de la ligne désormais donnés
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
Il devient le vecteur de direction
Calcul de la distance dans une boucle
Cet exemple utilise le traitement des résultats à partir des nœuds EF. Le contrôle de la distance est effectué dans une boucle sur le champ des résultats. Ces résultats doivent d'abord être obtenus via l'interface ICalculation2, puis IResults. Dans cette boucle, le point Pres est d'abord décrit avec les coordonnées de la valeur de résultat pour plus de clarté. L'Équation (4) peut ensuite être calculée. Une fois la variable s calculée, il est possible de vérifier si la valeur est inférieure à zéro ou supérieure à un, car ces valeurs se situent en dehors de la ligne droite, avant ou après. Si une valeur se trouve dans cette intervalle, la distance est calculée à l'aide de l'Équation (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
La vérification du facteur s et de la distance d est soumise à une tolérance afin qu'aucune imprécision mineure n'entraîne l'exclusion d'un résultat.
Résultats du programme
Les valeurs trouvées par le programme sont affichées dans le tableau, où elles sont arrondies à la deuxième décimale.
σy+ [N/mm²] | Facteur 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 |
À titre de comparaison, les valeurs du diagramme de résultats sur la ligne correspondante sont affichées sur la Figure 03.
On constate que les valeurs sont les mêmes, que la correspondance est parfaite ou que toutes les valeurs ont été trouvées sur la ligne.
Conclusion
Un calcul de vecteurs permet d'élaborer un programme grâce auquel on peut trouver des nœuds le long d'une ligne. Cet algorithme sert également à trouver d'autres éléments géométriques en plus des résultats. Cette méthode est particulièrement utile car il est impossible d'effectuer visuellement une sélection via l'interface COM, mais une fonction le permet. Il est possible d'évaluer automatiquement les résultats, notamment pour les programmes exécutés en tâche de fond.