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.
Files changed (393) hide show
  1. rs3/ApplicationManager.py +77 -0
  2. rs3/ColorPicker.py +123 -0
  3. rs3/CommonEnums.py +16 -0
  4. rs3/Compute.py +105 -0
  5. rs3/ExternalVolume.py +48 -0
  6. rs3/Geometry.py +74 -0
  7. rs3/Model.py +795 -0
  8. rs3/ModelEnums.py +9 -0
  9. rs3/RS3Modeler.py +109 -0
  10. rs3/Restraints.py +91 -0
  11. rs3/Selection.py +123 -0
  12. rs3/__init__.py +18 -0
  13. rs3/_client.py +57 -0
  14. rs3/_proxyObject.py +5 -0
  15. rs3/generatedFiles/BFPCommonMessage_pb2.py +38 -0
  16. rs3/generatedFiles/BFPCommonMessage_pb2.pyi +47 -0
  17. rs3/generatedFiles/BFPCommonMessage_pb2_grpc.py +24 -0
  18. rs3/generatedFiles/BeamDataService_pb2.py +37 -0
  19. rs3/generatedFiles/BeamDataService_pb2.pyi +5 -0
  20. rs3/generatedFiles/BeamDataService_pb2_grpc.py +226 -0
  21. rs3/generatedFiles/BeamService_pb2.py +37 -0
  22. rs3/generatedFiles/BeamService_pb2.pyi +5 -0
  23. rs3/generatedFiles/BeamService_pb2_grpc.py +140 -0
  24. rs3/generatedFiles/BeamStageFactorService_pb2.py +37 -0
  25. rs3/generatedFiles/BeamStageFactorService_pb2.pyi +5 -0
  26. rs3/generatedFiles/BeamStageFactorService_pb2_grpc.py +140 -0
  27. rs3/generatedFiles/BeamsResultsQueryService_pb2.py +50 -0
  28. rs3/generatedFiles/BeamsResultsQueryService_pb2.pyi +48 -0
  29. rs3/generatedFiles/BeamsResultsQueryService_pb2_grpc.py +141 -0
  30. rs3/generatedFiles/BoltDataService_pb2.py +37 -0
  31. rs3/generatedFiles/BoltDataService_pb2.pyi +5 -0
  32. rs3/generatedFiles/BoltDataService_pb2_grpc.py +226 -0
  33. rs3/generatedFiles/BoltService_pb2.py +37 -0
  34. rs3/generatedFiles/BoltService_pb2.pyi +5 -0
  35. rs3/generatedFiles/BoltService_pb2_grpc.py +140 -0
  36. rs3/generatedFiles/BoltsResultsQueryService_pb2.py +51 -0
  37. rs3/generatedFiles/BoltsResultsQueryService_pb2.pyi +75 -0
  38. rs3/generatedFiles/BoltsResultsQueryService_pb2_grpc.py +141 -0
  39. rs3/generatedFiles/ClientService_pb2.py +40 -0
  40. rs3/generatedFiles/ClientService_pb2.pyi +15 -0
  41. rs3/generatedFiles/ClientService_pb2_grpc.py +97 -0
  42. rs3/generatedFiles/CommonGeometryMessages_pb2.py +52 -0
  43. rs3/generatedFiles/CommonGeometryMessages_pb2.pyi +92 -0
  44. rs3/generatedFiles/CommonGeometryMessages_pb2_grpc.py +24 -0
  45. rs3/generatedFiles/CommonMessages_pb2.py +66 -0
  46. rs3/generatedFiles/CommonMessages_pb2.pyi +145 -0
  47. rs3/generatedFiles/CommonMessages_pb2_grpc.py +24 -0
  48. rs3/generatedFiles/CompositeLinerDataService_pb2.py +47 -0
  49. rs3/generatedFiles/CompositeLinerDataService_pb2.pyi +51 -0
  50. rs3/generatedFiles/CompositeLinerDataService_pb2_grpc.py +227 -0
  51. rs3/generatedFiles/CompositeLinerResultsQueryService_pb2.py +63 -0
  52. rs3/generatedFiles/CompositeLinerResultsQueryService_pb2.pyi +139 -0
  53. rs3/generatedFiles/CompositeLinerResultsQueryService_pb2_grpc.py +314 -0
  54. rs3/generatedFiles/CompositeLinerService_pb2.py +37 -0
  55. rs3/generatedFiles/CompositeLinerService_pb2.pyi +5 -0
  56. rs3/generatedFiles/CompositeLinerService_pb2_grpc.py +140 -0
  57. rs3/generatedFiles/ComputeService_pb2.py +48 -0
  58. rs3/generatedFiles/ComputeService_pb2.pyi +56 -0
  59. rs3/generatedFiles/ComputeService_pb2_grpc.py +147 -0
  60. rs3/generatedFiles/ExternalVolumesService_pb2.py +45 -0
  61. rs3/generatedFiles/ExternalVolumesService_pb2.pyi +34 -0
  62. rs3/generatedFiles/ExternalVolumesService_pb2_grpc.py +270 -0
  63. rs3/generatedFiles/FieldStressService_pb2.py +37 -0
  64. rs3/generatedFiles/FieldStressService_pb2.pyi +5 -0
  65. rs3/generatedFiles/FieldStressService_pb2_grpc.py +140 -0
  66. rs3/generatedFiles/FieldStressSourceService_pb2.py +85 -0
  67. rs3/generatedFiles/FieldStressSourceService_pb2.pyi +182 -0
  68. rs3/generatedFiles/FieldStressSourceService_pb2_grpc.py +657 -0
  69. rs3/generatedFiles/GaussPointFailureMessage_pb2.py +37 -0
  70. rs3/generatedFiles/GaussPointFailureMessage_pb2.pyi +14 -0
  71. rs3/generatedFiles/GaussPointFailureMessage_pb2_grpc.py +24 -0
  72. rs3/generatedFiles/HydraulicStageFactorService_pb2.py +45 -0
  73. rs3/generatedFiles/HydraulicStageFactorService_pb2.pyi +36 -0
  74. rs3/generatedFiles/HydraulicStageFactorService_pb2_grpc.py +227 -0
  75. rs3/generatedFiles/JointDataService_pb2.py +45 -0
  76. rs3/generatedFiles/JointDataService_pb2.pyi +30 -0
  77. rs3/generatedFiles/JointDataService_pb2_grpc.py +313 -0
  78. rs3/generatedFiles/JointResultsQueryService_pb2.py +54 -0
  79. rs3/generatedFiles/JointResultsQueryService_pb2.pyi +92 -0
  80. rs3/generatedFiles/JointResultsQueryService_pb2_grpc.py +141 -0
  81. rs3/generatedFiles/JointService_pb2.py +45 -0
  82. rs3/generatedFiles/JointService_pb2.pyi +30 -0
  83. rs3/generatedFiles/JointService_pb2_grpc.py +227 -0
  84. rs3/generatedFiles/JointStageFactorService_pb2.py +37 -0
  85. rs3/generatedFiles/JointStageFactorService_pb2.pyi +5 -0
  86. rs3/generatedFiles/JointStageFactorService_pb2_grpc.py +140 -0
  87. rs3/generatedFiles/LinerDataService_pb2.py +37 -0
  88. rs3/generatedFiles/LinerDataService_pb2.pyi +5 -0
  89. rs3/generatedFiles/LinerDataService_pb2_grpc.py +226 -0
  90. rs3/generatedFiles/LinerService_pb2.py +37 -0
  91. rs3/generatedFiles/LinerService_pb2.pyi +5 -0
  92. rs3/generatedFiles/LinerService_pb2_grpc.py +140 -0
  93. rs3/generatedFiles/LinerStageFactorService_pb2.py +37 -0
  94. rs3/generatedFiles/LinerStageFactorService_pb2.pyi +5 -0
  95. rs3/generatedFiles/LinerStageFactorService_pb2_grpc.py +140 -0
  96. rs3/generatedFiles/MaterialDataService_pb2.py +37 -0
  97. rs3/generatedFiles/MaterialDataService_pb2.pyi +5 -0
  98. rs3/generatedFiles/MaterialDataService_pb2_grpc.py +226 -0
  99. rs3/generatedFiles/MaterialDatumService_pb2.py +45 -0
  100. rs3/generatedFiles/MaterialDatumService_pb2.pyi +38 -0
  101. rs3/generatedFiles/MaterialDatumService_pb2_grpc.py +140 -0
  102. rs3/generatedFiles/MaterialHydraulicDataService_pb2.py +93 -0
  103. rs3/generatedFiles/MaterialHydraulicDataService_pb2.pyi +193 -0
  104. rs3/generatedFiles/MaterialHydraulicDataService_pb2_grpc.py +829 -0
  105. rs3/generatedFiles/MaterialHydraulicModelService_pb2.py +55 -0
  106. rs3/generatedFiles/MaterialHydraulicModelService_pb2.pyi +79 -0
  107. rs3/generatedFiles/MaterialHydraulicModelService_pb2_grpc.py +313 -0
  108. rs3/generatedFiles/MaterialInitialConditionsService_pb2.py +37 -0
  109. rs3/generatedFiles/MaterialInitialConditionsService_pb2.pyi +5 -0
  110. rs3/generatedFiles/MaterialInitialConditionsService_pb2_grpc.py +140 -0
  111. rs3/generatedFiles/MaterialJointService_pb2.py +49 -0
  112. rs3/generatedFiles/MaterialJointService_pb2.pyi +52 -0
  113. rs3/generatedFiles/MaterialJointService_pb2_grpc.py +183 -0
  114. rs3/generatedFiles/MaterialJointSetSlipCriterionService_pb2.py +69 -0
  115. rs3/generatedFiles/MaterialJointSetSlipCriterionService_pb2.pyi +130 -0
  116. rs3/generatedFiles/MaterialJointSetSlipCriterionService_pb2_grpc.py +398 -0
  117. rs3/generatedFiles/MaterialJointStageFactorService_pb2.py +45 -0
  118. rs3/generatedFiles/MaterialJointStageFactorService_pb2.pyi +42 -0
  119. rs3/generatedFiles/MaterialJointStageFactorService_pb2_grpc.py +140 -0
  120. rs3/generatedFiles/MaterialStageFactorsService_pb2.py +37 -0
  121. rs3/generatedFiles/MaterialStageFactorsService_pb2.pyi +5 -0
  122. rs3/generatedFiles/MaterialStageFactorsService_pb2_grpc.py +140 -0
  123. rs3/generatedFiles/MaterialStiffnessFormulaService_pb2.py +47 -0
  124. rs3/generatedFiles/MaterialStiffnessFormulaService_pb2.pyi +54 -0
  125. rs3/generatedFiles/MaterialStiffnessFormulaService_pb2_grpc.py +140 -0
  126. rs3/generatedFiles/MaterialStiffnessService_pb2.py +53 -0
  127. rs3/generatedFiles/MaterialStiffnessService_pb2.pyi +66 -0
  128. rs3/generatedFiles/MaterialStiffnessService_pb2_grpc.py +313 -0
  129. rs3/generatedFiles/MaterialStrengthService_pb2.py +105 -0
  130. rs3/generatedFiles/MaterialStrengthService_pb2.pyi +243 -0
  131. rs3/generatedFiles/MaterialStrengthService_pb2_grpc.py +833 -0
  132. rs3/generatedFiles/MaterialUnsaturatedSoilDataService_pb2.py +47 -0
  133. rs3/generatedFiles/MaterialUnsaturatedSoilDataService_pb2.pyi +43 -0
  134. rs3/generatedFiles/MaterialUnsaturatedSoilDataService_pb2_grpc.py +228 -0
  135. rs3/generatedFiles/MeshSettingsService_pb2.py +41 -0
  136. rs3/generatedFiles/MeshSettingsService_pb2.pyi +16 -0
  137. rs3/generatedFiles/MeshSettingsService_pb2_grpc.py +184 -0
  138. rs3/generatedFiles/ModelFunctionService_pb2.py +119 -0
  139. rs3/generatedFiles/ModelFunctionService_pb2.pyi +331 -0
  140. rs3/generatedFiles/ModelFunctionService_pb2_grpc.py +871 -0
  141. rs3/generatedFiles/ModelService_pb2.py +342 -0
  142. rs3/generatedFiles/ModelService_pb2.pyi +962 -0
  143. rs3/generatedFiles/ModelService_pb2_grpc.py +3322 -0
  144. rs3/generatedFiles/PileDataService_pb2.py +55 -0
  145. rs3/generatedFiles/PileDataService_pb2.pyi +63 -0
  146. rs3/generatedFiles/PileDataService_pb2_grpc.py +399 -0
  147. rs3/generatedFiles/PileForepoleResultsQueryService_pb2.py +51 -0
  148. rs3/generatedFiles/PileForepoleResultsQueryService_pb2.pyi +63 -0
  149. rs3/generatedFiles/PileForepoleResultsQueryService_pb2_grpc.py +141 -0
  150. rs3/generatedFiles/PileStageFactorService_pb2.py +37 -0
  151. rs3/generatedFiles/PileStageFactorService_pb2.pyi +5 -0
  152. rs3/generatedFiles/PileStageFactorService_pb2_grpc.py +140 -0
  153. rs3/generatedFiles/PlainStrandCableBoltService_pb2.py +44 -0
  154. rs3/generatedFiles/PlainStrandCableBoltService_pb2.pyi +30 -0
  155. rs3/generatedFiles/PlainStrandCableBoltService_pb2_grpc.py +140 -0
  156. rs3/generatedFiles/ProjectSettingsDataService_pb2.py +69 -0
  157. rs3/generatedFiles/ProjectSettingsDataService_pb2.pyi +119 -0
  158. rs3/generatedFiles/ProjectSettingsDataService_pb2_grpc.py +786 -0
  159. rs3/generatedFiles/RFCApplicationService_pb2.py +34 -0
  160. rs3/generatedFiles/RFCApplicationService_pb2.pyi +27 -0
  161. rs3/generatedFiles/RFCApplicationService_pb2_grpc.py +145 -0
  162. rs3/generatedFiles/RS3ModelerService_pb2.py +50 -0
  163. rs3/generatedFiles/RS3ModelerService_pb2.pyi +45 -0
  164. rs3/generatedFiles/RS3ModelerService_pb2_grpc.py +183 -0
  165. rs3/generatedFiles/RelativeStageFactorService_pb2.py +40 -0
  166. rs3/generatedFiles/RelativeStageFactorService_pb2.pyi +17 -0
  167. rs3/generatedFiles/RelativeStageFactorService_pb2_grpc.py +97 -0
  168. rs3/generatedFiles/RestraintsService_pb2.py +62 -0
  169. rs3/generatedFiles/RestraintsService_pb2.pyi +84 -0
  170. rs3/generatedFiles/RestraintsService_pb2_grpc.py +312 -0
  171. rs3/generatedFiles/ResultsQueryCommonMessage_pb2.py +56 -0
  172. rs3/generatedFiles/ResultsQueryCommonMessage_pb2.pyi +85 -0
  173. rs3/generatedFiles/ResultsQueryCommonMessage_pb2_grpc.py +24 -0
  174. rs3/generatedFiles/ResultsQueryService_pb2.py +87 -0
  175. rs3/generatedFiles/ResultsQueryService_pb2.pyi +185 -0
  176. rs3/generatedFiles/ResultsQueryService_pb2_grpc.py +745 -0
  177. rs3/generatedFiles/SelectionService_pb2.py +49 -0
  178. rs3/generatedFiles/SelectionService_pb2.pyi +51 -0
  179. rs3/generatedFiles/SelectionService_pb2_grpc.py +269 -0
  180. rs3/generatedFiles/SolidsResultsQueryService_pb2.py +93 -0
  181. rs3/generatedFiles/SolidsResultsQueryService_pb2.pyi +213 -0
  182. rs3/generatedFiles/SolidsResultsQueryService_pb2_grpc.py +195 -0
  183. rs3/generatedFiles/StageFactorService_pb2.py +58 -0
  184. rs3/generatedFiles/StageFactorService_pb2.pyi +79 -0
  185. rs3/generatedFiles/StageFactorService_pb2_grpc.py +226 -0
  186. rs3/generatedFiles/StiffnessStageFactorService_pb2.py +37 -0
  187. rs3/generatedFiles/StiffnessStageFactorService_pb2.pyi +5 -0
  188. rs3/generatedFiles/StiffnessStageFactorService_pb2_grpc.py +140 -0
  189. rs3/generatedFiles/StrengthStageFactorService_pb2.py +37 -0
  190. rs3/generatedFiles/StrengthStageFactorService_pb2.pyi +5 -0
  191. rs3/generatedFiles/StrengthStageFactorService_pb2_grpc.py +140 -0
  192. rs3/generatedFiles/WaterByLocationDataService_pb2.py +61 -0
  193. rs3/generatedFiles/WaterByLocationDataService_pb2.pyi +95 -0
  194. rs3/generatedFiles/WaterByLocationDataService_pb2_grpc.py +312 -0
  195. rs3/generatedFiles/WaterPressureGridDataService_pb2.py +63 -0
  196. rs3/generatedFiles/WaterPressureGridDataService_pb2.pyi +107 -0
  197. rs3/generatedFiles/WaterPressureGridDataService_pb2_grpc.py +312 -0
  198. rs3/generatedFiles/__init__.py +3 -0
  199. rs3/loadings/LoadingEnums.py +6 -0
  200. rs3/loadings/Loadings.py +15 -0
  201. rs3/loadings/__init__.py +0 -0
  202. rs3/loadings/fieldStress/AdvancedConstant.py +115 -0
  203. rs3/loadings/fieldStress/AdvancedGravity.py +176 -0
  204. rs3/loadings/fieldStress/Constant.py +119 -0
  205. rs3/loadings/fieldStress/FieldStress.py +38 -0
  206. rs3/loadings/fieldStress/Gravity.py +206 -0
  207. rs3/loadings/fieldStress/_PropertyAccessor.py +41 -0
  208. rs3/loadings/fieldStress/__init__.py +0 -0
  209. rs3/mesh/Graded.py +59 -0
  210. rs3/mesh/Mesh.py +50 -0
  211. rs3/mesh/MeshEnums.py +16 -0
  212. rs3/mesh/Uniform.py +35 -0
  213. rs3/mesh/_PropertyAccessor.py +10 -0
  214. rs3/mesh/__init__.py +0 -0
  215. rs3/projectSettings/Dynamic.py +110 -0
  216. rs3/projectSettings/Groundwater.py +118 -0
  217. rs3/projectSettings/ProjectSettingEnums.py +108 -0
  218. rs3/projectSettings/ProjectSettings.py +43 -0
  219. rs3/projectSettings/ShearStrengthReduction.py +130 -0
  220. rs3/projectSettings/SolverOptions.py +88 -0
  221. rs3/projectSettings/Stages.py +162 -0
  222. rs3/projectSettings/StressAnalysis.py +183 -0
  223. rs3/projectSettings/Units.py +82 -0
  224. rs3/projectSettings/_PropertyAccessor.py +133 -0
  225. rs3/projectSettings/__init__.py +0 -0
  226. rs3/properties/CustomHydraulicModel.py +129 -0
  227. rs3/properties/DiscreteFunction.py +147 -0
  228. rs3/properties/GeneralizedAnisotropicFunction.py +98 -0
  229. rs3/properties/IPropertyGroupAccessors.py +12 -0
  230. rs3/properties/PropertyEnums.py +387 -0
  231. rs3/properties/ShearNormalFunction.py +94 -0
  232. rs3/properties/SnowdenStrengthFunction.py +115 -0
  233. rs3/properties/_PropertyAccessor.py +111 -0
  234. rs3/properties/__init__.py +0 -0
  235. rs3/properties/beam/Beam.py +86 -0
  236. rs3/properties/beam/BeamCommon.py +175 -0
  237. rs3/properties/beam/Standard.py +97 -0
  238. rs3/properties/beam/Truss.py +23 -0
  239. rs3/properties/beam/_PropertyAccessor.py +9 -0
  240. rs3/properties/beam/__init__.py +0 -0
  241. rs3/properties/bolt/Bolt.py +81 -0
  242. rs3/properties/bolt/EndAnchored.py +77 -0
  243. rs3/properties/bolt/FullyBonded.py +78 -0
  244. rs3/properties/bolt/PlainStrandCable.py +151 -0
  245. rs3/properties/bolt/Swellex.py +106 -0
  246. rs3/properties/bolt/Tieback.py +176 -0
  247. rs3/properties/bolt/_PropertyAccessor.py +7 -0
  248. rs3/properties/bolt/__init__.py +0 -0
  249. rs3/properties/groundwater/WaterByLocation.py +83 -0
  250. rs3/properties/groundwater/WaterGrid.py +120 -0
  251. rs3/properties/groundwater/_PropertyAccessor.py +36 -0
  252. rs3/properties/groundwater/__init__.py +0 -0
  253. rs3/properties/joint/BartonBandis.py +118 -0
  254. rs3/properties/joint/GeosyntheticHyperbolic.py +158 -0
  255. rs3/properties/joint/Joint.py +176 -0
  256. rs3/properties/joint/MaterialDependent.py +107 -0
  257. rs3/properties/joint/MohrCoulomb.py +169 -0
  258. rs3/properties/joint/NoneSlip.py +68 -0
  259. rs3/properties/joint/_PropertyAccessor.py +9 -0
  260. rs3/properties/joint/__init__.py +0 -0
  261. rs3/properties/liner/Geosynthetic.py +85 -0
  262. rs3/properties/liner/Liner.py +83 -0
  263. rs3/properties/liner/ReinforcedConcrete.py +216 -0
  264. rs3/properties/liner/Standard.py +183 -0
  265. rs3/properties/liner/_PropertyAccessor.py +7 -0
  266. rs3/properties/liner/__init__.py +0 -0
  267. rs3/properties/liningComposition/LiningComposition.py +244 -0
  268. rs3/properties/liningComposition/_PropertyAccessor.py +7 -0
  269. rs3/properties/liningComposition/__init__.py +0 -0
  270. rs3/properties/material/Material.py +74 -0
  271. rs3/properties/material/__init__.py +0 -0
  272. rs3/properties/material/constitutiveModel/AnisotropicLinear.py +149 -0
  273. rs3/properties/material/constitutiveModel/AnisotropicLinearPlanarBase.py +72 -0
  274. rs3/properties/material/constitutiveModel/BarcelonaBasic.py +158 -0
  275. rs3/properties/material/constitutiveModel/BartonBandis.py +77 -0
  276. rs3/properties/material/constitutiveModel/BaseConstitutiveModel.py +11 -0
  277. rs3/properties/material/constitutiveModel/BoundingSurfacePlasticity.py +88 -0
  278. rs3/properties/material/constitutiveModel/CamClay.py +144 -0
  279. rs3/properties/material/constitutiveModel/ChSoil.py +111 -0
  280. rs3/properties/material/constitutiveModel/ConstitutiveModel.py +87 -0
  281. rs3/properties/material/constitutiveModel/CySoil.py +137 -0
  282. rs3/properties/material/constitutiveModel/DiscreteFunction.py +39 -0
  283. rs3/properties/material/constitutiveModel/DoubleYield.py +130 -0
  284. rs3/properties/material/constitutiveModel/DruckerPrager.py +136 -0
  285. rs3/properties/material/constitutiveModel/GeneralizedAnisotropic.py +39 -0
  286. rs3/properties/material/constitutiveModel/GeneralizedHoekBrown.py +226 -0
  287. rs3/properties/material/constitutiveModel/HardeningSoil.py +156 -0
  288. rs3/properties/material/constitutiveModel/HardeningSoilWithSmallStrain.py +170 -0
  289. rs3/properties/material/constitutiveModel/HoekBrown.py +125 -0
  290. rs3/properties/material/constitutiveModel/Hyperbolic.py +77 -0
  291. rs3/properties/material/constitutiveModel/JointedGeneralizedHoekBrown.py +184 -0
  292. rs3/properties/material/constitutiveModel/JointedMohrCoulomb.py +173 -0
  293. rs3/properties/material/constitutiveModel/ManzariAndDafalias.py +148 -0
  294. rs3/properties/material/constitutiveModel/ModifiedCamClay.py +11 -0
  295. rs3/properties/material/constitutiveModel/MohrCoulomb.py +147 -0
  296. rs3/properties/material/constitutiveModel/MohrCoulombUnsaturatedZoneCalculations.py +80 -0
  297. rs3/properties/material/constitutiveModel/MohrCoulombWithCap.py +154 -0
  298. rs3/properties/material/constitutiveModel/Norsand.py +146 -0
  299. rs3/properties/material/constitutiveModel/PowerCurve.py +119 -0
  300. rs3/properties/material/constitutiveModel/Shansep.py +214 -0
  301. rs3/properties/material/constitutiveModel/ShearNormalFunction.py +34 -0
  302. rs3/properties/material/constitutiveModel/SnowdenAnisotropicLinear.py +108 -0
  303. rs3/properties/material/constitutiveModel/SoftSoil.py +104 -0
  304. rs3/properties/material/constitutiveModel/SoftSoilCreep.py +111 -0
  305. rs3/properties/material/constitutiveModel/SofteningHardening.py +214 -0
  306. rs3/properties/material/constitutiveModel/SwellingRock.py +202 -0
  307. rs3/properties/material/constitutiveModel/UnsaturatedZoneCalculations.py +138 -0
  308. rs3/properties/material/constitutiveModel/VerticalStressRatio.py +113 -0
  309. rs3/properties/material/constitutiveModel/_PropertyAccessor.py +96 -0
  310. rs3/properties/material/constitutiveModel/__init__.py +0 -0
  311. rs3/properties/material/constitutiveModel/jointOption/BartonBandis.py +109 -0
  312. rs3/properties/material/constitutiveModel/jointOption/MaterialJoint.py +48 -0
  313. rs3/properties/material/constitutiveModel/jointOption/MaterialJointOptions.py +32 -0
  314. rs3/properties/material/constitutiveModel/jointOption/MohrCoulomb.py +142 -0
  315. rs3/properties/material/constitutiveModel/jointOption/PlaneOrientationBase.py +92 -0
  316. rs3/properties/material/constitutiveModel/jointOption/SimpleHyperbolic.py +112 -0
  317. rs3/properties/material/constitutiveModel/jointOption/_PropertyAccessor.py +61 -0
  318. rs3/properties/material/constitutiveModel/jointOption/__init__.py +0 -0
  319. rs3/properties/material/constitutiveModel/stiffness/BaseStiffness.py +11 -0
  320. rs3/properties/material/constitutiveModel/stiffness/DuncanChangHyperbolic.py +128 -0
  321. rs3/properties/material/constitutiveModel/stiffness/GeneralizedHoekBrownEstimation.py +50 -0
  322. rs3/properties/material/constitutiveModel/stiffness/LinearIsotropic.py +106 -0
  323. rs3/properties/material/constitutiveModel/stiffness/NonlinearIsotropic.py +104 -0
  324. rs3/properties/material/constitutiveModel/stiffness/Orthotropic.py +296 -0
  325. rs3/properties/material/constitutiveModel/stiffness/TransverselyIsotropic.py +186 -0
  326. rs3/properties/material/constitutiveModel/stiffness/_PropertyAccessor.py +33 -0
  327. rs3/properties/material/constitutiveModel/stiffness/__init__.py +0 -0
  328. rs3/properties/material/constitutiveModel/stiffness/formula/Formula1.py +96 -0
  329. rs3/properties/material/constitutiveModel/stiffness/formula/Formula2.py +136 -0
  330. rs3/properties/material/constitutiveModel/stiffness/formula/Formula3.py +113 -0
  331. rs3/properties/material/constitutiveModel/stiffness/formula/_PropertyAccessor.py +37 -0
  332. rs3/properties/material/constitutiveModel/stiffness/formula/__init__.py +0 -0
  333. rs3/properties/material/datum/CohesionDatumDependency.py +99 -0
  334. rs3/properties/material/datum/Datum.py +23 -0
  335. rs3/properties/material/datum/FrictionAngleDatumDependency.py +99 -0
  336. rs3/properties/material/datum/YoungsModulusDatumDependency.py +78 -0
  337. rs3/properties/material/datum/_PropertyAccessor.py +26 -0
  338. rs3/properties/material/datum/__init__.py +0 -0
  339. rs3/properties/material/hydraulic/FEAGroundwater/Brooks.py +71 -0
  340. rs3/properties/material/hydraulic/FEAGroundwater/Custom.py +79 -0
  341. rs3/properties/material/hydraulic/FEAGroundwater/FEAGroundwater.py +85 -0
  342. rs3/properties/material/hydraulic/FEAGroundwater/Fredlund.py +82 -0
  343. rs3/properties/material/hydraulic/FEAGroundwater/Gardner.py +72 -0
  344. rs3/properties/material/hydraulic/FEAGroundwater/HydraulicMethodVectors.py +97 -0
  345. rs3/properties/material/hydraulic/FEAGroundwater/HydraulicParametersCommon.py +157 -0
  346. rs3/properties/material/hydraulic/FEAGroundwater/Simple.py +37 -0
  347. rs3/properties/material/hydraulic/FEAGroundwater/VanGenuchten.py +94 -0
  348. rs3/properties/material/hydraulic/FEAGroundwater/_PropertyAccessor.py +16 -0
  349. rs3/properties/material/hydraulic/FEAGroundwater/__init__.py +0 -0
  350. rs3/properties/material/hydraulic/Hydraulic.py +111 -0
  351. rs3/properties/material/hydraulic/PhreaticConditions.py +37 -0
  352. rs3/properties/material/hydraulic/StaticGroundwater.py +100 -0
  353. rs3/properties/material/hydraulic/WaterConditions.py +110 -0
  354. rs3/properties/material/hydraulic/_PropertyAccessor.py +31 -0
  355. rs3/properties/material/hydraulic/__init__.py +0 -0
  356. rs3/properties/material/initialConditions/InitialConditions.py +108 -0
  357. rs3/properties/material/initialConditions/_PropertyAccessor.py +11 -0
  358. rs3/properties/material/initialConditions/__init__.py +0 -0
  359. rs3/properties/material/stageFactors/StageFactors.py +77 -0
  360. rs3/properties/material/stageFactors/_PropertyAccessor.py +7 -0
  361. rs3/properties/material/stageFactors/__init__.py +0 -0
  362. rs3/properties/pile/EndCondition.py +109 -0
  363. rs3/properties/pile/Linear.py +69 -0
  364. rs3/properties/pile/MohrCoulomb.py +123 -0
  365. rs3/properties/pile/MultiLinear.py +70 -0
  366. rs3/properties/pile/Pile.py +108 -0
  367. rs3/properties/pile/PileCommon.py +99 -0
  368. rs3/properties/pile/_PropertyAccessor.py +9 -0
  369. rs3/properties/pile/__init__.py +0 -0
  370. rs3/properties/stageFactors/IStageFactorBase.py +10 -0
  371. rs3/properties/stageFactors/StageFactorBaseInterfaces.py +24 -0
  372. rs3/properties/stageFactors/StageFactorInterfaces.py +70 -0
  373. rs3/properties/stageFactors/_StageFactorInterface.py +48 -0
  374. rs3/properties/stageFactors/_StageFactorPropertyAccessor.py +18 -0
  375. rs3/properties/stageFactors/__init__.py +0 -0
  376. rs3/results/BeamResults.py +181 -0
  377. rs3/results/BoltResults.py +214 -0
  378. rs3/results/CompositeLinerResults.py +374 -0
  379. rs3/results/JointResults.py +160 -0
  380. rs3/results/PileForepoleResults.py +219 -0
  381. rs3/results/ResultEnums.py +146 -0
  382. rs3/results/Results.py +661 -0
  383. rs3/results/ResultsCommon.py +66 -0
  384. rs3/results/SolidElementResults.py +175 -0
  385. rs3/results/SolidNodalResults.py +248 -0
  386. rs3/results/SolidResults.py +206 -0
  387. rs3/results/YieldedElement.py +33 -0
  388. rs3/results/__init__.py +0 -0
  389. rs3scripting-4.42.0.dist-info/METADATA +70 -0
  390. rs3scripting-4.42.0.dist-info/RECORD +393 -0
  391. rs3scripting-4.42.0.dist-info/WHEEL +5 -0
  392. rs3scripting-4.42.0.dist-info/licenses/License.txt +20 -0
  393. 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