RS3Scripting 4.42.0__py3-none-any.whl
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.
- rs3/ApplicationManager.py +77 -0
- rs3/ColorPicker.py +123 -0
- rs3/CommonEnums.py +16 -0
- rs3/Compute.py +105 -0
- rs3/ExternalVolume.py +48 -0
- rs3/Geometry.py +74 -0
- rs3/Model.py +795 -0
- rs3/ModelEnums.py +9 -0
- rs3/RS3Modeler.py +109 -0
- rs3/Restraints.py +91 -0
- rs3/Selection.py +123 -0
- rs3/__init__.py +18 -0
- rs3/_client.py +57 -0
- rs3/_proxyObject.py +5 -0
- rs3/generatedFiles/BFPCommonMessage_pb2.py +38 -0
- rs3/generatedFiles/BFPCommonMessage_pb2.pyi +47 -0
- rs3/generatedFiles/BFPCommonMessage_pb2_grpc.py +24 -0
- rs3/generatedFiles/BeamDataService_pb2.py +37 -0
- rs3/generatedFiles/BeamDataService_pb2.pyi +5 -0
- rs3/generatedFiles/BeamDataService_pb2_grpc.py +226 -0
- rs3/generatedFiles/BeamService_pb2.py +37 -0
- rs3/generatedFiles/BeamService_pb2.pyi +5 -0
- rs3/generatedFiles/BeamService_pb2_grpc.py +140 -0
- rs3/generatedFiles/BeamStageFactorService_pb2.py +37 -0
- rs3/generatedFiles/BeamStageFactorService_pb2.pyi +5 -0
- rs3/generatedFiles/BeamStageFactorService_pb2_grpc.py +140 -0
- rs3/generatedFiles/BeamsResultsQueryService_pb2.py +50 -0
- rs3/generatedFiles/BeamsResultsQueryService_pb2.pyi +48 -0
- rs3/generatedFiles/BeamsResultsQueryService_pb2_grpc.py +141 -0
- rs3/generatedFiles/BoltDataService_pb2.py +37 -0
- rs3/generatedFiles/BoltDataService_pb2.pyi +5 -0
- rs3/generatedFiles/BoltDataService_pb2_grpc.py +226 -0
- rs3/generatedFiles/BoltService_pb2.py +37 -0
- rs3/generatedFiles/BoltService_pb2.pyi +5 -0
- rs3/generatedFiles/BoltService_pb2_grpc.py +140 -0
- rs3/generatedFiles/BoltsResultsQueryService_pb2.py +51 -0
- rs3/generatedFiles/BoltsResultsQueryService_pb2.pyi +75 -0
- rs3/generatedFiles/BoltsResultsQueryService_pb2_grpc.py +141 -0
- rs3/generatedFiles/ClientService_pb2.py +40 -0
- rs3/generatedFiles/ClientService_pb2.pyi +15 -0
- rs3/generatedFiles/ClientService_pb2_grpc.py +97 -0
- rs3/generatedFiles/CommonGeometryMessages_pb2.py +52 -0
- rs3/generatedFiles/CommonGeometryMessages_pb2.pyi +92 -0
- rs3/generatedFiles/CommonGeometryMessages_pb2_grpc.py +24 -0
- rs3/generatedFiles/CommonMessages_pb2.py +66 -0
- rs3/generatedFiles/CommonMessages_pb2.pyi +145 -0
- rs3/generatedFiles/CommonMessages_pb2_grpc.py +24 -0
- rs3/generatedFiles/CompositeLinerDataService_pb2.py +47 -0
- rs3/generatedFiles/CompositeLinerDataService_pb2.pyi +51 -0
- rs3/generatedFiles/CompositeLinerDataService_pb2_grpc.py +227 -0
- rs3/generatedFiles/CompositeLinerResultsQueryService_pb2.py +63 -0
- rs3/generatedFiles/CompositeLinerResultsQueryService_pb2.pyi +139 -0
- rs3/generatedFiles/CompositeLinerResultsQueryService_pb2_grpc.py +314 -0
- rs3/generatedFiles/CompositeLinerService_pb2.py +37 -0
- rs3/generatedFiles/CompositeLinerService_pb2.pyi +5 -0
- rs3/generatedFiles/CompositeLinerService_pb2_grpc.py +140 -0
- rs3/generatedFiles/ComputeService_pb2.py +48 -0
- rs3/generatedFiles/ComputeService_pb2.pyi +56 -0
- rs3/generatedFiles/ComputeService_pb2_grpc.py +147 -0
- rs3/generatedFiles/ExternalVolumesService_pb2.py +45 -0
- rs3/generatedFiles/ExternalVolumesService_pb2.pyi +34 -0
- rs3/generatedFiles/ExternalVolumesService_pb2_grpc.py +270 -0
- rs3/generatedFiles/FieldStressService_pb2.py +37 -0
- rs3/generatedFiles/FieldStressService_pb2.pyi +5 -0
- rs3/generatedFiles/FieldStressService_pb2_grpc.py +140 -0
- rs3/generatedFiles/FieldStressSourceService_pb2.py +85 -0
- rs3/generatedFiles/FieldStressSourceService_pb2.pyi +182 -0
- rs3/generatedFiles/FieldStressSourceService_pb2_grpc.py +657 -0
- rs3/generatedFiles/GaussPointFailureMessage_pb2.py +37 -0
- rs3/generatedFiles/GaussPointFailureMessage_pb2.pyi +14 -0
- rs3/generatedFiles/GaussPointFailureMessage_pb2_grpc.py +24 -0
- rs3/generatedFiles/HydraulicStageFactorService_pb2.py +45 -0
- rs3/generatedFiles/HydraulicStageFactorService_pb2.pyi +36 -0
- rs3/generatedFiles/HydraulicStageFactorService_pb2_grpc.py +227 -0
- rs3/generatedFiles/JointDataService_pb2.py +45 -0
- rs3/generatedFiles/JointDataService_pb2.pyi +30 -0
- rs3/generatedFiles/JointDataService_pb2_grpc.py +313 -0
- rs3/generatedFiles/JointResultsQueryService_pb2.py +54 -0
- rs3/generatedFiles/JointResultsQueryService_pb2.pyi +92 -0
- rs3/generatedFiles/JointResultsQueryService_pb2_grpc.py +141 -0
- rs3/generatedFiles/JointService_pb2.py +45 -0
- rs3/generatedFiles/JointService_pb2.pyi +30 -0
- rs3/generatedFiles/JointService_pb2_grpc.py +227 -0
- rs3/generatedFiles/JointStageFactorService_pb2.py +37 -0
- rs3/generatedFiles/JointStageFactorService_pb2.pyi +5 -0
- rs3/generatedFiles/JointStageFactorService_pb2_grpc.py +140 -0
- rs3/generatedFiles/LinerDataService_pb2.py +37 -0
- rs3/generatedFiles/LinerDataService_pb2.pyi +5 -0
- rs3/generatedFiles/LinerDataService_pb2_grpc.py +226 -0
- rs3/generatedFiles/LinerService_pb2.py +37 -0
- rs3/generatedFiles/LinerService_pb2.pyi +5 -0
- rs3/generatedFiles/LinerService_pb2_grpc.py +140 -0
- rs3/generatedFiles/LinerStageFactorService_pb2.py +37 -0
- rs3/generatedFiles/LinerStageFactorService_pb2.pyi +5 -0
- rs3/generatedFiles/LinerStageFactorService_pb2_grpc.py +140 -0
- rs3/generatedFiles/MaterialDataService_pb2.py +37 -0
- rs3/generatedFiles/MaterialDataService_pb2.pyi +5 -0
- rs3/generatedFiles/MaterialDataService_pb2_grpc.py +226 -0
- rs3/generatedFiles/MaterialDatumService_pb2.py +45 -0
- rs3/generatedFiles/MaterialDatumService_pb2.pyi +38 -0
- rs3/generatedFiles/MaterialDatumService_pb2_grpc.py +140 -0
- rs3/generatedFiles/MaterialHydraulicDataService_pb2.py +93 -0
- rs3/generatedFiles/MaterialHydraulicDataService_pb2.pyi +193 -0
- rs3/generatedFiles/MaterialHydraulicDataService_pb2_grpc.py +829 -0
- rs3/generatedFiles/MaterialHydraulicModelService_pb2.py +55 -0
- rs3/generatedFiles/MaterialHydraulicModelService_pb2.pyi +79 -0
- rs3/generatedFiles/MaterialHydraulicModelService_pb2_grpc.py +313 -0
- rs3/generatedFiles/MaterialInitialConditionsService_pb2.py +37 -0
- rs3/generatedFiles/MaterialInitialConditionsService_pb2.pyi +5 -0
- rs3/generatedFiles/MaterialInitialConditionsService_pb2_grpc.py +140 -0
- rs3/generatedFiles/MaterialJointService_pb2.py +49 -0
- rs3/generatedFiles/MaterialJointService_pb2.pyi +52 -0
- rs3/generatedFiles/MaterialJointService_pb2_grpc.py +183 -0
- rs3/generatedFiles/MaterialJointSetSlipCriterionService_pb2.py +69 -0
- rs3/generatedFiles/MaterialJointSetSlipCriterionService_pb2.pyi +130 -0
- rs3/generatedFiles/MaterialJointSetSlipCriterionService_pb2_grpc.py +398 -0
- rs3/generatedFiles/MaterialJointStageFactorService_pb2.py +45 -0
- rs3/generatedFiles/MaterialJointStageFactorService_pb2.pyi +42 -0
- rs3/generatedFiles/MaterialJointStageFactorService_pb2_grpc.py +140 -0
- rs3/generatedFiles/MaterialStageFactorsService_pb2.py +37 -0
- rs3/generatedFiles/MaterialStageFactorsService_pb2.pyi +5 -0
- rs3/generatedFiles/MaterialStageFactorsService_pb2_grpc.py +140 -0
- rs3/generatedFiles/MaterialStiffnessFormulaService_pb2.py +47 -0
- rs3/generatedFiles/MaterialStiffnessFormulaService_pb2.pyi +54 -0
- rs3/generatedFiles/MaterialStiffnessFormulaService_pb2_grpc.py +140 -0
- rs3/generatedFiles/MaterialStiffnessService_pb2.py +53 -0
- rs3/generatedFiles/MaterialStiffnessService_pb2.pyi +66 -0
- rs3/generatedFiles/MaterialStiffnessService_pb2_grpc.py +313 -0
- rs3/generatedFiles/MaterialStrengthService_pb2.py +105 -0
- rs3/generatedFiles/MaterialStrengthService_pb2.pyi +243 -0
- rs3/generatedFiles/MaterialStrengthService_pb2_grpc.py +833 -0
- rs3/generatedFiles/MaterialUnsaturatedSoilDataService_pb2.py +47 -0
- rs3/generatedFiles/MaterialUnsaturatedSoilDataService_pb2.pyi +43 -0
- rs3/generatedFiles/MaterialUnsaturatedSoilDataService_pb2_grpc.py +228 -0
- rs3/generatedFiles/MeshSettingsService_pb2.py +41 -0
- rs3/generatedFiles/MeshSettingsService_pb2.pyi +16 -0
- rs3/generatedFiles/MeshSettingsService_pb2_grpc.py +184 -0
- rs3/generatedFiles/ModelFunctionService_pb2.py +119 -0
- rs3/generatedFiles/ModelFunctionService_pb2.pyi +331 -0
- rs3/generatedFiles/ModelFunctionService_pb2_grpc.py +871 -0
- rs3/generatedFiles/ModelService_pb2.py +342 -0
- rs3/generatedFiles/ModelService_pb2.pyi +962 -0
- rs3/generatedFiles/ModelService_pb2_grpc.py +3322 -0
- rs3/generatedFiles/PileDataService_pb2.py +55 -0
- rs3/generatedFiles/PileDataService_pb2.pyi +63 -0
- rs3/generatedFiles/PileDataService_pb2_grpc.py +399 -0
- rs3/generatedFiles/PileForepoleResultsQueryService_pb2.py +51 -0
- rs3/generatedFiles/PileForepoleResultsQueryService_pb2.pyi +63 -0
- rs3/generatedFiles/PileForepoleResultsQueryService_pb2_grpc.py +141 -0
- rs3/generatedFiles/PileStageFactorService_pb2.py +37 -0
- rs3/generatedFiles/PileStageFactorService_pb2.pyi +5 -0
- rs3/generatedFiles/PileStageFactorService_pb2_grpc.py +140 -0
- rs3/generatedFiles/PlainStrandCableBoltService_pb2.py +44 -0
- rs3/generatedFiles/PlainStrandCableBoltService_pb2.pyi +30 -0
- rs3/generatedFiles/PlainStrandCableBoltService_pb2_grpc.py +140 -0
- rs3/generatedFiles/ProjectSettingsDataService_pb2.py +69 -0
- rs3/generatedFiles/ProjectSettingsDataService_pb2.pyi +119 -0
- rs3/generatedFiles/ProjectSettingsDataService_pb2_grpc.py +786 -0
- rs3/generatedFiles/RFCApplicationService_pb2.py +34 -0
- rs3/generatedFiles/RFCApplicationService_pb2.pyi +27 -0
- rs3/generatedFiles/RFCApplicationService_pb2_grpc.py +145 -0
- rs3/generatedFiles/RS3ModelerService_pb2.py +50 -0
- rs3/generatedFiles/RS3ModelerService_pb2.pyi +45 -0
- rs3/generatedFiles/RS3ModelerService_pb2_grpc.py +183 -0
- rs3/generatedFiles/RelativeStageFactorService_pb2.py +40 -0
- rs3/generatedFiles/RelativeStageFactorService_pb2.pyi +17 -0
- rs3/generatedFiles/RelativeStageFactorService_pb2_grpc.py +97 -0
- rs3/generatedFiles/RestraintsService_pb2.py +62 -0
- rs3/generatedFiles/RestraintsService_pb2.pyi +84 -0
- rs3/generatedFiles/RestraintsService_pb2_grpc.py +312 -0
- rs3/generatedFiles/ResultsQueryCommonMessage_pb2.py +56 -0
- rs3/generatedFiles/ResultsQueryCommonMessage_pb2.pyi +85 -0
- rs3/generatedFiles/ResultsQueryCommonMessage_pb2_grpc.py +24 -0
- rs3/generatedFiles/ResultsQueryService_pb2.py +87 -0
- rs3/generatedFiles/ResultsQueryService_pb2.pyi +185 -0
- rs3/generatedFiles/ResultsQueryService_pb2_grpc.py +745 -0
- rs3/generatedFiles/SelectionService_pb2.py +49 -0
- rs3/generatedFiles/SelectionService_pb2.pyi +51 -0
- rs3/generatedFiles/SelectionService_pb2_grpc.py +269 -0
- rs3/generatedFiles/SolidsResultsQueryService_pb2.py +93 -0
- rs3/generatedFiles/SolidsResultsQueryService_pb2.pyi +213 -0
- rs3/generatedFiles/SolidsResultsQueryService_pb2_grpc.py +195 -0
- rs3/generatedFiles/StageFactorService_pb2.py +58 -0
- rs3/generatedFiles/StageFactorService_pb2.pyi +79 -0
- rs3/generatedFiles/StageFactorService_pb2_grpc.py +226 -0
- rs3/generatedFiles/StiffnessStageFactorService_pb2.py +37 -0
- rs3/generatedFiles/StiffnessStageFactorService_pb2.pyi +5 -0
- rs3/generatedFiles/StiffnessStageFactorService_pb2_grpc.py +140 -0
- rs3/generatedFiles/StrengthStageFactorService_pb2.py +37 -0
- rs3/generatedFiles/StrengthStageFactorService_pb2.pyi +5 -0
- rs3/generatedFiles/StrengthStageFactorService_pb2_grpc.py +140 -0
- rs3/generatedFiles/WaterByLocationDataService_pb2.py +61 -0
- rs3/generatedFiles/WaterByLocationDataService_pb2.pyi +95 -0
- rs3/generatedFiles/WaterByLocationDataService_pb2_grpc.py +312 -0
- rs3/generatedFiles/WaterPressureGridDataService_pb2.py +63 -0
- rs3/generatedFiles/WaterPressureGridDataService_pb2.pyi +107 -0
- rs3/generatedFiles/WaterPressureGridDataService_pb2_grpc.py +312 -0
- rs3/generatedFiles/__init__.py +3 -0
- rs3/loadings/LoadingEnums.py +6 -0
- rs3/loadings/Loadings.py +15 -0
- rs3/loadings/__init__.py +0 -0
- rs3/loadings/fieldStress/AdvancedConstant.py +115 -0
- rs3/loadings/fieldStress/AdvancedGravity.py +176 -0
- rs3/loadings/fieldStress/Constant.py +119 -0
- rs3/loadings/fieldStress/FieldStress.py +38 -0
- rs3/loadings/fieldStress/Gravity.py +206 -0
- rs3/loadings/fieldStress/_PropertyAccessor.py +41 -0
- rs3/loadings/fieldStress/__init__.py +0 -0
- rs3/mesh/Graded.py +59 -0
- rs3/mesh/Mesh.py +50 -0
- rs3/mesh/MeshEnums.py +16 -0
- rs3/mesh/Uniform.py +35 -0
- rs3/mesh/_PropertyAccessor.py +10 -0
- rs3/mesh/__init__.py +0 -0
- rs3/projectSettings/Dynamic.py +110 -0
- rs3/projectSettings/Groundwater.py +118 -0
- rs3/projectSettings/ProjectSettingEnums.py +108 -0
- rs3/projectSettings/ProjectSettings.py +43 -0
- rs3/projectSettings/ShearStrengthReduction.py +130 -0
- rs3/projectSettings/SolverOptions.py +88 -0
- rs3/projectSettings/Stages.py +162 -0
- rs3/projectSettings/StressAnalysis.py +183 -0
- rs3/projectSettings/Units.py +82 -0
- rs3/projectSettings/_PropertyAccessor.py +133 -0
- rs3/projectSettings/__init__.py +0 -0
- rs3/properties/CustomHydraulicModel.py +129 -0
- rs3/properties/DiscreteFunction.py +147 -0
- rs3/properties/GeneralizedAnisotropicFunction.py +98 -0
- rs3/properties/IPropertyGroupAccessors.py +12 -0
- rs3/properties/PropertyEnums.py +387 -0
- rs3/properties/ShearNormalFunction.py +94 -0
- rs3/properties/SnowdenStrengthFunction.py +115 -0
- rs3/properties/_PropertyAccessor.py +111 -0
- rs3/properties/__init__.py +0 -0
- rs3/properties/beam/Beam.py +86 -0
- rs3/properties/beam/BeamCommon.py +175 -0
- rs3/properties/beam/Standard.py +97 -0
- rs3/properties/beam/Truss.py +23 -0
- rs3/properties/beam/_PropertyAccessor.py +9 -0
- rs3/properties/beam/__init__.py +0 -0
- rs3/properties/bolt/Bolt.py +81 -0
- rs3/properties/bolt/EndAnchored.py +77 -0
- rs3/properties/bolt/FullyBonded.py +78 -0
- rs3/properties/bolt/PlainStrandCable.py +151 -0
- rs3/properties/bolt/Swellex.py +106 -0
- rs3/properties/bolt/Tieback.py +176 -0
- rs3/properties/bolt/_PropertyAccessor.py +7 -0
- rs3/properties/bolt/__init__.py +0 -0
- rs3/properties/groundwater/WaterByLocation.py +83 -0
- rs3/properties/groundwater/WaterGrid.py +120 -0
- rs3/properties/groundwater/_PropertyAccessor.py +36 -0
- rs3/properties/groundwater/__init__.py +0 -0
- rs3/properties/joint/BartonBandis.py +118 -0
- rs3/properties/joint/GeosyntheticHyperbolic.py +158 -0
- rs3/properties/joint/Joint.py +176 -0
- rs3/properties/joint/MaterialDependent.py +107 -0
- rs3/properties/joint/MohrCoulomb.py +169 -0
- rs3/properties/joint/NoneSlip.py +68 -0
- rs3/properties/joint/_PropertyAccessor.py +9 -0
- rs3/properties/joint/__init__.py +0 -0
- rs3/properties/liner/Geosynthetic.py +85 -0
- rs3/properties/liner/Liner.py +83 -0
- rs3/properties/liner/ReinforcedConcrete.py +216 -0
- rs3/properties/liner/Standard.py +183 -0
- rs3/properties/liner/_PropertyAccessor.py +7 -0
- rs3/properties/liner/__init__.py +0 -0
- rs3/properties/liningComposition/LiningComposition.py +244 -0
- rs3/properties/liningComposition/_PropertyAccessor.py +7 -0
- rs3/properties/liningComposition/__init__.py +0 -0
- rs3/properties/material/Material.py +74 -0
- rs3/properties/material/__init__.py +0 -0
- rs3/properties/material/constitutiveModel/AnisotropicLinear.py +149 -0
- rs3/properties/material/constitutiveModel/AnisotropicLinearPlanarBase.py +72 -0
- rs3/properties/material/constitutiveModel/BarcelonaBasic.py +158 -0
- rs3/properties/material/constitutiveModel/BartonBandis.py +77 -0
- rs3/properties/material/constitutiveModel/BaseConstitutiveModel.py +11 -0
- rs3/properties/material/constitutiveModel/BoundingSurfacePlasticity.py +88 -0
- rs3/properties/material/constitutiveModel/CamClay.py +144 -0
- rs3/properties/material/constitutiveModel/ChSoil.py +111 -0
- rs3/properties/material/constitutiveModel/ConstitutiveModel.py +87 -0
- rs3/properties/material/constitutiveModel/CySoil.py +137 -0
- rs3/properties/material/constitutiveModel/DiscreteFunction.py +39 -0
- rs3/properties/material/constitutiveModel/DoubleYield.py +130 -0
- rs3/properties/material/constitutiveModel/DruckerPrager.py +136 -0
- rs3/properties/material/constitutiveModel/GeneralizedAnisotropic.py +39 -0
- rs3/properties/material/constitutiveModel/GeneralizedHoekBrown.py +226 -0
- rs3/properties/material/constitutiveModel/HardeningSoil.py +156 -0
- rs3/properties/material/constitutiveModel/HardeningSoilWithSmallStrain.py +170 -0
- rs3/properties/material/constitutiveModel/HoekBrown.py +125 -0
- rs3/properties/material/constitutiveModel/Hyperbolic.py +77 -0
- rs3/properties/material/constitutiveModel/JointedGeneralizedHoekBrown.py +184 -0
- rs3/properties/material/constitutiveModel/JointedMohrCoulomb.py +173 -0
- rs3/properties/material/constitutiveModel/ManzariAndDafalias.py +148 -0
- rs3/properties/material/constitutiveModel/ModifiedCamClay.py +11 -0
- rs3/properties/material/constitutiveModel/MohrCoulomb.py +147 -0
- rs3/properties/material/constitutiveModel/MohrCoulombUnsaturatedZoneCalculations.py +80 -0
- rs3/properties/material/constitutiveModel/MohrCoulombWithCap.py +154 -0
- rs3/properties/material/constitutiveModel/Norsand.py +146 -0
- rs3/properties/material/constitutiveModel/PowerCurve.py +119 -0
- rs3/properties/material/constitutiveModel/Shansep.py +214 -0
- rs3/properties/material/constitutiveModel/ShearNormalFunction.py +34 -0
- rs3/properties/material/constitutiveModel/SnowdenAnisotropicLinear.py +108 -0
- rs3/properties/material/constitutiveModel/SoftSoil.py +104 -0
- rs3/properties/material/constitutiveModel/SoftSoilCreep.py +111 -0
- rs3/properties/material/constitutiveModel/SofteningHardening.py +214 -0
- rs3/properties/material/constitutiveModel/SwellingRock.py +202 -0
- rs3/properties/material/constitutiveModel/UnsaturatedZoneCalculations.py +138 -0
- rs3/properties/material/constitutiveModel/VerticalStressRatio.py +113 -0
- rs3/properties/material/constitutiveModel/_PropertyAccessor.py +96 -0
- rs3/properties/material/constitutiveModel/__init__.py +0 -0
- rs3/properties/material/constitutiveModel/jointOption/BartonBandis.py +109 -0
- rs3/properties/material/constitutiveModel/jointOption/MaterialJoint.py +48 -0
- rs3/properties/material/constitutiveModel/jointOption/MaterialJointOptions.py +32 -0
- rs3/properties/material/constitutiveModel/jointOption/MohrCoulomb.py +142 -0
- rs3/properties/material/constitutiveModel/jointOption/PlaneOrientationBase.py +92 -0
- rs3/properties/material/constitutiveModel/jointOption/SimpleHyperbolic.py +112 -0
- rs3/properties/material/constitutiveModel/jointOption/_PropertyAccessor.py +61 -0
- rs3/properties/material/constitutiveModel/jointOption/__init__.py +0 -0
- rs3/properties/material/constitutiveModel/stiffness/BaseStiffness.py +11 -0
- rs3/properties/material/constitutiveModel/stiffness/DuncanChangHyperbolic.py +128 -0
- rs3/properties/material/constitutiveModel/stiffness/GeneralizedHoekBrownEstimation.py +50 -0
- rs3/properties/material/constitutiveModel/stiffness/LinearIsotropic.py +106 -0
- rs3/properties/material/constitutiveModel/stiffness/NonlinearIsotropic.py +104 -0
- rs3/properties/material/constitutiveModel/stiffness/Orthotropic.py +296 -0
- rs3/properties/material/constitutiveModel/stiffness/TransverselyIsotropic.py +186 -0
- rs3/properties/material/constitutiveModel/stiffness/_PropertyAccessor.py +33 -0
- rs3/properties/material/constitutiveModel/stiffness/__init__.py +0 -0
- rs3/properties/material/constitutiveModel/stiffness/formula/Formula1.py +96 -0
- rs3/properties/material/constitutiveModel/stiffness/formula/Formula2.py +136 -0
- rs3/properties/material/constitutiveModel/stiffness/formula/Formula3.py +113 -0
- rs3/properties/material/constitutiveModel/stiffness/formula/_PropertyAccessor.py +37 -0
- rs3/properties/material/constitutiveModel/stiffness/formula/__init__.py +0 -0
- rs3/properties/material/datum/CohesionDatumDependency.py +99 -0
- rs3/properties/material/datum/Datum.py +23 -0
- rs3/properties/material/datum/FrictionAngleDatumDependency.py +99 -0
- rs3/properties/material/datum/YoungsModulusDatumDependency.py +78 -0
- rs3/properties/material/datum/_PropertyAccessor.py +26 -0
- rs3/properties/material/datum/__init__.py +0 -0
- rs3/properties/material/hydraulic/FEAGroundwater/Brooks.py +71 -0
- rs3/properties/material/hydraulic/FEAGroundwater/Custom.py +79 -0
- rs3/properties/material/hydraulic/FEAGroundwater/FEAGroundwater.py +85 -0
- rs3/properties/material/hydraulic/FEAGroundwater/Fredlund.py +82 -0
- rs3/properties/material/hydraulic/FEAGroundwater/Gardner.py +72 -0
- rs3/properties/material/hydraulic/FEAGroundwater/HydraulicMethodVectors.py +97 -0
- rs3/properties/material/hydraulic/FEAGroundwater/HydraulicParametersCommon.py +157 -0
- rs3/properties/material/hydraulic/FEAGroundwater/Simple.py +37 -0
- rs3/properties/material/hydraulic/FEAGroundwater/VanGenuchten.py +94 -0
- rs3/properties/material/hydraulic/FEAGroundwater/_PropertyAccessor.py +16 -0
- rs3/properties/material/hydraulic/FEAGroundwater/__init__.py +0 -0
- rs3/properties/material/hydraulic/Hydraulic.py +111 -0
- rs3/properties/material/hydraulic/PhreaticConditions.py +37 -0
- rs3/properties/material/hydraulic/StaticGroundwater.py +100 -0
- rs3/properties/material/hydraulic/WaterConditions.py +110 -0
- rs3/properties/material/hydraulic/_PropertyAccessor.py +31 -0
- rs3/properties/material/hydraulic/__init__.py +0 -0
- rs3/properties/material/initialConditions/InitialConditions.py +108 -0
- rs3/properties/material/initialConditions/_PropertyAccessor.py +11 -0
- rs3/properties/material/initialConditions/__init__.py +0 -0
- rs3/properties/material/stageFactors/StageFactors.py +77 -0
- rs3/properties/material/stageFactors/_PropertyAccessor.py +7 -0
- rs3/properties/material/stageFactors/__init__.py +0 -0
- rs3/properties/pile/EndCondition.py +109 -0
- rs3/properties/pile/Linear.py +69 -0
- rs3/properties/pile/MohrCoulomb.py +123 -0
- rs3/properties/pile/MultiLinear.py +70 -0
- rs3/properties/pile/Pile.py +108 -0
- rs3/properties/pile/PileCommon.py +99 -0
- rs3/properties/pile/_PropertyAccessor.py +9 -0
- rs3/properties/pile/__init__.py +0 -0
- rs3/properties/stageFactors/IStageFactorBase.py +10 -0
- rs3/properties/stageFactors/StageFactorBaseInterfaces.py +24 -0
- rs3/properties/stageFactors/StageFactorInterfaces.py +70 -0
- rs3/properties/stageFactors/_StageFactorInterface.py +48 -0
- rs3/properties/stageFactors/_StageFactorPropertyAccessor.py +18 -0
- rs3/properties/stageFactors/__init__.py +0 -0
- rs3/results/BeamResults.py +181 -0
- rs3/results/BoltResults.py +214 -0
- rs3/results/CompositeLinerResults.py +374 -0
- rs3/results/JointResults.py +160 -0
- rs3/results/PileForepoleResults.py +219 -0
- rs3/results/ResultEnums.py +146 -0
- rs3/results/Results.py +661 -0
- rs3/results/ResultsCommon.py +66 -0
- rs3/results/SolidElementResults.py +175 -0
- rs3/results/SolidNodalResults.py +248 -0
- rs3/results/SolidResults.py +206 -0
- rs3/results/YieldedElement.py +33 -0
- rs3/results/__init__.py +0 -0
- rs3scripting-4.42.0.dist-info/METADATA +70 -0
- rs3scripting-4.42.0.dist-info/RECORD +393 -0
- rs3scripting-4.42.0.dist-info/WHEEL +5 -0
- rs3scripting-4.42.0.dist-info/licenses/License.txt +20 -0
- rs3scripting-4.42.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
from typing import List, Optional, Union
|
|
2
|
+
|
|
3
|
+
import rs3.generatedFiles.ResultsQueryCommonMessage_pb2 as ResultsQueryCommonMessage_pb2
|
|
4
|
+
|
|
5
|
+
from rs3._proxyObject import _ProxyObject
|
|
6
|
+
from rs3._client import Client
|
|
7
|
+
from rs3.Geometry import Cube, Cylinder, Sphere
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class _NodeValuePairCollection:
|
|
11
|
+
'''
|
|
12
|
+
Container for a collection of node value pairs.
|
|
13
|
+
|
|
14
|
+
Notes:
|
|
15
|
+
- FormattedDisplay joins items with commas; formatting is stable but not localized.
|
|
16
|
+
'''
|
|
17
|
+
def __init__(self, nodeValuePairs: List[tuple[int, float]]):
|
|
18
|
+
self._nodeValuePairs: List[tuple[int, float]] = nodeValuePairs
|
|
19
|
+
self._nodeValues: List[float] = [value for _, value in self._nodeValuePairs]
|
|
20
|
+
self._nodeValuesDisplay = None
|
|
21
|
+
|
|
22
|
+
@property
|
|
23
|
+
def FormattedDisplay(self) -> str:
|
|
24
|
+
if self._nodeValuesDisplay is None:
|
|
25
|
+
self._nodeValuesDisplay = ",".join([f"Node {nodeId}: {value}" for nodeId, value in self._nodeValuePairs])
|
|
26
|
+
return self._nodeValuesDisplay
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def NodeValuePairs(self) -> List[tuple[int, float]]:
|
|
30
|
+
return self._nodeValuePairs
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def ResultValues(self) -> List[float]:
|
|
35
|
+
return self._nodeValues
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class _ResultsQueryBase(_ProxyObject):
|
|
40
|
+
|
|
41
|
+
def __init__(self, client: Client, projectId: str, stageNumber: int, srfResultIndex: int):
|
|
42
|
+
super().__init__(client, projectId)
|
|
43
|
+
self._stageNumber = stageNumber
|
|
44
|
+
self._srfResultIndex = srfResultIndex
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _makeRequest(self, entityName: Optional[str], region: Optional[Union[Cube, Cylinder, Sphere]], includeIntersecting: bool = True) -> ResultsQueryCommonMessage_pb2.ResultsQueryRequest:
|
|
48
|
+
request = ResultsQueryCommonMessage_pb2.ResultsQueryRequest(
|
|
49
|
+
_projectId=self._objectId,
|
|
50
|
+
stageNumber=self._stageNumber,
|
|
51
|
+
srfValueNumber=self._srfResultIndex)
|
|
52
|
+
|
|
53
|
+
if entityName is not None:
|
|
54
|
+
entityName = entityName.strip()
|
|
55
|
+
if entityName:
|
|
56
|
+
request.entityName = entityName
|
|
57
|
+
|
|
58
|
+
if region is not None:
|
|
59
|
+
if isinstance(region, (Cube, Cylinder, Sphere)):
|
|
60
|
+
common_region = region.toCommonGeometryObject()
|
|
61
|
+
request.sampleRegion.region.CopyFrom(common_region)
|
|
62
|
+
request.sampleRegion.includeIntersecting = includeIntersecting
|
|
63
|
+
else:
|
|
64
|
+
raise TypeError(f"Unsupported region type: {type(region)}")
|
|
65
|
+
|
|
66
|
+
return request
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
from typing import List, Dict
|
|
2
|
+
import rs3.generatedFiles.SolidsResultsQueryService_pb2 as SolidsResultsQueryService_pb2
|
|
3
|
+
|
|
4
|
+
class NodeUserDataResult:
|
|
5
|
+
def __init__(self, nodeId: int, value: float):
|
|
6
|
+
self._nodeId = nodeId
|
|
7
|
+
self._value = value
|
|
8
|
+
|
|
9
|
+
@property
|
|
10
|
+
def NodeID(self) -> int:
|
|
11
|
+
return self._nodeId
|
|
12
|
+
|
|
13
|
+
@property
|
|
14
|
+
def Value(self) -> float:
|
|
15
|
+
return self._value
|
|
16
|
+
|
|
17
|
+
def __str__(self) -> str:
|
|
18
|
+
return f"Node {self._nodeId}: {self._value}"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class UserDataResults:
|
|
22
|
+
'''
|
|
23
|
+
Container for node-level user data.
|
|
24
|
+
|
|
25
|
+
Notes:
|
|
26
|
+
- NodeDataValues are sorted by NodeID and exposed as an immutable sequence (tuple).
|
|
27
|
+
- FormattedDisplay joins items with commas; formatting is stable but not localized.
|
|
28
|
+
'''
|
|
29
|
+
def __init__(self, nodeDataValues: List[NodeUserDataResult]):
|
|
30
|
+
self._nodeDataValues = sorted(nodeDataValues, key=lambda x: x.NodeID)
|
|
31
|
+
self._nodeDataValuesDisplay = None
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def FormattedDisplay(self) -> str:
|
|
35
|
+
if self._nodeDataValuesDisplay is None:
|
|
36
|
+
self._nodeDataValuesDisplay = ",".join([str(nodeDataValue) for nodeDataValue in self._nodeDataValues])
|
|
37
|
+
return self._nodeDataValuesDisplay
|
|
38
|
+
|
|
39
|
+
@property
|
|
40
|
+
def NodeDataValues(self) -> tuple[NodeUserDataResult, ...]:
|
|
41
|
+
return tuple(self._nodeDataValues)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class UserDataResultsCollection:
|
|
45
|
+
'''
|
|
46
|
+
Lazily builds and caches user data series by name.
|
|
47
|
+
|
|
48
|
+
Notes:
|
|
49
|
+
- The first access to a given userDataName triggers computation and caching.
|
|
50
|
+
- Raises ValueError if the userDataName does not exist in the mapping.
|
|
51
|
+
'''
|
|
52
|
+
def __init__(self, userDataNameToResultIndexMap: Dict[str, int], nodedUserDataResults: Dict[int, SolidsResultsQueryService_pb2.UserDataResults]):
|
|
53
|
+
# Lazy construction: keep raw inputs and build per userDataName on-demand
|
|
54
|
+
self._userDataNameToResultIndexMap: Dict[str, int] = dict(userDataNameToResultIndexMap)
|
|
55
|
+
self._nodedUserDataResults: Dict[int, SolidsResultsQueryService_pb2.UserDataResults] = nodedUserDataResults
|
|
56
|
+
self._userDataResultsByName : Dict[str, UserDataResults] = {}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@staticmethod
|
|
60
|
+
def _getNodeDataValues(resultIndex: int, nodedUserDataResults: Dict[int, SolidsResultsQueryService_pb2.UserDataResults]) -> List[NodeUserDataResult]:
|
|
61
|
+
nodeData: List[NodeUserDataResult] = []
|
|
62
|
+
for nodeId, userDataResults in nodedUserDataResults.items():
|
|
63
|
+
values = userDataResults.values
|
|
64
|
+
if resultIndex < 0 or resultIndex >= len(values):
|
|
65
|
+
raise ValueError(
|
|
66
|
+
f"User data index {resultIndex} out of range for node {nodeId} (size {len(values)})"
|
|
67
|
+
)
|
|
68
|
+
nodeData.append(NodeUserDataResult(nodeId, values[resultIndex]))
|
|
69
|
+
return nodeData
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def getResult(self, userDataName: str) -> List[NodeUserDataResult]:
|
|
73
|
+
# Build and cache on first access
|
|
74
|
+
cached = self._userDataResultsByName.get(userDataName)
|
|
75
|
+
if cached is None:
|
|
76
|
+
if userDataName not in self._userDataNameToResultIndexMap:
|
|
77
|
+
raise ValueError(f"User data name {userDataName} not found")
|
|
78
|
+
resultIndex = self._userDataNameToResultIndexMap[userDataName]
|
|
79
|
+
nodeValues = UserDataResultsCollection._getNodeDataValues(resultIndex, self._nodedUserDataResults)
|
|
80
|
+
cached = UserDataResults(nodeValues)
|
|
81
|
+
self._userDataResultsByName[userDataName] = cached
|
|
82
|
+
return cached.NodeDataValues
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class FailurePoint:
|
|
86
|
+
'''
|
|
87
|
+
Wrapper for a failure point reported at a Gauss/integration point.
|
|
88
|
+
|
|
89
|
+
Notes:
|
|
90
|
+
- Coordinates (X/Y/Z) are in model units.
|
|
91
|
+
- FailureTypes is a list of descriptive strings. Order has no priority semantics unless stated by the service.
|
|
92
|
+
'''
|
|
93
|
+
def __init__(self, grpcFailurePoint: SolidsResultsQueryService_pb2.FailurePoint):
|
|
94
|
+
self._grpcFailurePoint = grpcFailurePoint
|
|
95
|
+
|
|
96
|
+
@property
|
|
97
|
+
def XCoordinate(self):
|
|
98
|
+
return self._grpcFailurePoint.location.x
|
|
99
|
+
|
|
100
|
+
@property
|
|
101
|
+
def YCoordinate(self):
|
|
102
|
+
return self._grpcFailurePoint.location.y
|
|
103
|
+
|
|
104
|
+
@property
|
|
105
|
+
def ZCoordinate(self):
|
|
106
|
+
return self._grpcFailurePoint.location.z
|
|
107
|
+
|
|
108
|
+
@property
|
|
109
|
+
def FailureTypes(self):
|
|
110
|
+
return list(self._grpcFailurePoint.failureTypes)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class YieldingResults:
|
|
114
|
+
def __init__(self, grpcElementResults):
|
|
115
|
+
self._failurePoints = [FailurePoint(fp) for fp in grpcElementResults.failurePoints]
|
|
116
|
+
|
|
117
|
+
def getFailurePoints(self) -> tuple[FailurePoint, ...]:
|
|
118
|
+
return tuple(self._failurePoints)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class SolidElementResults:
|
|
123
|
+
'''
|
|
124
|
+
Element-level results wrapper for a specific stage/SRF context.
|
|
125
|
+
|
|
126
|
+
Notes:
|
|
127
|
+
- getFailurePoints() returns an immutable sequence (tuple).
|
|
128
|
+
- AttachedNodes returns a copy of node IDs; modifying it does not affect internal state.
|
|
129
|
+
- YieldPercent is a value in [0, 100].
|
|
130
|
+
'''
|
|
131
|
+
def __init__(self, grpcElementResults, hasUserData: bool, userDataNameToResultIndexMap: Dict[str, int]):
|
|
132
|
+
self._grpcElementResults = grpcElementResults
|
|
133
|
+
self._userDataResultsCollection = UserDataResultsCollection(userDataNameToResultIndexMap, grpcElementResults.nodedUserDataResults) if hasUserData else None
|
|
134
|
+
self._yieldingResults = YieldingResults(grpcElementResults)
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def ElementID(self):
|
|
138
|
+
return self._grpcElementResults.elementInformation.elementID
|
|
139
|
+
|
|
140
|
+
@property
|
|
141
|
+
def EntityName(self):
|
|
142
|
+
return self._grpcElementResults.entityName
|
|
143
|
+
|
|
144
|
+
@property
|
|
145
|
+
def EntityID(self):
|
|
146
|
+
return self._grpcElementResults.entityID
|
|
147
|
+
|
|
148
|
+
@property
|
|
149
|
+
def AttachedNodes(self):
|
|
150
|
+
return list(self._grpcElementResults.elementInformation.nodeIDs)
|
|
151
|
+
|
|
152
|
+
@property
|
|
153
|
+
def YieldPercent(self):
|
|
154
|
+
return self._grpcElementResults.yieldPercent
|
|
155
|
+
|
|
156
|
+
@property
|
|
157
|
+
def YieldingResults(self):
|
|
158
|
+
return self._yieldingResults
|
|
159
|
+
|
|
160
|
+
'''
|
|
161
|
+
Return node-level user data values for the given user data name.
|
|
162
|
+
|
|
163
|
+
Parameters:
|
|
164
|
+
userDataName: str
|
|
165
|
+
The user data series to retrieve.
|
|
166
|
+
|
|
167
|
+
Raises:
|
|
168
|
+
ValueError: If the specified user data name does not exist.
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
List[NodeUserDataResult]: Values sorted by NodeID. If the element has no
|
|
172
|
+
user data, returns an empty list.
|
|
173
|
+
'''
|
|
174
|
+
def getUserData(self, userDataName: str) -> List[NodeUserDataResult]:
|
|
175
|
+
return self._userDataResultsCollection.getResult(userDataName) if self._userDataResultsCollection is not None else []
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
from typing import List, Dict, Optional, Union, Iterable
|
|
2
|
+
import unicodedata as ud
|
|
3
|
+
import re
|
|
4
|
+
from rs3.results.ResultEnums import SolidsDataType
|
|
5
|
+
|
|
6
|
+
import rs3.generatedFiles.SolidsResultsQueryService_pb2 as SolidsResultsQueryService_pb2
|
|
7
|
+
|
|
8
|
+
class SolidNodalResults:
|
|
9
|
+
'''
|
|
10
|
+
Nodal result wrapper with per-material data access.
|
|
11
|
+
|
|
12
|
+
Notes:
|
|
13
|
+
- EntityNames/EntityIDs correspond to owning entities for this node.
|
|
14
|
+
- getResult(dataType, materialName=None) returns the average across materials when materialName is None.
|
|
15
|
+
'''
|
|
16
|
+
_NON_MATERIAL_RESULT_ENUMS = (
|
|
17
|
+
SolidsDataType.DISPLACEMENT_X,
|
|
18
|
+
SolidsDataType.DISPLACEMENT_Y,
|
|
19
|
+
SolidsDataType.DISPLACEMENT_Z,
|
|
20
|
+
SolidsDataType.EXCESS_PWP,
|
|
21
|
+
SolidsDataType.TOTAL_PWP,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
def __init__(self, grpcNodalResults, dataTypeToIndexMap: Dict["SolidsDataType", int]):
|
|
25
|
+
self._grpcNodalResults = grpcNodalResults
|
|
26
|
+
self._materialProperties = self._setMaterialProperties(grpcNodalResults.materialValues)
|
|
27
|
+
self._materialDataQuery = _DataTypeQuery(grpcNodalResults.materialValues, dataTypeToIndexMap)
|
|
28
|
+
|
|
29
|
+
@property
|
|
30
|
+
def NodeID(self):
|
|
31
|
+
return self._grpcNodalResults.nodeInformation.nodeID
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def XCoordinate(self):
|
|
35
|
+
return self._grpcNodalResults.nodeInformation.location.x
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def YCoordinate(self):
|
|
39
|
+
return self._grpcNodalResults.nodeInformation.location.y
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def ZCoordinate(self):
|
|
43
|
+
return self._grpcNodalResults.nodeInformation.location.z
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def EntityNames(self):
|
|
48
|
+
return list(self._grpcNodalResults.entityNames)
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
def EntityIDs(self):
|
|
52
|
+
return list(self._grpcNodalResults.entityIDs)
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
def MaterialProperties(self):
|
|
56
|
+
return self._materialProperties
|
|
57
|
+
|
|
58
|
+
def getResult(self, dataType: Union[str, "SolidsDataType"], materialName: Optional[str] = None) -> float:
|
|
59
|
+
'''
|
|
60
|
+
Get a nodal result by data type.
|
|
61
|
+
|
|
62
|
+
Parameters:
|
|
63
|
+
dataType: Union[str, SolidsDataType]
|
|
64
|
+
Either a `SolidsDataType` enum member or a free-form string.
|
|
65
|
+
Free-form strings are normalized (NFKC + casefold + separators removed)
|
|
66
|
+
and resolved against `SolidsDataAlias.alias`.
|
|
67
|
+
Examples: SolidsDataType.SIGMA_1_EFFECTIVE, "sigma1", "Stress P Major".
|
|
68
|
+
|
|
69
|
+
materialName: Optional[str]
|
|
70
|
+
When provided, return the value for that specific material.
|
|
71
|
+
When None, return the average across materials.
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
float: The requested value (material-specific or averaged).
|
|
75
|
+
'''
|
|
76
|
+
if self._dataTypeNonMaterialResult(dataType):
|
|
77
|
+
return self._getNonMaterialResult(dataType)
|
|
78
|
+
|
|
79
|
+
if materialName is not None and materialName not in self._materialProperties:
|
|
80
|
+
raise ValueError(f"Material {materialName} not found")
|
|
81
|
+
return self._materialDataQuery.getDataType(dataType).getResult(materialName)
|
|
82
|
+
|
|
83
|
+
def _setMaterialProperties(self, materialProperties: List[SolidsResultsQueryService_pb2.MaterialResults]):
|
|
84
|
+
uniqueNames: list[str] = []
|
|
85
|
+
seen : set[str] = set()
|
|
86
|
+
for mp in materialProperties:
|
|
87
|
+
if mp.materialName not in seen:
|
|
88
|
+
uniqueNames.append(mp.materialName)
|
|
89
|
+
seen.add(mp.materialName)
|
|
90
|
+
return sorted(uniqueNames)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
# region non-material result
|
|
94
|
+
|
|
95
|
+
def _dataTypeNonMaterialResult(self, dataType: Union[str, "SolidsDataType"]) -> bool:
|
|
96
|
+
if isinstance(dataType, SolidsDataType):
|
|
97
|
+
return dataType in self._NON_MATERIAL_RESULT_ENUMS
|
|
98
|
+
normalized = _DataTypeNameNormalizer.normalizeDataTypeName(dataType)
|
|
99
|
+
return normalized in {_DataTypeNameNormalizer.normalizeDataTypeName(dt.name) for dt in self._NON_MATERIAL_RESULT_ENUMS}
|
|
100
|
+
|
|
101
|
+
def _getNonMaterialResult(self, dataType: Union[str, "SolidsDataType"]) -> float:
|
|
102
|
+
resolved: SolidsDataType
|
|
103
|
+
if isinstance(dataType, SolidsDataType):
|
|
104
|
+
resolved = dataType
|
|
105
|
+
else:
|
|
106
|
+
normalized = _DataTypeNameNormalizer.normalizeDataTypeName(dataType)
|
|
107
|
+
normalized_to_enum = {_DataTypeNameNormalizer.normalizeDataTypeName(dt.name): dt for dt in self._NON_MATERIAL_RESULT_ENUMS}
|
|
108
|
+
if normalized not in normalized_to_enum:
|
|
109
|
+
available = [dt.name for dt in self._NON_MATERIAL_RESULT_ENUMS]
|
|
110
|
+
raise ValueError(f"Invalid data type: {dataType}. Available: {available}")
|
|
111
|
+
resolved = normalized_to_enum[normalized]
|
|
112
|
+
return getattr(self._grpcNodalResults.nodalValues, resolved.value)
|
|
113
|
+
|
|
114
|
+
# endregion non-material results
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
# region Material Results
|
|
118
|
+
|
|
119
|
+
class SolidsDataAlias:
|
|
120
|
+
alias = {
|
|
121
|
+
SolidsDataType.SIGMA_1_EFFECTIVE: {"stress p major"},
|
|
122
|
+
SolidsDataType.SIGMA_2_EFFECTIVE: {"stress p mean"},
|
|
123
|
+
SolidsDataType.SIGMA_3_EFFECTIVE: {"stress p minor"},
|
|
124
|
+
|
|
125
|
+
# todo: add more aliases
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class _DataTypeNameNormalizer:
|
|
130
|
+
@staticmethod
|
|
131
|
+
def normalizeDataTypeName(dataType: str) -> str:
|
|
132
|
+
dataType = ud.normalize('NFKC', dataType).casefold()
|
|
133
|
+
return re.sub(r'[\s\-_+/·.,:;()]+', '', dataType)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
class _MaterialDataValues:
|
|
137
|
+
'''
|
|
138
|
+
Provides per-material values and an average across materials.
|
|
139
|
+
|
|
140
|
+
Notes:
|
|
141
|
+
- Average is computed on first request and cached.
|
|
142
|
+
- Raises ValueError when requesting a non-existent material.
|
|
143
|
+
'''
|
|
144
|
+
|
|
145
|
+
def __init__(self, materialDataValuePair: Iterable[tuple[str, float]]):
|
|
146
|
+
self._dataValueByMaterial : Dict[str, float] = {}
|
|
147
|
+
for materialName, dataValue in materialDataValuePair:
|
|
148
|
+
self._dataValueByMaterial[materialName] = dataValue
|
|
149
|
+
self._average = None
|
|
150
|
+
|
|
151
|
+
def getResult(self, materialName: Optional[str] = None) -> float:
|
|
152
|
+
'''
|
|
153
|
+
Required behavior: when materialName is not provided (None), return the
|
|
154
|
+
average value across all materials.
|
|
155
|
+
'''
|
|
156
|
+
if materialName is None:
|
|
157
|
+
return self._getAverage()
|
|
158
|
+
if materialName is not None and materialName not in self._dataValueByMaterial:
|
|
159
|
+
raise ValueError(f"Material {materialName} not found")
|
|
160
|
+
return self._dataValueByMaterial[materialName]
|
|
161
|
+
|
|
162
|
+
def _getAverage(self) -> float:
|
|
163
|
+
if self._average is None:
|
|
164
|
+
if len(self._dataValueByMaterial) == 0:
|
|
165
|
+
self._average = float("nan")
|
|
166
|
+
else:
|
|
167
|
+
self._average = sum(self._dataValueByMaterial.values()) / len(self._dataValueByMaterial)
|
|
168
|
+
return self._average
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
class _DataTypeQuery:
|
|
172
|
+
def __init__(self, materialValues: List[SolidsResultsQueryService_pb2.MaterialResults], dataTypeToIndexMap: Dict["SolidsDataType", int]):
|
|
173
|
+
self._required_DataTypeQuery = _RequiredDataTypeMaterialQuery(materialValues, dataTypeToIndexMap)
|
|
174
|
+
|
|
175
|
+
def getDataType(self, dataType: Union[str, "SolidsDataType"]) -> _MaterialDataValues:
|
|
176
|
+
'''
|
|
177
|
+
Resolve a data type to its material values accessor.
|
|
178
|
+
|
|
179
|
+
Parameters:
|
|
180
|
+
dataType: Union[str, SolidsDataType]
|
|
181
|
+
Either a `SolidsDataType` enum member or a free-form string.
|
|
182
|
+
Free-form strings are normalized (NFKC + casefold + separators removed)
|
|
183
|
+
and matched using `SolidsDataAlias.alias`.
|
|
184
|
+
|
|
185
|
+
Returns:
|
|
186
|
+
_MaterialDataValues: Wrapper that provides `getResult(materialName)`.
|
|
187
|
+
'''
|
|
188
|
+
return self._required_DataTypeQuery.getResult(dataType)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
class _RequiredDataTypeMaterialQuery:
|
|
192
|
+
"""
|
|
193
|
+
Material data query that uses indexed dataTypeValues list instead of named fields.
|
|
194
|
+
|
|
195
|
+
The values are retrieved from the dataTypeValues list using indices defined in dataTypeToIndexMap.
|
|
196
|
+
"""
|
|
197
|
+
def __init__(self, materialValues: List[SolidsResultsQueryService_pb2.MaterialResults], dataTypeToIndexMap: Dict["SolidsDataType", int]):
|
|
198
|
+
self._dataTypeToIndexMap = dataTypeToIndexMap
|
|
199
|
+
self._materialValues = materialValues
|
|
200
|
+
|
|
201
|
+
# Lazy initialization: _dataTypes will be populated on-demand in getResult()
|
|
202
|
+
self._dataTypes: Dict[str, _MaterialDataValues] = {}
|
|
203
|
+
|
|
204
|
+
# Build reverse mapping from normalized name to SolidsDataType enum for lazy initialization
|
|
205
|
+
self._normalizedNameToEnum: Dict[str, "SolidsDataType"] = {}
|
|
206
|
+
for dataType, index in dataTypeToIndexMap.items():
|
|
207
|
+
normalizedName = _DataTypeNameNormalizer.normalizeDataTypeName(dataType.name)
|
|
208
|
+
self._normalizedNameToEnum[normalizedName] = dataType
|
|
209
|
+
|
|
210
|
+
self._alias = {}
|
|
211
|
+
for dataType, aliases in SolidsDataAlias.alias.items():
|
|
212
|
+
for alias in aliases:
|
|
213
|
+
self._alias[_DataTypeNameNormalizer.normalizeDataTypeName(alias)] = _DataTypeNameNormalizer.normalizeDataTypeName(dataType.name)
|
|
214
|
+
|
|
215
|
+
def getResult(self, dataType: Union[str, "SolidsDataType"]) -> _MaterialDataValues:
|
|
216
|
+
# Check for SolidsDataType first since it inherits from str
|
|
217
|
+
normalizedDataType = _DataTypeNameNormalizer.normalizeDataTypeName(dataType.name if isinstance(dataType, SolidsDataType) else dataType)
|
|
218
|
+
|
|
219
|
+
# Determine canonical name (either direct match or via alias)
|
|
220
|
+
canonical = normalizedDataType
|
|
221
|
+
if normalizedDataType not in self._normalizedNameToEnum:
|
|
222
|
+
# Try alias match
|
|
223
|
+
canonical = self._alias.get(normalizedDataType)
|
|
224
|
+
if canonical is None or canonical not in self._normalizedNameToEnum:
|
|
225
|
+
available = sorted(self._normalizedNameToEnum.keys())
|
|
226
|
+
raise ValueError(f"Invalid data type: {dataType}. Available: {available}")
|
|
227
|
+
|
|
228
|
+
# Lazy initialization: create and cache if not already present
|
|
229
|
+
if canonical not in self._dataTypes:
|
|
230
|
+
enumDataType = self._normalizedNameToEnum[canonical]
|
|
231
|
+
index = self._dataTypeToIndexMap[enumDataType]
|
|
232
|
+
self._dataTypes[canonical] = _MaterialDataValues(
|
|
233
|
+
self._getMaterialNameDataTypeValue(index, self._materialValues)
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
return self._dataTypes[canonical]
|
|
237
|
+
|
|
238
|
+
def _getMaterialNameDataTypeValue(self, index: int, materialValues: List[SolidsResultsQueryService_pb2.MaterialResults]) -> list[tuple[str, float]]:
|
|
239
|
+
"""Get material name and value pairs for a given data type index from dataTypeValues list."""
|
|
240
|
+
nameValueList: list[tuple[str, float]] = []
|
|
241
|
+
for mv in materialValues:
|
|
242
|
+
if hasattr(mv, "materialName") and hasattr(mv, "dataTypeValues"):
|
|
243
|
+
if index < len(mv.dataTypeValues):
|
|
244
|
+
nameValueList.append((mv.materialName, mv.dataTypeValues[index]))
|
|
245
|
+
return nameValueList
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
#endregion Material Results
|