3382x
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 os parâmetros das nervuras (secção, orientação, etc.)
  2. Criar superfície de nervura
  3. criar uma barra de resultados
  4. Eliminar barra de nervura

No texto a seguir, mostraremos trechos de todo o código -fonte como exemplos. É possível 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ção EnableSelections. Enquanto o EnableSelections estiver ativado com true, apenas os elementos selecionados serão lidos no RFEM. A leitura da barra selecionada tem esta aparência.

'obter interface do modelo ativo
Set iMod = iApp.GetActiveModel
        
'obter interface de dados do modelo (estrutural)
Dim iModData As RFEM5.IModelData2
Set iModData = iMod.GetModelData
        
'obter membro selecionado
iModData.EnableSelections True

Dim mems() As RFEM5.Member
Dim selMem As RFEM5.Member
mems = iModData.GetMembers
selMem = mems (0)

iModData.EnableSelections False

Os seguintes parâmetros são necessários para a modelação de nervura:

  • Secção da nervura, números de superfície 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 contido na barra através de Member.RibNo.

'obter parâmetros de nervura
'#####################
Dim iRb As RFEM5.IRib
Definir iRb = iModData.GetRib (selMem.RibNo, AtNo)

Dim selRb As RFEM5.Rib
selRb = iRb.GetData

Dim rbCrsc As RFEM5.RibCrossSection
rbCrsc = iRb.GetRibCrossSection

A interface para a nervura oferece dois elementos diferentes: os dados gerais da nervura através da estrutura de nervuras e os dados da secção transversal da nervura através de RibCrossSection. Nervura contém os números de superfície, a posição da nervura e as larguras efetivas. RibCrossSection contém a descrição e as dimensões da secção de 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 é acessado através da interface com a barra. A função IMemer.GetLocalCoordinateSystem devolve a estrutura CoordateSystem.

Dim aconchegante 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 z positivo. Como a nervura também pode estar em planos oblíquos, a superfície deve ser criada com a orientação da barra. A variável aconchegante 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, indica a distância e a direção da borda inferior da nervura. Para as linhas de contorno da superfície da nervura, este vetor é multiplicado pela altura da nervura e adicionado aos nós inicial e final. Isto resulta nos dois nós de extremidade da linha de borda inferior da superfície da nervura. Tenha em atenção o seguinte: a altura da nervura também inclui metade da espessura da superfície da largura efetiva. Para simplificação, é utilizada apenas a espessura da superfície do primeiro lado (-y no sistema de eixos local) a partir da secção da nervura (UpperLeftFlangeThickness). Depois de os nós estarem disponíveis, pode gerar as linhas de contorno e a superfície da nervura.

'criar/calcular nós
'######################
Dim Dim () As RFEM5.Node
nodes = selNodes
nós (0) .no = index_n + 1
nós (1) .no = index_n + 2
Dim h_rib As Double
h_rib = (rbCrsc.Depth - rbCrsc.UpperLeftFlangeThickness/2)
nós (0) .X = nós (0) .X + h_rib * cosy.AxisZ.X
nós (0) .Y = nós (0) .Y + h_rib * cosy.AxisZ.Y
nós (0) .Z = nós (0) .Z + h_rib * cosy.AxisZ.Z
nós (1) .X = nós (1) .X + h_rib * cosy.AxisZ.X
nós (1) .Y = nós (1) .Y + h_rib * cosy.AxisZ.Y
nós (1) .Z = nós (1) .Z + h_rib * cosy.AxisZ.Z

'criar linhas
'############
Escurecer as 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 surf As RFEM5.Surface
surf.BoundaryLineCount = 4
surf.BoundaryLineList = str (selLine.no) + "," + str (linhas (0) .no) + "," + str (linhas (2) .no) + "," + str (linhas (1)) não)
surf.Comment = "nervura"
surf.GeometryType = PlaneSurfaceType
surf.MaterialNo = selCrsc.MaterialNo
surf.Thickness.Type = ConstantThicknessType
surf.Thickness.Constant = rbCrsc.WebThickness
surf.StiffnessType = StandardStiffnessType
surf.no = índice_ + 1

