1738x
001408
2017-03-02

Interfaccia COM in VBA | 2.2 Creazione di un'asta


Dim iApp As RFEM5.Application
Imposta iApp = GetObject (, "RFEM5.Application")
Quindi, il gestore degli errori viene avviato e la licenza viene bloccata:
"Gestore errori
On Error GoTo e

'La licenza COM e l'accesso al programma sono bloccati.
iApp.LockLicense

Si consiglia di avviare il gestore prima di bloccare la licenza; in caso contrario, RFEM rimane bloccato in caso di errore e può essere chiuso solo utilizzando Task Manager. Poiché l'interfaccia è ora pronta per essere applicata, è possibile ottenere l'interfaccia per il modello:

'Ottieni l'interfaccia per il primo modello.
Dim iModel As RFEM5.model
If iApp.GetModelCount> 0 Quindi
Imposta iModel = iApp.GetModel (0)
Altrimenti
Err.Raise vbObjectError, "LoadModel ()","iApp.GetModelCount <1"
End If

Per una migliore gestione degli errori, è possibile verificare se il modello è effettivamente disponibile (GetModelCount, in questo caso) prima di recuperare il modello. Anche nel caso di altre interfacce, come l'interfaccia per casi di carico o carichi, è possibile indicare gli errori in un modo migliore.

Crea supporti nodali

È necessario creare una trave a campata singola e, poiché l'asta si trova lungo l'asse x, anche la traslazione x, y, z e la rotazione attorno agli assi x e z devono essere bloccate sul nodo 1. Il supporto sul nodo 2 è simile al primo fino alla traslazione libera nella direzione x. Prima di creare i supporti nodali, è ancora necessario recuperare l'interfaccia per i dati del modello. Quando si definisce il vincolo esterno, è necessario assicurarsi che nel caso di gradi di libertà, un numero maggiore o uguale a 0 sia equalizzato con il rilascio utilizzando una costante della molla. Qui, vengono utilizzate anche le unità SI; cioè, N/m o N/rad:

'Ottieni l'interfaccia per i dati del modello.
Dim iModelData As RFEM5.iModelData
Imposta iModelData = iModel.GetModelData ()

'Crea supporti nodali.
Dim nodsups (0 To 1)As RFEM5.NodalSupport
nodsups (0) .No = 1
nodsups (0) .nodeList = "1"
nodsups (0) .RestraintConstantX = -1
nodsups (0) .RestraintConstantY = 0 #
nodsups (0) .RestraintConstantZ = -1
nodsups (0) .SupportConstantX = -1
nodsups (0) .SupportConstantY = -1
nodsups (0) .SupportConstantZ = -1

nodsups (1) .No = 2
nodsups (1) .nodeList = "2"
nodsups (1) .RestraintConstantX = -1
nodsups (1) .RestraintConstantY = 0 #
nodsups (1) .RestraintConstantZ = -1
nodsups (1) .SupportConstantX = 0 #
nodsups (1) .SupportConstantY = -1
nodsups (1) .SupportConstantZ = -1

Se si verificano problemi, potrebbero essere causati da un tipo di dati errato. Se è richiesto il doppio, la voce intera può causare errori. Pertanto, è necessario aggiungere una chiave hash dopo il valore intero, in modo che sia usata come doppio valore.

Naturalmente, il supporto nodale deve essere nuovamente trasferito alla modalità di modifica (PrepareModification/FinishModification):

'Trasferire i supporti nodali.
iModelData.PrepareModification
iModelData.SetNodalSupports nodsups
iModelData.FinishModification

Crea casi di carico

Per creare carichi, è necessario definire prima i casi di carico, esattamente come in RFEM. Durante la programmazione, i casi di carico vengono creati e trasferiti per primi, e solo successivamente i carichi possono essere trasferiti utilizzando le interfacce dei casi di carico. Innanzitutto, creiamo i casi di carico:

