import os
import sys
import logging
import time
import atexit
from abc import ABC
from typing import Literal
from NaxToPy.Core.Errors.N2PFileHandler import FileHandler
# Clase que se encarga del registro de NaxToPy -------------------------------------------------------------------------
[docs]
class N2PLog(ABC):
""" Class prepared for the control of the program.
It uses the module logging to register the main instructions and
data of the NaxToPy Package. It can't be instanced.
Attributes:
LevelList
"""
# Aqui se definen los atributos de la clase, cuyo concepto es ligeramente diferente ald de los de la instancia
flv = "INFO"
clv = "WARNING"
__levellist = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
# Nivel de registro del archivo .log
if flv == "DEBUG":
__flevel = logging.DEBUG
elif flv == "WARNING":
__flevel = logging.WARNING
elif flv == "ERROR":
__flevel = logging.ERROR
elif flv == "CRITICAL":
__flevel = logging.CRITICAL
else:
__flevel = logging.INFO
# Nivel de registro de lo que sale por consola
if clv == "DEBUG":
__clevel = logging.DEBUG
elif clv == "WARNING":
__clevel = logging.WARNING
elif clv == "ERROR":
__clevel = logging.ERROR
elif clv == "CRITICAL":
__clevel = logging.CRITICAL
else:
__clevel = logging.INFO
__directory = os.path.dirname(os.path.abspath(sys.argv[0]))
if __directory == "C:\\Users":
__directory = os.path.expanduser("~") + "\\Documents\\"
__filename = time.strftime("NaxToPy_%Y-%m-%d.log", time.localtime())
__path = os.path.join(__directory, __filename)
__logger = logging.getLogger('Logger')
__logger.setLevel("DEBUG")
# Formato en el que se presenta los datos del registro en el archivo .log
__formatter = logging.Formatter("%(asctime)s %(levelname)-8s %(message)-5s", "%H:%M:%S")
# File with the loggin data:
__fh = FileHandler(__path)
__fh.setLevel(__flevel)
__fh.setFormatter(__formatter)
__logger.addHandler(__fh)
# Formato en el que se presenta los datos del registro en la consola
__formatter = logging.Formatter("%(asctime)s %(levelname)-8s %(message)-5s", "%H:%M:%S")
# Loggin data shown in the console
__ch = logging.StreamHandler()
__ch.setLevel(__clevel)
__ch.setFormatter(__formatter)
__logger.addHandler(__ch)
# Primera instruccion en el logger
__logger.info("############### NaxToPy Started ###############")
# Ultima instruccion en el logger
atexit.register(__logger.info, "############### NaxToPy Finished ###############\n")
# Tras cualquier error critico, contemplado o no, se ejecuta esta funcion. Se comprueba si el ultimo error
# almacenado era crtico o no, se escribe el archivo .log y se activa el logger. Si el ultimo error almacenado no
# era critico o no hay errores almacenados es porque el error que ha causado el fallo no estaba contemplado. En
# ese caso se llama al error C001 y despues se escribe el log
def _my_excepthook(excType, excValue, traceback, logger=__logger, fh=__fh):
if not fh.buffered_records:
previous_critical = fh.buffered_records[-1].getMessage().startswith('C')
else:
previous_critical = False
if not previous_critical:
logger.critical("C001: UNCAUGHT CRITICAL EXCEPTION: ", exc_info=(excType, excValue, traceback))
fh.write_buffered_records()
fh.immediate_logging()
# ----------------------------------------------------------------------------------------------------------------
sys.excepthook = _my_excepthook
# ATRIBUTOS COMO CLASES DE LA CLASE N2PLog PARA INTRODUCIR DATOS EN EL REGISTRO -----------------------------------
############################################ DEBUG ###############################################################
[docs]
class Debug:
""" Class with all the debug data.
The DXXX are methods that keep in the register the information in the
debuggibg procces about the processes that the package is keeping. Use only in the debug stages.
"""
[docs]
@staticmethod
def user(message: str) -> None:
"""Method prepared to be called by the user for adding debugs data to the loggin
Anyone who is using NaxToPy can write in the register their
own debug message. Use the following structure as a standard message (D + four digits + Body).
Args:
message: str
Example:
"DXXXX: Body of the message"
"""
N2PLog._N2PLog__logger.debug(message)
[docs]
@staticmethod
def D100(instruction, timee) -> None:
"""Method for timing the instructions during debug
"""
message = f"Time (s) {instruction}: {timee}"
N2PLog._N2PLog__logger.debug(message)
[docs]
@staticmethod
def D101(path) -> None:
"""Method that shows the location of the NaxToModel library found"""
message = f"NaxToModel found at: {path}"
N2PLog._N2PLog__logger.debug(message)
[docs]
@staticmethod
def D102() -> None:
"""Method that shows if the property Program_Call of N2ModelContent was changed"""
message = f"Program_Call of N2ModelContent has been set"
N2PLog._N2PLog__logger.debug(message)
[docs]
@staticmethod
def D103(parallel) -> None:
"""Method that shows the parallel option set at low level"""
message = f"The parallel processing has been set to {parallel}"
N2PLog._N2PLog__logger.debug(message)
[docs]
@staticmethod
def D200(assembly) -> None:
"""Message that shows the assembly version of the core library"""
message = f"The assembly version is: {assembly}"
N2PLog._N2PLog__logger.debug(message)
[docs]
@staticmethod
def D201(result_file) -> None:
"""Message that shows that the results from a file were loaded correctly"""
message = f"The results from {result_file} were loaded correctly"
N2PLog._N2PLog__logger.debug(message)
[docs]
@staticmethod
def D500(current_time,tinit) -> None:
""" Information given for the extraction time.
"""
message = f"D500: Extraction time: {current_time-tinit} s"
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def D501(current_time,tinit) -> None:
""" Information given for computation time of elastic modulus.
"""
message = f"D501: Elastic modulus calculation time: {current_time-tinit} s"
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def D502(current_time,tinit) -> None:
""" Information given for computation time of set intersection
"""
message = f"D502: Set intersection computation time: {current_time-tinit} s"
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def D503(current_time,tinit) -> None:
""" Information given for computation time of fastener update
"""
message = f"D503: Fastener update computation time: {current_time-tinit} s"
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def D504(current_time,tinit) -> None:
""" Information given for loading time of the model
"""
message = f"D504: Model loading time: {current_time-tinit} s"
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def D600(current_time, tinit) -> None:
""" Information given for result obtention time.
"""
message = f"D600: Result obtention time: {current_time - tinit} s"
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def D601(current_time, tinit) -> None:
""" Information given for fasteners obtention time.
"""
message = f"D601: Fasteners obtention time: {current_time - tinit} s"
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def D602(current_time, tinit) -> None:
""" Information given for fasteners analysis time.
"""
message = f"D602: Fasteners analysis time: {current_time - tinit} s"
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def D603(current_time, tinit) -> None:
""" Information given for fasteners attachments obtention time.
"""
message = f"D603: Fasteners attachments obtention time: {current_time - tinit} s"
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def D604(current_time, tinit) -> None:
""" Information given for fasteners whole calculation time.
"""
message = f"D604: Fasteners whole calculation time: {current_time - tinit} s"
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def D605(current_time, tinit) -> None:
""" Information given for fasteners distance obtention time. """
message = f"D605: Fasteners distance obtention time: {current_time - tinit} s"
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def D606(current_time, tinit) -> None:
""" Information given for fasteners force obtention time. """
message = f"D605: Fasteners forces obtention time: {current_time - tinit} s"
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def D607(current_time, tinit) -> None:
""" Information given for fasteners bypass loads obtention time. """
message = f"D605: Fasteners bypass loads obtention time: {current_time - tinit} s"
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def D608(current_time, tinit) -> None:
""" Information given for results export time. """
message = f"D605: Fasteners results export time: {current_time - tinit} s"
N2PLog._N2PLog__logger.info(message)
# ------------------------------------------------------------------------------------------------------------------
############################################ INFO ################################################################
[docs]
class Info:
""" Class with all the information data. The IXXX are methods that keep in the register the information
about the processes that the package is keeping.
"""
[docs]
@staticmethod
def user(message) -> None:
""" Method prepared to be used by the user so anyone who is using NaxToPy can write in the register their
own information message. Use the following structure as a standard message (I + four digits + Body).
"IXXXX: Body of the message"
"""
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def I100() -> None:
""" Information that show that the NaxToPy Runing Code.
"""
from NaxToLicense import LicenseManager
from System import DateTime
from datetime import datetime
current_date = datetime.now()
time_date = DateTime(current_date.year, current_date.month, current_date.day, current_date.hour,
current_date.minute, current_date.second)
licen = LicenseManager()
if not licen.HasLicense():
err = LicenseManager.GenerateCommunityLicense()
licen.HasLicense()
code = licen.GetRunCode(time_date)
message = f"I100: NaxToPy Running with the code: {code}"
N2PLog._set_format2(time_date.ToString().split(" ")[1])
N2PLog._N2PLog__logger.info(message)
N2PLog._set_format1()
[docs]
@staticmethod
def I101(vizzer_libs) -> None:
""" Information that show that the NaxTo libraries were correctly found at vizzer_libs.
"""
message = f"I101: The NaxTo libraries were found successfully at {vizzer_libs}."
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def I102(value) -> None:
message = f"I102: The directory of the .log file has been modified to {value} ."
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def I103(value) -> None:
message = f"I103: The name of the .log file has been modified to {value} ."
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def I104() -> None:
message = f"I104: Numpy installation has been successfully completed."
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def I105() -> None:
""" Information given when the register is modified correctly.
"""
message = f"I105: The windows register was modified with the path of the NaxTo libraries successfully."
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def I106(register, key_version) -> None:
""" Information given when the register is modified correctly.
"""
message = f"I106: Key for {key_version} created successfully in {register}."
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def I107() -> None:
""" Information given when the program is called from a .exe file.
"""
message = "I107: Working with the executable version libraries of NaxTo."
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def I108() -> None:
""" Information given when the program use the develover version of NaxToModel.
"""
message = "I108: Working with developer version of NaxToModel."
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def I109() -> None:
""" Information given when the NaxToModel library is load correctly.
"""
message = f"I109: The library NaxToModel.dll was load successfully."
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def I110(path) -> None:
""" Information given when the file .N2P is saved correctly.
"""
message = f"I110: The file {path} has been successfully saved."
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def I111(path) -> None:
""" Information given when the result file is initialize correctly.
"""
message = f"I111: The file {path} has been successfully opened."
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def I112() -> None:
""" Information given when the result the mesh is build correctly.
"""
message = "I112: The mesh has been successfully created."
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def I200() -> None:
""" Information given when the NaxToPy.ico is found correctly.
"""
message = "I200: The NaxToPy icon file has been successfully found."
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def I201(file) -> None:
""" Information given when the .exe file built with n2ptoexe() is correctly created.
"""
message = f"I201: The .exe file has been successfully created at {file}."
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def I202(id) -> None:
""" Information given when the .exe file built with n2ptoexe() is correctly created.
"""
message = f"I202: The Active Increment has been set to the ID: {id}"
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def I203() -> None:
""" Information given when the module N2PEnvelope is executing.
"""
message = f"I203: Executing N2PEnvelope..."
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def I500() -> None:
""" Information given when the ID list is empty.
"""
message = f"I500: All load cases will be studied because no ID list was given."
N2PLog._N2PLog__logger.info(message)
[docs]
@staticmethod
def I501() -> None:
""" Information given when the ID list is empty.
"""
message = f"I501: All fasteners will be studied because no ID list was given."
N2PLog._N2PLog__logger.info(message)
# ------------------------------------------------------------------------------------------------------------------
########################################### WARNING ##############################################################
[docs]
class Warning:
""" Class with all the warnings. The WXXX are methods that keep in the register the warnings that might be
revised. They don't affect directly to the correct working of the package.
"""
[docs]
@staticmethod
def user(message) -> None:
""" Method prepared to be used by the user so anyone who is using NaxToPy can write in the register their
own warning message. Use the following structure as a standard message (W + four digits + Body).
"WXXXX: Body of the message"
"""
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W100() -> None:
""" Warning raised when numpy is not installed and it will be installed using pip
"""
message = "W100: numpy package is not installed. In order to execute this method, the package is needed. \n" + \
" The installation will start in 10 seconds ."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W101() -> None:
""" Warning raised when the register level of the .log file is intended to change, as it could make more difficult to track errors
"""
message = "W101: Register level of the .log has changed to a higher filter. This can make more difficult to track errors."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W102(path) -> None:
""" Warning raised when the Windows Register is modified by NaxToPy
"""
message = f"W102: The Windows Register has been modified: CURRENT_USER/SOFTWARE/IDAERO -> Path = {path}" + \
" If NaxTo is installed afterwards, this key must be deleted"
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W103() -> None:
""" Warning raised when the Windows Register is modified by NaxToPy: The Path value is deleted
"""
message = f"W103: The Path Value in Windows Register has been deleted."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W104(naxver) -> None:
""" Warning raised when the version NaxTo that this NaxToPy version is prepared for is not found
"""
message = f"W104: This NaxToPy should work with {naxver}, that is NOT found. Checking compatibility with" \
f"other versions installed"
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W105() -> None:
""" Warning raised when the assemblies founded are not saved as compatible
"""
message = f"W105: No library was found to be compatible with this NaxToPy version. The package may" \
f"work but is recommended to find a compatible NaxTo or NaxToPy version."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W106(e) -> None:
""" Warning raised when the register couldn't be destroyed
"""
message = f"W106: The NaxTo key couldn't be destroyed. It may cause some errors in the future. Error:{e}"
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W107(versions: list) -> None:
""" The NaxToModel.dll was loaded successfully, but it may not be fully compatible.
"""
message = (f"W107: The NaxTo library was loaded successfully, but it may not be fully compatible.\n"
f"\tConsider to use this NaxToPy versions: {versions}")
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W110(depre_method, new_method) -> None:
""" Deprecated Warning
"""
message = f"W110: The {depre_method} is deprecated. Please use {new_method} instead"
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W200() -> None:
""" Warning raised when the executable file is build without the icon
"""
message = "W200: The .exe file will not have the NaxToPy icon. There should have been an error while loading it"
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W201() -> None:
""" Warning raised when the AbaqusVersion is asked but the solver is not Abaqus
"""
message = "W201: The Abaqus version is None as the solver is not ABAQUS"
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W202() -> None:
""" Warning raised when the number of elements don't match with the size of the results
"""
message = "W202: The number of elements don't match with the size of the results"
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W203(key) -> None:
""" Warning raised when there are two connectors with the same id. So they are saved in the connector dict
as a list.
"""
message = f"W203: there are two or more connectors with the same id. They are saved in the connector" + \
f"dict as a list with the same key: {key}."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W204() -> None:
""" Warning raised when there is no Model Data from an Input File.
"""
message = f"W204: There is no data from an input file data supported"
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W205() -> None:
""" Warning raised when there the Deprecated function "Initialize" is called.
"""
message = f"W205: Initialize is a deprecated function. Please, use load_model instead"
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W206() -> None:
""" Warning raised when there the Deprecated property "ActiveIncrement" is called.
"""
message = f"W206: ActiveIncrement is a deprecated property. Please, ActiveN2pIncrement to obtain a " \
f"N2PIncrement or ActiveN2pIncrement.ID to obtain the ID"
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W207() -> None:
""" Warning raised when there the Deprecated class "N2PModelInputData" is called.
"""
message = f"W207: N2PModelInputData class is a deprecated. Please, use N2PNastranInputData"
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W300() -> None:
""" Warning raised when there are more dimensions than points in n2p.envelope
"""
message = f"W300: there are more dimensions than points as arguments in n2p.envelope"
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W301(name) -> None:
""" Warning raised when the name for the new derived load case already exist
"""
message = f"W301: the name for the new load case already exist. It has been rename to '{name}'"
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W500(listids) -> None:
""" Warning raised when a CBUSH or CBAR has not a defined Diameter.
"""
message = f"W500: Fasteners {listids} have not a defined Diameter and are either CBUSH or CBAR. The input diameter needs to be used"
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W501(bolt) -> None:
""" Warning raised when a CBUSH is defined with coincident nodes.
"""
message = f"W501: CBUSH {bolt.ID} is discarded for the study because it is defined with coincident nodes"
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W502(bolt) -> None:
""" Warning raised when a CFAST is defined as PROP.
"""
message = f"W502: CFAST {bolt.ID} ignored: defined as PROP."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W503(bolt) -> None:
""" Warning raised when a Fastener property is not found.
"""
message = f"W503: Fastener {bolt.ID} ignored: property not found."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W504(bolt) -> None:
""" Warning raised when a Fastener plates are not found.
"""
message = f"W504: Fastener {bolt.ID} ignored: plates not found."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W505(bolt) -> None:
''' Warning raised when a fastener element is not found.
'''
message = f"W505: Fastener {bolt.ID} skipped. Element not found."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W506(bolt) -> None:
''' Warning raised when a fastener intersection with the plate is not found.
'''
message = f"W506: Fastener {bolt.ID} ignored: intersection with the plate not found."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W507(bolt) -> None:
''' Warning raised when different types of properties found in the same joined plate elements.
'''
message = f"W507: Different types of properties found in the same joined plate elements: not consistent. Fastener {bolt.ID} ignored."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W508(bolt) -> None:
''' Warning raised when direction of elements 1D wrt connected plates not consistent.
'''
message = f"W508: Direction of elements 1D wrt connected plates not consistent. Fastener {bolt.ID} ignored."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W509(bolt) -> None:
''' Warning raised when different type of elements 1D in the same bolt.
'''
message = f"W509: Different type of elements 1D in the same bolt: not consistent. Fastener {bolt.ID} ignored."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W510(listids) -> None:
''' Warning raised when a fastener has not a provided head position.
'''
message = f"W510: Fasteners {listids} have not a provided head position, so the inner element 1D order is set indistinctly."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W511() -> None:
''' Warning raised when calculation using the results in the centroid.
'''
message = f"W511: Calculation using the results in the centroid may not be as precise as when Corner Data is used."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W512(plate, bolt) -> None:
''' Warning raised when element not found.
'''
message = f"W512: Skipping plate {plate.ID} of bolt {bolt.ID}. Element not found."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W513(bolt) -> None:
''' Warning raised when intersection point with plate not defined.
'''
message = f"W513: Intersection point with plate not defined. Bypass calculation skipped in fastener {bolt.ID}."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W514(bolt) -> None:
''' Warning raised when normal to plate not defined.
'''
message = f"W514: Normal to plate not defined. Bypass calculation skipped in fastener {bolt.ID}."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W515(bolt) -> None:
''' Warning raised when distance to edge not defined.
'''
message = f"W515: Distance to edge not defined. Bypass calculation skipped in fastener {bolt.ID}."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W516(bolt) -> None:
''' Warning raised when no plate elements found.
'''
message = f"W516: No plate elements found. Bypass calculation skipped in fastener {bolt.ID}."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W517() -> None:
''' Warning raised when a plate is not an ARPlate.
'''
message = f"W517: Plate omitted. Incorrect class: Should be ARPlate."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W518() -> None:
''' Warning raised when a fastener is not an AR1DElement.
'''
message = f"W518: Fastener omitted. Incorrect class: Should be AR1DElement."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W519(elem) -> None:
''' Warning raised when a element is not CQUAD4 nor CTRIA3.
'''
message = f"W519: Element {elem.ID} is not CQUAD4 nor CTRIA3."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W520(plate) -> None:
'''Warning raised when a plate has no elements adjacent.'''
message = f"W520: Plate with element ID {plate.GlobalID[0]} has not enough adjacent elements and its bypass loads will not be calculated."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W521(lcID) -> None:
'''Warning raised when a load case doesn't have a complete set of results'''
message = f"W521: load case {lcID} has some missing results and will be ignored."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W522() -> None:
'''Warning raised when, in N2PGetLoadFasteners, the get_fasteners attribute is set while the model or list_joints attribute is also set'''
message = f"W522: The model and/or list_joints attribute is already set. They will be overwritten."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W523() -> None:
'''Warning raised when, in N2PGetLoadFasteners, the model attribute is set while the get_fasteners attribute is also set'''
message = f"W523: The model attribute has already been set by get_fasteners. It will be overwritten."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W524() -> None:
'''Warning raised when, in N2PGetLoadFasteners, the list_joints attribute is set while the get_fasteners attribute is also set'''
message = f"W524: The list_joints attribute has already been set by get_fasteners. It will be overwritten."
N2PLog._N2PLog__logger.warning(message)
[docs]
@staticmethod
def W525() -> None:
'''Warning raised when, in N2PGetLoadFasteners, the type_export attribute is not NAXTOPY or ALTAIR'''
message = f"W525: Type of export not supported. The results will be exported in NAXTOPY style. Try <<NAXTOPY>> or <<ALTAIR>>."
N2PLog._N2PLog__logger.warning(message)
# ------------------------------------------------------------------------------------------------------------------
############################################ ERROR ###############################################################
[docs]
class Error:
""" Class with all the errors that can be expected.
They should be handeled by a try-exception clasule. The errors are method that do not return anything,
they write in the log file and console the error.
"""
[docs]
@staticmethod
def user(message: str) -> None:
""" Method prepared to be called by the user for adding errors to the loggin
This anyone who is using NaxToPy can write in the register their
own error message. Use the following structure as a standard message (E + four digits + Body).
Args:
message: str
Example:
"EXXXX: BODY OF THE MESSAGE"
"""
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E101() -> None:
""" Error raised when the NaxTo libraries couldn't be found.
"""
message = "E101: THE NAXTO LIBRARIES COULDN'T BE FOUND."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E102() -> None:
""" Error raised when the value to set the directory where the .log file is not a string.
"""
message = "E102: THE DIRECTORY OF THE .log MUST BE A STRING."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E103() -> None:
""" Error raised when the value to set the file name of the .log is not a string.
"""
message = "E103: THE FILE NAME OF THE .log MUST BE A STRING."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E104() -> None:
""" Error raised when directory of the .log couldn't be changed.
"""
message = "E104: THE DIRECTORY OF THE .log COULDN'T BE CHANGED."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E105() -> None:
""" Error raised when the file name of the .log couldn't be changed.
"""
message = "E105: THE FILE NAME OF THE .log COULDN'T BE CHANGED."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E106() -> None:
""" Error raised when there is an error while closing the windows register after modifing.
"""
message = "E106: THE WINDOWS REGISTER COULDN'T BE CLOSED PROPERLY."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E107(levellist) -> None:
""" Error raised when the register level is intended to change and the level is not one of the possible choices.
"""
message = f"E107: THE REGISTER LEVEL IS NOT OF THE POSSIBLE ONES ({levellist})."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E108() -> None:
""" Error raised when the change of register level of the .log file fails.
"""
message = f"E108: THE REGISTER LEVEL OF THE .log FILE COULDN'T BE CHANGED."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E109() -> None:
""" Error raised when the change of register level of the console fails.
"""
message = f"E109: THE REGISTER LEVEL OF THE CONSOLE COULDN'T BE CHANGED."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E110(path) -> None:
""" Error raised when the n2ptoexe tries to createa exe from a module that dont use NaxToPy.
"""
message = f"E110: THE MODULE IN {path} DOESN'T USE NaxToPy"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E111() -> str:
""" Error raised when a file with an extension of a binary result file is intended to be loaded as
nastran input text file
"""
message = f"E111: THE FILE THAT IS INTENDED TO LOAD IS BINARY RESULT FILE, NOT A NASTRAN INPUT TEXT FILE"
N2PLog._N2PLog__logger.error(message)
return message
[docs]
@staticmethod
def E112(er) -> str:
""" Error raised when the Windows Register couldn't be modified
"""
message = f"E112: THE WINDOWS REGISTER COULDN'T BE MODIFIED. ERROR: {er}"
N2PLog._N2PLog__logger.error(message)
return message
[docs]
@staticmethod
def E113(file) -> str:
""" Error raised when the Windows Register couldn't be modified
"""
message = f"E113: THE FILE {file} DOESN'T EXIST OR COULDN'T BE FOUND"
N2PLog._N2PLog__logger.error(message)
return message
[docs]
@staticmethod
def E201(*args) -> None:
''' Error raised when the id of the node is not in the node dictionary.
'''
message = "E201: NODE " + str(*args) + " NOT FOUND."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E202(*args) -> None:
''' Error raised when the id of the element is not in the element dictionary.
'''
message = "E202: ELEMENT " + str(*args) + " NOT FOUND."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E203(*args) -> None:
''' Error raised when the id of the coordinate system is not in the coord dictionary.
'''
message = "E203: COORDINATE SYSTEM " + str(*args) + " NOT FOUND."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E204(*args) -> None:
''' Error raised when the id of the connector is not in the coord dictionary.
'''
message = "E204: CONNECTOR " + str(*args) + " NOT FOUND."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E205(*args) -> None:
''' Error raised when the arguments are no recognize by the function.
'''
message = "E205: THE INPUT " + str(*args) + " IS NOT RECOGNIZE."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E206(arg) -> None:
''' Error raised when the component don't have any results.
'''
message = "E206: THE COMPONENT " + str(arg) + " DON'T HAVE ANY RESULTS WITH THE SPECIFIED CONFIG."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E207(arg) -> None:
''' Error raised when there is not any Increment with the ID specified.
'''
message = f"E207: THE INCREMENT WITH THE ID {arg} DOESN'T EXIST."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E208() -> None:
"""
Error raised when there is not any result. Some arguments may be the problem.
"""
message = "E208: THERE IS NOT ANY RESULT WITH THE SPECIFICATION GIVEN."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E209(name) -> None:
"""
Error raised when there is not ID for the property (Abaqus don't use ids for properties).
"""
message = f"E209: THERE IS NOT ID FOR THE PROPERTY {name}"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E210(name) -> None:
"""
Error raised when there is not PartID for the property (Abaqus don't use ids for properties).
"""
message = f"E210: THERE IS NOT PartID FOR THE PROPERTY {name}"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E211() -> None:
"""
Error raised when the increment asked is not an id(int) or a name(str).
"""
message = f"E211: THE ARGUMENT FOR GET INCREMENT MUST BE A NAME(str) or an ID(int)"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E212(id) -> None:
"""
Error raised when the increment asked is found.
"""
message = f"E212: THE INCREMENT {id} WAS NOT FOUND"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E213(name) -> None:
"""
Error raised when the result asked is found.
"""
message = f"E213: THE RESULT {name} WAS NOT FOUND"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E214() -> None:
"""
Error raised when the result asked is not name(str).
"""
message = f"E214: THE ARGUMENT FOR GET RESULT MUST BE A NAME(str)"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E215(name) -> None:
"""
Error raised when the component asked is not found.
"""
message = f"E215: THE COMPONENT {name} WAS NOT FOUND"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E216() -> None:
"""
Error raised when the component asked is not name(str).
"""
message = f"E216: THE ARGUMENT FOR GET COMPONENT MUST BE A NAME(str)"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E217(name) -> None:
"""
Error raised when the derived component asked is not found.
"""
message = f"E215: THE DERIVED COMPONENT {name} WAS NOT FOUND"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E218() -> None:
"""
Error raised when the sections asked in the get_array function.
"""
message = f"E218: THE SECTIONS MUST BE A LIST OF STRINGS IN THE GET ARRAY RESULT"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E219() -> None:
"""
Error raised when the component selected is not transformable.
"""
message = f"E219: THE COMPONET SELECTED IS NOT TRANSFORMABLE"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E220() -> None:
"""
Error raised when there is an error during the processing of the output coord system.
"""
message = f"E220: ERROR SELECTION THE OUTPUT COORDINATE SYSTEM"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E221(arg) -> None:
''' Error raised when the id of the load case is not found.
'''
message = F"E221: THE LOAD CASE WITH ID {arg} DOESN'T EXIST IN THE MODEL."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E222(arg) -> None:
''' Error raised when the NAME of the load case is not found.
'''
message = F"E222: THE LOAD CASE WITH NAME {arg} DOESN'T EXIST IN THE MODEL."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E223() -> None:
''' Error raised when the get element need the part and not only the id.
'''
message = F"E223: THE PART IS NEEDED AS A INPUT IN get_elements(arg). TRY USING A TUPLE: (id, part)"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E224() -> None:
''' Error raised when the get nodes need the part and not only the id.
'''
message = F"E224: THE PART IS NEEDED AS A INPUT IN get_nodes(arg). TRY USING A TUPLE: (id, part)"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E225() -> None:
''' Error raised when the get connectors need the part and not only the id.
'''
message = F"E225: THE PART IS NEEDED AS A INPUT IN get_connectors(arg). TRY USING A TUPLE: (id, part)"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E226() -> None:
''' Error raised when ABD matrix is not invertible.
'''
message = F"E226: THE ABD MATRIX IS NOT INVERTIBLE"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E227(rep_id) -> None:
''' Error raised when there is a repeated ID in the properties
'''
message = f"E227: THE PROPERTY ID {-rep_id} IS REPEATED. ONE WILL BE SAVE WITH THE SIGN CHANGE"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E228(formula, vz_msg) -> None:
''' Error raised when the formula introduced for a new derived loadcase is wrong
'''
message = f"E228: THE FORMULA INTRODUCED TO CREATE A DERIVED LOAD CASE \"{formula}\" IS WRONG: {vz_msg}"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E229(formula, vz_msg) -> None:
''' Error raised when the formula introduced for a new envelope loadcase is wrong
'''
message = f"E229: THE FORMULA INTRODUCED TO CREATE A ENVELOPE LOAD CASE \"{formula}\" IS WRONG: {vz_msg}"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E230(formula, vz_msg) -> None:
''' Error raised when the formula introduced for a new derived component is wrong
'''
message = f"E230: THE FORMULA INTRODUCED TO CREATE DERIVED COMPONENT \"{formula}\" IS WRONG: {vz_msg}"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E231() -> str:
''' Error raised when the argument "where" of load_user_coord_sys_from_csv is not "NODES" or "ELEMENTS"
'''
message = f"E231: THE ARGUMENT 'where' MUST BE 'ELEMENTS' OR 'NODES'"
N2PLog._N2PLog__logger.error(message)
return message
[docs]
@staticmethod
def E232(result_file) -> None:
"""Error raised when the file to import results don't exist """
message = f"E232: The file {result_file} don't exist"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E300(args) -> None:
''' Error raised when the program fail to save the model (as a N2PModelContent object).
'''
prueba = list(locals().keys())
message = "E300: THE MODEL {prueba} COULDN\'T BE SAVE."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E301(args) -> None:
''' Error raised when the extension of the file path that is intended to save is wrong.
'''
message = "E301: FILE {args} HAS A WRONG EXTENSION."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E302(args) -> None:
''' Error raised when the program faile to load the model (as a N2PModelContent object) from a .N2P file.
'''
message = "E302: THE MODEL COULDN'T BE LOAD FROM {args}."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E303(args) -> None:
''' Error raised when the extension of the file path that is intended to load is wrong.
'''
message = "E303: FILE {args} HAS A WRONG EXTENSION."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E304() -> None:
''' Error raised when NaxToPy.ico is not found.
'''
message = f"E304: NAXTOPYTHON ICON WAS NOT FOUND IN THE PACKAGE (icon.ico)."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E305() -> None:
''' Error raised when the length of the columns of the cloud of points don't macht in N2PEnvelope.
'''
message = f"E305: THE LENGHT OF THE DATA INCLUDED MUST HAVE THE SAME LENGTH"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E306() -> None:
''' Error raised when the arguments of envelope are not valid.
'''
message = f"E306: THE ARGUMENTS OF 'envelope' MUST BE A DATAFRAME OR LISTS"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E307() -> None:
''' Error raised when the dataframe of envelope has NaN values.
'''
message = f"E307: THE DATAFRAME ARGUMENT HAS NAN VALUES IN IT. PLEASE CHECK THE INPUTS"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E308() -> None:
''' Error raised when qhull library fails (wrong inputs, coplanar points, etc).
'''
message = f"E308: THE INNER LIBRARY FAILED (WRONG INPUTS OR COPLANAR POINTS)"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E309() -> None:
''' Error raised when qhull library fails (wrong inputs, coplanar points, etc).
'''
message = f"E309: THE INNER LIBRARY FAILED (INSUFFICIENT NUMBER OF POINTS)"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E310() -> None:
''' Error raised when the inputs list(tuple(LC, Incr)) for getting results for LC and Incr are wrong.
'''
message = f"E310: THE LIST OF LOAD CASES AND INCREMENTS MUST BE A A LIST OF TUPLES. THE TUPLE MUST BE " + \
f"(N2PLOADCASE, N2PINCREMENT) OR (INT[id_lc], INT[id_incr])"
N2PLog._N2PLog__logger.error(message)
@staticmethod
def E311() -> None:
''' Error raised when the sortby parameter of the N2PReport is not one of the possible ones.
'''
message = f"E311: THE SORTBY PARAMETER FOR A N2PREPORT MUST BE 'LC' OR 'IDS' "
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E312(lc, result) -> None:
''' Error raised when the components asked for the N2PReport are not found in the result of the loadcase
'''
message = f"E312: THE COMPONENTS ASKED FOR THE N2PREPORT ARE NOT IN THE RESULT {result} OF THE " \
f"LOAD CASE {lc}"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E313() -> None:
''' Error raised when there is an error in the arguments, probably in the formulas.
'''
message = f"E313: THERE IS AN ERROR IN THE ARGUMENTS OF THE METHOD new_report()"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E314() -> None:
''' Error raised when there is an error generating the report in VizzerClasses.
'''
message = f"E314: INTERNAL ERROR WHILE CALCULATING THE REPORT. PLEASE, CHECK THE ARGUMENTS"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E315() -> str:
''' Error raised when the matrix couldn't be inverted.
'''
message = f"E315: THE ROTATION MATRIZ COULDN'T BE INVERTED"
N2PLog._N2PLog__logger.error(message)
return message
[docs]
@staticmethod
def E316() -> str:
"""Error raised when the string used in N2PAbaqusInputData.get_keywords_by_type is not a valid one"""
message = f"E316: THE STRING USED IN N2PAbaqusInputData.get_keywords_by_type() DOESN'T MATCH WITH ANY OF" \
f"POSSIBLES"
N2PLog._N2PLog__logger.error(message)
return message
[docs]
@staticmethod
def E400() -> None:
''' Error raised when the atttribute of a N2PCard is intended to change and the new value lenght don't match
with the previous.
'''
message = f"E400: THE LENGTH OF THE LIST DONT MATCH WITH THE PREVIOUS LENGTH LIST ATTRIBUTE OF A N2PCARD"
N2PLog._N2PLog__logger.error(message)
# ------------------------------------------------------------------------------------------------------------------
[docs]
@staticmethod
def E311(propID) -> None:
''' Error raised when young modulus is not found.
'''
message = f"E311: YOUNG MODULUS COULD NOT BE FOUND FOR PROPERTY {propID}"
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E500() -> None:
''' Error raised when an element not found correctly when trying to create plates.
'''
message = f"E500: Element not found correctly or not supported."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E501() -> None:
''' Error raised when a prop not found correctly or it is not supported.
'''
message = f"E501: Property not found correctly or not supported."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E502() -> None:
''' Error raised when a mat not found correctly or it is not supported.
'''
message = f"E502: Material not found correctly or not supported."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E503(bolt) -> None:
''' Error raised when fastener is said to have the Head in a middle element1D.
'''
message = f"E503: Bad definition of fastener {bolt.ID}: said to have the Head in a middle element1D."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E504() -> None:
''' Error raised when load cases/s are not found.
'''
message = f"E504: Load cases/s not found."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E505(bolt) -> None:
''' Error raised when a fastener is not connected to 2 plates.
'''
message = f"E505: Fastener {bolt.ID} was not computed because it is not connected to 2 plates."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E506(bolt) -> None:
''' Error raised when a fastener diameter is not defined.
'''
message = f"E506: Diameter not defined. Bypass calculation skipped for fastener {bolt.ID}."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E507(bolt) -> None:
''' Error raised when iterations > max_iter.
'''
message = f"E507: Unable to calculate bypass loads in fastener {bolt.ID} because iterations > Max Iterations."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E508(bolt) -> None:
''' Error raised when there is a problem with the geometry of the fastener.
'''
message = f"E508: Fastener {bolt.ID} was not computed because there is a problem with its geometry."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E509(bolt) -> None:
''' Error raised when no forces were correctly retrieved.
'''
message = f"E509: Fastener {bolt.ID} discarded because no forces were correctly retrieved."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E510() -> None:
''' Error raised when there is an error in the isoparametric transformation.
'''
message = f"E510: Cannot obtain u and v in isoparametric transformation."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E511() -> None:
''' Error raised when elements are not supported in interpolation.
'''
message = f"E511: Interpolation only supported for triangular and quadrilateral elements."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E512() -> None:
''' Error raised when the number of components of the vector and the reference systems are not multiple of 3
in the rotation.'''
message = f"E512: The number of components of the vector and the reference systems must be multiple of 3."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E513() -> None:
''' Error raised when the type is not supported.'''
message = f"E513: Not supported type. Not serializing."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E514() -> None:
''' Error raised when trying to serialize something that is not a list.'''
message = f"E514: Can only serialize lists. Not serializing."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E515() -> None:
''' Error raised when trying to deserialize something that is not a list.'''
message = f"E515: Not supported type. Not deserializing."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E516() -> None:
''' Error raised when trying to deserialize something that is not a list.'''
message = f"E516: Can only deserialize lists. Not deserializing."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E517(listids) -> None:
''' Error raised when having fasteners with wrong diameter.'''
message = f"E517: Fasteners {listids} will not be calculated because they have a wrong or no diameter definition."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E518() -> None:
'''Error raised when solver_id_list is not present but part_id is in get_joints(...)'''
message = f"E518: If part_id is present, then solver_id_list must also be present."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E519() -> None:
'''Error raised when part_id is not present but solver_id_list is in get_joints()'''
message = f"E519: If solver_id_list is present, then part_id must also be present."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E520() -> None:
'''Error raised when no joints have been imported'''
message = f"E520: No N2Joints have been imported."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E521() -> None:
'''Error raised when no model has been imported'''
message = f"E521: No N2PModelContent has been imported."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E522() -> None:
'''Error raised when, in N2PGetFasteners, the get_distance or get_attachments method is used before the get_joints() one'''
message = f"E522: No N2PJoints have been created. Try using get_joints()."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E523() -> None:
'''Error raised when, in N2PGetLoadFasteners, no N2PJoints have been imported'''
message = f"E523: No N2PJoints have been imported."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E524() -> None:
'''Error raised when, in N2PGetLoadFasteners, the get_forces_joints() or get_bypass_joints() methods are used before the get_results_joints() one'''
message = f"E524: No results have been created. Try using get_results_joints()."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E525(loadcase) -> None:
'''Error raised when the loadcases attribute is not filled with integers'''
message = f"E525: Loadcase {loadcase} is not correctly defined. It should be an integer representing the load case's ID."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E526(export) -> None:
'''Error raised when the wrong export style is used.'''
message = f"E526: Export type {export} not supported."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E527() -> None:
'''Error raised when the used solver is not Nastran'''
message = f"E527: Solver not supported. Try using a model with Nastran or the new N2PGetFasteners module."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E528(parameter) -> None:
'''Error raised when the bypass parameters dictionary is not well defined'''
message = f"E528: Bypass parameter {parameter} is not well defined."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E529() -> None:
'''Error raised when, in N2PGetLoadFasteners, the export_results() method is used before the get_forces_joints() one'''
message = f"E529: No forces have been calculated. Try using get_forces_joints()."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E530() -> None:
'''Error raised when, in N2PGetLoadFasteners, the export_results() method is used before the get_bypass_joints() one'''
message = f"E530: No bypass loads have been calculated. Try using get_bypass_joints()."
N2PLog._N2PLog__logger.error(message)
[docs]
@staticmethod
def E531(path) -> None:
'''Error raised when a loaded file does not exist or is not a file'''
message = f"E531: Path {path} does not exist or is not a file."
N2PLog._N2PLog__logger.error(message)
########################################### CRITICAL #############################################################
[docs]
class Critical:
"""Class with all the critical errors.
The critical are methods that do not return anything, they write in the log file and console the error.
Optionally a raise Exception could be added. Always a sys.exit() should be executed at the end.
"""
[docs]
@staticmethod
def user(message: str) -> None:
"""Method prepared to be called by the user for adding CRITICAL errors to the loggin.
Anyone who is using NaxToPy can write in the register their own CRITICAL error message.
Use the following structure as a standard message (C + four digits + Body).
Args:
message: str
Example:
"CXXXX: BODY OF THE MESSAGE"
"""
N2PLog._N2PLog__logger.critical(message)
[docs]
@staticmethod
def C001(message):
N2PLog._N2PLog__logger.critical(message)
[docs]
@staticmethod
def C100(path, error) -> str:
""" Critical error raised when the model couldn't be initialized.
"""
message = f"C100: THE MODEL IN THE FILE {path} COULDN'T BE INITIALIZED. (Vizzer Error: {error})"
N2PLog._N2PLog__logger.critical(message)
return message
[docs]
@staticmethod
def C101(error) -> str:
""" Critical error raised when the mesh couldn't be generated.
"""
message = f"C101: THE MESH COULDN'T BE GENERATED. (Vizzer Error: {error})"
N2PLog._N2PLog__logger.critical(message)
return message
[docs]
@staticmethod
def C102(py_version) -> str:
""" Critical Error raised when the current python version is not supported.
"""
message = f"C102: THE CURRENT PYTHON VERSION ({py_version}) IS NOT SUPPORTED."
N2PLog._N2PLog__logger.critical(message)
return message
[docs]
@staticmethod
def C103() -> str:
""" Critical Error raised when VizzerClasses.dll is not properly load.
"""
message = f"C103: THE LIBRARY 'NaxToModel.dll' COULDN'T BE LOADED CORRECTLY"
N2PLog._N2PLog__logger.critical(message)
return message
[docs]
@staticmethod
def C104() -> str:
""" Critical Error raised when the console argument in n2ptoexe is not a bool type.
"""
message = f"C104: THE ARGUMENT CONSOLE MUST BE A BOOLEAN: True | False"
N2PLog._N2PLog__logger.critical(message)
return message
[docs]
@staticmethod
def C105(directions) -> None:
""" Critical Error raised when the argument abaqus version in n2ptoexe is wrong or not supported.
"""
message = f"C105: THE ARGUMENT ABAQUSVERSION MUST BE ONE OF THE AVIABLE: {directions}"
N2PLog._N2PLog__logger.critical(message)
[docs]
@staticmethod
def C106() -> str:
""" Critical Error raised when the pyinstaller is not installed and it couldn´t be downloaded.
"""
message = f"C106: THE PACKAGE PyInstaller COULDN'T BE LOADED. PLEASE INSTALL IT MANUALLY"
N2PLog._N2PLog__logger.critical(message)
return message
[docs]
@staticmethod
def C107() -> str:
""" Error raised when the NaxTo libraries couldn't be found.
"""
message = "C107: THE NAXTO LIBRARIES COULDN'T BE FOUND. PLEASE, INSTALL NAXTO"
N2PLog._N2PLog__logger.critical(message)
return message
[docs]
@staticmethod
def C108(path) -> str:
""" Error raised when the file couldn't be found.
"""
message = f"C108: THE FILE {path} DOESN'T EXIST"
N2PLog._N2PLog__logger.critical(message)
return message
[docs]
@staticmethod
def C109(ver, comp_ver) -> None:
""" Error raised when NaxTo is not compatible with NaxToPy.
"""
message = f"C109: THIS VERSION OF NAXTOPY ({ver}) IS NOT COMPATIBLE WITH THIS ASSEMBLY VERSION: {comp_ver}"
N2PLog._N2PLog__logger.critical(message)
[docs]
@staticmethod
def C110(ver, naxver) -> str:
""" Error raised when there aren't installed a compatible version of with minor changes.
"""
message = (f"C110: THIS VERSION OF NAXTOPY({ver}) IS NOT COMPATIBLE WITH THE NAXTO VERSIONS THAT ARE INSTALLED.\n"
f"\tUPDATE TO A COMPATIBLE NAXTO VERSION ({naxver}) OR DOWNLOAD FROM https://pypi.org/project/NaxToPy/ A COMPATIBLE NAXTOPY VERSION")
N2PLog._N2PLog__logger.critical(message)
return message
[docs]
@staticmethod
def C111(ver) -> None:
""" Error raised when there version of NaxTo is not found.
"""
message = f"C111: NAXTO VERSION WAS NOT FOUND. PLEASE, CHECK IF NAXTO{ver} IS INSTALLED"
N2PLog._N2PLog__logger.critical(message)
[docs]
@staticmethod
def C112() -> str:
""" Error raised when there is an Elements safearray error in VizzerClasses (Vizzer Error: -1003). This
error could happen when the memory of the processor tthat call the low level libraries has a leak (is not
correctly erased). A solution may be change the initialize method to parallel.
"""
message = f"C112: ERROR RAISED WHEN THERE IS AN ERROR IN THE SA OF ELEMENTS. THIS MAY BE CAUSED BY A MEMORY" \
f"LEAK IN THE LOW LEVEL LIBRERIES. A SOLUTION MAY BE CHANGE THE \"initilaize\" method to parallel:" \
f"model = NaxToPy.load_model(path, parallelprocessing=True)"
N2PLog._N2PLog__logger.critical(message)
return message
[docs]
@staticmethod
def C113(lib, ver, listver) -> str:
""" Error raised when the NaxToPy versions the dll is compatible with is not this one
"""
message = f"C113: THE LIBRARY {lib} IS NOT COMPATIBLE WITH NAXTOPY {ver}. INSTALL ANY OF THESE VERSION OF" \
f"NAXTOPY {listver} OR UPDATE NAXTO"
N2PLog._N2PLog__logger.critical(message)
return message
[docs]
@staticmethod
def C114(path) -> str:
""" Register gave a path to a file that doen't exist
"""
message = f"C114: THE FILE THE IN THE PATH THE REGISTER GAVE DOESN'T EXIST: {path}"
N2PLog._N2PLog__logger.critical(message)
return message
[docs]
@staticmethod
def C200() -> None:
""" Critical error raised when numpy couldn't be installed.
"""
message = "C200: NUMPY PACKAGE COULDN\'T BE INSTALLED. PLEASE, INSATALL IT MANUALY."
N2PLog._N2PLog__logger.critical(message)
[docs]
@staticmethod
def C201() -> None:
""" Critical error raised when the type of the argument of N2PAbaqusInputData.get_keywords_by_type is not a
string.
"""
message = "C201: THE ARGUMENT FOR N2PAbaqusInputData.get_keywords_by_type() MUST BE A STRING"
N2PLog._N2PLog__logger.critical(message)
[docs]
@staticmethod
def C500() -> None:
""" Critical error raised when numpy couldn't be installed.
"""
message = "C500: SOLVER NOT SUPPORTED."
N2PLog._N2PLog__logger.critical(message)
[docs]
@staticmethod
def C520() -> None:
'''Critical error raised when all load cases are broken.'''
message = f"C520: ALL LOAD CASES HAVE MISSING RESULTS."
N2PLog._N2PLog__logger.error(message)
# ------------------------------------------------------------------------------------------------------------------
####################################################################################################################
################## METODOS GETTER Y SETTER PARA USAR LOS ATRIBUTOS COMO PROPIEDADES ##############################
####################################################################################################################
# Nota: Estos metodos cambian los atributos del objeto que se ha instanciado como clase N2PLog y que se
# ha guardado dentro del atributo _ De ahí que estos metodos no vayan como propiedades.
# Metodo para obtener la lista de niveles del registro -------------------------------------------------------------
@classmethod
@property
def LevelList(cls) -> list[str]:
"""Property that retuns the list with the message levels in the log"""
return cls.__levellist
# ------------------------------------------------------------------------------------------------------------------
# Metodo para obtener directorio donde se guarda el archivo.log ----------------------------------------------------
[docs]
@classmethod
def get_directory(cls) -> str:
"""Method that returns the folder where the .log file is being saved"""
return cls.__directory
# ------------------------------------------------------------------------------------------------------------------
# Metodo para declarar directorio donde se guarda el archivo.log ---------------------------------------------------
[docs]
@classmethod
def set_directory(cls, value: str) -> None:
"""Method that sets the folder where the .log file must be saved
Args:
value: str -> Path to the folder where the .log must be saved.
"""
if isinstance(value, str):
cls.__directory = value
cls.__path = os.path.join(cls.__directory, cls.__filename)
cls.__fh.path = cls.__path
else:
cls.Error.E102()
# ------------------------------------------------------------------------------------------------------------------
# Metodo para cambiar el nivel de registro del fichero .log---------------------------------------------------------
[docs]
@classmethod
def set_file_level(cls, flv: Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]) -> None:
""" Method to set a different level for the file .log of the register. The default level is "INFO". Only The level
register and higher will be printed in the .log file. Higher levels could make more difficult to track errors.
The possible levels are:
"DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL".
"""
if flv in cls.LevelList:
if flv == "DEBUG":
flevel = logging.DEBUG
elif flv == "WARNING":
flevel = logging.WARNING
elif flv == "ERROR":
flevel = logging.ERROR
elif flv == "CRITICAL":
flevel = logging.CRITICAL
else:
flevel = logging.INFO
try:
if flv in ["WARNING", "ERROR", "CRITICAL"]:
cls.Warning.W101()
cls.__flevel = flevel
cls.__fh.setLevel(cls.__flevel)
#cls._N2PLog__logger.addHandler(cls.__fh)
except:
cls.Error.E108()
else:
cls.Error.E107(cls.LevelList)
# ------------------------------------------------------------------------------------------------------------------
# Metodo para cambiar el nivel de registro por consola -------------------------------------------------------------
[docs]
@classmethod
def set_console_level(cls, clv: Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]) -> None:
""" Method to set a different level for console register. The default level is "WARNING". Only The level
register and higher will be printed in the console.
The possible levels are:
"DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL".
"""
if clv in cls.LevelList:
if clv == "DEBUG":
clevel = logging.DEBUG
elif clv == "WARNING":
clevel = logging.WARNING
elif clv == "ERROR":
clevel = logging.ERROR
elif clv == "CRITICAL":
clevel = logging.CRITICAL
else:
clevel = logging.INFO
try:
cls.__clevel = clevel
cls.__ch.setLevel(cls.__clevel)
cls._N2PLog__logger.addHandler(cls.__ch)
except:
cls.Error.E109()
else:
cls.Error.E107(cls.LevelList)
# ------------------------------------------------------------------------------------------------------------------
# Metodo para obtener el nombre del archivo.log --------------------------------------------------------------------
[docs]
@classmethod
def get_file_name(cls) -> str:
"""Method that returns the name of the file of the .log"""
return cls.__filename
# ------------------------------------------------------------------------------------------------------------------
# Metodo para cambiar el nombre del archivo.log --------------------------------------------------------------------
[docs]
@classmethod
def set_file_name(cls, value: str) -> None:
"""Method that sets the name of the file of the .log
Args:
value: str -> Name of the .log file
"""
if isinstance(value, str):
try:
cls.__filename = value
cls.__path = os.path.join(cls.__directory, cls.__filename)
cls.__fh.path = cls.__path
except:
cls.Error.E105()
else:
cls.Error.E103()
# ------------------------------------------------------------------------------------------------------------------
# ----------------------------------------------------------------------------------------------------------------------
# Metodo para cambiar desactivar la generación del archivo .log-----------------------------------------------------
[docs]
@classmethod
def deactivate_log(cls) -> None:
"""Method that deactivates the .log"""
cls.__fh.active = False
# ------------------------------------------------------------------------------------------------------------------
# ----------------------------------------------------------------------------------------------------------------------
# Metodo para cambiar activar la generación del archivo .log-----------------------------------------------------
[docs]
@classmethod
def activate_log(cls) -> None:
"""Method that activates the .log"""
cls.__fh.active = True
# ------------------------------------------------------------------------------------------------------------------
@classmethod
def _set_format1(cls) -> None:
cls.__formatter = logging.Formatter("%(asctime)s %(levelname)-8s %(message)-5s", "%H:%M:%S")
cls.__fh.setFormatter(cls.__formatter)
cls.__logger.addHandler(cls.__fh)
@classmethod
def _set_format2(cls, time) -> None:
if len(time) < 8:
time = "0" + time
cls.__formatter = logging.Formatter(f"{time} %(levelname)-8s %(message)-5s")
cls.__fh.setFormatter(cls.__formatter)
cls.__logger.addHandler(cls.__fh)
# ----------------------------------------------------------------------------------------------------------------------