3380x
001639
2020-07-20

Trasformazione della nervatura in modello di superficie con trave risultante utilizzando VBA

Se la nervatura fa parte di un progetto non lineare o è rigidamente collegata alle seguenti pareti, si dovrà utilizzare una superficie per la modellazione invece di un'asta. Comunque la nervatura possa ancora essere progettata come un asta, è richiesto un asta risultante con la corretta eccentricità, che trasforma le forze interne della superficie in forze interne dell'asta.

Poiché la modellazione di una tale nervatura basata sulla superficie con l'asta risultante è molto più complicata rispetto della creazione di un'asta del tipo nervatura, il seguente programma in EXCEL-VBA convertirà la nervatura basata sull'asta in un modello di superficie incluso l'asta del risultato.

Per trasformare una nervatura in un modello di superficie, sono necessari i seguenti passaggi:

  1. Lettura dei parametri della nervatura (sezione trasversale, orientamento, ecc.)
  2. Crea superficie della nervatura
  3. Crea trave risultante
  4. Elimina asta della nervatura

Nel testo seguente, mostreremo come esempi gli estratti dell'intero codice sorgente. È possibile scaricare il codice completo alla fine di questo articolo.

Leggi i parametri della nervatura

È possibile selezionare la nervatura da trasformare selezionandola dall'interfaccia del programma. Per fare ciò, è necessario lavorare con la funzione EnableSelections. Finché EnableSelections è attivato con true, solo gli elementi selezionati vengono letti da RFEM. La lettura dell'asta selezionata ha questo aspetto.

'ottieni l'interfaccia del modello attivo
Imposta iMod = iApp.GetActiveModel
        
'ottieni l'interfaccia dei dati del modello (strutturale)
Dim iModData As RFEM5.IModelData2
Imposta iModData = iMod.GetModelData
        
'ottieni membro selezionato
iModData.EnableSelections True

Dim mems () Come RFEM5.Member
Dim selMem As RFEM5.Member
mems = iModData.GetMembers
selMem = mems (0)

iModData.EnableSelections False

I seguenti parametri sono necessari per la modellazione della nervatura:

  • Sezione trasversale delle nervature, numeri delle superfici e larghezze efficaci
  • Orientamento delle nervature
  • Materiale della nervatura

In RFEM, una nervatura è un tipo di asta. Quando si utilizza la programmazione tramite l'interfaccia COM, è necessario ottenere i dati di una nervatura tramite due diverse interfacce. Da una parte c'è l'interfaccia per l'asta e dall'altra c'è l'interfaccia per la nervatura. L'interfaccia con una nervatura può essere ottenuta tramite IModelData.GetRib. GetRib prevede che il numero di nervatura contenuto nell'asta tramite Member.RibNo.

'ottieni i parametri della nervatura
'###################
Dim iRb As RFEM5.IRib
Imposta iRb = iModData.GetRib (selMem.RibNo, AtNo)

Dim selRb As RFEM5.Rib
selRb = iRb.GetData

Dim rbCrsc As RFEM5.RibCrossSection
rbCrsc = iRb.GetRibCrossSection

L'interfaccia con la bindella offre due diversi elementi: i dati generali della nervatura tramite la struttura della nervatura e i dati della sezione trasversale della nervatura tramite RibCrossSection. La nervatura contiene i numeri della superficie, la posizione della nervatura e le larghezze efficaci. RibCrossSection contiene la descrizione e le dimensioni della sezione trasversale della nervatura interna, che è anche utilizzata da RF-CONCRETE Members (ITCU).

Inoltre, è richiesto l'orientamento, che è disponibile tramite il sistema di assi locale dell'asta. Si accede al sistema di assi tramite l'interfaccia con l'asta. La funzione IMemer.GetLocalCoordinateSystem restituisce la struttura CoordinateSystem.

