3575x
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 di nervatura

Nel testo seguente, mostreremo estratti dall'intero codice sorgente come esempi. È 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 è simile a questa.

'   get interface of active model
Set iMod = iApp.GetActiveModel
        
'   get interface of (structural) model data
Dim iModData As RFEM5.IModelData2
Set iModData = iMod.GetModelData
        
'   get selected member
iModData.EnableSelections True

Dim mems() As 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 della nervatura, numeri delle superfici e larghezze efficaci
  • Orientamento della nervatura
  • 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 un lato, c'è l'interfaccia per l'asta e dall'altro, c'è l'interfaccia per la nervatura. L'interfaccia con una nervatura può essere ottenuta tramite IModelData.GetRib. GetRib si aspetta il numero di nervatura contenuta nell'asta tramite Member.RibNo.

'   get parameters of rib
'   #####################
Dim iRb As RFEM5.IRib
Set 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 nervatura offre due diversi elementi: i dati generali della nervatura tramite la struttura della nervatura e i dati della sezione trasversale della nervatura tramite RibCrossSection. Nervatura contiene i numeri delle superfici, la posizione della nervatura e le larghezze efficaci. RibCrossSection contiene la descrizione e le dimensioni della sezione trasversale della nervatura interna, che è utilizzata anche 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 cosy As 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 è stato creato inizialmente solo per nervature diritte sul lato z positivo. Poiché la nervatura può essere anche su piani obliqui, è necessario creare la superficie utilizzando l'orientamento dell'asta. La variabile accogliente per il sistema di assi locale dell'asta include il vettore di direzione per l'asse locale z 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 iniziali e finali. Ciò si traduce nei due nodi finali della linea del bordo inferiore della superficie della nervatura. Notare quanto segue: l'altezza della nervatura include anche metà dello spessore della superficie della larghezza efficace. Per semplificare, 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.

  1. code.vb#

' crea/calcola nodi
' ##########################
Dim nodes() As RFEM5.Node
nodi = selNodi
nodi(0).no = indice_n + 1
nodi(1).no = indice_n + 2
Dim h_rib come doppio
h_rib = (rbCrsc.Depth - rbCrsc.UpperLeftFlangeThickness/2)
nodes(0).X = nodes(0).X + h_rib * cosy.AxisZ.X
nodes(0).Y = nodes(0).Y + h_rib * cosy.AxisZ.Y
nodes(0).Z = nodes(0).Z + h_rib * cosy.AxisZ.Z
nodes(1).X = nodes(1).X + h_rib * cosy.AxisZ.X
nodes(1).Y = nodes(1).Y + h_rib * cosy.AxisZ.Y
nodi (1) .Z = nodi (1) .Z + h_rib * cosy.AxisZ.Z

' crea linee
' #############
Dim linee(0 - 2) As RFEM5.RfLine
linee(0).no = indice_l + 1
linee(1).no = indice_l + 2
linee(2).no = indice_l + 3
linee(0).NodeList = str(selNodes(0).no) + "," + str(nodes(0).no)
lines(1).NodeList = str(selNodes(1).no) + "," + str(nodes(1).no)
linee(2).ListaNodi = str(nodi(0).no) + "," + str(nodi(1).no)

' crea superficie
' ################
Dim surf as RFEM5.Surface
surf.BoundaryLineCount = 4
surf.BoundaryLineList = str(selLine.no) + "," + str(linee(0).no) + "," + str(linee(2).no) + "," + str(linee(1). no)
surf.Comment = "nervatura"
surf.GeometryType = PlaneSurfaceType
surf.MaterialNo = selCrsc.Materialnr
surf.Thickness.Type = ConstantThicknessType
surf.Thickness.Constant = rbCrsc.WebThickness
surf.StiffnessType = StandardStiffnessType
surf.no = indice_s + 1

  1. /codice#

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

crea trave risultante

La trave risultante, come la nervatura, è composta da due elementi: la struttura standard Asta e i dati aggiuntivi ResultBeam. È possibile modificare i dati aggiuntivi solo tramite l'interfaccia per l'asta, quindi è necessario creare prima l'asta; quindi è possibile trasferire i dati tramite l'interfaccia IMember. Poiché l'asta di solito deve essere eccentrica, i nodi iniziali e finali 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 una verifica successiva, 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 al posto della stringa da CrossSection.Description.

  1. code.vb#

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

resNodes(0).no = indice_n + 3
resNodes(1).no = indice_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 As RFEM5.RfLine
resLine.no = indice_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 = indice_c + 1
resCrsc.TextID = ""

' crea asta
Dim resMem As RFEM5.Member
resMem.Linenr = resLinenr
resMem.no = indice_m + 1
resMem.Type = ResultBeamType
resMem.StartCrossSectionNo = resCrsc.no
resMem.Rotation = selMem.Rotation

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

  1. iModData.SetNodes nodi
  2. Linee iModData.SetLines
  3. iModData.SetSurface
  4. iModData.SetNodes resNodes
  5. iModData.SetLine resLine
  6. iModData.SetCrossSection resCrsc
  7. iModData.SetMember resMem

iModData.FinishModification

  1. /codice#

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 cubo). In questo caso, vengono utilizzati il numero della nuova superficie della nervatura e i numeri delle superfici delle larghezze efficaci, se presenti. Come area di integrazione, viene selezionato il cuboide, che (visto localmente) può essere definito nelle direzioni +/- y e +/- z. I valori di RibCrossSection vengono utilizzati di nuovo come valori. Si noti che nel caso di una larghezza efficace mancante, è ancora necessario utilizzare 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.

  1. code.vb#

' imposta i parametri della trave risultante
' #############################
Dim resBeam As RFEM5.ResultBeam
Dim iResBeam as RFEM5.IResultBeam
Imposta iResBeam = iModData.GetMember(resMem.no, AtNo).GetExtraData
resBeam = iResBeam.GetData

' imposta elementi integrati
Se selRb.SurfaceNoSide1 Then

  1. resBeam.IncludeSurfaces = str(selRb.SurfaceNoSide1) & ,

End If
Se selRb.SurfaceNoSide2 Then

  1. 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(0 To 3) as Double
' +y, -y, +z, -z
Se selRb.WidthSide2 Then

  1. resBeamParam(0) = selRb.WidthSide2 - rbCrsc.Eccentricity.Y

Altro

  1. resBeamParam(0) = 0.5 * rbCrsc.WebThickness - rbCrsc.Eccentricity.Y

End If
Se selRb.WidthSide1 Then

  1. resBeamParam(1) = selRb.WidthSide1 + rbCrsc.Eccentricity.Y

Altro

  1. resBeamParam(1) = 0.5 * rbCrsc.WebThickness + rbCrsc.Eccentricity.Y

End If
resBeamParam(2) = rbCrsc.Depth
resBeamParam(3) = rbCrsc.Depth

resBeam.Parameters = resBeamParam

' invia nuovi parametri della trave risultante a RFEM
iModData.PrepareModification
iResBeam.SetData resBeam
iModData.FinishModification

  1. /codice#

Elimina asta di nervatura

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

  1. code.vb#

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

  1. /codice#

Conclusione

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 e la visualizzazione più dettagliate 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 della nervatura (superiore, inferiore, centrale). Un'altra opzione sarebbe l'estensione a nervature rastremate o anche a 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


;