Interfejs COM w VBA | 2.2 Tworzenie pręta

Artykuł o tematyce technicznej

W części 2.1 serii artykułów na temat interfejsu COM opisano tworzenie i modyfikowanie elementów na przykładzie pręta. W trzeciej części te podstawowe elementy są wykorzystywane ponownie do tworzenia podpór węzłowych, obciążeń, przypadków obciążeń, kombinacji obciążeń i kombinacji wyników. W ten sposób model utworzony w drugiej części zostanie rozszerzony. Z tego względu elementy opisane w części 1 i części 2.1 nie są ponownie opisane.

Rysunek 01 - Układ konstrukcyjny

Pobieranie interfejsu otwartego modelu

W odróżnieniu od dwóch ostatnich artykułów tym razem ma zostać wczytany istniejący model, który został już otwarty w programie RFEM. W tym przykładzie otwarty jest model z drugiego artykułu. Najpierw pobierany jest interfejs dla otwartej aplikacji:

' Interface with RFEM is retrieved.
Dim iApp As RFEM5.Application
Set iApp = GetObject(, "RFEM5.Application" )

Następnie uruchamiana jest procedura obsługi błędów, a licencja zostaje zablokowana.

' Error Handler
On Error GoTo e

' COM license and program access is locked.
iApp.LockLicense

Zaleca się uruchomić procedurę przed zablokowaniem licencji, w przeciwnym razie program RFEM pozostanie zablokowany w przypadku wystąpienia błędu i można go zamknąć tylko za pomocą Menedżera zadań. Ponieważ interfejs jest teraz gotowy do zastosowania, można pobrać interfejs dla modelu:

' Get interface for the first model.
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

W celu lepszej obsługi błędów przed pobraniem modelu zaleca się sprawdzić, czy model jest faktycznie dostępny (w tym przypadku GetModelCount). Także w przypadku innych interfejsów, takich jak interfejs dla przypadków obciążeń lub obciążeń, można dzięki temu uzyskać lepsze informacje o błędach.

Tworzenie podpór węzłowych

Ma zostać utworzona belka jednoprzęsłowa, a ponieważ pręt znajduje się na osi x, w węźle 1 należy zablokować przesunięcie x, y, z oraz obrót wokół osi x i z. Podpora w węźle 2 jest różni się od pierwszej swobodnym przesunięciem w kierunku x. Przed utworzeniem podpór węzłowych konieczne jest jeszcze pobranie interfejsu dla danych modelu. Podczas definiowania podpory należy upewnić się, że w przypadku stopni swobody liczba większa lub równa zero jest równa zwolnieniu przy użyciu stałej sprężystości. Również w tym przypadku stosowane są jednostki SI, czyli N/m oraz N/rad:

' Get interface for model data.
Dim iModelData As RFEM5.iModelData
Set iModelData = iModel.GetModelData()

' Create nodal supports.
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

W przypadku wystąpienia problemów mogą one wynikać z niewłaściwego typu danych. Jeżeli wymagana jest wartość typu double, wprowadzenie liczby całkowitej może powodować powstawanie błędów. Z tego względu po wartości całkowitej należy dodać znak krzyżyka, aby została ona zastosowana jako wartość typu double.

Podporę węzłową należy następnie ponownie przenieść do trybu edycji (PrepareModification/FinishModification):

' Transfer nodal supports.
iModelData.PrepareModification
iModelData.SetNodalSupports nodsups
iModelData.FinishModification

Tworzenie przypadków obciążeń

Podobnie jak w programie RFEM, w celu utworzenia obciążeń należy najpierw zdefiniować przypadek obciążenia. W efekcie podczas programowania najpierw tworzone i przenoszone są przypadki obciążeń, a dopiero później przy użyciu interfejsów przypadków obciążeń mogą być przenoszone obciążenia. Najpierw tworzymy przypadki obciążeń:

' Get interface for loads.
Dim iLoads As RFEM5.iLoads
Set iLoads = iModel.GetLoads

' Create load cases.
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

Należy utworzyć trzy przypadki obciążeń: ciężar własny, obciążenie śniegiem oraz obciążenie użytkowe. W interfejsie COM wszystkie identyfikatory są w języku angielskim. Z tego względu dla przypadku obciążenia ciężarem własnym stosowana jest właściwość Permanent dla ActionCategory. Właściwość SelfWeightFactor umożliwia określenie kierunku i wartości ciężaru własnego. Mają one jednak zastosowanie tylko w przypadku, gdy właściwość SelfWeight jest ustawiona na True.

Również właściwość ToSolve musi być ustawiona na True, aby uwzględnić przypadek obciążenia w obliczeniach i nadać numer przypadkowi obciążenia (.Loading.No). Pozostałe dwa przypadki obciążeń są prostsze do zdefiniowania, ponieważ nie jest tu stosowany ciężar własny.

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

' Transfer load cases.
iLoads.PrepareModification
iLoads.SetLoadCases loadcases
iLoads.FinishModification

Dla obciążeń śniegiem na wysokości poniżej 1000 m n.p.m. stosuje się kategorię ShowHLowerThan1000, a dla obciążenia użytkowego kategorii A -  ImposedCategoryA. Przypadki obciążeń można następnie przenieść do programu RFEM. Do tego celu zamiast interfejsu IModelData wykorzystywany jest interfejs ILoads, ponieważ przenoszone dane nie są danymi modelu, lecz danymi obciążenia.

