Ponieważ modelowanie żebra za pomocą powierzchni oraz belki wynikowej jest znacznie bardziej skomplikowane niż tworzenie pręta typu „żebro”, poniżej przedstawiono program w EXCEL-VBA, który pozwala przekształcić żebro zamodelowane prętem na model powłokowy i stosowną belkę wynikową.
Aby przekształcić żebro w model powłokowy, należy wykonać następujące kroki:
- Odczytać parametry żebra (przekrój, orientację itd.)
- Tworzenie powierzchni żebra
- utworzyć belkę wynikową
- Usunąć żebro
Poniżej, w opisie procedury krok po kroku, zaprezentujemy fragmenty kodu źródłowego. Pełny kod można pobrać na końcu tego artykułu.
Odczytanie parametrów żebra
Użytkownik może wskazać żebro, które ma zostać przekształcone na powłokę, wybierając je z poziomu interfejsu programu. W tym celu konieczna jest praca z funkcją EnableSelections. Dopóki EnableSelections jest aktywowane za pomocą wartości true, tylko elementy wybrane przez użytkownika są odczytywane z programu RFEM. Wynik odczytania danych wybranego pręta wygląda następująco.
' get interface of active model
Set iMod = iApp.GetActiveModel
' get interface of (structural) model data
Dim iModData As RFEM5.IModelData2
Set iModData = iMod.GetModelData
' get selected member
iModData.EnableSelections True
Dim mems() As RFEM5.Member
Dim selMem As RFEM5.Member
mems = iModData.GetMembers
selMem = mems(0)
iModData.EnableSelections False
Do modelowania żebra jako powłoki wymagane są następujące parametry:
- Przekrój żebra, numery powierzchni do której zostało przypisane oraz szerokości współpracujące
- Orientacja żebra
- Materiał, z którego wykonano żebro
W programie RFEM żebro jest typem pręta. Jeżeli programowanie odbywa się za pomocą interfejsu COM, dane dotyczące żebra należy pozyskać za pomocą dwóch różnych interfejsów (komend). Z jednej strony istnieje komenda dla pręta, z drugiej strony istnieje komenda dla żebra. Interfejs z żebrem można pozyskać poprzez komendę IModelData.GetRib. GetRib czeka na podanie numeru żebra zawartego w danych o pręcie poprzez Member.RibNo.
' get parameters of rib
' #####################
Dim iRb As RFEM5.IRib
Set iRb = iModData.GetRib(selMem.RibNo, AtNo)
Dim selRb As RFEM5.Rib
selRb = iRb.GetData
Dim rbCrsc As RFEM5.RibCrossSection
rbCrsc = iRb.GetRibCrossSection
Interfejs z żebrem oferuje dwa różne elementy: ogólne dane żebra, dostępne za pomocą struktury Rib oraz dane o przekroju żebra za pomocą RibCrossSection. Struktura Rib zawiera numer powierzchni do której przypisano żebro, położenie żebra oraz szerokości efektywne. RibCrossSection zawiera opis i wymiary przekroju jaki przypisano do żebra. Jest to również przekrój wykorzystywany przez RF-CONCRETE Members (ITCU).
Dodatkowo wymagana jest informacja o orientacji, dostępna w odniesieniu do lokalnego układ współrzędnych pręta. Do układu osi można uzyskać dostęp poprzez interfejs pręta. Funkcja IMemer.GetLocalCoordinateSystem zwraca dane ze struktury CoordinateSystem.
Dim cosy As RFEM5.CoordinateSystem
cosy = iModData.GetMember(selMem.no, AtNo).GetLocalCoordinateSystem(0#).GetData
GetLocalCoordinateSystem oczekuje na położenie x pręta, które tutaj zostało ustawione na 0,0 lub w punkcie początkowym. Oprócz wymienionych parametrów wymagany jest również materiał z którego wykonano pręt. Informację tą można pozyskać poprzez przekrój pręta.
Dim selCrsc As RFEM5.CrossSection
selCrsc = iModData.GetCrossSection(selMem.StartCrossSectionNo, AtNo).GetData
Tworzenie powierzchni żebra
Poniższy program początkowo stworzono tylko dla prostych żeber umiejscowionych po dodatniej stronie powłoki z. Ponieważ żebro może znajdować się również w płaszczyznach ukośnych, powierzchnię należy utworzyć za pomocą kierunku pręta. Zmienna „cosy” dla lokalnego układu osi pręta obejmuje wektor kierunku lokalnej osi z - „cosy.AxisZ” - wraz z trzema współrzędnymi x, y i z. Wektor ten jest znormalizowany tak, że po pomnożeniu przez wysokość żebra, wskazuje on odległość i kierunek dolnej krawędzi żebra od powierzchni. W przypadku linii granicznych powierzchni żebra powłokowego, wektor ten jest mnożony przez wysokość żebra i dodawany do węzła początkowego oraz końcowego pręta tworzącego żebro. W rezultacie powstają dwa węzły końcowe dolnej linii granicznej powierzchni żebra. Należy pamiętać, że: wysokość żebra obejmuje również połowę grubości powierzchni z którą jest połączone. Dla uproszczenia stosowana jest tylko grubość jednej półki przekroju teowego żebra (-y w lokalnym układzie osi pręta) - zmienna UpperLeftFlangeThickness. Po odczytaniu danych dotyczących węzłów można wygenerować linie graniczne i powłokę nowego żebra.
- kod.vb#
' utworzyć/obliczyć węzły
' ######################
Dim nodes () As RFEM5.Node
nodes = selNodes
nodes(0).no = index_n + 1
nodes(1).no = index_n + 2
Dim h_rib As Double
h_rib = (rbCrsc.Depth - rbCrsc.UpperLeftFlangeThickness/2)
nodes(0).X = nodes(0).X + h_rib * cosy.AxisZ.X
nodes(0).Y = nodes(0).Y + h_rib * cosy.AxisZ.Y
nodes(0).Z = nodes(0).Z + h_rib * cosy.AxisZ.Z
nodes(1).X = nodes(1).X + h_rib * cosy.AxisZ.X
nodes(1).Y = nodes(1).Y + h_rib * cosy.AxisZ.Y
nodes (1) .Z = nodes (1) .Z + h_rib * cozy.AxisZ.Z
' utworzyć linie
' ############
Dim lines(0 To 2) As RFEM5.RfLine
lines(0).no = index_l + 1
lines(1).no = index_l + 2
lines(2).no = index_l + 3
lines(0).NodeList = str(selNodes(0).no) + "," + str(nodes(0).no)
lines(1).NodeList = str(selNodes(1).no) + "," + str(nodes(1).no)
lines(2).NodeList = str(nodes(0).no) + "," + str(nodes(1).no)
' utworzyć powierzchnię
' ##############
Dim surf As RFEM5.Surface
surf.BoundaryLineCount = 4
surf.BoundaryLineList = str(selLine.no) + "," + str(lines(0).no) + "," + str(lines(2).no) + "," + str(lines(1).no)
surf.Comment = "rib"
surf.GeometryType = PlaneSurfaceType
surf.MaterialNo = selCrsc.MaterialNo
surf.Thickness.Type = ConstantThicknessType
surf.Thickness.Constant = rbCrsc.WebThickness
surf.StiffnessType = StandardStiffnessType
surf.no = index_s + 1
- /kod#
Każda ze zmiennych indeks_n, indeks_l, indeks_s zawiera ostatni indeks odpowiedniego elementu z programu RFEM. Kod źródłowy dostępny do pobrania na końcu tego artykułu pozwala określić indeksy.
utworzyć belkę wynikową
Belka wynikowa, podobnie jak żebro, składa się z dwóch elementów: standardowej struktury Member oraz dodatkowych danych w strukturze ResultBeam. Dodatkowe dane można modyfikować tylko przez interfejs do pręta, w związku z czym należy najpierw utworzyć pręt, a następnie przenieść stosowne dane za pośrednictwem interfejsu IMember. Pręt zazwyczaj musi być zadany z mimośrodem a węzły początkowy i końcowy są tworzone bezpośrednio w środku ścinania bez uwzględnienia mimośrodu pręta. Mimośród jest zapisywany wewnątrz struktury RibCrossSection. Można więc skopiować węzły początkowy i końcowy oryginalnego żebra i użyć ich jako bazy dla definicji belki wynikowej. Za pomocą wektorów kierunkowych y oraz z, lokalnego układu osi pręta, można przenieść skopiowane węzły w odpowiednie miejsce. Na potrzeby późniejszego wymiarowania belka wynikowa musi mieć przypisany przekroju, który jest najpierw kopiowany z wyjściowego pręta tworzącego żebro. Następnie opis przekroju jest importowany ze struktury RibCrossSection, a informacje w CrossSection.TextID są kasowane.
- kod.vb#
' utworzyć węzły dla pręta wynikowego i obliczyć mimośród
Dim resNodes () As RFEM5.Node
resNodes = selNodes
resNodes(0).no = index_n + 3
resNodes(1).no = index_n + 4
resNodes (0) .X = selNodes (0) .X + rbCrsc.Eccentricity.Z * cosy.AxisZ.X + rbCrsc.Eccentricity.Y * cosy.AxisY.X
resNodes (0) .Y = selNodes (0) .Y + rbCrsc.Eccentricity.Z * cosy.AxisZ.Y + rbCrsc.Eccentricity.Y * cosy.AxisY.Y
resNodes (0) .Z = selNodes (0) .Z + rbCrsc.Eccentricity.Z * cosy.AxisZ.Z + rbCrsc.Eccentricity.Y * cosy.AxisY.Z
resNodes (1) .X = selNodes (1) .X + rbCrsc.Eccentricity.Z * cosy.AxisZ.X + rbCrsc.Eccentricity.Y * cosy.AxisY.X
resNodes (1) .Y = selNodes (1) .Y + rbCrsc.Eccentricity.Z * cosy.AxisZ.Y + rbCrsc.Eccentricity.Y * cosy.AxisY.Y
resNodes (1) .Z = selNodes (1) .Z + rbCrsc.Eccentricity.Z * cosy.AxisZ.Z + rbCrsc.Eccentricity.Y * cosy.AxisY.Z
' utworzyć linię
Dim resLine As RFEM5.RfLine
resLine.no = index_l + 4
resLine.NodeCount = 2
resLine.Type = PolylineType
resLine.NodeList = str (resNodes (0) .no) & "," & str (resNodes (1) .no)
' utworzyć przekrój
Dim resCrsc As RFEM5.CrossSection
resCrsc = selCrsc
resCrsc.description = rbCrsc.description
resCrsc.no = indeks_c + 1
resCrsc.TextID = ""
' utworzyć pręt
Dim resMem As RFEM5.Member
resMem.LineNo = resLine.no
resMem.no = indeks_m + 1
resMem.Type = ResultBeamType
resMem.StartCrossSectionNo = resCrsc.no
resMem.Rotation = selMem.Rotation
' wysłanie danych do RFEM
' ####################
iModData.PrepareModification
- iModData.SetNodes nodes
- iModData.SetLines lines
- iModData.SetSurface surf
- iModData.SetNodes resNodes
- iModData.SetLine resLine
- iModData.SetCrossSection resCrsc
- iModData.SetMember resMem
iModData.FinishModification
- /kod#
Po utworzeniu pręta (również węzłów, linii, przekroju oraz powierzchni) należy określić i przenieść parametry belki wynikowej. Belka wynikowa całkuje siły wewnętrzne innych elementów w modelu (prętów, powierzchni, brył) i przekształca je w ekwiwalentne siły wewnętrzne prętów zgodnie z ich położeniem. Aby wskazać prawidłowe elementy do całkowania, belka wynikowa ma dwie podstawowe opcje. Można określić elementy, które mają zostać uwzględnione i dodatkowo ograniczyć zakres całkowania za pomocą bryły (walca lub prostopadłościanu). W tym przypadku zastosowano numer nowej powierzchni żebra oraz numery powierzchni szerokości współpracującej, jeżeli istnieją. Jako obszar całkowania wybierany jest prostopadłościan, który (względem lokalnego układu współrzędnych) można zdefiniować w kierunku +/- y- i +/- z-. Wartości ze struktury RibCrossSection są ponownie wykorzystywane jako dane. Należy pamiętać, że w przypadku braku szerokości współpracującej, nadal konieczne jest zdefiniowanie szerokości obszaru całkowania, aby płyta nad żebrem była prawidłowo uwzględniona. Zastosowano dodatkową szerokość wynoszącą połowę grubości powierzchni.
- kod.vb#
' ustawić parametry belki wynikowej
' ##########################
Dim resBeam As RFEM5.ResultBeam
Dim iResBeam As RFEM5.IResultBeam
Set iResBeam = iModData.GetMember(resMem.no, AtNo).GetExtraData
resBeam = iResBeam.GetData
' ustawić elementy zintegrowane
If selRb.SurfaceNoSide1 Then
- resBeam.IncludeSurfaces = str (selRb.SurfaceNoSide1) & ","
End If
If selRb.SurfaceNoSide2 Then
- resBeam.IncludeSurfaces = resBeam.IncludeSurfaces & str(selRb.SurfaceNoSide2) & ","
End If
resBeam.IncludeSurfaces = resBeam.IncludeSurfaces & str (surf.no)
'ustawianie obszaru integracji
resBeam.Integrate = WithinCuboidGeneral
Dim resBeamParam (0 do 3) As Double
' +y, -y, +z, -z
If selRb.WidthSide2 Then
- resBeamParam (0) = selRb.WidthSide2 - rbCrsc.Eccentricity.Y
Else
- resBeamParam(0) = 0.5 * rbCrsc.WebThickness - rbCrsc.Eccentricity.Y
End If
If selRb.WidthSide1 Then
- resBeamParam(1) = selRb.WidthSide1 + rbCrsc.Eccentricity.Y
Else
- resBeamParam(1) = 0.5 * rbCrsc.WebThickness + rbCrsc.Eccentricity.Y
End If
resBeamParam (2) = rbCrsc.Depth
resBeamParam (3) = rbCrsc.Depth
resBeam.Parameters = resBeamParam
' przesyłanie nowych parametrów belki wynikowej do RFEM
iModData.PrepareModification
iResBeam.SetData resBeam
iModData.FinishModification
- /kod#
Usunąć żebro
Ponieważ nowe żebro zostało utworzone za pomocą powierzchni, można teraz usunąć pręt użyty poprzednio do modelowania żebra. Każdy element można usunąć za pomocą funkcji DeleteObjects interfejsu IModelData. Ponieważ elementy są modyfikowane, należy raz jeszcze użyć bloku kodu modyfikującego Prepare/Finish.
- kod.vb#
' Usunąć żebro
'##########
iModData.PrepareModification
iModData.DeleteObjects MemberObject, str (selMem.no)
iModData.FinishModification
- /kod#
Uwagi końcowe
Żebra modelowane jako pręty stanowią uproszczenie i nie zawsze są w stanie odwzorować wszystkie aspekty bardziej złożonego układu konstrukcyjnego. Tworzenie żebra za pomocą pręta jest prostą operacją. W związku z tym zaprezentowany tu program pozwala wykorzystać zalety prostego modelowania żebra wyjściowego jako pręta oraz bardziej szczegółowe odwzorowanie żebra docelowego za pomocą powierzchni. Oprócz już znanych elementów, takich jak interfejsy do pręta (IMember), wprowadziliśmy interfejs IRib. Zapewnia on między innymi dostęp do przekroju przypisanego do żebra. Zaprezentowano odczyt lokalnego układu osi pręta i utworzona została powierzchnia żebra za pomocą obliczeń wektorowych.
Perspektywy
Przedstawiony program można dalej rozwinąć. Można na przykład uwzględnić różne położenie żebra względem płyty (góra, dół, środek). Inną opcją może być rozszerzenie na żebra o zmiennym przekroju lub żebra opate na liniach zakrzywionych.