3575x
001639
2020-07-20

Transformação de nervura em modelo de superfície com barra resultante utilizando VBA

Se uma nervura faz parte de um dimensionamento não linear ou está rigidamente ligada às paredes seguintes, deve ser utilizada uma superfície para a modelação em vez de uma barra. Para que a nervura ainda possa ser dimensionada como uma barra, é necessária uma barra resultante com a excentricidade correta, que transforma as forças internas da superfície em forças internas da barra.

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:

  1. Ler parâmetros da nervura (secção, orientação etc.)
  2. Criar superfície de nervura
  3. criar uma barra de resultados
  4. 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.

  1. 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.

  1. 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

  1. Nós de iModData.SetNodes
  2. Linhas iModData.SetLines
  3. iModData.SetSuperfície
  4. iModData.SetNodes resNodes
  5. iModData.SetLine resLine
  6. iModData.SetCrossSection resCrsc
  7. 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.

  1. 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

  1. resBeam.IncludeSurfaces = str(selRb.SurfaceNoSide1) & ,

End If
Se selRb.SurfaceNoSide2 Então

  1. 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

  1. resBeamParam(0) = selRb.WidthSide2 - rbCrsc.Eccentricity.Y

Else

  1. resBeamParam(0) = 0,5 * rbCrsc.Web Thickness - rbCrsc.Eccentricity.Y

End If
Se selRb.WidthSide1 Então

  1. resBeamParam(1) = selRb.WidthSide1 + rbCrsc.Eccentricity.Y

Else

  1. 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.

  1. 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.


Autor

O Eng. Günthel opera na área do apoio técnico para clientes.

Ligações
Downloads


;