1809x
001408
2.3.2017

Rozhraní COM ve VBA | 2.2 Vytvoření prutu

In Teil 2.1 der Beiträge dieser Serie wurde am Beispiel eines Stabes das Anlegen und Verändern von Elementen gezeigt. Im dritten Teil werden diese Kernelemente wiederverwendet und damit Kontenlager, Lasten, Lastfälle, Lastkombinationen und Ergebniskombinationen angelegt. Das im zweiten Beitrag erstellte Modell wird dabei erweitert. Die Elemente aus Teil 1 und 2.1 werden daher nicht erneut angesprochen.


Dim iAppAs RFEM5.Application
Set iApp = GetObject (, "RFEM5.Application")
Poté se spustí popisovač chyb a licence se zamkne:
'Zpracování chyb
On Error GoTo e

'COM licence a přístup k programům jsou uzamčeny.
iApp.LockLicense

Před zamknutím licence doporučujeme spustit obslužnou rutinu; v opačném případě zůstane program RFEM v případě chyby uzamčený a lze ho ukončit pouze pomocí Správce úloh. Protože rozhraní je nyní připraveno k použití, můžete získat rozhraní pro model:

'Získat rozhraní pro první model.
Dim iModelAs 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 můžete před načtením modelu zkontrolovat, zda je model skutečně k dispozici (v tomto případě GetModelCount). I v případě jiných rozhraní, jako je rozhraní pro zatěžovací stavy nebo zatížení, lze chyby lépe označit.

Vytvoření uzlové podpory

Měl by být vytvořen nosník o jednom poli a protože je prut podél osy x, je třeba na uzlu 1 zablokovat také posun x, y, z a natočení okolo osy x a z. Podpora v uzlu 2 je stejná jako u prvního až po volný překlad ve směru x. Před vytvořením uzlových podpor je třeba ještě načíst rozhraní pro data modelu. Při definování podpory je třeba se ujistit, že v případě stupňů volnosti se pomocí pružinové konstanty vyrovná číslo větší než nebo rovno 0 s uvolněním. Zde se také používají jednotky SI; tj. N/m nebo N/rad:

'Získat rozhraní pro data modelu.
Dim iModelData As RFEM5.iModelData
Set iModelData = iModel.GetModelData ()

'Vytvořit uzlové podpory.
Dim nodsups (0 Komu 1)As RFEM5.NodalSupport
nodsups (0) .No = 1
nodsups (0) .nodeList = "1"
nodsups (0) .RestraintConstantX = -1
nodsups (0) .RestraintConstantY = 0 #
nodsups (0) .RozpočetConstantZ = -1
nodsups (0) .PodporaConstantX = -1
nodsups (0) .PodporaConstantY = -1
nodsups (0) .PodporaConstantZ = -1

nodsups (1) .No = 2
nodsups (1) .nodeList = "2"
nodsups (1) .RestraintConstantX = -1
nodsups (1) .RestraintConstantY = 0 #
nodsups (1) .RestraintConstantZ = -1
nodsups (1) .PodporaConstantX = 0 #
nodsups (1) .PodporaConstantY = -1
nodsups (1) .PodporaConstantZ = -1

Pokud se vyskytnou problémy, mohou být způsobeny nesprávným typem dat. Pokud je třeba zdvojnásobit, může způsobit celé číslo chyby. Proto je třeba za celočíselnou hodnotu přidat hash klíč, aby byl použit jako dvojitá hodnota.

Uzlovou podporu je pak samozřejmě třeba znovu převést do režimu úprav (PrepareModification/FinishModification):

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

Vytvoření zatěžovacího stavu

Pro vytvoření zatížení je třeba nejdříve definovat zatěžovací stavy, přesně jako v programu RFEM. Při programování se nejdříve vytvoří a přenese zatěžovací stav a teprve poté lze přenášet zatížení pomocí rozhraní zatěžovacích stavů. Nejdříve vytvoříme zatěžovací stavy:

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

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

zatěžovací stavy (0). Načítání.No = 1
zatěžovací stavy (0) .SelfWeight = True
zatěžovací stavy (0) .ToSolve = True
zatěžovací stavy (0) .SelfWeightFactor.X = 0
zatěžovací stavy (0) .SelfWeightFactor.Y = 0
zatěžovací stavy (0) .SelfWeightFactor.Z = 1
zatěžovací stavy (0) .ActionCategory = Trvalé

Je třeba vytvořit tři zatěžovací stavy: vlastní tíha, sníh a vynucené zatížení. V programování COM jsou všechny identifikátory v angličtině. Proto se v případě zatěžovacího stavu s vlastní tíhou používá pro funkci ActionCategory. Pro vlastnost SelfWeightFactor lze nastavit směr a hodnotu vlastní tíhy. Platí ovšem pouze tehdy, pokud je vlastnost vlastní tíhy nastavena na hodnotu TRUE. Kromě toho musí být funkce ToSolve také nastaveno na hodnotu TRUE, aby se zatěžovací stav mohl zahrnout do výpočtu a aby se zatěžovacímu případu přiřadilo číslo (.Loading.No). Další dva zatěžovací stavy se zadávají snadněji, protože neexistuje vlastní tíha:

zatěžovací stavy (1). Načítání.No = 2
zatěžovací stavy (1) .SelfWeight = Nepravda
zatěžovací stavy (1) .ToSolve = True
zatěžovací stavy (1) .ActionCategory = ZobrazitHLowerThan1000

