3377x
001639
2020-07-20

Transformación de un nervio en un modelo de superficie con viga de resultados utilizando VBA

Si un nervio es parte de un cálculo no lineal o está conectado rígidamente a los muros siguientes, para el modelado se debe usar una superficie en lugar de una barra. Para que el nervio se pueda diseñar todavía como una barra, se necesita una barra de resultados con la excentricidad correcta, la cual transforma los esfuerzos internos de la superficie en esfuerzos internos de la barra.

Ya que el modelado de dicho nervio basado en una superficie con la viga de resultados es bastante más complicado que crear un elemento del tipo nervio, el siguiente programa en EXCEL-VBA convertirá el nervio basado en una barra en un modelo de superficie incluyendo la viga de resultados.

Para transformar un nervio en un modelo de superficie, son necesarios los siguientes pasos:

  1. Leer los parámetros del nervio (sección, orientación, etc.)
  2. Crear la superficie del nervio
  3. Crear la viga de resultados
  4. Eliminar la barra del nervio

A continuación, mostraremos extractos del código fuente completo como ejemplos. Puede descargar el código completo al final de este artículo.

Leer los parámetros del nervio

Tiene la opción de seleccionar el nervio a transformar seleccionándolo desde la interfaz del programa. Para esto, es necesario trabajar con la función EnableSelections. Mientras EnableSelections esté activado con true, solo se leerán los elementos seleccionados de RFEM. La lectura de la barra seleccionada es la siguiente.

'   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

Se necesitan los siguientes parámetros para el modelado del nervio:

  • Sección del nervio, números de superficies y anchos eficaces
  • Orientación del nervio
  • Material del nervio

En RFEM, un nervio es un tipo de barra. Cuando utiliza la programación a través de la interfaz COM, debe obtener los datos de un nervio a través de dos interfaces diferentes. Por un lado, está la interfaz para la barra y, por otro lado, está la interfaz para el nervio. La interfaz con un nervio se puede obtener a través de IModelData.GetRib. GetRib espera el número de nervio contenido en la barra a travé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

La interfaz con el nervio ofrece dos elementos diferentes: los datos generales del nervio a través de la estructura y los datos de su sección a través de RibCrossSection. El nervio contiene los números de superficie, su posición y los anchos eficaces. RibCrossSection contiene la descripción y las dimensiones de la sección interna del nervio, que también se utiliza en RF-CONCRETE Members (ITCU).

Además, se necesita la orientación, que está disponible a través del sistema de ejes local de la barra. Puede acceder al sistema de ejes a través de la interfaz para la barra. La función IMemer.GetLocalCoordinateSystem devuelve la estructura CoordinateSystem.

Dim cosy As RFEM5.CoordinateSystem
cosy = iModData.GetMember(selMem.no, AtNo).GetLocalCoordinateSystem(0#).GetData

GetLocalCoordinateSystem todavía espera la posición x de la barra, que se ha establecido en 0,0 o el inicio aquí. Además de los parámetros mencionados, también se requiere el material de la barra, que se puede obtener a través de su sección transversal.

Dim selCrsc As RFEM5.CrossSection
selCrsc = iModData.GetCrossSection(selMem.StartCrossSectionNo, AtNo).GetData

Crear la superficie del nervio

El programa está creado inicialmente para nervios rectos en el lado z positivo. Ya que el nervio también puede estar en planos oblicuos, debe crear la superficie utilizando la orientación de la barra. La variable cosy para el sistema de ejes local de la barra incluye el vector de dirección para el eje z cosy.AxisZ local con sus tres valores x, y, z. Este vector se normaliza de forma que, multiplicado por la altura del nervio, indica la distancia y dirección del borde inferior del nervio. Para las líneas de contorno de la superficie del nervio, este vector se multiplica por su altura y se agrega al nudo inicial y final. Esto da como resultado los dos nudos extremos de la línea de borde inferior de la superficie del nervio. Tenga en cuenta lo siguiente: la altura del nervio también incluye la mitad del espesor de la superficie del ancho eficaz. Para simplificar, solo se usa el espesor de la superficie del primer lado (-y en el sistema de ejes local) desde la sección del nervio (UpperLeftFlangeThickness). Después de que los nudos estén disponibles, puede generar las líneas de contorno y la superficie del nervio.

'   create/calculate nodes
'   ######################
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

'   create lines
'   ############
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)
líneas (1) .NodeList = str (selNodes (1) .no) + "," + str (nudos (1) .no)
lines(2).NodeList = str(nodes(0).no) + "," + str(nodes(1).no)

