Výběr podle komentáře
Nejjednodušší je pravděpodobně přiřazení komentářů při vytváření prvků, které lze poté konkrétně vyhledat. Následující text obsahuje příklad funkce, která vyhledává pruty podle komentáře a vrací nalezená čísla prutů:
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)
‚ smyčka po prutech
For i = 0 To UBound(members, 1)
If (members(i).comment = comment) Then
‘ velikost, pokud je celočíselné pole zvětšeno o 1
ReDim Preserve intArr(0 To j)
intArr(j) = members(i).no
j = j + 1
End If
Next i
' vrácení celočíselného pole
getMemberNosByComment = intArr
End Function
Funkce prochází přenesené pruty a pokud se řetězec v „comment“ shoduje s komentářem prutu, číslo prutu se přidá do celočíselného pole. Nakonec se vrátí celočíselné pole se všemi čísly prutů.
Výběr koncových uzlů prutu
Výběr prvků v programu, a tedy i přes rozhraní COM, se provádí pomocí řetězců. U linie se například přenesou příslušné uzly přes řetězec, ve kterém jsou čísla uzlů odděleny čárkami. Použití řetězců vyžaduje při programování převod na číselné hodnoty a naopak. Následující funkce proto představuje způsob, jak převést čísla prutů určená výše uvedenou funkcí na řetězec. Čísla prutů se pomocí funkce ‚'CStr‘' převedou jednotlivě na znaky a za každé číslo se do řetězce přidá čárka. RFEM/RSTAB ignoruje nadbytečnou čárku na konci řetězce, která proto může zůstat.
Funkce 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
Tato funkce nyní umožňuje výběr prutů filtrovaných podle komentáře přes rozhraní COM.
' výběr prutů podle komentáře
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
Často nestačí vybrat pouze určité prvky, ale jsou zapotřebí i prvky podřízené. Následující příklad ukazuje, jak najít počáteční uzly prutu. V programu RFEM je to o něco složitější než v programu RSTAB, protože každému prutu patří linie, proto byla zvolena tato metoda.
Nejprve je třeba najít čísla linií patřících k prutům. Následující funkce předpokládá, že čísla prutů jsou již k dispozici, a vyhledá příslušná čísla linií.
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
' zvětšit velikost pole o 1
ReDim Preserve intArr(0 To k)
intArr(k) = members(i).LineNo
k = k + 1
' ukončit smyčku nad member_nos
Exit For
End If
Next j
Next i
getLineNosByMemberNos = intArr
End Function
Tato funkce má dvě vnořené smyčky. Hlavní smyčka prochází pruty a podřízená smyčka čísla prutů. Pro každý prut je pole obsahující čísla prutů projito úplně. Pro zrychlení tohoto procesu je podřízená smyčka opuštěna, jakmile se čísla prutů shodují. Při každé shodě je do pole obsahujícího čísla linií přidán jeden prvek a přidáno nové číslo (k je index pro nalezená čísla linií).
K nalezení počátečního uzlu linie nebo prutu je zapotřebí další funkce. Tato funkce musí projít linie a přečíst počáteční uzel, pokud dojde ke shodě s danými čísly linií. Protože čísla uzlů jsou uložena v řetězci, je zapotřebí nová funkce, která převede řetězec na číselné pole.
Function strToIntArr(intList As String) As Integer()
‚ možné znaky „1-9 ; - ,“
‘ příklad: 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)
' pokud řetězec obsahuje „-“, je zaznamenáno rozpětí nosníku
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 = „“
' pokud je dosaženo posledního znaku nebo je dalším znakem čárka nebo středník
ElseIf ((curChar = „,“) Or (curChar = „;“) Or (i = Len(intList) - 1)) Then
‚ je dosaženo posledního znaku, celé číslo nebo rozpětí nosníku jsou ukončeny
If (i = Len(intList) - 1) Then
curInt = curInt & curChar
End If
‘ zpracovat rozpětí nosníku
If span Then
' vytvořit všechna celá čísla mezi rozpětím nosníku
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
' rozšířit ints a přidat nová čísla do pole
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
Další j
ints = tmpInts
rozpětí nosníku = False
' přidejte novou číslici
Jinak
'rozšiřte ints a přidejte nové číslo do ints
tmpInts = ints
ReDim Preserve tmpInts(0 To UBound(tmpInts, 1) + 1)
tmpInts(UBound(tmpInts, 1) - 1) = CInt(curInt)
ints = tmpInts
curInt = „“
Konec
Jinak
curInt = curInt & curChar
Konec
i = i + 1
Smyčka
' pole je o jeden prvek delší a je zkráceno
ReDim Preserve ints(0 To UBound(ints, 1) - 1)
strToIntArr = ints
End Function
Tato funkce prochází řetězec a analyzuje každý znak. Pokud znak obsahuje jedno nebo více čísel, jsou shromažďována, dokud není dosaženo dalšího znaku nebo konce. Po dosažení pomlčky je rozpoznána řada/rozsah čísel a čísla mezi nimi jsou generována automaticky.
Nyní lze vytvořit skutečnou funkci pro extrakci počátečního bodu linie, která je velmi přehledná.
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
' přidat nalezené číslo linie do pole
ReDim Preserve intArr(0 To k)
str = lines(j).NodeList
tmpIntArr = strToIntArr(str)
intArr(k) = tmpIntArr(0)
k = k + 1
' ukončit smyčku nad line_nos_cpy
Exit For
End If
Next j
Next i
getLineStartNodeNosByLineNos = intArr
End Function
Opět jsou zde dvě vnořené smyčky, stejně jako ve funkci „getLineNosByMemberNos“. Tentokrát je pořadí velmi důležité, protože jinak dojde ke ztrátě přiřazení uzlů k liniím. Vnější smyčka prochází čísly linií a pokud dojde ke shodě s linií ve vnitřní smyčce, použije se funkce strToIntArr k extrakci čísel uzlů, z nichž se použije první.
Celý postup pro získání počátečních uzlů je pak následující. Nejprve se načtou čísla linií prutů s odpovídajícími čísly prutů, poté počáteční uzly linií.
/code#
Shrnutí a výhled
Funkce ‚'getLineNosByMemberNos‘' je základem pro další funkce výběru, stejně jako funkce ‚'getLineStartNodeNosByLineNos‘'.
Pomocí tohoto vzoru můžete například najít zatížení na pruty. Funkce ‚'strToIntArr‘' a ‚'intArrToStr‘' jsou také k dispozici jako nástroje pro převod výběru RFEM založeného na řetězcích na číselná pole.
Další možností je výběr podle souřadnic. Můžete například zadat definovaný prostor a vybrat všechny prvky v tomto prostoru. Tato forma výběru bude popsána v budoucím článku.