Rozhraní COM ve VBA 3 | Vytvoření prutu 2

Odborný článek

V druhé části článku této série jsme si na příkladu prutu ukázali vytváření a úpravu prvků. Nyní ve třetí části znovu použijeme tyto jádrové prvky a vytvoříme uzlové podpory, zatížení, zatěžovací stavy, kombinace zatížení a kombinace výsledků. Rozšíříme tak model, který jsme vytvořili v druhém příspěvku. Prvky z první části ani druhé části článku se tak již znovu nebudeme blíže zabývat.

Obr. 01 - Konstrukce

Vyvolání rozhraní otevřeného modelu

Na rozdíl od obou posledních příspěvků budeme rozšiřovat již existující model. V našem příkladu máme tedy model z druhé části článku, již otevřený v programu RFEM. Nejdříve vyvoláme rozhraní pro otevřenou aplikaci:

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

Poté se spustí chybová rutina a uzamkne se licence:

' Chybová rutina.
On Error GoTo e

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

Doporučujeme spustit rutinu před zablokováním licence, jinak při výskytu chyby zůstává RFEM uzamčený a lze ho ukončit pouze ze správce úloh. Protože v tuto chvíli lze již rozhraní použít, vyvoláme rozhraní modelu:

' Vyvolat rozhraní prvního modelu.
Dim iModel As RFEM5.model
If iApp.GetModelCount > 0 Then
  Set iModel = iApp.GetModel(0)
Else
  Err.Raise vbObjectError, "LoadModel()", "iApp.GetModelCount < 1"
End If

Pro lepší zpracování chyb je vhodné před vyvoláním modelu zkontrolovat, zda je model vůbec k dispozici (zde GetModelCount). I v případě jiných rozhraní jako například pro zatěžovací stavy nebo zatížení tak lze lépe upozornit na chyby.

Vytvoření uzlových podpor

V našem příkladu má vzniknout prostý nosník o jednom poli. Protože prut probíhá podél osy x, je třeba na uzlu 1 odebrat stupně volnosti v posunu x,y,z a v otáčení okolo osy x a z. Podporu na uzlu 2 definujeme stejně až na volný posun ve směru osy x. Před vytvořením uzlových podpor je ještě třeba vyvolat rozhraní pro údaje o modelu. Při zadání podpory musíme dbát na to, aby v případě stupňů volnosti odpovídalo uvolnění s konstantou tuhosti hodnotě 0 nebo větší. Použijeme přitom SI jednotky, čili N/m, příp. N/rad:

' Vyvolat rozhraní pro údaje o modelu.
Dim iModelData As RFEM5.iModelData
Set iModelData = iModel.GetModelData()

' Vytvořit uzlové podpory.
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

Pokud se vyskytne problém, může být na vině nesprávný datový typ. Pokud je vyžadován double, může vést údaj typu integer k chybám. Za hodnotu integer je pak třeba doplnit konverzní znak, aby ji bylo možné použít jako číslo double.

Uzlovou podporu je poté samozřejmě třeba znovu převést do editačního režimu (PrepareModification/ FinishModification):

' Převést uzlové podpory.
iModelData.PrepareModification
iModelData.SetNodalSupports nodsups
iModelData.FinishModification

Vytvoření zatěžovacích stavů

Chceme‑li zadat zatížení, je třeba nejdříve stejně jako v programu RFEM definovat zatěžovací stav. To znamená, že při programování se nejdříve vytvoří a převedou zatěžovací stavy a teprve pak lze převést zatížení pomocí rozhraní zatěžovacích stavů. Nejdříve tedy vytvoříme zatěžovací stavy:

' Vyvolat rozhraní pro zatížení.
Dim iLoads As RFEM5.iLoads
Set iLoads = iModel.GetLoads

' Vytvořit zatěžovací stavy.
Dim loadcases(0 To 2) As RFEM5.LoadCase

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

Vytvořit se mají tři zatěžovací stavy: vlastní tíha, sníh a užitné zatížení. Všechny identifikátory při programování COM jsou v angličtině. Pro zatěžovací stav vlastní tíhy se tak jako ActionCategory použije Permanent. Pomocí vlastnosti SelfWeightFactor lze nastavit směr a hodnotu vlastní tíhy, které ovšem platí pouze v případě, že je vlastnost SelfWeight nastavena na True. Jinak se musí rovněž ToSolve nastavit na True, aby se zatěžovací stav také zahrnul do výpočtu a aby bylo zatěžovacímu stavu přiděleno číslo (.Loading.No). Zadání ostatních dvou zatěžovacích stavů je ještě o něco jednodušší, protože tu nepoužijeme žádnou vlastní tíhu:

loadcases(1).Loading.No = 2
loadcases(1).SelfWeight = False
loadcases(1).ToSolve = True
loadcases(1).ActionCategory = ShowHLowerThan1000

