3105x
001441
2017-05-23

Interfaccia COM in VBA | 3. Creazione di uno strumento

La parte 2.2 della serie di articoli sull'interfaccia COM descrive la creazione e la modifica di vincoli esterni nodali, carichi, casi di carico, combinazioni di carico e combinazioni di risultati su un esempio di asta. La quarta parte spiega la creazione di singoli strumenti.

Corso base

Vogliamo creare uno strumento che crea vincoli nodali non lineari sui nodi attualmente selezionati nel programma. Per fare ciò, sono necessari i seguenti elementi chiave:

  • Ottieni nodi attualmente selezionati
  • Creazione di supporti nodali
  • Creare e assegnare la non linearità
  • Esecuzione di uno strumento nel programma

Questi punti devono essere spiegati ora. Ciò richiede la conoscenza delle parti precedenti di questa serie di articoli, che non saranno più descritte. Tuttavia, il codice sorgente disponibile include commenti che documentano gli elementi precedentemente menzionati, come ottenere la struttura.

Ottieni nodo attualmente selezionato

È possibile modificare gli elementi selezionati tramite l'interfaccia COM utilizzando le funzioni già note, come IModelData.GetNodes per i nodi. Tuttavia, per restituire solo gli elementi selezionati, è necessario passare prima alla modifica della selezione corrente inserendo IModelData.EnableSelections. Se EnableSelections è impostato su True, IModelData.GetNodes restituisce solo gli elementi selezionati. Ecco un esempio specifico:

'Ottieni nodi selezionati.
iModDat.EnableSelections Vero 'funziona solo con l'oggetto selezionato
Dim nodi () As RFEM5.Node
nodes = iModDat.GetNodes
iModDat.EnableSelections Falso 'lavora di nuovo con tutti gli oggetti

Dopo aver ottenuto i nodi selezionati, EnableSelections viene reimpostato su false, poiché questo può spesso causare errori. Poiché il supporto nodale richiede un elenco di nodi come stringa per la definizione, questo viene fornito contemporaneamente:

'Crea un elenco di nodi.
Dim nodeList As Stringa
Dim iAsLong
Per i = 0 ToUBound (nodi, 1)
nodeList = nodeList & nodes (i) .No & ","
Successivo i

Creazione di supporti nodali

La non linearità, o il diagramma nel caso specifico, è un elemento separato. Può essere assegnato a un supporto nodale solo se questo è già disponibile nel sistema. Pertanto, è necessario creare prima il supporto nodale, seguendo i principi spiegati negli articoli precedenti:

'Crea supporti nodali.
Dim nodSup As RFEM5.NodalSupport
nodSup.No = 100
nodSup.IsColumn = Falso
nodSup.IsValid = Vero
nodSup.nodeList = nodeList
nodSup.ReferenceSystem = GlobalSystemType

nodSup.RestraintConstantX = 0.01
nodSup.RestraintConstantY = 0.01
nodSup.RestraintConstantZ = 0.01

nodSup.SupportConstantX = -1
nodSup.SupportConstantY = -1
nodSup.SupportConstantZ = -1

'Definire la non linearità.
nodSup.SupportNonlinearityZ = WorkingDiagramType

iModDat.PrepareModification
iModDat.SetNodalSupport nodSup
iModDat.FinishModification

Come puoi vedere nel codice, WorkingDiagramType è specificato come una non linearità nella direzione z globale.

Creazione e assegnazione di supporto non lineare

Dopo aver preparato il supporto nodale per la non linearità di WorkingDiagramType, questo dovrebbe essere creato:

'Crea non linearità.
Dim nldgrm As RFEM5.NonlinearityDiagram

nldgrm.ForceType = StiffnessDiagramForceType.NoneStiffnessForce
nldgrm.PositiveZoneType = DiagramAfterLastStepType.StopDiagramType
nldgrm.Symmetric = Vero

'Crea diagramma.
ReDim nldgrm.PositiveZone (3, 1)
nldgrm.PositiveZone (0, 0) = 0 #
nldgrm.PositiveZone (0, 1) = 0 #

nldgrm.PositiveZone (1, 0) = 0,01
nldgrm.PositiveZone (1, 1) = 100

nldgrm.PositiveZone (2, 0) = 0,03
nldgrm.PositiveZone (2, 1) = 200

nldgrm.PositiveZone (3, 0) = 0,05
nldgrm.PositiveZone (3, 1) = 300

Il diagramma è costituito da una matrice bidimensionale. La prima dimensione corrisponde al set di dati, la seconda dimensione agli elementi del set di dati. In questo caso, il primo elemento nel set di dati è lo spostamento in m, e il secondo elemento è la forza in N. Pertanto, l'esempio sopra ha creato quattro set di dati in cui il terzo punto del diagramma nella posizione è di 30 mm e 0,2 kN, per esempio. Questa non linearità deve ora essere assegnata al supporto esistente. Per fare ciò, è necessario ottenere l'interfaccia per il supporto nodale e quindi per la non linearità:

'Assegna non linearità.
Dim iNodSup As RFEM5.INodalSupport
Set iNodSup = iModDat.GetNodalSupport (100, ItemAt.AtNo)
Dim iNldiag As RFEM5.INonlinearityDiagram
Set iNldiag = iNodSup.GetNonlinearity (AlongAxisZ)

