Uma vez que a modelação de uma nervura com base na superfície com a barra de resultados é significativamente mais complicada do que criar uma barra do tipo nervura, o programa seguinte no EXCEL-VBA converterá a nervura com base em barra num modelo de superfície incluindo a barra de resultados.
Para transformar uma nervura num modelo de superfície, são necessários os seguintes passos:
- Ler parâmetros da nervura (secção, orientação etc.)
- Criar superfície de nervura
- criar uma barra de resultados
- Eliminar a barra de nervura
A seguir, mostraremos excertos do código fonte completo como exemplos. Pode fazer o download do código completo no final deste artigo.
Ler os parâmetros da nervura
Tem a opção de selecionar a nervura a ser transformada, selecionando-a na interface do programa. Para isso, é necessário trabalhar com a funçãoEnableSelections. EnquantoEnableSelections estiver ativado com verdadeiro, apenas os elementos selecionados são lidos do RFEM. A leitura da barra selecionada tem o seguinte aspeto.
' 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
São necessários os seguintes parâmetros para a modelação da nervura:
- Secção da nervura, números de superfícies e larguras efetivas
- Orientação da nervura
- Material da nervura
No RFEM, uma nervura é um tipo de barra. Quando utiliza a programação através da interface COM, tem de obter os dados de uma nervura através de duas interfaces diferentes. Por um lado, existe a interface para a barra e, por outro lado, existe a interface para a nervura. A interface para uma nervura pode ser obtida através de IModelData.GetRib. GetRib espera o número da nervura contida na barra através de 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
A interface com a nervura oferece dois elementos diferentes: os dados gerais da nervura através da estrutura da nervura e os dados da secção da nervura através da Nervura. Nervura contém os números da superfície, a posição da nervura e a largura efectiva. RibCrossSection contém a descrição e as dimensões da secção da nervura interna, que também é utilizada pelo RF-CONCRETE Members (ITCU).
Além disso, é necessária a orientação, que está disponível através do sistema de eixos local da barra. O sistema de eixos é acedido através da interface para a barra. A função IMemer.GetLocalCoordinateSystem devolve a estrutura CoordinateSystem.
Dim cosy As RFEM5.CoordinateSystem
cosy = iModData.GetMember(selMem.no, AtNo).GetLocalCoordinateSystem(0#).GetData
GetLocalCoordinateSystem ainda espera a posição x da barra que foi definida como 0,0 ou o início aqui. Além dos parâmetros mencionados, também é necessário o material da barra, o qual pode ser obtido através da secção da barra.
Dim selCrsc As RFEM5.CrossSection
selCrsc = iModData.GetCrossSection(selMem.StartCrossSectionNo, AtNo).GetData
Criar superfície de nervura
O programa é criado inicialmente apenas para nervuras retas no lado positivo z. Uma vez que a nervura também pode estar em planos oblíquos, a superfície deve ser criada utilizando a orientação da barra. A variável cosy para o sistema de eixos local da barra inclui o vetor de direção para o eixo z local cosy.AxisZ com os seus três valores x, y e z. Este vetor é normalizado de modo que, multiplicado pela altura da nervura, represente a distância e a direção da borda inferior da nervura. Para as linhas de fronteira da superfície da nervura, este vector é multiplicado pela altura da nervura e adicionado aos nós inicial e final. Isto resulta nos dois nós de extremidade da linha de extremidade inferior da superfície da nervura. Note o seguinte: a altura da nervura também inclui metade da espessura da superfície da largura efetiva. Para simplificação, apenas é utilizada a espessura da superfície do primeiro lado (-y no sistema de eixos local) a partir da secção da nervura (UpperLeftFlange Thickness). Após os nós estarem disponíveis, podem ser geradas as linhas de contorno e a superfície da nervura.
- código.vb#
' criar/calcular nós
' ##################
Dim nós() As RFEM5.Node
nós = selNodes
nós(0).no = index_n + 1
nós(1).no = index_n + 2
Dim nervura h_as como dupla
h_rib = (rbCrsc.Depth - rbCrsc.UpperLeftFlangeEspessura/2)
nós(0).X = nós(0).X + h_nervura * cosy.AxisZ.X
nós(0).Y = nós(0).Y + h_nervura * cosy.AxisZ.Y
nós(0).Z = nós(0).Z + h_nervura * cosy.AxisZ.Z
nós(1).X = nós(1).X + h_nervura * cosy.AxisZ.X
nós(1).Y = nós(1).Y + h_nervura * cosy.AxisZ.Y
nós (1) .Z = nós (1) .Z + h_rib * cosy.AxisZ.Z
' criar linhas
' ##########
Dim linhas(0 A 2) Como RFEM5.RfLine
linhas(0).no =index_l + 1
linhas(1).no =index_l + 2
linhas(2).no =index_l + 3
linhas(0).NodeList = str(selNodes(0).no) + "" + str(nós(0).no)
linhas(1).NodeList = str(selNodes(1).no) + "" + str(nós(1).no)
linhas(2).NodeList = str(nós(0).no) + "" + str(nós(1).no)
' criar superfície
' ###########
Dim superfície Como RFEM5.Superfície
superfície.BoundaryLineCount = 4
superfície.BoundaryLineList = str(selLine.no) + "" + str(linhas(0).no) + "", + str(linhas(2).no) + "" + str(linhas(1). não)
superfície.Comment = "nervura"
superfície.GeometriaType = PlaneSuperfícieType
superfície.MaterialNo = selCrsc.MaterialNo
surf.Espessura.Type = Constant ThicknessType
surf.Espessura.Constant = rbCrsc.WebEspessura
navegador.StiffnessType = StandardStiffnessType
surf.no = index_s + 1
#/code#
As variáveisindex_n,index_l,index_s contêm cada uma o último índice do respetivo elemento do RFEM. Consulte o código fonte para download no final deste artigo para determinar os índices.
criar uma barra de resultados
A barra resultante, tal como a nervura, é constituída por dois elementos: a estrutura padrão Member e os dados adicionais ResultBeam. Os dados adicionais só podem ser modificados através da interface para a barra, por isso, primeiro é necessário criar a barra; depois, pode transferir os dados através da interface IMember. Uma vez que a barra geralmente tem de ser excêntrica, os nós inicial e final são criados diretamente no centro de corte sem excentricidade de barra. A excentricidade é guardada em NervCrossSection. Assim, pode copiar os nós inicial e final da nervura original e utilizá-los como base. Pode deslocar os nós copiados para a localização correta utilizando os vetores de direção y e z do sistema de eixos local da barra. Para um dimensionamento posterior, a barra resultante também requer uma secção, a qual é primeiro copiada da nervura original. Em seguida, a descrição da secção é importada de RibCrossSection e CrossSection.TextID é esvaziado, caso contrário, será utilizado para a criação da secção em vez da cadeia de caracteres de CrossSection.Description.
- código.vb#
' cria nós para a barra de resultados e calcula a excentricidade
Dim resNodes() Como 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
' criar linha
Dim resLine As RFEM5.RfLine
resLine.no = index_l + 4
resLine.NodeCount = 2
resLine.Type = PolilinhaType
resLine.NodeList = str(resNodes (0).no) & , & str(resNodes (1).no)
' criar secção
Dim resCrsc As RFEM5.CrossSection
resCrsc = selCrsc
resCrsc.description = rbCrsc.description
resCrsc.no =index_c +1
resCrsc.TextID = ""
' criar barra
Dim resMem As RFEM5.Member
resMem.LineNo = resLine.no
resMem.no = index_m + 1
resMem.Type = ResultBeamType
resMem.StartCrossSectionNo = resCrsc.no
resMem.Rotation = selMem.Rotation
' enviar dados para o RFEM
' #################
iModData.PrepareModification
- Nós de iModData.SetNodes
- Linhas iModData.SetLines
- iModData.SetSuperfície
- iModData.SetNodes resNodes
- iModData.SetLine resLine
- iModData.SetCrossSection resCrsc
- iModData.SetMember resMem
iModData.FinishModification
#/code#
Após criar a barra (também nós, linhas, secções e superfícies), tem de determinar e transferir os parâmetros para a viga resultante. Uma barra resultante integra as forças internas de outros elementos (barras, superfícies, sólidos) e transforma-as em forças internas de barras de acordo com a sua posição. Para incluir os elementos corretos, uma barra resultante tem duas opções básicas. É possível especificar os elementos a serem integrados e adicionalmente limitar o intervalo de integração através de um sólido (cilindro ou cuboide). Neste caso, são utilizados o número da nova superfície de nervura e os números das superfícies da largura efetiva, se houver. Como área de integração, é selecionado o cuboide que (visto localmente) pode ser definido nas direções +/- y e +/- z. Os valores de RibCrossSection são utilizados novamente como valores. Tenha em atenção que, no caso de faltar uma largura efetiva, ainda assim deve ser utilizada uma largura de integração para que o piso acima da nervura fique integrado corretamente. A largura adicional deve, portanto, ser metade da espessura da superfície.
- código.vb#
' definir parâmetros da viga resultante
' ######################
Dim resBeam As RFEM5.ResultBeam
Dim iResBeam como RFEM5.IResultBeam
Definir iResBeam = iModData.GetMember(resMem.no, AtNo).GetExtraData
resBeam = iResBeam.GetData
' definir elementos integrados
Se selRb.SurfaceNoSide1 Então
- resBeam.IncludeSurfaces = str(selRb.SurfaceNoSide1) & ,
End If
Se selRb.SurfaceNoSide2 Então
- resBeam.IncludeSurfaces = resBeam.IncludeSurfaces & str(selRb.SurfaceNoSide2) &,
End If
resBeam.IncludeSurfaces = resBeam.IncludeSurfaces & str(surf.no)
' definir área de integração
resBeam.Integrate = LengthCubidGeneral
Dim resBeamParam(0 To 3) As duplo
' +y, -y, +z, -z
Se selRb.WidthSide2 Então
- resBeamParam(0) = selRb.WidthSide2 - rbCrsc.Eccentricity.Y
Else
- resBeamParam(0) = 0,5 * rbCrsc.Web Thickness - rbCrsc.Eccentricity.Y
End If
Se selRb.WidthSide1 Então
- resBeamParam(1) = selRb.WidthSide1 + rbCrsc.Eccentricity.Y
Else
- resBeamParam(1) = 0,5 * rbCrsc.WebEspessura + rbCrsc.Eccentricity.Y
End If
resBeamParam(2) = rbCrsc.Depth
resBeamParam(3) = rbCrsc.Depth
resBeam.Parameters = resBeamParam
' enviar novos parâmetros da barra resultante para o RFEM
iModData.PrepareModification
iResBeam.SetData resBeam
iModData.FinishModification
#/code#
Eliminar a barra de nervura
Uma vez que a nova nervura foi criada a partir de superfícies, pode agora eliminar a barra (a antiga nervura). Pode eliminar qualquer elemento utilizando a função DeleteObjects da interface IModelData. Novamente, uma vez que os elementos são modificados, tem de utilizar um bloco de modificação Prepare/Finish.
- código.vb#
' Remover nervura
'########
iModData.PrepareModification
iModData.DeleteObjects MemberObject, str(selMem.no)
iModData.FinishModification
#/code#
Conclusão
Na sua simplicidade, as nervuras como barras nem sempre cobrem todos os aspetos de um modelo mais complexo. Criar uma nervura de barra é simples, por isso o programa aqui apresentado combina a criação simples de uma nervura como barra com a modelação e representação mais detalhadas de uma nervura a partir de uma superfície. Além de elementos já conhecidos, como as interfaces para a barra (IMember), foi introduzida a interface IRib, que dá acesso à secção da nervura, entre outras coisas. Também lemos o sistema de eixos local de uma barra e criamos a superfície da nervura através do cálculo vetorial.
Perspetivas
Existem opções para o refinamento do programa. Por exemplo, poderia incluir a consideração da posição da nervura (superior, inferior, meio). Outra opção seria a extensão para nervuras de secção variável ou até mesmo para nervuras em linhas curvas.