NaxToPy 3.2.1__tar.gz → 3.2.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. {naxtopy-3.2.1/src/NaxToPy.egg-info → naxtopy-3.2.3}/PKG-INFO +18 -4
  2. {naxtopy-3.2.1 → naxtopy-3.2.3}/README.md +15 -1
  3. {naxtopy-3.2.1 → naxtopy-3.2.3}/pyproject.toml +3 -3
  4. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/N2PComponent.py +2 -2
  5. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/N2PNastranInputData.py +122 -54
  6. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Constants/Constants.py +4 -4
  7. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Errors/N2PLog.py +17 -1
  8. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/N2PModelContent.py +48 -23
  9. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/common/data_input_hdf5.py +20 -1
  10. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/common/hdf5.py +3 -3
  11. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/common/property.py +13 -11
  12. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/N2PCalculatorRFJoints.py +3 -3
  13. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/N2PGetFasteners.py +3 -3
  14. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/N2PGetLoadFasteners.py +4 -32
  15. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/joints/N2PBolt.py +1 -1
  16. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/joints/N2PJoint.py +2 -4
  17. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/metallic/neuber/N2PNeuber.py +215 -74
  18. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/__init__.py +1 -0
  19. {naxtopy-3.2.1 → naxtopy-3.2.3/src/NaxToPy.egg-info}/PKG-INFO +18 -4
  20. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy.egg-info/SOURCES.txt +0 -2
  21. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy.egg-info/requires.txt +2 -2
  22. naxtopy-3.2.1/src/NaxToPy/Modules/static/composite/failure_analysis/N2PFailureComposite_Backupy.py +0 -2000
  23. naxtopy-3.2.1/src/NaxToPy/Modules/static/composite/failure_analysis/N2PFailureComposite_Vectorisation.py +0 -2742
  24. {naxtopy-3.2.1 → naxtopy-3.2.3}/LICENSE +0 -0
  25. {naxtopy-3.2.1 → naxtopy-3.2.3}/setup.cfg +0 -0
  26. {naxtopy-3.2.1 → naxtopy-3.2.3}/setup.py +0 -0
  27. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQEntities/N2PEntity.py +0 -0
  28. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQEntities/N2PEntityElement.py +0 -0
  29. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQEntities/N2PEntityNode.py +0 -0
  30. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQEntities/N2PEntityShell.py +0 -0
  31. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQEntities/__init__.py +0 -0
  32. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeyword.py +0 -0
  33. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordBEAMSECTION.py +0 -0
  34. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordCOUPLING.py +0 -0
  35. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordDENSITY.py +0 -0
  36. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordDISTRIBUTING.py +0 -0
  37. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordDISTRIBUTINGCOUPLING.py +0 -0
  38. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordELASTIC.py +0 -0
  39. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordELEMENT.py +0 -0
  40. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordELSET.py +0 -0
  41. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordENDINSTANCE.py +0 -0
  42. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordENDPART.py +0 -0
  43. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordINSTANCE.py +0 -0
  44. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordKINEMATIC.py +0 -0
  45. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordKINEMATICCOUPLING.py +0 -0
  46. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordMATERIAL.py +0 -0
  47. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordNODE.py +0 -0
  48. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordNSET.py +0 -0
  49. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordORIENTATION.py +0 -0
  50. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordPART.py +0 -0
  51. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordPLASTIC.py +0 -0
  52. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordSHELLSECTION.py +0 -0
  53. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordSOLIDSECTION.py +0 -0
  54. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordSURFACE.py +0 -0
  55. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ABQKeywords/__init__.py +0 -0
  56. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/AllClasses.py +0 -0
  57. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/N2PAbaqusInputData.py +0 -0
  58. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/N2PConnector.py +0 -0
  59. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/N2PCoord.py +0 -0
  60. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/N2PElement.py +0 -0
  61. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/N2PFreeBody.py +0 -0
  62. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/N2PIncrement.py +0 -0
  63. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/N2PLoadCase.py +0 -0
  64. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/N2PMaterial.py +0 -0
  65. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/N2PNode.py +0 -0
  66. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/N2PProperty.py +0 -0
  67. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/N2PReport.py +0 -0
  68. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/N2PResult.py +0 -0
  69. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/N2PSection.py +0 -0
  70. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/N2PSet.py +0 -0
  71. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/ProgresBar.py +0 -0
  72. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Classes/__init__.py +0 -0
  73. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Constants/__init__.py +0 -0
  74. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Constants/librerias.py +0 -0
  75. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Errors/N2PColors.py +0 -0
  76. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Errors/N2PFileHandler.py +0 -0
  77. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Errors/__init__.py +0 -0
  78. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Reference_Finder/__Reference_Finder.py +0 -0
  79. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/Reference_Finder/__init__.py +0 -0
  80. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/_AuxFunc/_NetToPython.py +0 -0
  81. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/_AuxFunc/__init__.py +0 -0
  82. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Core/__init__.py +0 -0
  83. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/__init__.py +0 -0
  84. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/common/__init__.py +0 -0
  85. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/common/material.py +0 -0
  86. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/common/model_processor.py +0 -0
  87. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/envelope/N2PEnvelope.py +0 -0
  88. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/envelope/__init__.py +0 -0
  89. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/__init__.py +0 -0
  90. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/airbus/__init__.py +0 -0
  91. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/airbus/core_shear_crimping_airbus.py +0 -0
  92. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/airbus/dimpling_airbus.py +0 -0
  93. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/airbus/wrinkling_airbus.py +0 -0
  94. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/bruhn/__init__.py +0 -0
  95. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/cmh/__init__.py +0 -0
  96. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/cmh/core_shear_crimping_cmh.py +0 -0
  97. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/cmh/dimpling_cmh.py +0 -0
  98. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/cmh/wrinkling_cmh.py +0 -0
  99. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/esdu/__init__.py +0 -0
  100. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/hsb/__init__.py +0 -0
  101. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/hsb/wrinkling_hsb.py +0 -0
  102. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/hypersizer/__init__.py +0 -0
  103. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/hypersizer/crimping_hypersizer.py +0 -0
  104. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/hypersizer/dimpling_hypersizer.py +0 -0
  105. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/hypersizer/wrinkling_hypersizer.py +0 -0
  106. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/nasa/__init__.py +0 -0
  107. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/handbooks/nasa/wrinkling_nasa.py +0 -0
  108. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/n2ptoexe/N2PtoEXE.py +0 -0
  109. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/n2ptoexe/__init__.py +0 -0
  110. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/numericaltools/N2PCoefficientsFinder.py +0 -0
  111. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/numericaltools/__init__.py +0 -0
  112. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/__init__.py +0 -0
  113. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/composite/__init__.py +0 -0
  114. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/composite/delamination/N2PEdgeDelamination.py +0 -0
  115. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/composite/delamination/__init__.py +0 -0
  116. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/composite/failure_analysis/N2PCompositeFailure.py +0 -0
  117. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/composite/failure_analysis/__init__.py +0 -0
  118. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/composite/sandwich/N2PSandwich.py +0 -0
  119. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/composite/sandwich/__init__.py +0 -0
  120. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/N2PCompRF.py +0 -0
  121. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/N2PFastenerAnalysis.py +0 -0
  122. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/N2PMetalRF.py +0 -0
  123. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/N2PRivetRF.py +0 -0
  124. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/N2PUpdateFastener.py +0 -0
  125. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysis/Core/Functions/N2PGetAttachments.py +0 -0
  126. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysis/Core/Functions/N2PGetResults.py +0 -0
  127. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysis/Core/Functions/N2PInterpolation.py +0 -0
  128. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysis/Core/Functions/N2PLoadModel.py +0 -0
  129. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysis/Core/Functions/N2PRotation.py +0 -0
  130. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysis/Core/Functions/__init__.py +0 -0
  131. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysis/Core/__init__.py +0 -0
  132. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysis/__init__.py +0 -0
  133. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Check/Validation.py +0 -0
  134. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Classes/AR1DElement.py +0 -0
  135. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Classes/ARAttachment.py +0 -0
  136. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Classes/ARBolt.py +0 -0
  137. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Classes/ARPlate.py +0 -0
  138. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Classes/ARPlateElements.py +0 -0
  139. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Classes/__init__.py +0 -0
  140. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARAuxiliarFunctions.py +0 -0
  141. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARBilinearInterpolation.py +0 -0
  142. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARConfigurationInput.py +0 -0
  143. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARDerivedLoadCases.py +0 -0
  144. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARFileInputRivetsIDs.py +0 -0
  145. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARGetAttachments.py +0 -0
  146. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARGetBolts.py +0 -0
  147. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARReadResultsFromFile.py +0 -0
  148. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARResults.py +0 -0
  149. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARRotation.py +0 -0
  150. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARSerialize.py +0 -0
  151. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/__init__.py +0 -0
  152. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/__init__.py +0 -0
  153. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/__init__.py +0 -0
  154. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/__init__.py +0 -0
  155. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/joints/N2PAttachment.py +0 -0
  156. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/joints/N2PFastenerSystem.py +0 -0
  157. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/joints/N2PJointAnalysisParameters.py +0 -0
  158. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/joints/N2PPlate.py +0 -0
  159. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/fasteners/joints/__init__.py +0 -0
  160. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/metallic/__init__.py +0 -0
  161. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/Modules/static/metallic/neuber/__init__.py +0 -0
  162. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/NaxToPy.ico +0 -0
  163. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy/user_functions.txt +0 -0
  164. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy.egg-info/dependency_links.txt +0 -0
  165. {naxtopy-3.2.1 → naxtopy-3.2.3}/src/NaxToPy.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: NaxToPy