'Ottieni l'interfaccia per i carichi.
Dim iLoads As RFEM5.iLoads
Imposta iLoads = iModel.GetLoads

'Crea casi di carico.
Dim portacarichi (0 To 2) As RFEM5.LoadCase

loadcases (0) .Loading.No = 1
loadcases (0) .SelfWeight = Vero
loadcases (0) .ToSolve = Vero
loadcases (0) .SelfWeightFactor.X = 0
loadcases (0) .SelfWeightFactor.Y = 0
loadcases (0) .SelfWeightFactor.Z = 1
loadcases (0) .ActionCategory = Permanente

Esistono tre casi di carico da creare: peso proprio, neve e carico imposto. Nella programmazione COM, tutti gli identificatori sono in inglese. Pertanto, Permanent viene utilizzato per ActionCategory nel caso del caso di carico di peso proprio. Per la proprietà SelfWeightFactor, è possibile impostare la direzione e il valore del peso proprio. Tuttavia, questi si applicano solo se la proprietà Peso proprio è impostata su Vero. Inoltre, ToSolve deve essere impostato su True per includere il caso di carico nel calcolo e assegnare un numero al caso di carico (.Loading.No). Gli altri due casi di carico sono definiti più facilmente, poiché non c'è peso proprio:

loadcases (1) .Loading.No = 2
loadcases (1) .SelfWeight = Falso
loadcases (1) .ToSolve = Vero
loadcases (1) .ActionCategory = ShowHLowerThan1000

loadcases (2) .Loading.No = 3
loadcases (2) .SelfWeight = Falso
loadcases (2) .ToSolve = Vero
loadcases (2) .ActionCategory = ImposedCategoryA

'Trasferisci casi di carico.
iLoads.PrepareModification
iLoads.SetLoadCases casi di carico
iLoads.FinishModification

La categoria ShowHLowerThan1000 viene utilizzata per la neve al di sotto di un'altitudine di 1.000 m sul livello del mare e ImposedCategoryA viene utilizzata per il carico imposto di categoria A. Quindi, i casi di carico possono essere trasferiti a RFEM. Tuttavia, per questo viene utilizzata l'interfaccia ILoads invece dell'interfaccia IModelData, poiché i dati del modello non sono più interessati; piuttosto, i dati di carico sono.

Crea combinazioni di carico e risultato

Quando si creano combinazioni di carico o risultato, ci sono solo alcune differenze. La ragione di ciò è che il metodo di calcolo e altre impostazioni possono essere applicati solo dopo aver creato la combinazione di carico tramite l'interfaccia corrispondente. La definizione viene eseguita come in RFEM. Per questo, è possibile utilizzare l'identificatore LC (caso di carico). I diversi separatori decimali e le lettere maiuscole e minuscole non giocano un ruolo ed entrambi sono accettati:

'Crea combinazioni di carico.
Dim loadcombs (0 To 0) As RFEM5.LoadCombination

loadcombs (0) .Loading.No = 1
loadcombs (0) .ToSolve = Vero
loadcombs (0) .Definition = "1.35 * lc1 + 1.5 * lc2 + 1.05 * lc3"

'Trasferisci combinazioni di carico.
iLoads.PrepareModification
iLoads.SetLoadCombinations loadcombs
iLoads.FinishModification

'Crea combinazioni di risultati.
Dim rescombs (0 To 0) As RFEM5.ResultCombination

rescombs (0) .Loading.No = 1
rescombs (0) .Definition = "1.35 * lc1 + 0.75 * lc2 + 1.5 * lc3"

'Trasferisci combinazioni di risultati.
iLoads.PrepareModification
iLoads.SetResultCombinations rescombs
iLoads.FinishModification

Creazione di carichi

