NaxToPy 3.2.3__tar.gz → 3.3.0__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 (163) hide show
  1. {naxtopy-3.2.3 → naxtopy-3.3.0}/LICENSE +1 -1
  2. {naxtopy-3.2.3/src/NaxToPy.egg-info → naxtopy-3.3.0}/PKG-INFO +12 -5
  3. {naxtopy-3.2.3 → naxtopy-3.3.0}/README.md +10 -3
  4. {naxtopy-3.2.3 → naxtopy-3.3.0}/pyproject.toml +2 -2
  5. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/N2PNastranInputData.py +384 -1
  6. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Constants/Constants.py +5 -5
  7. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Errors/N2PLog.py +6 -0
  8. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/N2PModelContent.py +27 -21
  9. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/n2ptoexe/N2PtoEXE.py +2 -1
  10. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/N2PUpdateFastener.py +2 -2
  11. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysis/Core/Functions/N2PGetResults.py +1 -1
  12. {naxtopy-3.2.3 → naxtopy-3.3.0/src/NaxToPy.egg-info}/PKG-INFO +12 -5
  13. {naxtopy-3.2.3 → naxtopy-3.3.0}/setup.cfg +0 -0
  14. {naxtopy-3.2.3 → naxtopy-3.3.0}/setup.py +0 -0
  15. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQEntities/N2PEntity.py +0 -0
  16. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQEntities/N2PEntityElement.py +0 -0
  17. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQEntities/N2PEntityNode.py +0 -0
  18. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQEntities/N2PEntityShell.py +0 -0
  19. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQEntities/__init__.py +0 -0
  20. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeyword.py +0 -0
  21. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordBEAMSECTION.py +0 -0
  22. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordCOUPLING.py +0 -0
  23. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordDENSITY.py +0 -0
  24. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordDISTRIBUTING.py +0 -0
  25. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordDISTRIBUTINGCOUPLING.py +0 -0
  26. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordELASTIC.py +0 -0
  27. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordELEMENT.py +0 -0
  28. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordELSET.py +0 -0
  29. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordENDINSTANCE.py +0 -0
  30. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordENDPART.py +0 -0
  31. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordINSTANCE.py +0 -0
  32. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordKINEMATIC.py +0 -0
  33. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordKINEMATICCOUPLING.py +0 -0
  34. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordMATERIAL.py +0 -0
  35. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordNODE.py +0 -0
  36. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordNSET.py +0 -0
  37. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordORIENTATION.py +0 -0
  38. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordPART.py +0 -0
  39. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordPLASTIC.py +0 -0
  40. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordSHELLSECTION.py +0 -0
  41. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordSOLIDSECTION.py +0 -0
  42. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/N2PKeywordSURFACE.py +0 -0
  43. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ABQKeywords/__init__.py +0 -0
  44. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/AllClasses.py +0 -0
  45. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/N2PAbaqusInputData.py +0 -0
  46. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/N2PComponent.py +0 -0
  47. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/N2PConnector.py +0 -0
  48. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/N2PCoord.py +0 -0
  49. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/N2PElement.py +0 -0
  50. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/N2PFreeBody.py +0 -0
  51. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/N2PIncrement.py +0 -0
  52. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/N2PLoadCase.py +0 -0
  53. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/N2PMaterial.py +0 -0
  54. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/N2PNode.py +0 -0
  55. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/N2PProperty.py +0 -0
  56. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/N2PReport.py +0 -0
  57. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/N2PResult.py +0 -0
  58. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/N2PSection.py +0 -0
  59. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/N2PSet.py +0 -0
  60. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/ProgresBar.py +0 -0
  61. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Classes/__init__.py +0 -0
  62. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Constants/__init__.py +0 -0
  63. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Constants/librerias.py +0 -0
  64. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Errors/N2PColors.py +0 -0
  65. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Errors/N2PFileHandler.py +0 -0
  66. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Errors/__init__.py +0 -0
  67. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Reference_Finder/__Reference_Finder.py +0 -0
  68. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/Reference_Finder/__init__.py +0 -0
  69. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/_AuxFunc/_NetToPython.py +0 -0
  70. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/_AuxFunc/__init__.py +0 -0
  71. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Core/__init__.py +0 -0
  72. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/__init__.py +0 -0
  73. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/common/__init__.py +0 -0
  74. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/common/data_input_hdf5.py +0 -0
  75. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/common/hdf5.py +0 -0
  76. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/common/material.py +0 -0
  77. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/common/model_processor.py +0 -0
  78. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/common/property.py +0 -0
  79. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/envelope/N2PEnvelope.py +0 -0
  80. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/envelope/__init__.py +0 -0
  81. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/__init__.py +0 -0
  82. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/airbus/__init__.py +0 -0
  83. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/airbus/core_shear_crimping_airbus.py +0 -0
  84. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/airbus/dimpling_airbus.py +0 -0
  85. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/airbus/wrinkling_airbus.py +0 -0
  86. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/bruhn/__init__.py +0 -0
  87. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/cmh/__init__.py +0 -0
  88. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/cmh/core_shear_crimping_cmh.py +0 -0
  89. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/cmh/dimpling_cmh.py +0 -0
  90. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/cmh/wrinkling_cmh.py +0 -0
  91. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/esdu/__init__.py +0 -0
  92. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/hsb/__init__.py +0 -0
  93. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/hsb/wrinkling_hsb.py +0 -0
  94. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/hypersizer/__init__.py +0 -0
  95. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/hypersizer/crimping_hypersizer.py +0 -0
  96. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/hypersizer/dimpling_hypersizer.py +0 -0
  97. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/hypersizer/wrinkling_hypersizer.py +0 -0
  98. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/nasa/__init__.py +0 -0
  99. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/handbooks/nasa/wrinkling_nasa.py +0 -0
  100. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/n2ptoexe/__init__.py +0 -0
  101. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/numericaltools/N2PCoefficientsFinder.py +0 -0
  102. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/numericaltools/__init__.py +0 -0
  103. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/__init__.py +0 -0
  104. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/composite/__init__.py +0 -0
  105. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/composite/delamination/N2PEdgeDelamination.py +0 -0
  106. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/composite/delamination/__init__.py +0 -0
  107. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/composite/failure_analysis/N2PCompositeFailure.py +0 -0
  108. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/composite/failure_analysis/__init__.py +0 -0
  109. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/composite/sandwich/N2PSandwich.py +0 -0
  110. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/composite/sandwich/__init__.py +0 -0
  111. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/N2PCalculatorRFJoints.py +0 -0
  112. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/N2PCompRF.py +0 -0
  113. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/N2PFastenerAnalysis.py +0 -0
  114. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/N2PGetFasteners.py +0 -0
  115. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/N2PGetLoadFasteners.py +0 -0
  116. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/N2PMetalRF.py +0 -0
  117. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/N2PRivetRF.py +0 -0
  118. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysis/Core/Functions/N2PGetAttachments.py +0 -0
  119. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysis/Core/Functions/N2PInterpolation.py +0 -0
  120. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysis/Core/Functions/N2PLoadModel.py +0 -0
  121. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysis/Core/Functions/N2PRotation.py +0 -0
  122. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysis/Core/Functions/__init__.py +0 -0
  123. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysis/Core/__init__.py +0 -0
  124. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysis/__init__.py +0 -0
  125. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Check/Validation.py +0 -0
  126. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Classes/AR1DElement.py +0 -0
  127. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Classes/ARAttachment.py +0 -0
  128. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Classes/ARBolt.py +0 -0
  129. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Classes/ARPlate.py +0 -0
  130. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Classes/ARPlateElements.py +0 -0
  131. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Classes/__init__.py +0 -0
  132. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARAuxiliarFunctions.py +0 -0
  133. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARBilinearInterpolation.py +0 -0
  134. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARConfigurationInput.py +0 -0
  135. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARDerivedLoadCases.py +0 -0
  136. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARFileInputRivetsIDs.py +0 -0
  137. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARGetAttachments.py +0 -0
  138. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARGetBolts.py +0 -0
  139. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARReadResultsFromFile.py +0 -0
  140. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARResults.py +0 -0
  141. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARRotation.py +0 -0
  142. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/ARSerialize.py +0 -0
  143. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/Functions/__init__.py +0 -0
  144. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/Core/__init__.py +0 -0
  145. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/_N2PFastenerAnalysisDeprecated/__init__.py +0 -0
  146. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/__init__.py +0 -0
  147. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/joints/N2PAttachment.py +0 -0
  148. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/joints/N2PBolt.py +0 -0
  149. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/joints/N2PFastenerSystem.py +0 -0
  150. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/joints/N2PJoint.py +0 -0
  151. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/joints/N2PJointAnalysisParameters.py +0 -0
  152. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/joints/N2PPlate.py +0 -0
  153. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/fasteners/joints/__init__.py +0 -0
  154. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/metallic/__init__.py +0 -0
  155. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/metallic/neuber/N2PNeuber.py +0 -0
  156. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/Modules/static/metallic/neuber/__init__.py +0 -0
  157. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/NaxToPy.ico +0 -0
  158. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/__init__.py +0 -0
  159. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy/user_functions.txt +0 -0
  160. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy.egg-info/SOURCES.txt +0 -0
  161. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy.egg-info/dependency_links.txt +0 -0
  162. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy.egg-info/requires.txt +0 -0
  163. {naxtopy-3.2.3 → naxtopy-3.3.0}/src/NaxToPy.egg-info/top_level.txt +0 -0
