2242x
001596
13.5.2019

Metody výběru prvků prostřednictvím rozhraní COM

Při úpravách prvků přes rozhraní COM je výběr prvků často problém, protože jej nelze provést vizuálně přes pracovní okno. Výběr může být obzvláště obtížný u modelů, které byly vytvořeny přes rozhraní programu a které mají být následně upraveny pomocí samostatného programu. Kromě výjimky, kdy byl výběr proveden předem v programu RFEM, existuje několik alternativ pro programování.

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.


Autor

Ing. Günthel zajišťuje technickou podporu zákazníkům.

Odkazy
Stahování


;