Rozhraní COM ve VBA | 3. Vytvoření nástroje

Odborný článek

V části 2.2 této série jsme si na příkladu prutu ukázali, jak se vytváří a upravují uzlové podpory, zatížení, zatěžovací stavy, kombinace zatížení a kombinace výsledků. V následujícím příspěvku si předvedeme, jak si mohou uživatelé sami vytvářet vlastní nástroje.

Obr. 01 - Individuálně vytvořený EXCEL nástroj v programu RFEM

Základy

Vytvářet budeme nástroj, který slouží ke vložení nelineární uzlové podpory na právě vybraný uzel v programu. K tomu jsou zapotřebí následující jádrové prvky:

  • Vyvolání právě vybraného uzlu
  • Vytvoření uzlové podpory
  • Vytvoření a přiřazení nelinearity
  • Vytvoření nástroje v programu

Tyto body budeme nyní postupně řešit. Předpokládáme přitom, že čtenář se již seznámil s našimi dřívějšími příspěvky, k předchozím bodům se totiž již nebudeme vracet. Zdrojový kód nicméně dokumentuje také již popsané prvky jako například vyvolání konstrukce.

Vyvolání právě vybraného uzlu

Při zpracování vybraných prvků přes rozhraní COM se uplatňují již známé funkce jako například IModelData.GetNodes pro uzly. Pro vyvolání pouze vybraných prvků je třeba pomocí IModelData.EnableSelections přepnout na zpracování aktuálního výběru. Pokud nastavíme EnableSelections na True,vrací IModelData.GetNodes pouze vybrané prvky. Níže uvádíme konkrétní příklad:

' Vyvolat vybrané uzly
iModDat.EnableSelections True ' pracovat pouze s vybranými objekty
Dim nodes() As RFEM5.Node
nodes = iModDat.GetNodes
iModDat.EnableSelections False ' pracovat opět se všemi objekty

Po vyvolání vybraných uzlů se EnableSelections znovu nastaví na false, vyhneme se tak zdroji častých chyb. Protože uzlová podpora vyžaduje ke svému zadání seznam uzlů jako znakový řetězec, vytvoříme ho hned v dalším kroku:

' Vytvořit seznam uzlů
Dim nodeList As String
Dim i As Long
For i = 0 To UBound(nodes, 1)
   nodeList = nodeList & nodes(i).No & ","
Next i

Vytvoření uzlové podpory

Nelinearita, v našem případě diagram, je samostatný prvek. Lze ho uzlové podpoře přiřadit, teprve když již existuje v systému. Proto je nutné nejdříve vytvořit uzlovou podporu. Budeme se přitom držet zásad, které jsme uvedli v předchozích příspěvcích:

' Vytvořit uzlovou podporu
Dim nodSup As RFEM5.NodalSupport
nodSup.No = 100
nodSup.IsColumn = False
nodSup.IsValid = True
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

' Zadat nelinearitu
nodSup.SupportNonlinearityZ = WorkingDiagramType

iModDat.PrepareModification
iModDat.SetNodalSupport nodSup
iModDat.FinishModification

Jak vidíme v kódu, stanoví se v globálním směru Z nelinearita typu WorkingDiagramType.

Vytvoření a přiřazení nelineární podpory

Uzlovou podporu jsme připravili na nelinearitu WorkingDiagramType, nyní je třeba ji vytvořit:

' Vytvořit nelinearitu
Dim nldgrm As RFEM5.NonlinearityDiagram

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

' Vytvořit diagram
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

Diagram sestává z dvourozměrného pole. První rozměr odpovídá datové sadě, druhý rozměr prvkům datové sady. První prvek v datové sadě tu představuje posun v m, druhým je síla v N. Ve výše uvedeném příkladu se tak vytvoří čtyři datové sady, kdy se například třetí bod diagramu nachází v místě, které odpovídá 30 mm a 0,2 kN. Danou nelinearitu je nyní třeba přiřadit vytvořené podpoře. Vyvolá se proto rozhraní k uzlové podpoře a následně k nelinearitě:

' Přiřadit nelinearitu
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

Nelinearita je v daném případě podél osy Z, a proto je třeba při jejím vyvolání zvolit AlongAxisZ. Přiřazení se provádí v již známém modifikačním bloku.

Vytvoření nástroje v programu

Do programu RFEM lze integrovat externí programy. K tomu je potřeba upravit RFEM.ini v adresáři programu. Na rozdíl od programování v C# a VB, kdy se vytváří samospustitelný soubor, VBA vyžaduje Excel ke spuštění nástroje. Excelu lze argumentem při startu přiřadit soubor k otevření. Příkazový řádek pak vypadá následovně, přičemž soubor Excel je uložen pod C:\temp a Excel je nainstalován ve 32bitové verzi:
"C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE" C:\temp\tabulka1.xlsm