3
- Version: 3.2.1
3
+ Version: 3.2.3
4
4
  Summary: Package for postprocessing FEM results in Python
5
5
  Home-page: https://www.idaerosolutions.com/Home/NaxToPy
6
6
  Download-URL: https://apps.microsoft.com/detail/XP9MMH0KDKGRJN?hl=en-US&gl=US
@@ -18,9 +18,9 @@ Requires-Python: >=3.9
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
20
  Requires-Dist: pythonnet>=3.0.4
21
- Requires-Dist: numpy>=1.26.0
21
+ Requires-Dist: numpy>=1.25.1
22
22
  Requires-Dist: setuptools>=67.8.0
23
- Requires-Dist: h5py>=3.12.1
23
+ Requires-Dist: h5py>=3.8.0
24
24
  Dynamic: download-url
25
25
  Dynamic: home-page
26
26
  Dynamic: license-file
@@ -285,9 +285,23 @@ is redundant. The coordinate system will prevail.
285
285
 
286
286
  ### v.3.2.1
287
287
  1. BugFix: Derived components are now founded right while using `get_result_by_LCs_Incr()`.
288
- 1. BugFix: All sections are now founded right while using `get_result_by_LCs_Incr()`.
288
+ 2. BugFix: All sections are now founded right while using `get_result_by_LCs_Incr()`.
289
289
  3. BugFix: Now symbols like "\" or "-" are supported as part of the name of Components and Load Cases while creating new derived Components and Derived Load Cases.
