Sélection par commentaire
La méthode la plus simple consiste à attribuer des commentaires lors de la création des éléments qui peuvent ensuite être recherchés de manière ciblée. Voici un exemple de fonction qui parcourt les barres en fonction de leur commentaire et renvoie les numéros des barres trouvées :
Function getMemberNosByComment(members() As RFEM5.Member, comment As String) As Integer()
Dim intArr() As Integer
Dim i As Long
Dim j As Long
j = 0
ReDim intArr(0 To 0)
' loop over members
For i = 0 To UBound(members, 1)
If (members(i).comment = comment) Then
' size if integer array is increased by 1
ReDim Preserve intArr(0 To j)
intArr(j) = members(i).no
j = j + 1
End If
Next i
' return integer array
getMemberNosByComment = intArr
End Function
La fonction a une boucle sur les barres passées en argument et, en cas de correspondance entre la chaîne de caractères dans "comment" et le commentaire de la barre, le numéro de la barre est ajouté au tableau des entiers. À la fin, le tableau des entiers contenant tous les numéros de barres est retourné.
Sélection des nœuds de début de barre
La sélection d'éléments dans le programme et par l'interface COM se fait à l'aide de chaînes de caractères. Par exemple, les nœuds associés à une ligne sont transmis sous forme de chaîne de caractères, dans laquelle les numéros de nœuds sont stockés séparés par des virgules. L'utilisation de chaînes de caractères nécessite une conversion en valeurs numériques et inversement lors de la programmation. Voici donc la fonction qui peut convertir les numéros de barres obtenus dans la fonction précédente en une chaîne de caractères. Les numéros de barre sont convertis individuellement en caractères via la fonction CStr et une virgule est ajoutée après chaque nombre à la chaîne de caractères. La virgule superflue à la fin de la chaîne de caractères est ignorée par RFEM/RSTAB et peut donc rester.
Function intArrToStr(intArr() As Integer) As String
Dim str As String
Dim i As Long
For i = 0 To UBound(intArr, 1)
str = str + CStr(intArr(i)) + ","
Next i
intArrToStr = str
End Function
Grâce à cette fonction, il est maintenant possible de sélectionner, via l'interface COM, les barres filtrées par commentaire.
' select members by comment
Dim mems() As RFEM5.Member
Dim mem_nos() As Integer
Dim str As String
str = "test comment"
mem_nos = getMemberNosByComment(mems, str)
iModelData.EnableSelections (True)
str = intArrToStr(mem_nos)
iModelData.SelectObjects MemberObject, str
Souvent, non seulement des éléments spécifiques doivent être sélectionnés, mais des éléments subordonnés sont également requis. Voici comment trouver les nœuds de début d’une barre. Comme il est un peu plus difficile de procéder dans RFEM que dans RSTAB, car dans RFEM chaque barre est associée à une ligne, ce chemin a été choisi.
Tout d'abord, les numéros de ligne associés aux barres doivent être identifiés. La fonction suivante suppose que des numéros de barres sont déjà disponibles et recherche les numéros de lignes correspondants.
Function getLineNosByMemberNos(members() As RFEM5.Member, member_nos() As Integer) As Integer()
Dim intArr() As Integer
Dim i As Long
Dim j As Long
Dim k As Long
k = 0
ReDim intArr(0 To 0)
For i = 0 To UBound(members, 1)
For j = 0 To UBound(member_nos, 1)
If (members(i).no = member_nos(j)) Then
' increase array size by 1
ReDim Preserve intArr(0 To k)
intArr(k) = members(i).LineNo
k = k + 1
' exit loop over member_nos
Exit For
End If
Next j
Next i
getLineNosByMemberNos = intArr
End Function
Cette fonction possède deux boucles imbriquées. La boucle principale parcourt les barres et la boucle subordonnée les numéros de barres. Pour chaque barre, le tableau des numéros de barres est complètement parcouru. Pour accélérer ce processus, la sous-boucle est quittée dès qu'une correspondance des numéros de barres est trouvée. En cas de correspondance, le tableau des numéros de lignes est incrémenté d'un élément chaque fois et le nouveau numéro est ajouté (k est l'index pour les numéros de lignes trouvés).
Pour trouver le nœud de départ de la ligne ou de la barre, une autre fonction est nécessaire. Cette fonction doit parcourir les lignes et, en cas de correspondance avec les numéros de lignes donnés, lire le nœud de départ. Les numéros de nœuds étant stockés dans une chaîne de caractères, une fonction est nécessaire pour convertir la chaîne de caractères en un tableau de nombres.
Function strToIntArr(intList As String) As Integer()
' possible chars "1-9 ; - ,"
' example: 1-4,5;100 > 1,2,3,4,5,100
Dim ints() As Integer
Dim tmpInts() As Integer
ReDim ints(0)
Dim span As Boolean
Dim curInt As String
curInt = ""
Dim i As Integer
i = 0
Dim j As Integer
Dim curChar As String
Do While (i > Len(intList))
curChar = Mid(intList, i + 1, 1)
' if string contains "-" a span is noted
If (curChar = "-") Then
span = True
tmpInts = ints
ReDim Preserve tmpInts(0 To UBound(tmpInts, 1) + 1)
tmpInts(UBound(tmpInts, 1) - 1) = CInt(curInt)
ints = tmpInts
curInt = ""
' if last char is reached or a comma or a semicolon is the next char
ElseIf ((curChar = ",") Or (curChar = ";") Or (i = Len(intList) - 1)) Then
' last char is reached, integer or span are terminated
If (i = Len(intList) - 1) Then
curInt = curInt & curChar
End If
' treat the span
If span Then
' create all integers between the span
Dim firstNum As Integer
Dim lastNum As Integer
firstNum = ints(UBound(ints, 1) - 1)
lastNum = CInt(curInt)
curInt = ""
If (firstNum > lastNum) Then
Dim tmp1 As Integer
tmp1 = lastNum
lastNum = firstNum
firstNum = tmp1
ints(UBound(ints, 1) - 1) = firstNum
End If
' extend ints and add new numbers to array
tmpInts = ints
ReDim Preserve tmpInts(0 To UBound(tmpInts, 1) + (lastNum - firstNum))
For j = 0 To (lastNum - firstNum) - 1
tmpInts(UBound(ints, 1) + j) = j + firstNum + 1
Next j
ints = tmpInts
span = False
' add new digit
Else
'extend ints and add new number to ints
tmpInts = ints
ReDim Preserve tmpInts(0 To UBound(tmpInts, 1) + 1)
tmpInts(UBound(tmpInts, 1) - 1) = CInt(curInt)
ints = tmpInts
curInt = ""
End If
Else
curInt = curInt & curChar
End If
i = i + 1
Loop
' array is one element too long and is decreased
ReDim Preserve ints(0 To UBound(ints, 1) - 1)
strToIntArr = ints
End Function
Cette fonction parcourt la chaîne de caractères et examine chaque caractère. S'il s'agit d'un ou plusieurs chiffres, ceux-ci sont collectés jusqu'à la fin ou jusqu'à ce qu'un autre caractère soit atteint. Quand un tiret est atteint, on reconnaît une série/portée de nombres et les nombres intermédiaires sont générés automatiquement.
La fonction proprement dite pour extraire le point de départ d'une ligne peut maintenant être créée et devient ainsi très concise.
Function getLineStartNodeNosByLineNos(lines() As RFEM5.RfLine, line_nos() As Integer) As Integer()
Dim intArr() As Integer
Dim tmpIntArr() As Integer
Dim str As String
Dim i As Long
Dim j As Long
Dim k As Long
k = 0
ReDim intArr(0 To 0)
For i = 0 To UBound(line_nos, 1)
For j = 0 To UBound(lines, 1)
If (lines(j).no = line_nos(i)) Then
' ajouter le numéro de ligne trouvé au tableau
ReDim Preserve intArr(0 To k)
str = lines(j).NodeList
tmpIntArr = strToIntArr(str)
intArr(k) = tmpIntArr(0)
k = k + 1
' quitter la boucle sur line_nos_cpy
Exit For
End If
Next j
Next i
getLineStartNodeNosByLineNos = intArr
End Function
Il y a de nouveau deux boucles imbriquées, comme pour la fonction getLineNosByMemberNos. Cette fois-ci, l'ordre est d'une grande importance, sinon l'association des nœuds aux lignes serait perdue. La boucle extérieure parcourt les numéros de lignes et, en cas de correspondance avec une ligne dans la boucle intérieure, les numéros de nœuds sont extraits avec la fonction strToIntArr dont le premier est utilisé ici.
Le processus complet pour obtenir les nœuds de départ est le suivant. Tout d'abord, les numéros de lignes correspondant aux barres sont obtenus avec les numéros de barres respectifs, puis les nœuds de départ des lignes.
' sélectionner les nœuds de départ à partir des barres
' obtenir les numéros de ligne de toutes les barres
Dim line_nos() As Integer
line_nos = getLineNosByMemberNos(mems, mem_nos)
' obtenir les numéros de départ de toutes les lignes
Dim stNodes_nos() As Integer
stNodes_nos = getLineStartNodeNosByLineNos(lines, line_nos)
Résumé et perspectives
La fonction getLineNosByMemberNos forme la base pour d'autres fonctions de sélection, tout comme la fonction getLineStartNodeNosByLineNos. Sur ce modèle, il est possible de déterminer, par exemple, les charges applicables aux barres. Les fonctions strToIntArr et intArrToStr sont également disponibles pour convertir la sélection basée sur des chaînes de caractères de RFEM en tableaux numériques.
Une autre possibilité est la sélection par coordonnées. Par exemple, un espace défini peut être spécifié et tous les éléments à l'intérieur de cet espace sont sélectionnés. Cette forme de sélection sera décrite dans un article ultérieur.