Excel se pak otevře i s požadovaným souborem. Vzhledem k tomu, že z programu RFEM lze externí program vyvolat jen bez přídavných argumentů (jakým je v našem případě název souboru za EXCEL.EXE), musíme ještě vytvořit dávkový soubor systému Windows. Tento jednoduchý textový soubor s příponou ".bat" zpracuje Windows jako spustitelný soubor EXE. K jeho vytvoření musíme tedy například v editoru založit soubor TXT, který po vytvoření dostane koncovku ".bat". Zobrazení přípony souborů je případně třeba nejdříve nastavit v průzkumníku souborů ve Windows. Příslušný dávkový soubor (dále EXCEL-nástroj.bat) se pak musí zapsat následovně:
"C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE" C:\temp\tabulka1.xlsm
Tento záznam odpovídá příkazu z příkazového řádku.

Vytvořený spustitelný soubor můžeme následně jako externí nástroj zapsat do souboru RFEM.ini. Soubor RFEM.ini se nachází v adresáři programu RFEM (standardně pro RFEM 5.07 64bitovou verzi: C:\Program Files\Dlubal\RFEM 5.07). V něm doplníme následující zápis:

ModuleName2=EXCEL-nástroj
ModuleExeName2="c:\temp\EXCEL-nástroj.bat"
ModuleDescription2=Nelineární kloub na konci prutu

Dávkový soubor EXCEL-nástroj.bat a makro tabulka1.xlsm se pak také samozřejmě musí uložit do C:/temp/.

Pokud se má makro spouštět automaticky, musí se vyvolat příslušná subrutina v automaticky spouštěné subrutině v Excelu při otevření souboru. Tato subrutina má název Workbook_Open a musí být uložena do sešitu (Workbook).

Obr. 02 - Subrutina Workbook_Open uložená do sešitu

Nyní již jen zbývá, aby se Excel po úspěšném provedení opět zavřel. Jestli se vyskytne chyba nebo RFEM není otevřen, můžeme makro upravit a zařadit ještě rozpoznání případu. Celý návrh pak vypadá následovně:

Private Sub Workbook_Open()

' Chybová rutina Spuštění programu RFEM
On Error GoTo e

' Vyvolá se rozhraní k programu RFEM
Dim iApp As RFEM5.Application
Set iApp = GetObject(, "RFEM5.Application")

e: ' v případě chyby se zobrazí "RFEM není otevřen"
If Err.Number <> 0 Then
   MsgBox "RFEM not open", , Err.Source
   Exit Sub
End If

' Chybová rutina Program
On Error GoTo f

' Licence COM a přístup k programu se zablokuje
iApp.LockLicense

' Vyvolat rozhraní pro aktivní model
Dim iModel As RFEM5.model
If iApp.GetModelCount > 0 Then
   Set iModel = iApp.GetActiveModel
Else
' Vyhodit chybu v případě nedostatku modelů
Err.Raise vbObjectError, "LoadModel()", "iApp.GetModelCount < 1"
End If

' Místo pro vlastní zdrojový kód

f: ' Odchytit chyby ze zdrojového kódu
If Err.Number <> 0 Then
   MsgBox Err.Description, , Err.Source
   ' COM licence se odblokuje, přístup k programu je opět možný
   iModel.GetApplication.UnlockLicense
   ' Nástroj má ponechat Excel otevřený, pokud se vyskytne chyba
   Exit Sub
End If

' COM licence se odblokuje, přístup k programu je opět možný
iModel.GetApplication.UnlockLicense
' Nástroj má Excel při úspěšném použití zavřít
Application.Quit

End Sub

Chybí tu nyní pouze odkaz na již vytvořenou subrutinu, která se má vložit na „místo pro vlastní zdrojový kód“. Celý zdrojový kód připojujeme níže.

Shrnutí

Vytvoření nelineární uzlové podpory lze vnímat jako doplnění našich předchozích příspěvků, zatímco vytvoření externího modulu je nové téma. Integrace je méně problematická, pokud použijeme spustitelné soubory, které lze typicky vytvářet při programování ve VisualStudiu ve VB, případně C#. Z tohoto důvodu jsme v našem příspěvku popsali složitější postup při použití Excelu.

Odkazy

Kontakt

Kontakt

Máte dotazy nebo potřebujete poradit?
Kontaktujte nás nebo využijte stránky s často kladenými dotazy.

+420 227 203 203

info@dlubal.cz

RFEM Hlavní program
RFEM 5.xx

Hlavní program

Program RFEM pro statické výpočty metodou konečných prvků umožňuje rychlé a snadné modelování konstrukcí, které se skládají z prutů, desek, stěn, skořepin a těles. Pro následná posouzení jsou k dispozici přídavné moduly, které zohledňují specifické vlastnosti materiálů a podmínky uvedené v normách.

Cena za první licenci
3 540,00 USD