Tworzenie kombinacji obciążeń i kombinacji wyników

Podczas tworzenia obu typów kombinacji występuje tylko kilka różnic. Wynika to z faktu, że metodę obliczeń i inne ustawienia można zastosować dopiero po utworzeniu kombinacji obciążeń za pośrednictwem odpowiedniego interfejsu. Kombinacje definiowane są w taki sam sposób, jak w programie RFEM. Można używać zarówno angielskiego identyfikatora LC (Load Case), jak i polskiego identyfikatora PO (Przypadek Obciążenia). Różne separatory dziesiętne oraz wielkie i małe litery nie odgrywają żadnej roli i są akceptowane.

' Create load combinations.
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"

' Transfer load combinations.
iLoads.PrepareModification
iLoads.SetLoadCombinations loadcombs
iLoads.FinishModification

' Create result combinations.
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"

' Transfer result combinations.
iLoads.PrepareModification
iLoads.SetResultCombinations rescombs
iLoads.FinishModification

Tworzenie obciążeń

Jak już wspomniano, obciążenia będą teraz przenoszone za pośrednictwem interfejsów dla przypadków obciążeń. W naszym przykładzie w Przypadku obciążenia 1 nie są tworzone żadne obciążenia dodatkowe. W Przypadku obciążenia 2 zostaje zdefiniowane liniowe obciążenie trapezowe, a w Przypadku obciążenia 3 - stałe obciążenie liniowe i obciążenie węzłowe. Sposób postępowania w celu utworzenia Przypadku obciążenia 2 jest następujący:

' Create loads.
' Load Case 2.
Dim iLoadCase As RFEM5.iLoadCase
Set iLoadCase = iLoads.GetLoadCase(2, AtNo)

Ponieważ znamy numer przypadku obciążenia, można go użyć z AtNo podczas pobierania interfejsu:

' Create member loads.
Dim memLoads() As RFEM5.MemberLoad
ReDim memLoads(0 To 0)

W takim przypadku macierz nie jest zwymiarowana podczas inicjalizacji, lecz dopiero później, ponieważ dla Przypadku obciążenia 3 należy ponownie użyć funkcji memLoads. Ma to tę zaletę, że podczas ponownego używania ReDim zawartość zostanie przywrócona do wartości domyślnych. W zakładce ObjectList można wybrać pręty do wczytania, oddzielając je przecinkami lub łącząc za pomocą łączników. W przypadku obciążenia trapezowego oprócz obu wartości obciążenia dla początku  (Magnitude1) i końca obciążenia (Magnitude2) należy podać także odległości dla początku (DistanceA) i końca (DistanceB). Właściwość RelativeDistances określa, czy będą stosowane dane bezwzględne (False) w m czy względne (True) 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

' Transfer member loads.
iLoadCase.PrepareModification
iLoadCase.SetMemberLoads memLoads
iLoadCase.FinishModification

Podczas przenoszenia obciążeń należy ustawić odpowiedni interfejs, w tym przypadku interfejs ILoadCase. Obciążenia w Przypadku obciążenia 3 są zdefiniowane w następujący sposób:

' Create nodal loads.
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

' Transfer nodal loads.
iLoadCase.PrepareModification
iLoadCase.SetNodalLoads nodalLoads
iLoadCase.FinishModification

' Create member loads.
ReDim memLoads(0 To 0)
memLoads(0).No = 1
memLoads(0).ObjectList = "1"
memLoads(0).Distribution = UniformType
memLoads(0).Magnitude1 = 5000#

' Transfer member loads.
iLoadCase.PrepareModification
iLoadCase.SetMemberLoads memLoads
iLoadCase.FinishModification

Podczas zamykania programu procedura obsługi błędu jest zamykana, a licencja zostaje odblokowana.

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

' COM license is unlocked, the program access is possible again.
iModel.GetApplication.UnlockLicense

Podsumowanie i zapowiedź

Procedury przedstawione w artykule są oparte na dwóch poprzednich artykułach. Jak już wspomniano, struktura jest podobna dla wszystkich elementów. Wyjątek, o którym mowa w poprzednich artykułach, dotyczący nieliniowych zwolnień prętów lub podpór węzłowych, będzie tematem kolejnego artykułu.

Do pobrania

Linki

Kontakt

Kontakt do Dlubal

Mają Państwo pytania lub potrzebują porady?
Zapraszamy do bezpłatnego kontaktu z nami drogą mailową, poprzez czat lub forum lub odwiedzenia naszej strony z FAQ z użytecznymi wskazówkami i rozwiązaniami.

+48 (32) 782 46 26

+48 730 358 225

info@dlubal.pl

RFEM Program główny
RFEM 5.xx

Program główny

Oprogramowanie do obliczeń płaskich i przestrzennych układów konstrukcyjnych, obejmujących płyty, ściany, powłoki, pręty (belki), bryły i elementy kontaktowe, z wykorzystaniem Metody Elementów Skończonych (MES)

Cena pierwszej licencji
3 540,00 USD
RFEM Inne
RF-COM 5.xx

Moduł dodatkowy

Programowalny interfejs (API) w oparciu o technologię COM

Cena pierwszej licencji
580,00 USD