290
290
 
291
+ ### v.3.2.2
292
+ 1. BugFix: Logs message are not printed double when the buffer is called several times.
293
+ 2. BugFix: `get_load_case()` now returns correctly the load cases if it is called before and after calling `import_results_from_files()`.
294
+ 3. Refactor: New structure for the h5 files generated by N2PNeuber module.
295
+ 4. BugFix: MCID in CQUAD4 and CTRIA3 are now correctly read from a bdf file.
296
+
297
+ ### v.3.2.3
298
+ 1. Refactor: lower minimum required versions of NumPy and HDF5.
299
+ - numpy >= 1.25.1
300
+ - h5py >= 3.8.0
301
+ 2. Feat: Now is possible to read Nastran and Optistruct **SET**s. They are loaded as `N2Set`.
302
+ 3. Refactor: Reorder in `N2PNastranInputData.find_cards()` params making superElements optional. `category` is the first argument. `superElements` is now optional (default=None) to allow searching across all superelements by default.
303
+ 4. BugFix: Internal lazy dictionary for N2Cards (reading a Nastran or Optistruct input file) is fixed.
304
+
291
305
  # Documentation
292
306
 
293
307
  **NaxToPy** is a package developed by Idaero Solutions© as a part of the **NaxTo** software.
@@ -258,9 +258,23 @@ is redundant. The coordinate system will prevail.
258
258
 
259
259
  ### v.3.2.1
260
260
  1. BugFix: Derived components are now founded right while using `get_result_by_LCs_Incr()`.
261
- 1. BugFix: All sections are now founded right while using `get_result_by_LCs_Incr()`.
261
+ 2. BugFix: All sections are now founded right while using `get_result_by_LCs_Incr()`.
262
262
  3. BugFix: Now symbols like "\" or "-" are supported as part of the name of Components and Load Cases while creating new derived Components and Derived Load Cases.
263
263
 
264
+ ### v.3.2.2
265
+ 1. BugFix: Logs message are not printed double when the buffer is called several times.
266
+ 2. BugFix: `get_load_case()` now returns correctly the load cases if it is called before and after calling `import_results_from_files()`.
267
+ 3. Refactor: New structure for the h5 files generated by N2PNeuber module.
268
+ 4. BugFix: MCID in CQUAD4 and CTRIA3 are now correctly read from a bdf file.
269
+
270
+ ### v.3.2.3
271
+ 1. Refactor: lower minimum required versions of NumPy and HDF5.
272
+ - numpy >= 1.25.1
273
+ - h5py >= 3.8.0
274
+ 2. Feat: Now is possible to read Nastran and Optistruct **SET**s. They are loaded as `N2Set`.
275
+ 3. Refactor: Reorder in `N2PNastranInputData.find_cards()` params making superElements optional. `category` is the first argument. `superElements` is now optional (default=None) to allow searching across all superelements by default.
276
+ 4. BugFix: Internal lazy dictionary for N2Cards (reading a Nastran or Optistruct input file) is fixed.
277
+
264
278
  # Documentation
265
279
 
266
280
  **NaxToPy** is a package developed by Idaero Solutions© as a part of the **NaxTo** software.
@@ -4,14 +4,14 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "NaxToPy"
7
- version = "3.2.1"
7
+ version = "3.2.3"
8
8
  license = {text = "MIT"}
9
9
  authors = [ { name = "Idaero Solutions", email = "manuel.sanchez@idaerosolutions.com" }, ]
10
10
  requires-python = ">=3.9"
11
11
  dependencies = ["pythonnet>=3.0.4",
12
- "numpy>=1.26.0",
12
+ "numpy>=1.25.1",
13
13
  "setuptools>=67.8.0",
14
- "h5py>=3.12.1"]
14
+ "h5py>=3.8.0"]
15
15
  description = "Package for postprocessing FEM results in Python"
16
16
  readme = "README.md"
