Metodi per selezionare gli elementi tramite l'interfaccia COM

Articolo tecnico

Questo articolo è stato tradotto da Google Traduttore

Visualizza il testo originale

Quando si modificano gli elementi tramite l'interfaccia COM, la selezione di elementi è spesso un problema perché non può essere eseguita visivamente tramite la finestra di lavoro. La selezione può essere particolarmente difficile per i modelli che sono stati creati tramite l'interfaccia del programma e devono quindi essere modificati utilizzando un programma separato. Oltre all'eccezione, quando la selezione è stata effettuata precedentemente tramite RFEM, ci sono diverse alternative per la programmazione.

Selezione per commento

La più semplice è che i commenti sono stati assegnati durante la creazione di elementi, che possono essere ricercati in modo specifico. Di seguito, viene mostrato un esempio di una funzione che cerca le aste in base al loro commento e restituisce i numeri delle aste trovate:

Funzione getMemberNosByComment (members () As RFEM5.Member, commenta As String) As Integer ()
Dim intArr () As Integer
DimAs Long
Dim j As Long
j = 0
ReDim intArr (0 A 0)
'cappio sopra le aste
Per i = 0 a UBound (aste, 1)
If (members (i). Com = commento) Quindi
'size se l'array intero è aumentato di 1
ReDim Preserve intArr (0 A j)
intArr (j) = membri (i) .no
j = j + 1
Fine Se
Avanti
'Restituisce array intero
getMemberNosByComment = intArr
Funzione finale

La funzione ha un loop sulle aste trasferite e se la stringa in "commento" e il commento dell'asta coincidono, il numero dell'asta sarà aggiunto al campo Integer. Alla fine, sarà restituito il campo intero con tutti i numeri delle aste.

Selezione dei nodi finali dell'asta

La selezione di elementi nel programma e quindi anche tramite l'interfaccia COM avviene con l'ausilio di stringhe. Per una linea, per esempio, i nodi relativi sono trasferiti attraverso una stringa in cui i numeri dei nodi sono separati da virgole. L'uso di stringhe richiede la conversione in valori numerici durante la programmazione e viceversa. La seguente funzione presenta quindi un modo per convertire i numeri delle aste determinati con la funzione sopra in una stringa. I numeri delle aste vengono convertiti individualmente in caratteri usando la funzione CStr e, dopo ogni numero, si aggiunge una virgola alla stringa. RFEM/RSTAB ignora la virgola ridondante alla fine della stringa, che può quindi rimanere.

Funzione intArrToStr (intArr () As Integer) As String
Dim str As String
DimAs Long
    
Per i = 0 a UBound (intArr, 1)
str = str + CStr (intArr (i)) + ","
Avanti
    
intArrToStr = str
Funzione finale

Questa funzione ora consente di selezionare le aste filtrate per commento tramite l'interfaccia COM.

'seleziona le aste per commento
Dim mems () Come RFEM5.Member
Dim mem_nos () As Integer
Dim str As String
    
str = "commento del test"
mem_nos = getMemberNosByComment (mems, str)
    
iModelData.EnableSelections (True)
    
str = intArrToStr (mem_nos)
iModelData.SelectObjects MemberObject, str

Spesso non è sufficiente selezionare solo elementi specifici, ma sono necessari elementi subordinati. L'esempio seguente mostra come trovare i nodi iniziali di un'asta. Poiché questo risulta un po 'più difficile in RFEM che in RSTAB, poiché una linea appartiene a ciascuna asta, è stata scelta questa strada.

Per prima cosa, si devono trovare i numeri delle linee che appartengono alle aste. La seguente funzione presuppone che i numeri delle aste siano già disponibili e cerchi i relativi numeri di riga.

Funzione getLineNosByMemberNos (members () As RFEM5.Member, member_nos () As Integer) As Integer ()
    
Dim intArr () As Integer
DimAs Long
Dim j As Long
DimAs long
    
k = 0
ReDim intArr (0 A 0)
    