Come accennato in precedenza, i carichi saranno ora trasferiti utilizzando le interfacce per i casi di carico. Nel nostro esempio, non vengono creati carichi aggiuntivi nel caso di carico 1; nel caso di carico 2, viene applicato un carico distribuito trapezoidale; e il caso di carico 3 applica un carico lineare costante e un carico nodale. Ecco la procedura per Load Case 2:

'Crea carichi.
"Caso di carico 2.
Dim iLoadCase As RFEM5.iLoadCase

Imposta iLoadCase = iLoads.GetLoadCase (2, AtNo)
Poiché conosciamo il numero del caso di carico, può essere utilizzato con AtNo per il recupero dell'interfaccia:
'Crea carichi di aste.
Dim memLoads () As RFEM5.MemberLoad
ReDim memLoads (0 To 0)

In questo caso, l'array non è dimensionato all'inizializzazione, ma successivamente, poiché memLoads dovrebbe essere usato di nuovo per Load Case 3. Ciò ha il vantaggio che il contenuto viene ripristinato ai valori predefiniti quando si utilizza nuovamente ReDim. In ObjectList, è possibile selezionare le aste per il caricamento, separate da virgole o collegate con trattini. Oltre a entrambi i valori di carico per l'inizio del carico (Magnitudine1) e per la fine del carico (Magnitudine2), il carico trapezoidale richiede la specifica delle distanze per l'inizio del carico (Distanza A) e la fine (DistanzaB). La proprietà RelativeDistances determina se verranno utilizzati i dati assoluti (falsi) in mo i dati relativi (veri) di 0-1:

memLoads (0) .No = 1
memLoads (0) .ObjectList = "1"
memLoads (0) .Distribution = TrapezoidalType
memLoads (0) .Magnitude1 = 6000 #
memLoads (0) .Magnitude2 = 4000 #
memLoads (0) .RelativeDistances = Falso
memLoads (0) .Distanza A = 0,2
memLoads (0) .Distanza B = 0.9

'Trasferire i carichi delle aste.
iLoadCase.PrepareModification
iLoadCase.SetMemberLoads memLoads
iLoadCase.FinishModification
Durante il trasferimento dei carichi, è necessario impostare l'interfaccia corretta; in questo caso, l'interfaccia ILoadCase. I carichi del caso di carico 3 sono definiti in modo simile come segue:
'Crea carichi nodali.
Dim nodalLoads (0 To 0) As NodalLoad
nodalLoads (0) .No = 1
nodalLoads (0) .nodeList = "2"
nodalLoads (0) .Component.Force.X = -15000
nodalLoads (0) .Component.Force.Y = 0
nodalLoads (0) .Component.Force.Z = 0
nodalLoads (0) .Component.Moment.X = 0
nodalLoads (0) .Component.Moment.Y = 0
nodalLoads (0) .Component.Moment.Z = 0

'Trasferire i carichi nodali.
iLoadCase.PrepareModification
iLoadCase.SetNodalLoads nodalLoads
iLoadCase.FinishModification

'Crea carichi di aste.
ReDim memLoads (0 To 0)
memLoads (0) .No = 1
memLoads (0) .ObjectList = "1"
memLoads (0) .Distribution = UniformType
memLoads (0) .Magnitude1 = 5000 #

'Trasferire i carichi delle aste.
iLoadCase.PrepareModification
iLoadCase.SetMemberLoads memLoads
iLoadCase.FinishModification
Alla chiusura del programma, la routine di gestione degli errori è completata e la licenza è sbloccata:
e: If Err.Number <> 0 Quindi MsgBox Err.Description,, Err.Source

'La licenza COM è sbloccata, l'accesso al programma è di nuovo possibile.
iModel.GetApplication.UnlockLicense

Riepilogo e panoramica

Le procedure illustrate in questo articolo si basano sui due articoli precedenti. Come già accennato, la struttura è simile per tutti gli elementi. La menzionata eccezione dei rilasci di aste non lineari o dei supporti nodali sarà spiegata nel prossimo articolo.


Autore

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

Link
Download