17
17
  classifiers = ["Intended Audience :: Science/Research",
@@ -150,7 +150,7 @@ class N2PComponent:
150
150
  * -10: User defined coordinate system
151
151
  * -20: Element/Node user defined coordinate system
152
152
  * -1000: Analysis coordinate system (default)
153
- * \>0: Solver ID of predefined coordinate system
153
+ * >0: Solver ID of predefined coordinate system
154
154
 
155
155
  .. note::
156
156
 
@@ -251,7 +251,7 @@ class N2PComponent:
251
251
  * -10: User defined coordinate system
252
252
  * -20: Element/Node user defined coordinate system
253
253
  * -1000: Analysis coordinate system (default)
254
- * \>0: Solver ID of predefined coordinate system
254
+ * >0: Solver ID of predefined coordinate system
255
255
 
256
256
  .. note::
257
257
 
@@ -6,60 +6,86 @@ from typing import Union, overload, Literal
6
6
 
7
7
  from NaxToPy.Core.Errors.N2PLog import N2PLog
8
8
 
9
+ from typing import Union
10
+
9
11
  class _LazyList(list):
10
12
  """
11
13
  A lazy list connected to a LazyDict. The items are lazily instantiated
12
- from the LazyDict when accessed. It is immutable
14
+ from the LazyDict when accessed. It is immutable.
13
15
  """
14
16
  def __init__(self, lazy_dict):
15
- super().__init__([None] * len(lazy_dict)) # Initialize list with placeholders
17
+ # Extract the C# object references (not the tuple keys!)
18
+ self._cs_refs = []
19
+ for hash_code, cs_list in lazy_dict._hash_to_cs_list.items():
20
+ self._cs_refs.extend(cs_list)
21
+
22
+ super().__init__([None] * len(self._cs_refs)) # Initialize with placeholders
16
23
  self._lazy_dict = lazy_dict
17
- self.keys = list(lazy_dict.keys()) # Extract keys from the LazyDict
18
24
 
19
25
  def __getitem__(self, index: Union[slice, int]):
20
- if isinstance(index, int):
21
- if not (0 <= index < len(self.keys)):
22
- raise IndexError("list index out of range")
26
+ if isinstance(index, slice):
27
+ # Handle slice: load each item in the slice range
28
+ indices = range(*index.indices(len(self._cs_refs)))
29
+ return [self._load_item(i) for i in indices]
23
30
  else:
24
- if index.stop > len(self.keys):
25
- raise IndexError("list slice stop out of range")
26
-
27
- # Get the key corresponding to the index
28
- key = self.keys[index]
31
+ # Handle single index
32
+ if not (-len(self._cs_refs) <= index < len(self._cs_refs)):
33
+ raise IndexError("list index out of range")
34
+
35
+ # Normalize negative indices
36
+ if index < 0:
37
+ index = len(self._cs_refs) + index
38
+
39
+ return self._load_item(index)
40
+
41
+ def __iter__(self):
42
+ """Override iterator to trigger lazy loading."""
43
+ for i in range(len(self._cs_refs)):
44
+ yield self._load_item(i)
45
+
46
+ def _load_item(self, index: int):
47
+ """Load and cache a single item at the given index."""
29
48
  value = super().__getitem__(index)
30
-
49
+
31
50
  if value is None:
32
- # Trigger the LazyDict to create the value
33
- value = self._lazy_dict[key]
51
+ # Get the C# object reference and use it to access LazyDict
52
+ cs_ref = self._cs_refs[index]
53
+ value = self._lazy_dict[cs_ref] # Pass C# object
34
54
  # Update the list with the created value
35
55
  super().__setitem__(index, value)
36
-
56
+
37
57
  return value
38
-
58
+
59
+ # Make it truly immutable by blocking mutations
39
60
  def __setitem__(self, index, value):
40
- raise TypeError("ListBulkDataCards is immutable")
41
-
61
+ raise TypeError("_LazyList is immutable")
62
+
63
+ def __delitem__(self, index):
64
+ raise TypeError("_LazyList is immutable")
65
+
42
66
  def append(self, value):
43
- raise TypeError("ListBulkDataCards is immutable")
44
-
67
+ raise TypeError("_LazyList is immutable")
68
+
45
69
  def extend(self, iterable):
46
- raise TypeError("ListBulkDataCards is immutable")
47
-
70
+ raise TypeError("_LazyList is immutable")
71
+
48
72
  def insert(self, index, value):
49
- raise TypeError("ListBulkDataCards is immutable")
50
-
51
- def pop(self, index=-1):
52
- raise TypeError("ListBulkDataCards is immutable")
53
-
73
+ raise TypeError("_LazyList is immutable")
74
+
54
75
  def remove(self, value):
55
- raise TypeError("ListBulkDataCards is immutable")
56
-
76
+ raise TypeError("_LazyList is immutable")
77
+
78
+ def pop(self, index=-1):
79
+ raise TypeError("_LazyList is immutable")
80
+
57
81
  def clear(self):
58
- raise TypeError("ListBulkDataCards is immutable")
82
+ raise TypeError("_LazyList is immutable")
59
83
 
60
- def __iter__(self):
61
- for index in range(len(self.keys)):
62
- yield self[index] # Trigger lazy evaluation for each item
84
+ def sort(self, **kwargs):
85
+ raise TypeError("_LazyList is immutable")
86
+
87
+ def reverse(self):
88
+ raise TypeError("_LazyList is immutable")
63
89
 
64
90
 
65
91
  class IndexTrackingList(list):
@@ -230,6 +256,7 @@ class N2PNastranInputData:
230
256
  "__executivecontrolinstructions",
231
257
  "__listcomments",
232
258
  "__lazylist",
259
+ "__bdfFiles"
233
260
  )
234
261
 
235
262
  def __init__(self, dictcardscston2p: dict, inputfiledata):
@@ -239,6 +266,7 @@ class N2PNastranInputData:
239
266
  self.__executivecontrolinstructions = []
240
267
  self.__listcomments = []
241
268
  self.__lazylist = None
269
+ self.__bdfFiles = {bdf.BdfFilePath: bdf for bdf in inputfiledata.BdfFiles}
242
270
 
243
271
  @property
244
272
  def ListBulkDataCards(self) -> list[N2PCard]:
@@ -296,30 +324,44 @@ class N2PNastranInputData:
296
324
  # self.__listcomments = [N2PInputDataNas(i) for i in self.__inputfiledata.StructuredInfo.ModelComments]
297
325
  # return self.__listcomments
298
326
 