As variáveis index_n, index_l, index_s contêm 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 viga resultante, como a nervura, é constituída por dois elementos: a estrutura padrão Barra e os dados adicionais ResultBeam. Só pode modificar os dados adicionais através da interface para a barra, por isso tem de criar primeiro 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 no RibCrossSection. Assim, pode copiar os nós inicial e final da nervura original e utilizá -los como base. Você pode mover os nós copiados para a localização correta usando os vetores de direção y e z do sistema de eixos local da barra. Para um dimensionamento posterior, a viga 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 string de CrossSection.Description.

'criar nós para a barra de resultados e calcular excentricidade
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.Eccentricidade.Z * cosy.AxisZ.X + rbCrsc.Eccentricidade.Y * cosy.AxisY.X
resNodes (0) .Y = selNodes (0) .Y + rbCrsc.Eccentricidade.Z * cosy.AxisZ.Y + rbCrsc.Eccentricidade.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.Eccentricidade.Z * cosy.AxisZ.X + rbCrsc.Eccentricidade.Y * cosy.AxisY.X
resNodes (1) .Y = selNodes (1) .Y + rbCrsc.Eccentricidade.Z * cosy.AxisZ.Y + rbCrsc.Eccentricidade.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 Como RFEM5.RfLine
resLine.no = index_l + 4
resLine.NodeCount = 2
resLine.Type = PolylineType
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 = índice_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 iModData.SetNodes
Linhas iModData.SetLines
iModData.SetSurface surf
iModData.SetNodes resNodes
iModData.SetLine resLine
iModData.SetCrossSection resCrsc
iModData.SetMember resMem

iModData.FinishModification

Após criar a barra (também nós, linhas, secção e superfície), tem de determinar e transferir os parâmetros para a viga resultante. Uma viga resultante integra as forças internas de outros elementos (barras, superfícies, sólidos) e os transforma em forças internas de barra de acordo com a sua posição. Para incluir os elementos corretos, uma viga resultante tem duas opções básicas. É possível especificar os elementos a serem integrados e limitar adicionalmente o intervalo de integração através de um sólido (cilindro ou cubóide). Neste caso, é utilizado o número da nova superfície de nervura e o número das superfícies das larguras efetivas, se houver. Como área de integração, é selecionado o cuboide, o qual (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 falta de uma largura efetiva, ainda deve ser utilizada uma largura de integração para que o piso acima da nervura seja corretamente integrado. A largura adicional deve, portanto, ser metade da espessura da superfície.

'definir parâmetros da viga de resultados
'##########################
Dim resBeam Como 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 = WithinCuboidGeneral
Dim resBeamParam (0 a 3) como duplo
'+ y, -y, + z, -z
Se selRb.WidthSide2 Então
resBeamParam (0) = selRb.WidthSide2 - rbCrsc.Eccentricity.Y
Else
resBeamParam (0) = 0,5 * rbCrsc.WebThickness - rbCrsc.Eccentricity.Y
End If
Se selRb.WidthSide1 Então
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

'enviar novos parâmetros de barra de resultados ao RFEM
iModData.PrepareModification
iResBeam.SetData resBeam
iModData.FinishModification

Eliminar barra nervurada

Uma vez que a nova nervura foi criada a partir de superfícies, pode agora eliminar a barra (a nervura antiga). Pode eliminar qualquer elemento utilizando a função DeleteObjects da interface IModelData. Novamente, uma vez que os elementos são modificados, é necessário utilizar um bloco de modificações Prepare/Finish.

'Remover nervura
'##########
iModData.PrepareModification
iModData.DeleteObjects MemberObject, str (selMem.no)
iModData.FinishModification

Resumo

Na sua simplicidade, as nervuras como barras nem sempre podem cobrir todos os aspectos de um modelo mais complexo. Criar uma nervura de barra é simples e, portanto, o programa aqui apresentado combina a criação simples de uma nervura como uma barra com a modelação mais detalhada e a representação de uma nervura a partir de superfícies. Além dos elementos já conhecidos, tais como as interfaces para a barra (IMember), introduzimos, entre outras coisas, a interface IRib, que fornece acesso à secção da nervura. Também lemos o sistema de eixos local de uma barra e criamos a superfície da nervura utilizando o cálculo de vetores.

Perspetivas

Existem opções para refinamento no programa. Por exemplo, pode considerar a consideração da posição da nervura (superior, inferior, média). Outra opção seria a extensão para nervuras de secção variável ou mesmo para nervuras em linhas curvas.


Autor

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

Ligações
Downloads