'crear superficie
'   ##############
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

Las variables index_n, index_l e index_s contienen el último índice del elemento respectivo de RFEM. Consulte el código fuente para descargar al final de este artículo para determinar los índices.

Crear la viga de resultados

La viga de resultados, como el nervio, consta de dos elementos: la estructura estándar Member y los datos adicionales ResultBeam. Solo puede modificar los datos adicionales a través de la interfaz para la barra, de modo que primero tiene que crear la barra y luego puede transferir los datos a través de la interfaz IMember. Como la barra generalmente tiene que ser excéntrica, los nudos inicial y final se crean directamente en el centro de cortante sin excentricidad de la barra. La excentricidad se guarda en RibCrossSection. Por lo tanto, puede copiar los nudos inicial y final del nervio original y usarlos como base. Usando los vectores de dirección y, z del sistema de ejes local del elemento, puede mover los nudos copiados a la ubicación correcta. Para un diseño posterior, la viga de resultados también requiere una sección, que se copia primero del nervio original. A continuación, se importa la descripción de la sección desde RibCrossSection y CrossSection.TextID, de lo contrario se utilizará para la creación de la sección en lugar de la cadena de CrossSection.Description.

'       create nodes for result member and calculate eccentricity
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

'       create line
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)

'       create cross section
Dim resCrsc As RFEM5.CrossSection
resCrsc = selCrsc
resCrsc.description = rbCrsc.description
resCrsc.no = index_c + 1
resCrsc.TextID = ""

'       create member
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

'   send data to 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

Después de haber creado la barra (también nudos, líneas, sección y superficie), debe determinar y transferir los parámetros para la viga de resultados. Una viga de resultados integra los esfuerzos internos de otros elementos (barras, superficies, sólidos) y los transforma en esfuerzos internos de la barra según su posición. Para incluir los elementos correctos, una viga de resultados tiene dos opciones básicas. Puede especificar los elementos a integrar y limitar adicionalmente el intervalo de integración por medio de un sólido (cilindro o cuboide). En este caso, se usa el número de la nueva superficie del nervio y los números de las superficies de los anchos eficaces, si los hay. Como área de integración, se selecciona el cuboide, que (visto localmente) se puede definir en la dirección +/- y- y +/- z-. Los valores de RibCrossSection se utilizan de nuevo como valores. Tenga en cuenta que, en el caso de que falte el ancho eficaz, aún se debe utilizar un ancho de integración para que el piso sobre el nervio se integre correctamente. Por lo tanto, el ancho adicional debe ser la mitad del espesor de la superficie.

'   set result beam parameters
'   ##########################
Dim resBeam As RFEM5.ResultBeam
Dim iResBeam As RFEM5.IResultBeam
Set iResBeam = iModData.GetMember(resMem.no, AtNo).GetExtraData
resBeam = iResBeam.GetData

'       set integrated elements
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)

'       set integration area
resBeam.Integrate = WithinCuboidGeneral
Dim resBeamParam(0 To 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

'       send new result beam parameters to RFEM
iModData.PrepareModification
iResBeam.SetData resBeam
iModData.FinishModification

Eliminar la barra del nervio

Dado que el nuevo nervio se creó a partir de superficies, ahora puede eliminar la barra, el nervio anterior. Puede eliminar cualquier elemento utilizando la función DeleteObjects de la interfaz IModelData. De nuevo, como los elementos se han modificado, debe usar un bloque de modificación Prepare/Finish.

'   Remove Rib
'##########
iModData.PrepareModification
iModData.DeleteObjects MemberObject, str(selMem.no)
iModData.FinishModification

Conclusión

En su simplicidad, los nervios modelados como barras no siempre pueden cubrir todos los aspectos de un modelo más complejo. La creación de un nervio de barra es simple y, por lo tanto, el programa presentado aquí combina la creación simple de un nervio como una barra con el modelado y visualización más detallados de un nervio a partir de superficies. Además de los elementos ya conocidos, como las interfaces para la barra (IMember), presentamos la interfaz IRib, que proporciona acceso a la sección del nervio, entre otras cosas. También leímos el sistema de ejes local de una barra y creamos la superficie del nervio usando el cálculo vectorial.

Resumen

Hay opciones para el refinamiento en el programa. Por ejemplo, podría incluir la consideración de la posición del nervio (posición superior, inferior o central). Otra opción sería la extensión a nervios de sección variable o incluso a nervios en líneas curvas.


Autor

El Sr. Günthel proporciona soporte técnico para los clientes de Dlubal Software y se ocupa de sus solicitudes.

Enlaces
Descargas