299
- def find_cards(self, superElements: int,
327
+ def find_cards(self,
300
328
  category: Literal["GRID", "ELEMENT", "CONNECTOR", "PROPERTY", "MATERIAL", "COORDINATESYSTEM", "LOAD", "CONSTRAINT"],
301
- cardTypes: list[str] = None, filters: dict[str, object] = None) -> list [N2PCard]:
302
- """Searches for cards based on specified criteria:
303
-
304
- - superElements (mandatory): integer number of 8 bits (1 byte)
305
- - category (mandatory): Element, property, material, etc
306
- - cardTypes (optional): Specific type of card: CQUAD4, PBEAM, COORD2R
307
- - filters (optional): Each category has common fields. It is possible to filter acordinf to those fields.
329
+ cardTypes: list[str] = None, filters: dict[str, object] = None, superElements: int = None) -> list [N2PCard]:
330
+ """Searches for cards based on specified criteria.
331
+
332
+ Args:
333
+ category: Card category to search. Valid values: GRID, ELEMENT,
334
+ CONNECTOR, PROPERTY, MATERIAL, COORDINATESYSTEM, LOAD, CONSTRAINT.
335
+ cardTypes: Specific card types to filter by (e.g., CQUAD4, PBEAM, COORD2R).
336
+ If None, all card types within the category are returned.
337
+ filters: Dictionary of field-value pairs to filter results. Available
338
+ fields depend on the category:
308
339
  - GRID: "ID", "CP", "CD", "PS", "SEID", "X1", "X2", "X3"
309
- - ELEMENT: "EID, "PID", "NodeArray"
340
+ - ELEMENT: "EID", "PID", "NodeArray"
310
341
  - CONNECTOR:
311
342
  - PROPERTY: "PID"
312
343
  - MATERIAL: "MID"
313
344
  - COORDINATESYSTEM: "CoordinateSystemIds", "ReferenceSystemId"
314
345
  - LOAD:
315
346
  - CONSTRAINT:
316
-
317
- Example:
318
-
319
- >>> grids = model.ModelInputData.find_cards(0, "GRID")
320
- >>> cuads = model.ModelInputData.find_cards(0, "ELEMENT", ["CQUAD4"])
321
- >>> pshell_3 = model.ModelInputData.find_cards(0, "PROPERTY", ["PSHELL"], {"PID": 3})
322
- >>> grids_cp10 = model.ModelInputData.find_cards(0, "GRID", None, {"CP": 10})
347
+ superElements: Superelement (part) ID to search within. Use 0 for the
348
+ global model. If None, searches across all superelements.
349
+
350
+ Returns:
351
+ List of N2PCard objects matching the specified criteria.
352
+
353
+ Examples:
354
+ >>> # Get all grids from global model
355
+ >>> grids = model.ModelInputData.find_cards("GRID", superElements=0)
356
+
357
+ >>> # Get all CQUAD4 elements from global model
358
+ >>> quads = model.ModelInputData.find_cards("ELEMENT", ["CQUAD4"], superElements=0)
359
+
360
+ >>> # Get PSHELL property with PID=3
361
+ >>> pshell_3 = model.ModelInputData.find_cards("PROPERTY", ["PSHELL"], {"PID": 3}, superElements=0)
362
+
363
+ >>> # Get all grids with CP=10 across all superelements
364
+ >>> grids_cp10 = model.ModelInputData.find_cards("GRID", filters={"CP": 10})
323
365
  """
324
366
  # Convert superElements (part id) to System.Byte[] (or None)
325
367
  if not superElements and superElements != 0:
@@ -366,7 +408,7 @@ class N2PNastranInputData:
366
408
 
367
409
  cs_result = self.__inputfiledata.BulkDataSection.FindCards(part, category, cardTypes, filter_names, filter_values)
368
410
 
369
- return [self.__dictcardscston2p[RuntimeHelpers.GetHashCode(i)] for i in cs_result]
411
+ return [self.__dictcardscston2p[i] for i in cs_result]
370
412
 
371
413
 
372
414
  def print_include_hierarchy(self) -> None:
@@ -417,9 +459,33 @@ class N2PNastranInputData:
417
459
  N2PLog.Error.E100(error.StatusMessage)
418
460
  return failed_cards
419
461
 
420
- def create_card(self, card_type: str, parentBdfFile: object, rawContent: str = None, superElemntId:int = 0) -> N2PCard:
421
- """Method that creates a new card of the type specified."""
422
- card = self.__inputfiledata.CreateCard(card_type, parentBdfFile, rawContent, superElemntId)
462
+ def create_card(self, card_type: str, bdf_file: str, rawContent: str = None, superElemntId:int = 0) -> N2PCard:
463
+ """Method that creates a new card of the type specified. By default, the card is created empty, with small field format.
464
+
465
+ Example:
466
+ >>> new_cbar = model.ModelInputData.create_card("CBAR", "C:\\bdf\\mesh\\model.bdf")
467
+ >>> # new_cbar is now a N2PCard object of type CBAR empty. You can set its properties:
468
+ >>> new_cbar.EID = 1001
469
+ >>> new_cbar.PID = 2001
470
+ >>> new_cbar.GA = 10
471
+ >>> new_cbar.GB = 20
472
+ >>> new_cbar.X1 = 1.0
473
+ >>> new_cbar.X2 = 0.0
474
+ >>> new_cbar.X3 = 0.0
475
+
476
+ >>> # It is also possible to create a card with raw content and specifying the superelement id:
477
+ >>> raw_content = "CBAR 1002 2001 30 40 0.0 1.0 0.0"
478
+ >>> new_cbar2 = model.ModelInputData.create_card("CBAR", "C:\\bdf\\mesh\\model.bdf", rawContent=raw_content, superElemntId=0)
479
+
480
+ """
481
+ bdfFileObject = self.__bdfFiles.get(bdf_file, None)
482
+ if bdfFileObject is None:
483
+ N2PLog.Warning.W212(bdf_file)
484
+ bdfFileObject = self.__inputfiledata.BdfFiles[0]
485
+ card = self.__inputfiledata.BulkDataSection.CreateCard(card_type, bdfFileObject, rawContent, superElemntId)
486
+ card.CardType = card_type
487
+ card.FieldsFormat = "SMALL"
488
+
423
489
  return card
424
490
 
425
491
  class N2PModelInputData(N2PNastranInputData):
@@ -13335,5 +13401,7 @@ CONSTRUCTDICT = {
13335
13401
  "SPCD_NASTRAN": SPCDNAS,
13336
13402
  "SPC1": SPC1,
13337
13403
  "SPCADD": SPCADD,
13338
- "UNSUPPORTED": N2PCard
13404
+ "UNSUPPORTED": N2PCard,
13405
+ "FIELD_MAPPING_ERROR_NASTRAN": N2PCard,
13406
+ "FIELD_MAPPING_ERROR_OPTISTRUCT": N2PCard
13339
13407
  }
@@ -1,15 +1,15 @@
1
1
  """Constants of the NaxToPy package"""
2
2
 
3
3
  # NaxToPy Version
4
- VERSION = "3.2.1"
4
+ VERSION = "3.2.3"
5
5
 
6
6
  # Supported for Naxto:
7
7
  NAXTO_VERSION = '2025R2'
8
- NAXTO_STEP = "1"
9
- NAXTO_ADVANCED_INSTALLER = "2025.2.1"
8
+ NAXTO_STEP = "3"
9
+ NAXTO_ADVANCED_INSTALLER = "2025.2.3"
10
10
 
11
11
  # Assembly version of NaxToModel.dll
12
- VIZZER_COMPATIBILITY = ("5.2.0.1")
12
+ VIZZER_COMPATIBILITY = ("5.2.0.3")
13
13
  """Tuple with the compatible versions of NaxToModel.dll"""
14
14
 
15
15
  # PYTHON EXTERNO ----------------------------------------------------------------------------------
@@ -446,7 +446,7 @@ own information message. Use the following structure as a standard message (I +
446
446
  def I116() -> None:
447
447
  """ Working with the installed naxto libraries
448
448
  """
449
- message = "I116: Working with NaxTo installed libraries (in Program Files\IDAERO)"
449
+ message = r"I116: Working with NaxTo installed libraries (in Program Files\IDAERO)"
450
450
  N2PLog._N2PLog__logger.info(message)
451
451
 
452
452
  @staticmethod
@@ -676,6 +676,14 @@ own information message. Use the following structure as a standard message (I +
676
676
  message = f"W211: The result asked is not available in all the load cases selected"
677
677
  N2PLog._N2PLog__logger.warning(message)
678
678
 
679
+ @staticmethod
680
+ def W212(path) -> None:
681
+ """
682
+ Warning raised when the path for the new N2PCard is not in the include's tree.
683
+ """
684
+ message = f"W212: The path '{path}' for the new N2PCard is not in the include's tree. The card will be added in the launch bdf."
685
+ N2PLog._N2PLog__logger.warning(message)
686
+
679
687
  @staticmethod
680
688
  def W300() -> None:
681
689
  """ Warning raised when there are more dimensions than points in n2p.envelope
@@ -1259,6 +1267,14 @@ own information message. Use the following structure as a standard message (I +
1259
1267
  message = f"E114: THE FILE {file} IS A INPUT TEXT FILE BUT THE SOLVER IS UNKNOWN. SPECIFY THE 'file_type'."
1260
1268
  N2PLog._N2PLog__logger.error(message)
1261
1269
  return message
1270
+
1271
+ @staticmethod
1272
+ def E115() -> str:
1273
+ """ Error raised when a dictionary for filtering is passed but not where the filter is applied
1274
+ """
1275
+ message = f"E115: A DICTIONARY FOR FILTERING IS PASSED BUT NOT WHERE THE FILTER IS APPLIED. 'filter' MUST BE 'ELEMENTS', 'PROPERTIES', 'PARTS' OR 'NODES'"
1276
+ N2PLog._N2PLog__logger.error(message)
1277
+ return message
1262
1278
 
1263
1279
  @staticmethod
1264
1280
  def E201(*args) -> None:
@@ -66,8 +66,9 @@ class N2PModelContent:
66
66
  """
67
67
  # 0 ) Genera el archivo .log y añade los logs de la importación ------------------------------------------------
68
68
  # Configura el logger para que escriba automaticamente los logs ------------------------------------------------
69
- N2PLog._N2PLog__fh.write_buffered_records()
70
- N2PLog._N2PLog__fh.immediate_logging()
69
+ if not N2PLog._N2PLog__fh.immediate:
70
+ N2PLog._N2PLog__fh.write_buffered_records()
71
+ N2PLog._N2PLog__fh.immediate_logging()
71
72
 
72
73
  # 1) Extraer Toda la Informacion Principal de NaxTo ------------------------------------------------------------
73
74
  # Inicializador de atributos
@@ -311,28 +312,47 @@ class N2PModelContent:
311
312
 
312
313
  def __init__(self, keys_list: list):
313
314
  super().__init__()
314
- self._hash_to_cs = dict()
315
+ self._hash_to_cs_list = {} # hash -> list of C# objects
316
+
315
317
  for cs_ref in keys_list:
316
318
  if cs_ref.GetN2PCardType() not in CONSTRUCTDICT:
317
319
  continue
318
- # As the C# references can be moved by the CLR garbage collector, a dictionary using the
319
- # hash is used.
320
- hash = RuntimeHelpers.GetHashCode(cs_ref)
321
- self[hash] = None
322
- self._hash_to_cs[hash] = cs_ref
323
-
324
- def __getitem__(self, hash):
325
-
326
- if hash not in self or self.get(hash) is None:
327
- cs_ref = self._hash_to_cs.get(hash)
328
- value = CONSTRUCTDICT.get(cs_ref.GetN2PCardType())
329
- if value:
330
- self[hash] = value(cs_ref)
331
- else:
332
- return value
333
- return value(cs_ref)
334
- else:
335
- return self.get(hash)
320
+
321
+ hash_code = RuntimeHelpers.GetHashCode(cs_ref)
322
+
323
+ if hash_code not in self._hash_to_cs_list:
324
+ self._hash_to_cs_list[hash_code] = []
325
+
326
+ self._hash_to_cs_list[hash_code].append(cs_ref)
327
+ # Store with unique tuple key
328
+ unique_key = (hash_code, len(self._hash_to_cs_list[hash_code]) - 1)
329
+ self[unique_key] = None
330
+
331
+ def __getitem__(self, cs_key):
332
+ hash_code = RuntimeHelpers.GetHashCode(cs_key)
333
+
334
+ if hash_code not in self._hash_to_cs_list:
335
+ raise KeyError(f"Object not found")
336
+
337
+ # Find the matching C# object by reference equality
338
+ cs_objects = self._hash_to_cs_list[hash_code]
339
+
340
+ for idx, cs_ref in enumerate(cs_objects):
341
+ if System.Object.ReferenceEquals(cs_ref, cs_key): # Checks C# object identity directly
342
+ key = (hash_code, idx)
343
+
344
+ if self.get(key) is None:
345
+ # Lazy construction
346
+ value = CONSTRUCTDICT.get(cs_ref.GetN2PCardType(), CONSTRUCTDICT["UNSUPPORTED"])
347
+ if value:
348
+ constructed = value(cs_ref)
349
+ self[key] = constructed
350
+ return constructed
351
+ return None
352
+ else:
353
+ return self.get(key)
354
+
355
+ raise KeyError(f"Object not found in collision list")
336
356
 
337
357
  cslistbulkdatacards = self.__vzmodel.NasOptInputReader.BulkDataSection.GetCardDataBaseList()
338
358
  self.__modelinputdata = N2PNastranInputData(
@@ -1427,11 +1447,13 @@ class N2PModelContent:
1427
1447
  for result_file in results_files:
1428
1448
  if os.path.isfile(result_file):
1429
1449
  self.__vzmodel.ImportResults(str(result_file))
1430
- self._import_load_cases()
1431
1450
  N2PLog.Debug.D201(str(result_file))
1432
1451
  else:
1433
1452
  N2PLog.Error.E232(str(result_file))
1434
1453
 
1454
+ self._import_load_cases()
1455
+ self.__LCs_by_ID__ = {lc.ID: lc for lc in self.LoadCases}
1456
+
1435
1457
  # ------------------------------------------------------------------------------------------------------------------
1436
1458
 
1437
1459
  ####################################################################################################################
@@ -2422,7 +2444,7 @@ def load_model(path: str, parallelprocessing: bool = True,
2422
2444
  ("InputFileAbaqus") or binary result file ("Binary").
2423
2445
  filter: str.
2424
2446
  Optional. It specifies what to load in dict_gen (elements, properties, parts or nodes)
2425
- dict_gem: dict.
2447
+ dict_gen: dict.
2426
2448
  Optional. Dictionary that represents what elements/properties/parts/nodes to load. For
2427
2449
  elements and nodes, the dictionary is in the form {Part ID (str): [Elements ID/Nodes ID]}. For parts or
2428
2450
  properties, the dictionary could simply be in the form {Part ID (str) / Property ID (str): []}.
@@ -2451,6 +2473,9 @@ def load_model(path: str, parallelprocessing: bool = True,
2451
2473
  if path.split(".")[-1] in BINARY_EXTENSIONS and file_type == "InputFileNastran":
2452
2474
  N2PLog.Error.E111()
2453
2475
 
2476
+ if dict_gen and not filter:
2477
+ N2PLog.Error.E115()
2478
+
2454
2479
  return N2PModelContent(path, parallelprocessing, file_type, __transform_dict(dict_gen), filter, loadconnectors=loadconnectors)
2455
2480
  # ----------------------------------------------------------------------------------------------------------------------
2456
2481
 
@@ -31,6 +31,7 @@ class DataEntry:
31
31
  self._loadcase: int = None
32
32
  self._loadcase_description: str = "LOAD CASE"
33
33
  self._loadcase_name: str = None
34
+ self._solution_type: int = 101
34
35
  self._increment: int = 1
35
36
  self._increment_description: str = "INCREMENT"
36
37
  self._increment_value: float = 0.0
@@ -38,6 +39,7 @@ class DataEntry:
38
39
  self._section_description: str = "SECTION"
39
40
  self._part: str = None
40
41
  self._data: np.ndarray = None
42
+
41
43
  self._data_input: np.ndarray = None
42
44
  self._data_input_name: str = None
43
45
  self._data_description: str = "Data"
@@ -217,7 +219,15 @@ class DataEntry:
217
219
 
218
220
  return self._loadcase_name
219
221
  #-------------------------------------------------------------------------------------------------------------------
220
-
222
+
223
+ # Method to obtain the Solution Type ------------------------------------------------------------------------------
224
+ @property
225
+ def SolutionType(self) -> int:
226
+ """
227
+ Returns the Solution Type ID (e.g., 101 for Nastran linear static).
228
+ """
229
+ return self._solution_type
230
+ # ------------------------------------------------------------------------------------------------------------------
221
231
 
222
232
 
223
233
  # Setters ----------------------------------------------------------------------------------------------------------
@@ -354,3 +364,12 @@ class DataEntry:
354
364
  N2PLog.Error.E535(value, str)
355
365
  # ------------------------------------------------------------------------------------------------------------------
356
366
 
367
+
368
+ @SolutionType.setter
369
+ def SolutionType(self, value: int) -> None:
370
+ if type(value) == int:
371
+ self._solution_type = value
372
+ else:
373
+ N2PLog.Error.E535(value, int)
374
+ # ------------------------------------------------------------------------------------------------------------------
375
+
@@ -80,10 +80,10 @@ class HDF5_NaxTo:
80
80
 
81
81
  # Method used to create an HDF5 file -------------------------------------------------------------------------------
82
82
  def create_hdf5(self) -> None:
83
-
84
83
  """
85
84
  Method used to create an HDF5 file, either in disk (if the FilePath attribute has been filled in), or in memory
86
- (if the FilePath boolean attribute has not been filled in). This file will have the following default attributes:
85
+ (if the FilePath boolean attribute has not been filled in). This file will have the following default attributes:
86
+
87
87
  - "SOFTWARE", which will always be "NAXTO".
88
88
  - "DESCRIPTION", which will be the FileDescription attribute (if it has been set).
89
89
  - "CREATION_DATE", which will be the exact date when this function is called. Its structure will be
@@ -142,7 +142,7 @@ class HDF5_NaxTo:
142
142
  section = resultsName.require_group(sectionName)
143
143
  firstEntry = dataEntry[0]
144
144
  loadCase.attrs.update({"DESCRIPTION": firstEntry.LoadCaseDescription, "ID": firstEntry.LoadCase,
145
- "SUBTITLE": firstEntry.LoadCaseName, "SOLUTION_TYPE": np.int32(1)})
145
+ "SUBTITLE": firstEntry.LoadCaseName, "SOLUTION_TYPE": np.int32(firstEntry.SolutionType)})
146
146
  increment.attrs.update({"DESCRIPTION": firstEntry.IncrementDescription,
147
147
  "VALUE": firstEntry.IncrementValue, "ID": firstEntry.Increment})