iModDat.PrepareModification
iNldiag.SetData nldgrm
iModDat.FinishModification

In questo caso, la non linearità è lungo l'asse Z, quindi AlongAxisZ deve essere selezionato quando si ottiene la non linearità. La non linearità è assegnata nel blocco di modifica noto.

Esecuzione di uno strumento nel programma

Programmi esterni possono essere integrati in RFEM. Per fare ciò, è necessario modificare RFEM.ini nel percorso del programma. Contrariamente alla programmazione in C# e VB in cui viene creato un file eseguibile, VBA richiede Excel per implementare lo strumento. Excel può essere assegnato da un argomento quando si apre un file da aprire. Questo appare nella riga di comando come segue (il file Excel è in C: \ temp ed Excel è installato come versione a 32 bit):
"C: \ Programmi (x86) \ Microsoft Office \ Office15 \ EXCEL.EXE" C: \ temp \ table1.xlsm

Pertanto, Excel si apre con il file desiderato. Per garantire che RFEM apra il programma esterno solo senza gli argomenti aggiuntivi (come il nome del file dietro EXCEL.EXE in questo caso), è necessario creare prima un file batch di Windows. Questo semplice file di testo che include l'estensione ".bat" è gestito da Windows come file EXE eseguibile. Pertanto, è possibile utilizzare l'editor per creare un file TXT, che include la nuova estensione di file ".bat". L'opzione per mostrare l'estensione del file deve essere prima impostata in Windows Explorer. Questo file batch (di seguito, EXCEL-Tool.bat) deve quindi includere la seguente voce:
"C: \ Programmi (x86) \ Microsoft Office \ Office15 \ EXCEL.EXE" C: \ temp \ table1.xlsm
Ciò corrisponde al comando come verrebbe inserito nella riga di comando.

Dopo aver creato questo file eseguibile, può essere inserito in RFEM.ini come strumento esterno. RFEM.ini è incluso nel percorso del programma di RFEM (percorso predefinito per RFEM 5.07 64-bit: C: \ Programmi \ Dlubal \ RFEM 5.07). Lì, dovresti aggiungere le seguenti voci:

ModuleName2 = EXCEL-Tool
ModuleExeName2 = "c: \ temp \ EXCEL-Tool.bat"
ModuleDescription2 = Rilascio dell'estremità dell'asta non lineare

Naturalmente, anche il file batch EXCEL-Tool.bat e la macro table1.xlsm devono essere memorizzati in C:/temp/.

Per eseguire automaticamente la macro, è necessario avviare la subroutine nella subroutine eseguita automaticamente da Excel all'apertura del file. Questa subroutine si chiama Workbook_Open e deve essere memorizzata nella cartella di lavoro.

Ora dobbiamo chiudere Excel dopo essere stato eseguito correttamente. Se si verifica un errore o RFEM non si apre, è possibile modificare la macro. Per questo, una distinzione di caso è integrata. La bozza completa è la seguente:

Privato SottotitoliWorkbook_Open ()

'Il gestore degli errori esegue RFEM.
On Error GoTo e

'Viene recuperata l'interfaccia con RFEM.
Dim iApp AsRFEM5.Application
Set iApp = GetObject (, "RFEM5.Application")

e: 'in caso di errore, viene visualizzato "RFEM non aperto"
If Err.Number <> 0 Quindi
MsgBox "RFEM non aperto",, Err.Source
   Esci Sottotitoli
Fine If

'Programma di gestione degli errori.
On Error GoTo [F5]

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

'Ottieni l'interfaccia per il modello attivo.
Dim iModel As RFEM5.model
If iApp.GetModelCount> 0 Quindi
Impostare iModel = iApp.GetActiveModel
Altrimenti
'Visualizza errore quando non ci sono abbastanza modelli disponibili.
Err.Raise vbObjectError, "LoadModel ()","iApp.GetModelCount <1"
End If

'Posto per il tuo codice sorgente.

f: 'Intercettare l'errore dal codice sorgente.
If Err.Number <> 0 Quindi
MsgBox Err.Description,, Err.Source
'La licenza COM è sbloccata, l'accesso al programma è nuovamente possibile.
iModel.GetApplication.UnlockLicense
'Lo strumento consente ad Excel di aprirsi quando si verifica un errore.
   Esci da Sub
End If

'La licenza COM è sbloccata, è possibile accedere nuovamente al programma
iModel.GetApplication.UnlockLicense
'Lo strumento dovrebbe chiudere Excel se l'applicazione ha esito positivo
Applicazione.Quit

End Sub

In questo momento, manca solo il riferimento alla subroutine creata in precedenza, che si trova in "Inserisci il tuo codice sorgente". Il codice sorgente completo è disponibile al seguente link.

Sommario

Questo articolo sulla creazione di un supporto nodale non lineare descrive l'applicazione di un nuovo modulo esterno e quindi completa le sezioni precedenti di questa serie di articoli. L'integrazione è più semplice quando si utilizzano file eseguibili, che in genere vengono creati utilizzando VisualStudio e VB o C #. Pertanto, è stato descritto il complesso processo con Excel.


Autore

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

Link
Download