loadcases(2).Loading.No = 3
loadcases(2).SelfWeight = False
loadcases(2).ToSolve = True
loadcases(2).ActionCategory = ImposedCategoryA

' Převést zatěžovací stavy.
iLoads.PrepareModification
iLoads.SetLoadCases loadcases
iLoads.FinishModification

Pro sníh v nadmořské výšce do 1 000 m se použije kategorie ShowHLowerThan1000 a pro užitné zatížení kategorie A ImposedCategoryA. Následně lze zatěžovací stavy převést do programu RFEM. Nepoužijeme ovšem rozhraní IModelData, ale rozhraní ILoads, protože se již nejedná o údaje o modelu, ale o data zatížení.

Vytvoření kombinací zatížení a kombinací výsledků

Při vytváření jsou mezi oběma variantami jen malé rozdíly. Metoda výpočtu a jiné údaje se totiž nastavují až po vytvoření kombinace zatížení přes příslušné rozhraní. Zadání probíhá jako v programu RFEM a lze použít jak anglické identifikátory LC (Load Case) tak české ZS (Zatěžovací stav). Velká či malá písmena ani různé desetinné oddělovače nejsou důležité a jsou akceptovány:

' Vytvořit kombinace zatížení.
Dim loadcombs(0 To 0) As RFEM5.LoadCombination

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

' Převést kombinace zatížení.
iLoads.PrepareModification
iLoads.SetLoadCombinations loadcombs
iLoads.FinishModification

' Vytvořit kombinace výsledků.
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"

' Převést kombinace výsledků.
iLoads.PrepareModification
iLoads.SetResultCombinations rescombs
iLoads.FinishModification

Vytvoření zatížení

Jak jsme již výše zmínili, zatížení se nyní převedou přes rozhraní zatěžovacích stavů. V našem příkladu v zatěžovacím stavu 1 nevytvoříme žádná přídavná zatížení, v zatěžovacím stavu 2 zadáme lichoběžníkové spojité zatížení a v zatěžovacím stavu 3 konstantní spojité zatížení a uzlové zatížení. Níže uvádíme postup v případě zatěžovacího stavu 2:

' Vytvořit zatížení.
' Zatěžovací stav 2.
Dim iLoadCase As RFEM5.iLoadCase

Set iLoadCase = iLoads.GetLoadCase(2, AtNo)

Protože známe číslo zatěžovacího stavu, můžeme ho použít s AtNo při vyvolání rozhraní:

' Vytvořit zatížení na prut.
Dim memLoads() As RFEM5.MemberLoad
ReDim memLoads(0 To 0)

V tomto případě se array nedimenzuje při inicializaci, nýbrž až následně, protože memLoads se má znovu použít pro zatěžovací stav 3. Výhodou je, že při opětovném použití ReDim se obsah znovu nastaví na standardní hodnoty. Pod ObjectList se zvolí pruty pro zatížení a oddělí se čárkou nebo spojí spojovníkem. V případě lichoběžníkového zatížení je třeba zadat kromě obou hodnot zatížení na počátku (Magnitude1) a na konci (Magnitude2) také vzdálenosti pro počátek (DistanceA) a konec (DistanceB). Vlastnost RelativeDistances rozhoduje, zda se použijí absolutní (False) hodnoty v m nebo relativní (True) hodnoty v rozsahu 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 = False
memLoads(0).DistanceA = 0.2
memLoads(0).DistanceB = 0.9

' Převést zatížení na prut.
iLoadCase.PrepareModification
iLoadCase.SetMemberLoads memLoads
iLoadCase.FinishModification

Při převodu je třeba dát opět pozor na správné rozhraní, v tomto případě se jedná o rozhraní ILoadCase. Zatížení pro zatěžovací stav 3 se definují podobně:

' Vytvořit zatížení na uzel.
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

' Převést zatížení na uzel.
iLoadCase.PrepareModification
iLoadCase.SetNodalLoads nodalLoads
iLoadCase.FinishModification

' Vytvořit zatížení na prut.
ReDim memLoads(0 To 0)
memLoads(0).No = 1
memLoads(0).ObjectList = "1"
memLoads(0).Distribution = UniformType
memLoads(0).Magnitude1 = 5000#

' Převést zatížení na prut.
iLoadCase.PrepareModification
iLoadCase.SetMemberLoads memLoads
iLoadCase.FinishModification

Nakonec se ještě ukončí chybová rutina a poté se licence odemkne:

e: If Err.Number <> 0 Then MsgBox Err.Description, , Err.Source

' COM licence se odemkne, přístup k programu je opět možný.
iModel.GetApplication.UnlockLicense

Shrnutí

Postupy, které jsme v našem článku ukázali, navazují na předchozí dvě části článku. Jak jsme již uvedli, struktura je u všech prvků podobná. Výjimku představují nelineární klouby na koncích prutů nebo uzlové podpory, kterým se budeme věnovat v dalším článku.

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.