zatěžovací stavy (2). Načítání.No = 3
zatěžovací stavy (2) .SelfWeight = Nepravda
zatěžovací stavy (2) .ToSolve = True
zatěžovací stavy (2) .ActionCategory = ImposedCategoryA

'Převzít zatěžovací stavy.
iLoads.PrepareModification
Zatěžovací stavy iLoads.SetLoadCases
iLoads.FinishModification

Kategorie ShowHLowerThan1000 se používá pro sníh pod nadmořskou výškou 1 000 m a kategorie ImposedCategoryA pro užitné zatížení kategorie A. Poté lze zatěžovací stavy převést do programu RFEM. Místo toho však používá rozhraní ILoads místo rozhraní IModelData, protože se již nejedná o data modelu; spíše údaje o zatížení.

Vytvořit kombinace zatížení a výsledků

Při vytváření kombinací zatížení nebo kombinací výsledků existuje jen několik rozdílů. Důvodem je, že metodu výpočtu a další nastavení lze použít až po vytvoření kombinace zatížení pomocí příslušného rozhraní. Definice probíhá jako v programu RFEM. K tomu lze použít identifikátor ZS (zatěžovací stav). Různé oddělovače desetinných míst a velká a malá písmena nehrají žádnou roli a jsou akceptovány:

'Vytvořit kombinace zatížení.
Dim zatěžovací stavy (0 Komu 0) As RFEM5.LoadCombination

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

'Převzít kombinace zatížení.
iLoads.PrepareModification
iLoads.SetLoadKombinace zatížení
iLoads.FinishModification

'Vytvořit kombinace výsledků.
Dim rescombs (0 Komu 0) As RFEM5.ResultCombination

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

'Převzít kombinace výsledků.
iLoads.PrepareModification
iLoads.SetResultCombinations se zobrazí
iLoads.FinishModification

Vytvoření zatížení

Jak jsme již zmínili výše, zatížení se nyní převedou pomocí rozhraní pro zatěžovací stavy. V našem příkladu se v zatěžovacím stavu 1 nevytvoří žádná další zatížení; v zatěžovacím stavu 2 se použije lichoběžníkové rozložené zatížení; a Zatěžovací stav 3 aplikuje konstantní lineární zatížení a uzlové zatížení. Pro zatěžovací stav 2 je postup:

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

Set iLoadCase = iLoads.GetLoadCase (2, AtNo)
Vzhledem k tomu, že čísla zatěžovacích stavů známe, můžeme je použít v AtNo při načítání rozhraní:
'Vytvořit zatížení na pruty.
Dim memLoads () As RFEM5.MemberLoad
ReDim memLoads (0 Komu 0)

V tomto případě není pole dimenzováno při inicializaci, ale následně, protože by měl být memLoads znovu použit pro zatěžovací stav 3. Výhodou je, že při opětovném použití ReDimu se obsah nastaví na standardní hodnoty. V sekci ObjectList je možné vybrat pruty, které se mají načíst, oddělené čárkami nebo spojené spojovníkem. Kromě obou hodnot zatížení pro počátku zatížení (velikost1) a pro konec zatížení (velikost2) vyžaduje lichoběžníkové zatížení také specifikace vzdáleností pro počátek zatížení (vzdálenost A) a konec (vzdálenost B). Vlastnost RelativeDistance určuje, zda se mají použít absolutní (falešná) data v m nebo relativní (pravda) data 0-1:

memLoads (0) .No = 1
memLoads (0) .ObjectList = "1"
memLoads (0) .Distribuce = Trapézový typ
memLoads (0) .Magnitude1 = 6000 #
memLoads (0) .Magnitude2 = 4000 #
memLoads (0) .RelativeDistance = Nepravda
memLoads (0) .DacenceA = 0,2
memLoads (0) .DistenceB = 0,9

'Přenést zatížení na pruty.
iLoadCase.PrepareModification
iLoadCase.SetMemberLoads memLoads
iLoadCase.FinishModification
Při přenosu zatížení je třeba nastavit správné rozhraní; v tomto případě rozhraní ILoadCase. Zatížení zatěžovacího stavu 3 se definují následovně:
'Vytvořit uzlová zatížení.
Dim nodalLoads (0 Komu 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řevzít uzlová zatížení.
iLoadCase.PrepareModification
iLoadCase.SetNodalLoads nodalLoads
iLoadCase.FinishModification

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

'Přenést zatížení na pruty.
iLoadCase.PrepareModification
iLoadCase.SetMemberLoads memLoads
iLoadCase.FinishModification
Při ukončení programu se rutina zpracování chyb dokončí a licence se odemkne:
e: If Err.Number <> 0Then MsgBox Err.Description, , Err.Source

„Licence COM je odemčena, přístup k programu je opět možný.
iModel.GetApplication.UnlockLicense

Shrnutí a výhled

Postupy uvedené v tomto článku vycházejí z obou předchozích příspěvků. Jak jsme již zmínili, konstrukce je u všech prvků podobná. Uvedenou výjimku z nelineárních uvolnění prutů nebo uzlových podpor uvedeme v dalším příspěvku.


Autor

Ing. Günthel zajišťuje technickou podporu zákazníkům.

Odkazy
Stahování