Per i = 0 a UBound (aste, 1)
Per j = 0 a UBound (membro_nos, 1)
Se (aste (i) .no = member_nos (j)) Allora
'Aumentare la dimensione della matrice di 1
ReDim Preserve intArr (0 A k)
intArr (k) = membri (i) .LineNo
k = k + 1
'exit loop over member_nos
Esci per
Fine Se
        
Quindi,
Avanti
    
getLineNosByMemberNos = intArr
    
Funzione finale

Questa funzione ha due anelli annidati. Il ciclo principale passa attraverso le aste e il ciclo subordinato attraverso i numeri delle aste. Per ogni asta, il campo che contiene i numeri delle aste è passato completamente. Per velocizzare questo processo, il sottociclo sarà lasciato non appena i numeri delle aste coincidono. Ogni volta che c'è una corrispondenza, si aggiunge un elemento al campo contenente i numeri di riga e si aggiunge il nuovo numero (k è l'indice per i numeri di linea trovati).

Per trovare il nodo iniziale della linea o dell'asta, è richiesta un'altra funzione. Questa funzione deve attraversare le linee e, se corrispondono ai numeri di riga indicati, leggere il nodo di partenza. Poiché i numeri dei nodi sono memorizzati in una stringa, è necessaria una nuova funzione per convertire la stringa in un campo numerico.

Funzione strToIntArr (intList As String) As Integer ()
"possibili caratteri" 1-9; -, "
'esempio: 1-4,5; 100> 1,2,3,4,5,100
Dim Ints () As Integer
Dim tmpInts () As Integer
ReDim inti (0)
    
Dim span As Boolean
Dim curInt As String
curInt = ""
DimAs Integer
i = 0
Dim j As Integer
Dim curChar As String
    
Do While (i <Len (intList))
curChar = Mid (intList, i + 1, 1)
        
'se la stringa contiene "-" si nota una campata
Se (curChar = "-") Allora
        
span = Vero
tmpInts = int
ReDim Preserva tmpInts (da 0 a UBound (tmpInts, 1) + 1)
tmpInts (UBound (tmpInts, 1) - 1) = CInt (curInt)
ints = tmpInts
curInt = ""
'se l'ultimo carattere è stato raggiunto o una virgola o un punto e virgola è il carattere successivo
ElseIf ((curChar = ",") Or (curChar = ";") O (i = Len (intList) - 1)) Quindi
        
'l'ultimo carattere è stato raggiunto, il numero intero o lo span sono terminati
Se (i = Len (intList) - 1) Allora
CurInt = CurInt & CurChar
Fine Se
            
'tratta la campata
Se la campata allora
'crea tutti gli interi tra l'estensione
Dim FirstNum As Integer
Dim lastNum As Integer
firstNum = ints (UBound (ints, 1) - 1)
lastNum = CInt (curInt)
curInt = ""
                
Se (firstNum> lastNum) Allora
Dim tmp1 As Integer
tmp1 = lastNum
lastNum = firstNum
firstNum = tmp1
int (UBound (ints, 1) - 1) = firstNum
                    
Fine Se
                
'estendi int e aggiungi nuovi numeri all'array
tmpInts = int
ReDim Preserva tmpInts (da 0 a UBound (tmpInts, 1) + (lastNum - firstNum))
                
Per j = 0 A (lastNum - firstNum) - 1
tmpInts (UBound (ints, 1) + j) = j + firstNum + 1
Quindi,
                
ints = tmpInts
span = Falso
            
'aggiungi una nuova cifra
Altro
'estendi i valori e aggiungi un nuovo numero a int
tmpInts = int
ReDim Preserva tmpInts (da 0 a UBound (tmpInts, 1) + 1)
tmpInts (UBound (tmpInts, 1) - 1) = CInt (curInt)
ints = tmpInts
curInt = ""
Fine Se
        
Altro
        
CurInt = CurInt & CurChar
Fine Se
    
i = i + 1
Loop
    
'array è un elemento troppo lungo ed è diminuito
ReDim Preserve int (da 0 a UBound (ints, 1) - 1)
    
strToIntArr = int
Funzione finale

Questa funzione passa attraverso la stringa e analizza ogni carattere. Se il personaggio è uno o più numeri, questi saranno raccolti fino a quando non si raggiungerà un altro carattere o la fine. Quando si raggiunge un trattino, si riconoscerà una serie/intervallo di numeri e si genereranno automaticamente i numeri intermedi.

