Source code for NaxToPy.Core.Classes.N2PFreeBody

""" Module with all the FreeBody related classes.
"""
from NaxToModel import N2FBDSection, N2FBD, N2FBDResult
from NaxToPy.Core.Classes.N2PNode import N2PNode
from NaxToPy.Core.Classes.N2PElement import N2PElement
from NaxToPy.Core.Classes.N2PCoord import N2PCoord
from NaxToPy.Core.Classes.N2PIncrement import N2PIncrement
from NaxToPy.Core.Classes.N2PLoadCase import N2PLoadCase
from array import array

# Esta chapuza es para poder crear variables de C#, que son las que necesita el las propiedades de N2FBDSection
import System

[docs] class N2PFreeBody(object): """ Main class for free bodies analysis. """ __slots__ = ( "__name", "__loadcase", "__increment", "__nodelist", "__elementlist", "__coordsys", "__model", "__outpoint", "__fbdresult", "__centroid" ) def __init__(self, name: str, loadcase: N2PLoadCase, increment: N2PIncrement, nodelist: list[N2PNode], elementlist: list[N2PElement], modelfather, coordsys: N2PCoord = None, outpoint: tuple[float] = None): """ Constructor of the N2PFreeBody class. It generates a free body in the section defined with the node and element list passed as arguments. If no outpoint is given, resultant will be calculated in the centroid. Args: name: str -> Must be unique. If a new FreeBody is name as an old one, the old FreeBody will be deleted. loadcase: N2PLoadCase increment: N2PIncrement nodelist: list[N2PNode] elementlist: list[N2PElement] coordsys: N2PCoord = None outpoint: tuple[float] = None """ self.__name = name self.__loadcase = loadcase self.__increment = increment self.__nodelist = nodelist self.__elementlist = elementlist self.__coordsys = coordsys self.__model = modelfather self.__outpoint = outpoint self.__fbdresult = None if outpoint is not None: self.__centroid = False else: self.__centroid = True # Llamada al constructor de NaxToModel n2fbdsection = N2FBDSection(self.__name) n2fbdsection.OpenFile = self.__model._N2PModelContent__vzmodel # Se incluye la parte: n2fbdsection.NodesPartID = self.__model._N2PModelContent__StrPartToID.get(self.__nodelist[0].PartID, 0) # Si se define un sistema de coordenadas se evalua la propiedad, si no, no se evalua y se usara el global if coordsys is not None: n2fbdsection.CoordSystem = self.__coordsys._N2PCoord__info # Si se define un punto donde calcular los freebodies se añade a la propiedad Point. Si no no se hace nada y # se usara el centroide if not self.__centroid: pointcoords = array("d", self.__outpoint) point = N2FBDSection.N2FBDPointCoordinates(n2fbdsection) point.Coordinates = pointcoords n2fbdsection.Point = point else: n2fbdsection.OpenFile = self.__model._N2PModelContent__vzmodel # Se añaden los nodos usando su id de solver. La parte es la misma para todo_ y se define antes for node in self.__nodelist: n2fbdsection.NodesId.Add(node.ID) # Se añaden los elementos usando su id de solver. La parte es la misma para todo_ y se define antes for element in self.__elementlist: n2fbdsection.ElementsId.Add(element.ID) # Instancio un objeto de la clase N2FBD n2fbd = N2FBD(n2fbdsection) # Le añado los casos de carga y los incrementos: listacasos = System.Collections.Generic.List[System.Int32]() listaframes = System.Collections.Generic.List[System.Int32]() listacasos.Add(self.__loadcase.ID) listaframes.Add(self.__increment.ID) n2fbd.GetGpforcesLcInc(listacasos, listaframes) # Ejecuto el métedo que calcula las resultantes (por fin) # tuple_lc_inc = System.Tuple[System.Int32](self.__loadcase.ID, self.__increment.ID) # tuple_lc_inc = System.Tuple[int, int](self.__loadcase.ID, self.__increment.ID) tuple_lc_inc = System.Tuple.Create(self.__loadcase.ID, self.__increment.ID) self.__fbdresult = n2fbd.FBDCalculate(tuple_lc_inc) # Metodo para obtener el Nombre del Free Body ---------------------------------------------------------------------- @property def Name(self) -> str: """ Nombre del Free Body. """ return self.__name # ------------------------------------------------------------------------------------------------------------------ # Método para obtener el Módulo de la Fuerza Resultante ------------------------------------------------------------ @property def FTotal(self) -> float: """ Module of the resultant Force. """ return float(self.__fbdresult.FTotal) # ------------------------------------------------------------------------------------------------------------------ # Método para obtener el Módulo del Momento Resultante ------------------------------------------------------------- @property def MTotal(self) -> float: """ Module of the resultant Moment. """ return float(self.__fbdresult.MTotal) # ------------------------------------------------------------------------------------------------------------------ # Método para obtener el Vector de Fuerza Resultante --------------------------------------------------------------- @property def Force(self) -> tuple[float, float, float]: """ Vector of the resultant Force. """ return (float(self.__fbdresult.Section_Forces_FX), float(self.__fbdresult.Section_Forces_FY), float(self.__fbdresult.Section_Forces_FZ),) # ------------------------------------------------------------------------------------------------------------------ # Método para obtener el Vector de Momento Resultante -------------------------------------------------------------- @property def Moment(self) -> tuple[float, float, float]: """ Vector of the resultant Moment. """ return (float(self.__fbdresult.Section_Forces_MX), float(self.__fbdresult.Section_Forces_MY), float(self.__fbdresult.Section_Forces_MZ),) # ------------------------------------------------------------------------------------------------------------------ # Método para obtener el caso de carga del free body --------------------------------------------------------------- @property def LoadCase(self): """ Load Case of the Free Body. """ return self.__loadcase # ------------------------------------------------------------------------------------------------------------------ # Método para obtener el incremeneto del free body ----------------------------------------------------------------- @property def Increment(self): """ Increment of the Free Body. """ return self.__increment # ------------------------------------------------------------------------------------------------------------------ # Método para obtener la lista de nodos ---------------------------------------------------------------------------- @property def NodeList(self): """ List of nodes of the Free Body. """ return self.__nodelist # ------------------------------------------------------------------------------------------------------------------ # Método para obtener la lista de elementos ------------------------------------------------------------------------ @property def ElementList(self): """ Lista de elementos of the Free Body. """ return self.__elementlist # ------------------------------------------------------------------------------------------------------------------ # Método para obtener el punto donde los resultados han sido calculados -------------------------------------------- @property def OutPoint(self): """ Returns the point where the resultants were calculated. Centroid by default. """ return tuple(self.__fbdresult.NodeCoords) # ------------------------------------------------------------------------------------------------------------------ # Método para obtener el Sistema de Coordenadas donde los resultados han sido calculados --------------------------- @property def OutSys(self): """ Returns de Coordinate System where the resultants were calculated. """ return self.__coordsys
# ------------------------------------------------------------------------------------------------------------------