Dim accogliente come RFEM5.CoordinateSystem
cosy = iModData.GetMember (selMem.no, AtNo) .GetLocalCoordinateSystem (0#). GetData

GetLocalCoordinateSystem si aspetta ancora la posizione x dell'asta, che è stata impostata su 0,0 o l'inizio qui. Oltre ai parametri menzionati, è richiesto anche il materiale dell'asta, che può essere ottenuto tramite la sezione trasversale dell'asta.

Dim selCrsc As RFEM5.CrossSection
selCrsc = iModData.GetCrossSection (selMem.StartCrossSectionNo, AtNo) .GetData

Crea superficie della nervatura

Il programma viene inizialmente creato solo per nervature diritte sul lato z positivo. Poiché la nervatura può trovarsi anche su piani obliqui, è necessario creare la superficie utilizzando l'orientamento dell'asta. La variabile cosy per il sistema di assi dell'asta locale include il vettore di direzione per l'asse z locale cosy.AxisZ con i suoi tre valori, x, y e z. Questo vettore è normalizzato in modo che, moltiplicato per l'altezza della nervatura, indichi la distanza e la direzione del bordo inferiore della nervatura. Per le linee di contorno della superficie della nervatura, questo vettore viene moltiplicato per l'altezza della nervatura e aggiunto ai nodi iniziale e finale. Ciò risulta nei due nodi finali della linea del bordo inferiore della superficie della nervatura. Notare quanto segue: l'altezza della nervatura include anche la metà dello spessore della superficie della larghezza efficace. Per semplificazione, viene utilizzato solo lo spessore della superficie del primo lato (-y nel sistema di assi locale) dalla sezione trasversale della nervatura (UpperLeftFlangeThickness). Dopo che i nodi sono disponibili, è possibile generare le linee di contorno e la superficie della nervatura.

'crea/calcola nodi
'####################
Dim nodes () Come RFEM5.Node
nodes = selNodes
nodi (0) .no = index_n + 1
nodi (1) .no = index_n + 2
Dim h_rib As Double
h_rib = (rbCrsc.Depth - rbCrsc.UpperLeftFlangeThickness/2)
nodi (0) .X = nodi (0) .X + h_rib * cosy.AxisZ.X
nodi (0) .Y = nodi (0) .Y + h_rib * cosy.AxisZ.Y
nodi (0) .Z = nodi (0) .Z + h_rib * cosy.AxisZ.Z
nodi (1) .X = nodi (1) .X + h_rib * cosy.AxisZ.X
nodi (1) .Y = nodi (1) .Y + h_rib * cosy.AxisZ.Y
nodi (1) .Z = nodi (1) .Z + h_rib * cosy.AxisZ.Z

'creare linee
'############
Dim linee (da 0 a 2) Come RFEM5.RfLine
righe (0) .no = index_l + 1
righe (1) .no = index_l + 2
linee (2) .no = index_l + 3
righe (0) .NodeList = str (selNodes (0) .no) + "," + str (nodes (0) .no)
righe (1) .NodeList = str (selNodes (1) .no) + "," + str (nodes (1) .no)
righe (2) .NodeList = str (nodes (0) .no) + "," + str (nodes (1) .no)

'crea superficie
'#############
Superficie oscura come RFEM5
surf.BoundaryLineCount = 4
surf.BoundaryLineList = str (selLine.no) + "," + str (righe (0) .no) + "," + str (righe (2) .no) + "," + str (righe (1). no)
surf.Comment = "rib"
surf.GeometryType = PlaneSurfaceType
surf.MaterialNo = selCrsc.MaterialNo
surf.Thickness.Type = ConstantThicknessType
surf.Thickness.Constant = rbCrsc.WebThickness
surf.StiffnessType = StandardStiffnessType
surf.no = index_s + 1

Le variabili index_n, index_l, index_s contengono ciascuna l'ultimo indice del rispettivo elemento da RFEM. Vedi il codice sorgente da scaricare alla fine di questo articolo per determinare gli indici.

crea trave risultante

La trave risultante, come la nervatura, è composta da due elementi: l'asta della struttura standard e i dati aggiuntivi ResultBeam. È possibile modificare i dati aggiuntivi solo tramite l'interfaccia con l'asta, quindi è necessario prima creare l'asta; quindi è possibile trasferire i dati tramite l'interfaccia IMember. Poiché l'asta di solito deve essere eccentrica, i nodi iniziale e finale vengono creati direttamente nel centro di taglio senza eccentricità dell'asta. L'eccentricità viene salvata in RibCrossSection. Pertanto, è possibile copiare i nodi iniziali e finali della nervatura originale e utilizzarli come base. È possibile spostare i nodi copiati nella posizione corretta utilizzando i vettori di direzione y e z dal sistema di assi dell'asta locale. Per un progetto successivo, la trave risultante richiede anche una sezione trasversale, che viene prima copiata dalla nervatura originale. Quindi, la descrizione della sezione trasversale viene importata da RibCrossSection e CrossSection.TextID viene svuotato, altrimenti sarà utilizzata per la creazione della sezione trasversale invece della stringa da CrossSection.Description.

'crea nodi per l'asta risultante e calcola l'eccentricità
Dim resNodes () As RFEM5.Node
resNodes = selNodes

resNodes (0) .no = index_n + 3
resNodes (1) .no = index_n + 4
resNodes (0) .X = selNodes (0) .X + rbCrsc.Eccentricity.Z * cosy.AxisZ.X + rbCrsc.Eccentricity.Y * cosy.AxisY.X
resNodes (0) .Y = selNodes (0) .Y + rbCrsc.Eccentricity.Z * cosy.AxisZ.Y + rbCrsc.Eccentricity.Y * cosy.AxisY.Y
resNodes (0) .Z = selNodes (0) .Z + rbCrsc.Eccentricity.Z * cosy.AxisZ.Z + rbCrsc.Eccentricity.Y * cosy.AxisY.Z
resNodes (1) .X = selNodes (1) .X + rbCrsc.Eccentricity.Z * cosy.AxisZ.X + rbCrsc.Eccentricity.Y * cosy.AxisY.X
resNodes (1) .Y = selNodes (1) .Y + rbCrsc.Eccentricity.Z * cosy.AxisZ.Y + rbCrsc.Eccentricity.Y * cosy.AxisY.Y
resNodes (1) .Z = selNodes (1) .Z + rbCrsc.Eccentricity.Z * cosy.AxisZ.Z + rbCrsc.Eccentricity.Y * cosy.AxisY.Z

'crea linea
Dim resLine come RFEM5.RfLine
resLine.no = index_l + 4
resLine.NodeCount = 2
resLine.Type = PolylineType
resLine.NodeList = str (resNodes (0) .no) & "," & str (resNodes (1) .no)

'crea sezione trasversale
Dim resCrsc As RFEM5.CrossSection
resCrsc = selCrsc
resCrsc.description = rbCrsc.description
resCrsc.no = index_c + 1
resCrsc.TextID = ""

'crea membro
Dim resMem As RFEM5.Member
resMem.LineNo = resLine.no
resMem.no = index_m + 1
resMem.Type = ResultBeamType
resMem.StartCrossSectionNo = resCrsc.no
resMem.Rotation = selMem.Rotation

'invia i dati a RFEM
'##################
iModData.PrepareModification

i nodi iModData.SetNodes
iModData.SetLines linee
iModData.SetSurface surf
iModData.SetNodes resNodes
iModData.SetLine resLine
iModData.SetCrossSection resCrsc
iModData.SetMember resMem

iModData.FinishModification

Dopo aver creato l'asta (anche nodi, linee, sezione trasversale e superficie), è necessario determinare e trasferire i parametri per la trave risultante. Una trave risultante integra le forze interne di altri elementi (aste, superfici, solidi) e le trasforma in forze interne dell'asta in base alla loro posizione. Per includere gli elementi corretti, una trave risultante ha due opzioni di base. È possibile specificare gli elementi da integrare e limitare ulteriormente l'intervallo di integrazione per mezzo di un solido (cilindro o cuboide). In questo caso, vengono utilizzati il numero della nuova superficie della nervatura ed i numeri delle superfici delle larghezze efficaci. Come area di integrazione, viene selezionato il parallelepipedo, che (visto localmente) può essere definito nelle direzioni +/- y e +/- z. I valori da RibCrossSection vengono utilizzati di nuovo come valori. Si noti che nel caso di una larghezza efficace mancante, è necessario utilizzare ancora una larghezza di integrazione in modo che il pavimento sopra la nervatura sia correttamente integrato. La larghezza aggiuntiva deve quindi essere la metà dello spessore della superficie.

'imposta i parametri del fascio di risultati
'########################
Dim resBeam come RFEM5.ResultBeam
Dim iResBeam come RFEM5.IResultBeam
Impostare iResBeam = iModData.GetMember (resMem.no, AtNo) .GetExtraData
resBeam = iResBeam.GetData

'imposta elementi integrati
Se selRb.SurfaceNoSide1 Then
resBeam.IncludeSurfaces = str (selRb.SurfaceNoSide1) & ","
End If
Se selRb.SurfaceNoSide2 Then
resBeam.IncludeSurfaces = resBeam.IncludeSurfaces & str (selRb.SurfaceNoSide2) & ","
End If
resBeam.IncludeSurfaces = resBeam.IncludeSurfaces & str (surf.no)

'imposta l'area di integrazione
resBeam.Integrate = WithinCuboidGeneral
Dim resBeamParam (da 0 a 3) As Double
' +y, -y, +z, -z
Se selRb.WidthSide2 Then
resBeamParam (0) = selRb.WidthSide2 - rbCrsc.Eccentricity.Y
Altrimenti
resBeamParam (0) = 0,5 * rbCrsc.WebThickness - rbCrsc.Eccentricity.Y
End If
Se selRb.WidthSide1 Allora
resBeamParam (1) = selRb.WidthSide1 + rbCrsc.Eccentricity.Y
Altrimenti
resBeamParam (1) = 0,5 * rbCrsc.WebThickness + rbCrsc.Eccentricity.Y
End If
resBeamParam (2) = rbCrsc.Depth
resBeamParam (3) = rbCrsc.Depth

resBeam.Parameters = resBeamParam

'inviare i nuovi parametri del fascio dei risultati a RFEM
iModData.PrepareModification
iResBeam.SetData resBeam
iModData.FinishModification

Elimina asta della nervatura

Poiché la nuova nervatura è stata creata dalle superfici, è ora possibile eliminare l'asta (la vecchia nervatura). È possibile eliminare qualsiasi elemento utilizzando la funzione DeleteObjects dell'interfaccia IModelData. Anche in questo caso, poiché gli elementi vengono modificati, è necessario utilizzare un blocco di modifica Prepare/Finish.

'Rimuovi nervatura
'#########
iModData.PrepareModification
iModData.DeleteObjects MemberObject, str (selMem.no)
iModData.FinishModification

Sommario

Nella loro semplicità, le nervature come aste non possono sempre coprire tutti gli aspetti di un modello più complesso. La creazione di una nervatura dell'asta è semplice e, pertanto, il programma qui presentato combina la semplice creazione di una nervatura come asta con la modellazione più dettagliata e la visualizzazione di una nervatura dalle superfici. Oltre agli elementi già noti, come le interfacce con l'asta (IMember), abbiamo introdotto l'interfaccia IRib, che fornisce l'accesso alla sezione trasversale della nervatura, tra le altre cose. Abbiamo anche letto il sistema di assi locale di un'asta e creato la superficie della nervatura utilizzando il calcolo vettoriale.

Prospetti

Ci sono opzioni per il perfezionamento nel programma. Ad esempio, è possibile includere la considerazione della posizione delle nervature (in alto, in basso, al centro). Un'altra opzione sarebbe l'estensione a nervature rastremate o anche nervature su linee curve.


Autore

Il signor Günthel fornisce supporto tecnico per i clienti di Dlubal Software e si prende cura delle loro richieste.

Link
Download