La funzione attuale per l'estrazione del punto iniziale di una linea ora può essere creata ed è quindi molto chiara.

Funzione getLineStartNodeNosByLineNos (lines () As RFEM5.RfLine, line_nos () As Integer) As Integer ()
Dim intArr () As Integer
Dim tmpIntArr () As Integer
Dim str As String
DimAs Long
Dim j As Long
DimAs long
    
k = 0
ReDim intArr (0 A 0)
    
Per i = 0 a UBound (line_nos, 1)
Per j = 0 a UBound (linee, 1)
If (lines (j) .no = line_nos (i)) Then
'Aggiungi il numero della linea trovata alla matrice
ReDim Preserve intArr (0 A k)
str = lines (j) .NodeList
tmpIntArr = strToIntArr (str)
intArr (k) = tmpIntArr (0)
k = k + 1
'exit loop over line_nos_cpy
Esci per
Fine Se
        
Quindi,
Avanti
    
getLineStartNodeNosByLineNos = intArr
Funzione finale

Anche in questo caso, ci sono due cicli annidati, come nella funzione getLineNosByMemberNos. Questa volta, la sequenza è molto importante perché altrimenti l'assegnazione dei nodi alle linee andrà persa. Il ciclo esterno scorre ciclicamente i numeri di riga e, se una linea all'interno del ciclo interno è una corrispondenza, la funzione strToIntArr viene utilizzata per estrarre i numeri di nodo di cui si utilizza il primo qui.

L'intera procedura per ottenere i nodi iniziali sarà la seguente. Per prima cosa, i numeri delle linee delle aste con i numeri delle aste corrispondenti saranno recuperati, seguiti dai nodi iniziali delle linee.

'selezionare i nodi iniziali dalle aste
'Ottieni i numeri di riga da tutte le aste
Dim line_nos () As Integer
line_nos = getLineNosByMemberNos (mems, mem_nos)
'Ottieni i numeri di partenza da tutte le linee
Dim stNodes_nos () As Integer
stNodes_nos = getLineStartNodeNosByLineNos (lines, line_nos)

Riepilogo e Outlook

La funzione getLineNosByMemberNos è la base per ulteriori funzioni di selezione, proprio come con la funzione getLineStartNodeNosByLineNos. Utilizzando questo modello, è possibile, ad esempio, trovare i carichi per le aste. Le funzioni strToIntArr e intArrToStr sono anche disponibili come strumenti per convertire la selezione basata su stringhe di RFEM in campi numerici.

Un'altra opzione è la selezione tramite le coordinate. Ad esempio, è possibile specificare uno spazio definito e selezionare tutti gli elementi all'interno di tale spazio. Questa forma di selezione sarà descritta in un prossimo articolo.

Parole chiave

COM Selezione

Download

Link

Contattaci

Hai domande o bisogno di consigli?
Contattaci gratuitamente tramite e-mail, chat o il nostro forum di supporto o trova varie soluzioni e consigli utili nella nostra pagina delle FAQ.

+39 051 9525 443

info@dlubal.it

RFEM Programma principale
RFEM 5.xx

Programma principale

Software di progettazione strutturale per l'analisi con elementi finiti (FEA) di sistemi strutturali piani e spaziali costituiti da piastre, pareti, gusci, aste (travi), elementi solidi e di contatto

Prezzo della prima licenza
3.540,00 USD
RFEM Other
RF-COM 5.xx

Modulo aggiuntivo

Interfaccia programmabile (API) basata sulla tecnologia COM

Prezzo della prima licenza
580,00 USD
RSTAB Programma principale
RSTAB 8.xx

Programma principale

Software di progettazione strutturale per il calcolo lineare e non lineare di forze interne, spostamenti generalizzati e reazioni vincolari di telai e strutture costituite da aste e travature reticolari

Prezzo della prima licenza
2.550,00 USD
RSTAB Altri
RS-COM 8.xx

Modulo aggiuntivo

Interfaccia programmabile (API) basata sulla tecnologia COM

Prezzo della prima licenza
580,00 USD