148
148
  resultsName.attrs.update({"DESCRIPTION": firstEntry.ResultsNameDescription,
@@ -100,18 +100,20 @@ class CompositeShell(Property):
100
100
  It is mandatory that NumPlies is set in first place. Other attributes might be set with no order.
101
101
 
102
102
  EXAMPLE
103
- laminate = CompositeShell()
104
- laminate.NumPlies = 6
105
- laminate.PartIDs = '0'
106
- laminate.MatIDs = [(11100000,'0'),(11100000,'0'),(11100000,'0'),(11100000,'0'),(11100000,'0'),(11100000,'0')]
107
- laminate.thicknesses = [0.1,0.1,0.1,0.1,0.1,0.1]
108
- laminate.theta = [0,45,0,90,0,-45]
109
- model = n2p.load_model(r"")
110
- laminate.MaterialDict = model.MaterialDict
111
- laminate.simmetry = True
112
-
113
- *** Every given list must have the same length as the number of plies of the laminate. Otherwise, instance will not be created.
103
+
104
+ >>> laminate = CompositeShell()
105
+ >>> laminate.NumPlies = 6
106
+ >>> laminate.PartIDs = '0'
107
+ >>> laminate.MatIDs = [(11100000,'0'),(11100000,'0'),(11100000,'0'),(11100000,'0'),(11100000,'0'),(11100000,'0')]
108
+ >>> laminate.thicknesses = [0.1,0.1,0.1,0.1,0.1,0.1]
109
+ >>> laminate.theta = [0,45,0,90,0,-45]
110
+ >>> model = n2p.load_model(r"")
111
+ >>> laminate.MaterialDict = model.MaterialDict
112
+ >>> laminate.simmetry = True
113
+
114
+ .. warning::
114
115
 
116
+ Every given list must have the same length as the number of plies of the laminate. Otherwise, instance will not be created.
115
117
  """
116
118
  __slots__ = (
117
119
  '_n2p_property',
@@ -23,9 +23,9 @@ class N2PCalculatorRFJoints:
23
23
 
24
24
  Example:
25
25
  >>> import NaxToPy as n2p
26
- >>> from NaxToPy.Modules.Fasteners.N2PGetFasteners import N2PGetFasteners
27
- >>> from NaxToPy.Modules.Fasteners.N2PGetLoadFasteners import N2PGetLoadFasteners
28
- >>> from NaxToPy.Modules.Fasteners.Joints.N2PFastenerSystem import N2PFastenerSystem
26
+ >>> from NaxToPy.Modules.static.fasteners.N2PGetFasteners import N2PGetFasteners
27
+ >>> from NaxToPy.Modules.static.fasteners.N2PGetLoadFasteners import N2PGetLoadFasteners
28
+ >>> from NaxToPy.Modules.static.fasteners.N2PFastenerSystem import N2PFastenerSystem
29
29
  >>> from N2PCalculatorRFJoints import N2PCalculatorRFJoints
30
30
  >>> model1 = n2p.get_model(route.fem) # model loaded
31
31
  >>> fasteners = N2PGetFasteners()