@@ -1,4 +1,4 @@
1
- Copyright (c) 2024 Idaero Solutions
1
+ Copyright (c) 2026 Idaero Solutions
2
2
 
3
3
  This freeware license agreement (“agreement”) is a legally binding contract
4
4
  between the individual who downloads the software (“you”) and the licensor,
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: NaxToPy
3
- Version: 3.2.3
3
+ Version: 3.3.0
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
7
7
  Author-email: Idaero Solutions <manuel.sanchez@idaerosolutions.com>
8
8
  License: MIT
9
- Project-URL: Documentation, https://www.idaerosolutions.com/NaxToDocumentation/NaxToPy/3.1.0/index.html
9
+ Project-URL: Documentation, https://www.idaerosolutions.com/NaxToDocumentation/NaxTo/index.html
10
10
  Project-URL: LinkedIn, https://www.linkedin.com/company/idaero/
11
11
  Keywords: NaxTo,Postprocessing,FEM
12
12
  Classifier: Intended Audience :: Science/Research
@@ -51,10 +51,10 @@ additional software beyond NaxTo (see the Download and Homepage links on the lef
51
51
  ---------------
52
52
 
53
53
  ⚠️**Warning:** To use NaxToPy, [**NaxTo**](https://apps.microsoft.com/detail/XP9MMH0KDKGRJN?hl=en-US&gl=US) must be installed.
54
- This version is compatible with **NaxTo 2025.2**.
54
+ This version is compatible with **NaxTo 2026.0**.
55
55
  Check in _Programs and Features_ the NaxTo version that is installed.
56
56
 
57
- 📘**Note:** If a specific NaxTo version is installed, search the [**NaxToPy History**](https://pypi.org/project/NaxToPy/3.1.2/#history) to find which newer version is compatible with it.
57
+ 📘**Note:** If a specific NaxTo version is installed, search the [**NaxToPy History**](https://pypi.org/project/NaxToPy/#history) to find which newer version is compatible with it.
58
58
 
59
59
 
60
60
  ## Installation
@@ -302,6 +302,13 @@ is redundant. The coordinate system will prevail.
302
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
303
  4. BugFix: Internal lazy dictionary for N2Cards (reading a Nastran or Optistruct input file) is fixed.
304
304
 
305
+ ### v.3.3.0
306
+ 1. feat: optistruct fem files are now completely supported.
307
+ 2. feat: New methods for `N2PmodelContent.ModelInputData`: `update_model()` and `create_bdf_file`.
308
+ 3. feat: New methods for Optistruct and Nastran Cards: `remap_card()`, `set_raw_content_and_remap()`, `IsValid()`, `IsModified()`, `mark_as_synthetic()` and `mark_as_original()`.
309
+ 4. bugfix: minor errors have been fixed.
310
+ 5. refactor: optimize BDF (Nastran) and FEM (OptiStruct) file parsing methods.
311
+
305
312
  # Documentation
306
313
 
307
314
  **NaxToPy** is a package developed by Idaero Solutions© as a part of the **NaxTo** software.
@@ -517,7 +524,7 @@ def dataframe_results(model: "N2PModelContent", result: "N2PResult", sections=No
517
524
  ##
518
525
  For more documentation visit https://idaerosolutions.com/Home/NaxToPy
519
526
 
520
- Complete NaxToPy documentation at: https://www.idaerosolutions.com/NaxToDocumentation/NaxToPy/3.1.0/index.html
527
+ Complete NaxToPy documentation at: https://www.idaerosolutions.com/NaxToDocumentation/NaxTo/index.html
521
528
 
522
529
  # License
523
530
 
@@ -24,10 +24,10 @@ additional software beyond NaxTo (see the Download and Homepage links on the lef
24
24
  ---------------
25
25
 
26
26
  ⚠️**Warning:** To use NaxToPy, [**NaxTo**](https://apps.microsoft.com/detail/XP9MMH0KDKGRJN?hl=en-US&gl=US) must be installed.
27
- This version is compatible with **NaxTo 2025.2**.
27
+ This version is compatible with **NaxTo 2026.0**.
28
28
  Check in _Programs and Features_ the NaxTo version that is installed.
29
29
 
30
- 📘**Note:** If a specific NaxTo version is installed, search the [**NaxToPy History**](https://pypi.org/project/NaxToPy/3.1.2/#history) to find which newer version is compatible with it.
30
+ 📘**Note:** If a specific NaxTo version is installed, search the [**NaxToPy History**](https://pypi.org/project/NaxToPy/#history) to find which newer version is compatible with it.
31
31
 
32
32
 
33
33
  ## Installation
@@ -275,6 +275,13 @@ is redundant. The coordinate system will prevail.
275
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
276
  4. BugFix: Internal lazy dictionary for N2Cards (reading a Nastran or Optistruct input file) is fixed.
277
277
 
278
+ ### v.3.3.0
279
+ 1. feat: optistruct fem files are now completely supported.
280
+ 2. feat: New methods for `N2PmodelContent.ModelInputData`: `update_model()` and `create_bdf_file`.
281
+ 3. feat: New methods for Optistruct and Nastran Cards: `remap_card()`, `set_raw_content_and_remap()`, `IsValid()`, `IsModified()`, `mark_as_synthetic()` and `mark_as_original()`.
282
+ 4. bugfix: minor errors have been fixed.
283
+ 5. refactor: optimize BDF (Nastran) and FEM (OptiStruct) file parsing methods.
284
+
278
285
  # Documentation
279
286
 
280
287
  **NaxToPy** is a package developed by Idaero Solutions© as a part of the **NaxTo** software.
@@ -490,7 +497,7 @@ def dataframe_results(model: "N2PModelContent", result: "N2PResult", sections=No
490
497
  ##
491
498
  For more documentation visit https://idaerosolutions.com/Home/NaxToPy
492
499
 
493
- Complete NaxToPy documentation at: https://www.idaerosolutions.com/NaxToDocumentation/NaxToPy/3.1.0/index.html
500
+ Complete NaxToPy documentation at: https://www.idaerosolutions.com/NaxToDocumentation/NaxTo/index.html
494
501
 
495
502
  # License
496
503
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "NaxToPy"
7
- version = "3.2.3"
7
+ version = "3.3.0"
8
8
  license = {text = "MIT"}
9
9
  authors = [ { name = "Idaero Solutions", email = "manuel.sanchez@idaerosolutions.com" }, ]
10
10
  requires-python = ">=3.9"
@@ -25,7 +25,7 @@ keywords = ["NaxTo",
25
25
  "FEM"]
26
26
 
27
27
  [project.urls]
28
- "Documentation" = "https://www.idaerosolutions.com/NaxToDocumentation/NaxToPy/3.1.0/index.html"
28
+ "Documentation" = "https://www.idaerosolutions.com/NaxToDocumentation/NaxTo/index.html"
29
29
  "LinkedIn" = "https://www.linkedin.com/company/idaero/"
30
30
 
31
31
  [tool.setuptools]
@@ -183,7 +183,17 @@ class N2PCard(N2PInputDataNas):
183
183
 
184
184
  @property
185
185
  def MappingSuccessful(self) -> bool:
186
- return self.__card.MappingSuccessful
186
+ return self.__card.IsValid
187
+
188
+ @property
189
+ def IsValid(self) -> bool:
190
+ """Indicates whether the card is currently valid"""
191
+ return self.__card.IsValid
192
+
193
+ @property
194
+ def IsModified(self) -> bool:
195
+ """Indicates whether the card has been modified since it was read or created"""
196
+ return self.__card.IsModified
187
197
 
188
198
  def comment_card(self) -> None:
189
199
  """Comments the card adding a $ when writing the files"""
@@ -237,6 +247,80 @@ class N2PCard(N2PInputDataNas):
237
247
  """Gets the part id of the card. If the card is not in a superelement, it returns 0"""
238
248
  return self.__card.GetSuperElement()
239
249
 
250
+ def remap_card(self) -> bool:
251
+ """Re-parses the card from its stored raw content, resetting all fields to
252
+ a clean slate and re-running the full parsing pipeline. Acts as a
253
+ "refresh": discards any uncommitted setter mutations and restores the
254
+ field values that match the stored raw bytes. Cold path — primarily
255
+ useful for recovering cards that mapped with errors at load time after
256
+ a parsing-logic update, or for rolling back unconfirmed setter edits.
257
+
258
+ Returns:
259
+ ``True`` if the card is valid after re-parsing, ``False`` if the
260
+ stored raw content was unavailable or re-parsing produced errors.
261
+ Diagnostic detail is available from the model's operation registry.
262
+ """
263
+ result = self.__card.RemapCard()
264
+ self.last_status_message()
265
+ return result
266
+
267
+ def set_raw_content_and_remap(self, new_raw_content: str) -> bool:
268
+ """Replaces the card's raw BDF text with ``new_raw_content`` (encoded to
269
+ UTF-8 bytes) and re-runs the full parsing pipeline. The previous raw
270
+ content is **permanently** overwritten — there is no undo. After this
271
+ call, :attr:`IsModified` stays ``True`` even across subsequent
272
+ :meth:`remap_card` calls, because the original on-disk content is
273
+ irrecoverable.
274
+
275
+ Args:
276
+ new_raw_content: New BDF card text to parse. Must be non-empty and
277
+ non-whitespace; otherwise the call is rejected and an error is
278
+ logged via the operation registry without mutating state.
279
+
280
+ Returns:
281
+ ``True`` if the card is valid after re-parsing, ``False`` if
282
+ ``new_raw_content`` was rejected or re-parsing produced errors.
283
+ On a parsing-error result the new raw content is **already
284
+ persisted**; the consumer can recover field-by-field via property
285
+ setters without calling this method again.
286
+
287
+ Example:
288
+ >>> card.set_raw_content_and_remap(
289
+ ... "GRID 1001 0 0.0 1.0 0.0")
290
+ """
291
+ result = self.__card.SetRawContentAndRemap(new_raw_content)
292
+ self.last_status_message()
293
+ return result
294
+
295
+ def mark_as_synthetic(self) -> None:
296
+ """Marks the card as synthetically created (built programmatically via the
297
+ API) rather than parsed from a BDF file. **Idempotent** — calling it on
298
+ an already synthetic card is a no-op. Synthetic cards may receive
299
+ distinct visualization treatment when the model is rewritten to disk
300
+ (e.g. explanatory comment headers identifying them as non-original).
301
+
302
+ The transition (when it actually happens) is recorded as an informational
303
+ entry in the model's operation registry under
304
+ ``StatusCode.CardMarkedSynthetic``.
305
+ """
306
+ self.__card.MarkAsSynthetic()
307
+ self.last_status_message()
308
+
309
+ def mark_as_original(self) -> None:
310
+ """Reverts a previously synthetic card back to original status, treating it
311
+ as if it had been parsed from a BDF file. **Idempotent** — calling it on
312
+ a card that is already original is a no-op. Typical use case: a synthetic
313
+ card has been persisted to disk via :meth:`update_file` or
314
+ :meth:`rebuild_file` and subsequent operations should treat it as part of
315
+ the original model.
316
+
317
+ The transition (when it actually happens) is recorded as an informational
318
+ entry in the model's operation registry under
319
+ ``StatusCode.CardMarkedOriginal``.
320
+ """
321
+ self.__card.MarkAsOriginal()
322
+ self.last_status_message()
323
+
240
324
 
241
325
  class N2PNastranInputData:
242
326
  """Class with the complete data of a MEF input file (text file).
@@ -447,6 +531,61 @@ class N2PNastranInputData:
447
531
  else:
448
532
  N2PLog.Error.E401(folder)
449
533
 
534
+ def update_model(self) -> None:
535
+ """Selectively saves the model in place: rewrites only the BDF files that contain user-modified cards,
536
+ leaving unmodified files untouched (content and timestamp preserved). No destination folder needed — each
537
+ ``BdfFile`` is written back to its original absolute path."""
538
+ self.__inputfiledata.UpdateModel()
539
+
540
+
541
+ def create_bdf_file(self, file_name: str, parent_bdf_file: str = None) -> Union[str, None]:
542
+ """Adds a new auxiliary BDF file to a loaded model and links it through an
543
+ ``INCLUDE`` statement inside ``parent_bdf_file`` (defaulting to the launcher
544
+ file when omitted). The new file is registered in memory only — it is
545
+ materialized to disk on the next :meth:`update_file` or :meth:`rebuild_file`
546
+ call. Returns the new ``BdfFile`` ready to be populated through
547
+ :meth:`create_card`.
548
+
549
+ Args:
550
+ file_name: Name of the new BDF file (e.g. ``"custom_materials.bdf"``).
551
+ Sub-directories are supported with forward slashes
552
+ (``"extras/load_cases.bdf"``); ``..`` is rejected. The extension is
553
+ not added automatically — supply it explicitly.
554
+ parent_bdf_file: Absolute path of an existing BDF in the model where the
555
+ ``INCLUDE`` statement will be inserted. Defaults to the launcher file
556
+ when ``None``.
557
+
558
+ Returns:
559
+ The new ``BdfFile`` instance on success, or ``None`` when the C# layer
560
+ rejects the operation (empty model, invalid file name, path collision,
561
+ include cycle, etc.). Diagnostic detail is available from the model's
562
+ operation registry.
563
+
564
+ Example:
565
+ >>> extras = model.ModelInputData.create_bdf_file("extras/custom_materials.bdf")
566
+ >>> mat = model.ModelInputData.create_card("MAT1", extras.BdfFilePath)
567
+ >>> mat.MID = 999
568
+ >>> model.ModelInputData.update_file()
569
+ """
570
+ parent = None
571
+ if parent_bdf_file is not None:
572
+ parent = self.__bdfFiles.get(parent_bdf_file)
573
+ if parent is None:
574
+ N2PLog.Warning.W212(parent_bdf_file)
575
+
576
+ new_bdf = self.__inputfiledata.CreateBdfFile(file_name, parent)
577
+
578
+ if new_bdf is None:
579
+ if not self.__inputfiledata.IsLastOperationRead():
580
+ result = self.__inputfiledata.GetLastOperationStatusStructured()
581
+ self.__inputfiledata.SetLastOperationAsRead()
582
+ if result is not None and result.StatusMessage:
583
+ N2PLog.Error.E100(result.StatusMessage)
584
+ return None
585
+
586
+ self.__bdfFiles[new_bdf.BdfFilePath] = new_bdf
587
+ return new_bdf.BdfFilePath
588
+
450
589
  def get_failed_cards(self) -> list["N2PCard"]:
451
590
  """Method that returns a list with the N2PCard objects of the input FEM file that have not been mapped correctly."""
452
591
  failed_cards = []
@@ -13059,6 +13198,244 @@ class RSPLINE(N2PCard):
13059
13198
  self.last_status_message()
13060
13199
 
13061
13200
 
13201
+ class SETOPT(N2PCard):
13202
+ def __init__(self, cardinfo):
13203
+ super().__init__(cardinfo)
13204
+ self.__cardinfo = cardinfo
13205
+
13206
+ @property
13207
+ def SID(self) -> int:
13208
+ """
13209
+ Set Identification number
13210
+ """
13211
+ return self.__cardinfo.SID
13212
+
13213
+ @SID.setter
13214
+ def SID(self, value: int) -> None:
13215
+ self.__cardinfo.SID = value
13216
+ self.last_status_message()
13217
+
13218
+ @property
13219
+ def Type(self) -> Literal['GRID', 'ELEM', 'RIGID', 'GRIDC', 'DESVAR', 'MODE', 'FREQ', 'TIME', 'LABEL', 'PLY', 'SUBSYS']:
13220
+ """Gets or sets the entity type contained in the set.
13221
+
13222
+ Valid values: GRID, ELEM, RIGID, GRIDC, DESVAR, MODE, FREQ, TIME, LABEL, PLY, SUBSYS.
13223
+ """
13224
+ return self.__cardinfo.Type
13225
+
13226
+ @Type.setter
13227
+ def Type(self, value: Literal['GRID', 'ELEM', 'RIGID', 'GRIDC', 'DESVAR', 'MODE', 'FREQ', 'TIME', 'LABEL', 'PLY', 'SUBSYS']) -> None:
13228
+ self.__cardinfo.Type = value
13229
+ self.last_status_message()
13230
+
13231
+ @property
13232
+ def SubtypeOrOperator(self) -> Literal["LIST", "BBOX", "PROP", "MAT", "ELTYPE", "ELEM", "DMIG", "OR", "AND", "NOT", "MINUS"]:
13233
+ """Gets or sets the method of set definition (SUBTYPE) or boolean operation (OPERATOR).
13234
+
13235
+ SUBTYPE VALUES (define how the set membership is determined):
13236
+ - LIST (default): Direct list of entity IDs with optional range keywords (THRU, EXCEPT, ALL)
13237
+ - BBOX: Bounding box defined by coordinates (not supported by this library)
13238
+ - PROP: Elements by property ID reference
13239
+ - MAT: Elements by material ID reference
13240
+ - ELTYPE: Elements by element type name (not supported by this library)
13241
+ - ELEM: Grids belonging to specified elements
13242
+ - DMIG: Entities from DMIG matrices (not supported by this library)
13243
+
13244
+ OPERATOR VALUES (define boolean combinations of other SETs):
13245
+ - OR: Union of listed sets (1 or more SIDs allowed)
13246
+ - AND: Intersection of listed sets (1 or more SIDs allowed)
13247
+ - NOT: Complement of a single set (exactly 1 SID required)
13248
+ - MINUS: Difference of two sets (exactly 2 SIDs required)
13249
+ """
13250
+ return self.__cardinfo.SubtypeOrOperator
13251
+
13252
+ @SubtypeOrOperator.setter
13253
+ def SubtypeOrOperator(self, value: Literal["LIST", "BBOX", "PROP", "MAT", "ELTYPE", "ELEM", "DMIG", "OR", "AND", "NOT", "MINUS"]) -> None:
13254
+ self.__cardinfo.SubtypeOrOperator = value
13255
+ self.last_status_message()
13256
+
13257
+ @property
13258
+ def IsOperator(self) -> bool:
13259
+ """
13260
+ Returns True if the set definition is a boolean operator, False otherwise.
13261
+ """
13262
+ return self.__cardinfo.IsOperator
13263
+
13264
+ @IsOperator.setter
13265
+ def IsOperator(self, value: bool) -> None:
13266
+ self.__cardinfo.IsOperator = value
13267
+ self.last_status_message()
13268
+
13269
+ @property
13270
+ def IsSubtype(self) -> bool:
13271
+ """Indicates whether the current SubtypeOrOperator value is a SUBTYPE (LIST, BBOX, PROP, etc.).
13272
+ """
13273
+ return self.__cardinfo.IsSubtype
13274
+
13275
+ @IsSubtype.setter
13276
+ def IsSubtype(self, value: bool) -> None:
13277
+ self.__cardinfo.IsSubtype = value
13278
+ self.last_status_message()
13279
+
13280
+ @property
13281
+ def EntityIDs(self) -> list[int]:
13282
+ """Gets a copy of the expanded entity ID sequence.
13283
+ """
13284
+ return list(self.__cardinfo.EntityIds)
13285
+
13286
+ @property
13287
+ def HasAllEntities(self) -> bool:
13288
+ """Indicates whether the SET uses the ALL keyword (all entities of the specified TYPE).
13289
+ When true, EntityIds returns null because the list cannot be expanded without model knowledge."""
13290
+ return self.__cardinfo.HasAllEntities
13291
+
13292
+ @property
13293
+ def IsAllExceptMode(self) -> bool:
13294
+ """Indicates whether the SET uses the ALL EXCEPT pattern.
13295
+ When true, use ExcludedEntityIds to get the list of IDs to exclude."""
13296
+ return self.__cardinfo.IsAllExceptMode
13297
+
13298
+ @property
13299
+ def ExcludedEntityIds(self) -> list[int]:
13300
+ """Gets a copy of the excluded entity ID list (ALL EXCEPT mode only)."""
13301
+ return list(self.__cardinfo.ExcludedEntityIds)
13302
+
13303
+
13304
+ def add_entity_id(self, entity_id: int) -> None:
13305
+ """Adds a new entity ID to the sequence with validation."""
13306
+ rs = self.__cardinfo.AddEntityId(entity_id)
13307
+ if not rs:
13308
+ raise ValueError("Failed to add entity ID")
13309
+
13310
+ def remove_entity_id(self, entity_id: int) -> None:
13311
+ """Removes an entity ID from the sequence by value."""
13312
+ rs = self.__cardinfo.RemoveEntityId(entity_id)
13313
+ if not rs:
13314
+ raise ValueError("Failed to remove entity ID")
13315
+
13316
+ def replace_all_entity_ids(self, new_entity_ids: list[int], validate_ids: bool = True) -> None:
13317
+ """Replaces the entire sequence of entity IDs with a new list.
13318
+
13319
+ Args:
13320
+ new_entity_ids: The new entity IDs to set. Pass an empty list to clear
13321
+ the sequence.
13322
+ validate_ids: If ``True`` (default), validates each ID against the range
13323
+ constraints for the current entity type. If ``False``, accepts all
13324
+ values without validation.
13325
+ Example:
13326
+ >>> card.replace_all_entity_ids([1001, 1002, 1003])
13327
+ >>> card.replace_all_entity_ids([]) # Clears the sequence
13328
+ """
13329
+ cs_new_entity_ids = System.Array[System.Int32](new_entity_ids)
13330
+ self.__cardinfo.ReplaceAllEntityIds(cs_new_entity_ids, validate_ids)
13331
+ self.last_status_message()
13332
+
13333
+ class SET1NAS(N2PCard):
13334
+
13335
+ def __init__(self, cardinfo):
13336
+ super().__init__(cardinfo)
13337
+ self.__cardinfo = cardinfo
13338
+
13339
+ @property
13340
+ def SID(self) -> int:
13341
+ """
13342
+ Identification number of the single-point constraint set
13343
+ """
13344
+ return self.__cardinfo.SID
13345
+
13346
+ @SID.setter
13347
+ def SID(self, value: int) -> None:
13348
+ self.__cardinfo.SID = value
13349
+ self.last_status_message()
13350
+
13351
+ @property
13352
+ def HasExplicitList(self) -> bool:
13353
+ """Indicates whether the SET1 card uses an explicit list of entity IDs (standard mode).
13354
+ When true, the entity IDs are available via the EntityIds property.
13355
+ """
13356
+ return self.__cardinfo.HasExplicitList
13357
+
13358
+ @property
13359
+ def EntityIds(self) -> list[int]:
13360
+ """Gets the expanded array of structural grid point or element IDs (IDs mode only).
13361
+ Returns a copy to prevent external modification of internal state."""
13362
+ return list(self.__cardinfo.EntityIds)
13363
+
13364
+ def contains_entity_id(self, entity_id: int) -> bool:
13365
+ """Determines whether the entity ID list contains the specified ID."""
13366
+ return self.__cardinfo.ContainsEntityId(entity_id)
13367
+
13368
+ def add_entity_id(self, entity_id: int) -> None:
13369
+ """Adds a new entity ID to the end of the list, enforcing uniqueness and positive value."""
13370
+ rs = self.__cardinfo.AddEntityId(entity_id)
13371
+ if not rs:
13372
+ raise ValueError("Failed to add entity ID")
13373
+
13374
+ def remove_entity_id(self, entity_id: int) -> None:
13375
+ """Removes the first occurrence of the specified entity ID from the list."""
13376
+ rs = self.__cardinfo.RemoveEntityId(entity_id)
13377
+ if not rs:
13378
+ raise ValueError("Failed to remove entity ID")
13379
+
13380
+ def replace_all_entity_ids(self, new_entity_ids: list[int]) -> None:
13381
+ """Replaces the entire entity ID list with a new set of IDs. Automatically removes
13382
+ duplicates and validates all values. Can transition from SKIN mode to IDs mode.
13383
+ This is the only method that clears contextual parsing errors (THRU grammar
13384
+ violations from initial parsing)."""
13385
+ cs_new_entity_ids = System.Array[System.Int32](new_entity_ids)
13386
+ self.__cardinfo.ReplaceAllEntityIds(cs_new_entity_ids)
13387
+ self.last_status_message()
13388
+
13389
+ class SET1OPT(N2PCard):
13390
+
13391
+ def __init__(self, cardinfo):
13392
+ super().__init__(cardinfo)
13393
+ self.__cardinfo = cardinfo
13394
+
13395
+ @property
13396
+ def SID(self) -> int:
13397
+ """
13398
+ Identification number of the single-point constraint set
13399
+ """
13400
+ return self.__cardinfo.SID
13401
+
13402
+ @SID.setter
13403
+ def SID(self, value: int) -> None:
13404
+ self.__cardinfo.SID = value
13405
+ self.last_status_message()
13406
+
13407
+
13408
+ @property
13409
+ def EntityIds(self) -> list[int]:
13410
+ """Gets the expanded array of structural grid point or element IDs..
13411
+ Returns a copy to prevent external modification of internal state."""
13412
+ return list(self.__cardinfo.EntityIds)
13413
+
13414
+ def contains_entity_id(self, entity_id: int) -> bool:
13415
+ """Determines whether the entity ID list contains the specified ID."""
13416
+ return self.__cardinfo.ContainsEntityId(entity_id)
13417
+
13418
+ def add_entity_id(self, entity_id: int) -> None:
13419
+ """Adds a new entity ID to the end of the list, enforcing uniqueness and positive value."""
13420
+ rs = self.__cardinfo.AddEntityId(entity_id)
13421
+ if not rs:
13422
+ raise ValueError("Failed to add entity ID")
13423
+
13424
+ def remove_entity_id(self, entity_id: int) -> None:
13425
+ """Removes the first occurrence of the specified entity ID from the list."""
13426
+ rs = self.__cardinfo.RemoveEntityId(entity_id)
13427
+ if not rs:
13428
+ raise ValueError("Failed to remove entity ID")
13429
+
13430
+ def replace_all_entity_ids(self, new_entity_ids: list[int]) -> None:
13431
+ """Replaces the entire entity ID list with a new set of IDs. Automatically removes
13432
+ duplicates and validates all values. This is the only method that clears contextual parsing errors
13433
+ (THRU grammar violations from initial parsing)."""
13434
+
13435
+ cs_new_entity_ids = System.Array[System.Int32](new_entity_ids)
13436
+ self.__cardinfo.ReplaceAllEntityIds(cs_new_entity_ids)
13437
+ self.last_status_message()
13438
+
13062
13439
  class SPCNAS(N2PCard):
13063
13440
 
13064
13441
  def __init__(self, cardinfo):
@@ -13397,11 +13774,17 @@ CONSTRUCTDICT = {
13397
13774
  "RBE2": RBE2,
13398
13775
  "RBE3": RBE3,
13399
13776
  "RSPLINE": RSPLINE,
13777
+ "SET_OPTISTRUCT": SETOPT,
13778
+ "SET1_NASTRAN": SET1NAS,
13779
+ "SET1_OPTISTRUCT": SET1OPT,
13780
+ #"SET3_NASTRAN": SET3NAS,
13781
+ #"SET3_OPTISTRUCT": SET3OPT,
13400
13782
  "SPC_NASTRAN": SPCNAS,
13401
13783
  "SPCD_NASTRAN": SPCDNAS,
13402
13784
  "SPC1": SPC1,
13403
13785
  "SPCADD": SPCADD,
13404
13786
  "UNSUPPORTED": N2PCard,
13787
+ "FIELD_MAPPING_ERROR": N2PCard,
13405
13788
  "FIELD_MAPPING_ERROR_NASTRAN": N2PCard,
13406
13789
  "FIELD_MAPPING_ERROR_OPTISTRUCT": N2PCard
13407
13790
  }
@@ -1,15 +1,15 @@
1
1
  """Constants of the NaxToPy package"""
2
2
 
3
3
  # NaxToPy Version
4
- VERSION = "3.2.3"
4
+ VERSION = "3.3.0"
5
5
 
6
6
  # Supported for Naxto:
7
- NAXTO_VERSION = '2025R2'
8
- NAXTO_STEP = "3"
9
- NAXTO_ADVANCED_INSTALLER = "2025.2.3"
7
+ NAXTO_VERSION = '2026R0'
8
+ NAXTO_STEP = "0"
9
+ NAXTO_ADVANCED_INSTALLER = "2026.0.0"
10
10
 
11
11
  # Assembly version of NaxToModel.dll
12
- VIZZER_COMPATIBILITY = ("5.2.0.3")
12
+ VIZZER_COMPATIBILITY = ("6.0.0.0")
13
13
  """Tuple with the compatible versions of NaxToModel.dll"""
14
14
 
15
15
  # PYTHON EXTERNO ----------------------------------------------------------------------------------
@@ -698,6 +698,12 @@ own information message. Use the following structure as a standard message (I +
698
698
  message = f"W301: the name for the new load case already exist. It has been rename to '{name}'"
699
699
  N2PLog._N2PLog__logger.warning(message)
700
700
 
701
+ @staticmethod
702
+ def W302() -> None:
703
+ """ Warning raised when not all the inputs components are in N2PResult.Components
704
+ """
705
+ message = f"W302: A component introduced is not in the results component list of a load case"
706
+ N2PLog._N2PLog__logger.warning(message)
701
707
 
702
708
  @staticmethod
703
709
  def W500(listids) -> None: