luminarycloud 0.15.3__py3-none-any.whl → 0.15.5__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 (242) hide show
  1. luminarycloud/__init__.py +1 -0
  2. luminarycloud/_helpers/_create_geometry.py +36 -17
  3. luminarycloud/_helpers/_create_simulation.py +2 -0
  4. luminarycloud/_helpers/_entity_identifier.py +6 -0
  5. luminarycloud/_helpers/named_variables.py +6 -15
  6. luminarycloud/_helpers/warnings/experimental.py +6 -2
  7. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.py +77 -55
  8. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.pyi +34 -2
  9. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.py +33 -0
  10. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.pyi +10 -0
  11. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.py +45 -15
  12. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.pyi +104 -22
  13. luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.py +12 -12
  14. luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.pyi +10 -2
  15. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2.py +27 -105
  16. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2.pyi +24 -173
  17. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2_grpc.py +17 -113
  18. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2_grpc.pyi +16 -44
  19. luminarycloud/_proto/api/v0/luminarycloud/upload/upload_pb2.py +4 -2
  20. luminarycloud/_proto/api/v0/luminarycloud/upload/upload_pb2_grpc.py +37 -0
  21. luminarycloud/_proto/api/v0/luminarycloud/upload/upload_pb2_grpc.pyi +20 -0
  22. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py +221 -143
  23. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi +154 -7
  24. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.py +33 -0
  25. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.pyi +10 -0
  26. luminarycloud/_proto/assistant/assistant_pb2.py +62 -61
  27. luminarycloud/_proto/client/simulation_pb2.py +349 -309
  28. luminarycloud/_proto/client/simulation_pb2.pyi +97 -2
  29. luminarycloud/_proto/fvm/solver_results_pb2.py +25 -11
  30. luminarycloud/_proto/fvm/solver_results_pb2.pyi +24 -1
  31. luminarycloud/_proto/geometry/geometry_pb2.py +63 -64
  32. luminarycloud/_proto/namedvariableset/namedvariableset_pb2.py +49 -0
  33. luminarycloud/_proto/namedvariableset/namedvariableset_pb2.pyi +53 -0
  34. luminarycloud/_proto/upload/upload_pb2.py +27 -7
  35. luminarycloud/_proto/upload/upload_pb2.pyi +31 -0
  36. luminarycloud/_wrapper.py +26 -7
  37. luminarycloud/enum/__init__.py +2 -0
  38. luminarycloud/enum/physics_ai_lifecycle_state.py +30 -0
  39. luminarycloud/enum/quantity_type.py +43 -0
  40. luminarycloud/enum/vis_enums.py +6 -2
  41. luminarycloud/geometry.py +46 -2
  42. luminarycloud/named_variable_set.py +10 -5
  43. luminarycloud/params/enum/_enum_wrappers.py +68 -0
  44. luminarycloud/params/simulation/_lib.py +1 -1
  45. luminarycloud/params/simulation/adaptive_mesh_refinement/boundary_layer_profile_.py +5 -6
  46. luminarycloud/params/simulation/adaptive_mesh_refinement_.py +6 -7
  47. luminarycloud/params/simulation/adjoint_.py +3 -4
  48. luminarycloud/params/simulation/basic/gravity/gravity_off_.py +3 -4
  49. luminarycloud/params/simulation/basic/gravity/gravity_on_.py +3 -4
  50. luminarycloud/params/simulation/basic/gravity_.py +3 -4
  51. luminarycloud/params/simulation/body_frame_.py +3 -4
  52. luminarycloud/params/simulation/entity_relationships/volume_material_relationship_.py +9 -6
  53. luminarycloud/params/simulation/entity_relationships/volume_physics_relationship_.py +9 -6
  54. luminarycloud/params/simulation/entity_relationships_.py +3 -4
  55. luminarycloud/params/simulation/general_.py +3 -4
  56. luminarycloud/params/simulation/material/fluid/boussinesq_approximation/boussinesq_off_.py +3 -4
  57. luminarycloud/params/simulation/material/fluid/boussinesq_approximation/boussinesq_on_.py +5 -6
  58. luminarycloud/params/simulation/material/fluid/boussinesq_approximation_.py +3 -4
  59. luminarycloud/params/simulation/material/fluid/material_model/ideal_gas_.py +5 -6
  60. luminarycloud/params/simulation/material/fluid/material_model/incompressible_fluid_.py +4 -5
  61. luminarycloud/params/simulation/material/fluid/material_model/incompressible_fluid_with_energy_.py +5 -6
  62. luminarycloud/params/simulation/material/fluid/material_model_.py +3 -4
  63. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/prescribed_conductivity_.py +4 -5
  64. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/prescribed_prandtl_number_.py +4 -5
  65. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/temperature_dependent_conductivity_.py +3 -4
  66. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model_.py +3 -4
  67. luminarycloud/params/simulation/material/fluid/viscosity_model/prescribed_viscosity_.py +4 -5
  68. luminarycloud/params/simulation/material/fluid/viscosity_model/sutherland_.py +6 -7
  69. luminarycloud/params/simulation/material/fluid/viscosity_model/temperature_dependent_viscosity_.py +3 -4
  70. luminarycloud/params/simulation/material/fluid/viscosity_model_.py +3 -4
  71. luminarycloud/params/simulation/material/material_fluid_.py +4 -5
  72. luminarycloud/params/simulation/material/material_solid_.py +6 -7
  73. luminarycloud/params/simulation/material_entity_.py +6 -5
  74. luminarycloud/params/simulation/monitor_plane_.py +4 -5
  75. luminarycloud/params/simulation/motion_data/frame_transforms/no_transform_.py +3 -4
  76. luminarycloud/params/simulation/motion_data/frame_transforms/rotational_transform_.py +3 -4
  77. luminarycloud/params/simulation/motion_data/frame_transforms/translational_transform_.py +3 -4
  78. luminarycloud/params/simulation/motion_data/frame_transforms_.py +3 -4
  79. luminarycloud/params/simulation/motion_data/motion_type/constant_angular_motion_.py +3 -4
  80. luminarycloud/params/simulation/motion_data/motion_type/constant_translation_motion_.py +3 -4
  81. luminarycloud/params/simulation/motion_data/motion_type_.py +3 -4
  82. luminarycloud/params/simulation/motion_data_.py +3 -4
  83. luminarycloud/params/simulation/multi_physics_coupling_options_.py +3 -4
  84. luminarycloud/params/simulation/output_.py +3 -4
  85. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_normal_vector_.py +3 -4
  86. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_rotation_angles_.py +3 -4
  87. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection_.py +3 -4
  88. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk_.py +5 -6
  89. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_line_.py +3 -4
  90. luminarycloud/params/simulation/particle_group/particle_group_type/probe_points_.py +3 -4
  91. luminarycloud/params/simulation/particle_group/particle_group_type/source_points_.py +3 -4
  92. luminarycloud/params/simulation/particle_group/particle_group_type_.py +3 -4
  93. luminarycloud/params/simulation/particle_group_.py +3 -4
  94. luminarycloud/params/simulation/physics/fluid/adjoint_controls_fluid_.py +4 -5
  95. luminarycloud/params/simulation/physics/fluid/basic_fluid_.py +3 -4
  96. luminarycloud/params/simulation/physics/fluid/boundary_conditions/farfield_.py +9 -10
  97. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/fan_curve_inlet_.py +5 -6
  98. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mach_inlet_.py +5 -6
  99. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mass_flow_inlet_.py +4 -5
  100. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/total_pressure_inlet_.py +4 -5
  101. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/velocity_components_inlet_.py +4 -5
  102. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/velocity_magnitude_inlet_.py +5 -6
  103. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet_.py +4 -5
  104. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/fan_curve_outlet_.py +5 -6
  105. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_pressure_.py +4 -5
  106. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_corrected_mass_flow_rate_.py +7 -8
  107. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_mass_flow_rate_.py +5 -6
  108. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy_.py +3 -4
  109. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet_.py +3 -4
  110. luminarycloud/params/simulation/physics/fluid/boundary_conditions/symmetry_.py +3 -4
  111. luminarycloud/params/simulation/physics/fluid/boundary_conditions/turbulence_boundary_conditions_.py +9 -10
  112. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/prescribed_heat_flux_.py +4 -5
  113. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/prescribed_temperature_.py +4 -5
  114. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/no_slip_.py +4 -5
  115. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/slip_.py +3 -4
  116. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/wall_model_.py +4 -5
  117. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/wall_energy_.py +3 -4
  118. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/wall_momentum_.py +3 -4
  119. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall_.py +3 -4
  120. luminarycloud/params/simulation/physics/fluid/boundary_conditions_fluid_.py +3 -4
  121. luminarycloud/params/simulation/physics/fluid/initialization/fluid_existing_solution_.py +3 -4
  122. luminarycloud/params/simulation/physics/fluid/initialization/fluid_farfield_values_.py +3 -4
  123. luminarycloud/params/simulation/physics/fluid/initialization/fluid_prescribed_values_.py +5 -6
  124. luminarycloud/params/simulation/physics/fluid/initialization/turbulence_initialization_.py +9 -10
  125. luminarycloud/params/simulation/physics/fluid/initialization_fluid_.py +3 -4
  126. luminarycloud/params/simulation/physics/fluid/physical_behavior/blade_element_airfoil_data_.py +4 -5
  127. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_blade_element_.py +3 -4
  128. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_radial_distribution_.py +6 -7
  129. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_uniform_thrust_.py +4 -5
  130. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/fan_curve_internal_.py +4 -5
  131. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model_.py +3 -4
  132. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model/actuator_line_blade_element_.py +3 -4
  133. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model_.py +3 -4
  134. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/blade_element_params_.py +5 -6
  135. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_acceleration_source_.py +3 -4
  136. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_mass_source_.py +4 -5
  137. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model_.py +3 -4
  138. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model_.py +3 -4
  139. luminarycloud/params/simulation/physics/fluid/physical_behavior_.py +3 -4
  140. luminarycloud/params/simulation/physics/fluid/porous_behavior_.py +4 -5
  141. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_explicit_relaxation_.py +3 -4
  142. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_off_.py +3 -4
  143. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_on_.py +4 -5
  144. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup_.py +3 -4
  145. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation_.py +9 -10
  146. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method_.py +3 -4
  147. luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/cfl_based_.py +4 -5
  148. luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/fixed_pseudo_time_step_.py +4 -5
  149. luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method_.py +3 -4
  150. luminarycloud/params/simulation/physics/fluid/solution_controls_fluid_.py +3 -4
  151. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ec2_.py +3 -4
  152. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/fds_.py +5 -6
  153. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ld2_.py +5 -6
  154. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/rhie_chow_.py +4 -5
  155. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_.py +3 -4
  156. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order/first_order_.py +3 -4
  157. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order/second_order_.py +8 -9
  158. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order_.py +3 -4
  159. luminarycloud/params/simulation/physics/fluid/spatial_discretization_fluid_.py +4 -5
  160. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/ddes_.py +3 -4
  161. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/ddes_vtm_.py +3 -4
  162. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/iddes_.py +3 -4
  163. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation_.py +3 -4
  164. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/constants/custom_komega_sst_constants_.py +16 -17
  165. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/constants/default_komega_sst_constants_.py +3 -4
  166. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/komega_sst_constants_.py +3 -4
  167. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst_.py +3 -4
  168. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/constants/custom_spalart_allmaras_constants_.py +15 -16
  169. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/constants/default_spalart_allmaras_constants_.py +3 -4
  170. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/spalart_allmaras_constants_.py +3 -4
  171. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras_.py +3 -4
  172. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/amd_.py +4 -5
  173. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/sigma_.py +4 -5
  174. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/smagorinsky_.py +4 -5
  175. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/vreman_.py +4 -5
  176. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/wale_.py +4 -5
  177. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model_.py +3 -4
  178. luminarycloud/params/simulation/physics/fluid/turbulence_.py +6 -7
  179. luminarycloud/params/simulation/physics/fluid_.py +8 -7
  180. luminarycloud/params/simulation/physics/heat/adjoint_controls_heat_.py +3 -4
  181. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_convection_.py +5 -6
  182. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_heat_flux_.py +4 -5
  183. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_integrated_heat_flux_.py +4 -5
  184. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_symmetry_.py +3 -4
  185. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_temperature_.py +4 -5
  186. luminarycloud/params/simulation/physics/heat/boundary_conditions_heat_.py +3 -4
  187. luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/heat_source_type_power_.py +4 -5
  188. luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/heat_source_type_power_per_unit_of_volume_.py +4 -5
  189. luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type_.py +3 -4
  190. luminarycloud/params/simulation/physics/heat/heat_source_.py +3 -4
  191. luminarycloud/params/simulation/physics/heat/initialization/heat_existing_solution_.py +3 -4
  192. luminarycloud/params/simulation/physics/heat/initialization/heat_prescribed_values_.py +4 -5
  193. luminarycloud/params/simulation/physics/heat/initialization_heat_.py +3 -4
  194. luminarycloud/params/simulation/physics/heat/solution_controls/heat_relaxation_method/heat_implicit_relaxation_.py +4 -5
  195. luminarycloud/params/simulation/physics/heat/solution_controls/heat_relaxation_method_.py +3 -4
  196. luminarycloud/params/simulation/physics/heat/solution_controls_heat_.py +4 -5
  197. luminarycloud/params/simulation/physics/heat/spatial_discretization_heat_.py +5 -6
  198. luminarycloud/params/simulation/physics/heat_.py +5 -5
  199. luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/rotational_periodicity_.py +3 -4
  200. luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/translational_periodicity_.py +3 -4
  201. luminarycloud/params/simulation/physics/periodic_pair/periodicity_type_.py +3 -4
  202. luminarycloud/params/simulation/physics/periodic_pair_.py +3 -4
  203. luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/gauss_seidel_.py +3 -4
  204. luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/krylov_amg_.py +4 -5
  205. luminarycloud/params/simulation/physics/solution_controls/linear_solver_type_.py +4 -5
  206. luminarycloud/params/simulation/physics_.py +6 -5
  207. luminarycloud/params/simulation/simulation_param_.py +3 -4
  208. luminarycloud/params/simulation/sliding_interfaces_.py +3 -4
  209. luminarycloud/params/simulation/surface_name_.py +3 -4
  210. luminarycloud/params/simulation/time/compute_statistics/compute_statistics_off_.py +3 -4
  211. luminarycloud/params/simulation/time/compute_statistics/compute_statistics_on_.py +3 -4
  212. luminarycloud/params/simulation/time/compute_statistics_.py +3 -4
  213. luminarycloud/params/simulation/time/time_marching/time_explicit_.py +3 -4
  214. luminarycloud/params/simulation/time/time_marching/time_implicit_.py +3 -4
  215. luminarycloud/params/simulation/time/time_marching_.py +3 -4
  216. luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_off_.py +3 -4
  217. luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_on_.py +4 -5
  218. luminarycloud/params/simulation/time/time_step_ramp_.py +3 -4
  219. luminarycloud/params/simulation/time_.py +4 -5
  220. luminarycloud/params/simulation/volume_entity_.py +6 -5
  221. luminarycloud/physics_ai/__init__.py +2 -0
  222. luminarycloud/physics_ai/architectures.py +42 -8
  223. luminarycloud/physics_ai/inference.py +0 -2
  224. luminarycloud/physics_ai/models.py +44 -15
  225. luminarycloud/project.py +54 -3
  226. luminarycloud/simulation_template.py +21 -6
  227. luminarycloud/solution.py +1 -1
  228. luminarycloud/types/__init__.py +2 -0
  229. luminarycloud/types/adfloat.py +50 -8
  230. luminarycloud/types/ids.py +2 -0
  231. luminarycloud/vis/__init__.py +12 -2
  232. luminarycloud/vis/data_extraction.py +546 -0
  233. luminarycloud/vis/display.py +61 -6
  234. luminarycloud/vis/filters.py +199 -43
  235. luminarycloud/vis/interactive_scene.py +1 -0
  236. luminarycloud/vis/primitives.py +38 -0
  237. luminarycloud/vis/vis_util.py +56 -0
  238. luminarycloud/vis/visualization.py +224 -70
  239. {luminarycloud-0.15.3.dist-info → luminarycloud-0.15.5.dist-info}/METADATA +2 -1
  240. {luminarycloud-0.15.3.dist-info → luminarycloud-0.15.5.dist-info}/RECORD +241 -235
  241. luminarycloud/_proto/luminarycloud/luminarycloud_api.pb +0 -0
  242. {luminarycloud-0.15.3.dist-info → luminarycloud-0.15.5.dist-info}/WHEEL +0 -0
@@ -1,51 +1,20 @@
1
1
  from luminarycloud.types import Vector3, Vector3Like
2
2
  from ..types.vector3 import _to_vector3
3
- from luminarycloud.enum import VisQuantity, StreamlineDirection, SurfaceStreamlineMode
3
+ from luminarycloud.enum import (
4
+ VisQuantity,
5
+ StreamlineDirection,
6
+ SurfaceStreamlineMode,
7
+ FieldComponent,
8
+ )
9
+ import luminarycloud.enum.quantity_type as quantity_type
4
10
  from .._proto.api.v0.luminarycloud.vis import vis_pb2
5
11
  from abc import ABC, abstractmethod
6
- import string, random, math
12
+ import math
7
13
  import dataclasses as dc
8
14
  from .display import Field, DisplayAttributes
9
15
  from typing import List, Any, cast
10
-
11
-
12
- def generate_id(prefix: str) -> str:
13
- return prefix + "".join(random.choices(string.ascii_lowercase, k=24))
14
-
15
-
16
- @dc.dataclass
17
- class Plane:
18
- """
19
- This class defines a plane.
20
-
21
- .. warning:: This feature is experimental and may change or be removed in the future.
22
-
23
- """
24
-
25
- origin: Vector3Like = dc.field(default_factory=lambda: Vector3(x=0, y=0, z=0))
26
- """A point defined on the plane. Default: [0,0,0]."""
27
- normal: Vector3Like = dc.field(default_factory=lambda: Vector3(x=1, y=0, z=0))
28
- """The vector orthogonal to the plane. Default: [0,1,0]"""
29
-
30
-
31
- @dc.dataclass
32
- class Box:
33
- """
34
- This class defines a box used for filter such as box clip.
35
-
36
- .. warning:: This feature is experimental and may change or be removed in the future.
37
-
38
- """
39
-
40
- center: Vector3Like = dc.field(default_factory=lambda: Vector3(x=0, y=0, z=0))
41
- """A point defined at the center of the box. Default: [0,0,0]."""
42
- lengths: Vector3Like = dc.field(default_factory=lambda: Vector3(x=1, y=1, z=1))
43
- """The the legnths of each side of the box. Default: [1,1,1]"""
44
- angles: Vector3Like = dc.field(default_factory=lambda: Vector3(x=0, y=0, z=0))
45
- """
46
- The rotation of the box specified in Euler angles (degrees) and applied
47
- in XYZ ordering. Default: [0,0,0]
48
- """
16
+ from .primitives import Box, Plane
17
+ from .vis_util import generate_id
49
18
 
50
19
 
51
20
  class Filter(ABC):
@@ -71,6 +40,10 @@ class Filter(ABC):
71
40
  def _to_proto(self) -> vis_pb2.Filter:
72
41
  pass
73
42
 
43
+ @abstractmethod
44
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
45
+ pass
46
+
74
47
  def set_parent(self, filter: Any) -> None:
75
48
  """
76
49
  Set this filter's parent filter. This controls what data the filter uses
@@ -157,6 +130,20 @@ class Slice(Filter):
157
130
  vis_filter.slice.project_vectors = self.project_vectors
158
131
  return vis_filter
159
132
 
133
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
134
+ typ = filter.WhichOneof("value")
135
+ if typ != "slice":
136
+ raise TypeError(f"Expected 'slice', got {typ}")
137
+ self.id = filter.id
138
+ self.name = filter.name
139
+ self.project_vectors = filter.slice.project_vectors
140
+ origin = Vector3()
141
+ origin._from_proto(filter.slice.plane.origin)
142
+ self.plane.origin = origin
143
+ normal = Vector3()
144
+ normal._from_proto(filter.slice.plane.normal)
145
+ self.plane.normal = normal
146
+
160
147
 
161
148
  class Isosurface(Filter):
162
149
  """
@@ -201,11 +188,30 @@ class Isosurface(Filter):
201
188
  vis_filter.id = self.id
202
189
  vis_filter.name = self.name
203
190
  vis_filter.contour.field.quantity_typ = self.field.quantity.value
204
- vis_filter.contour.field.component = self.field.component.value
191
+ if not quantity_type._is_vector(self.field.quantity):
192
+ vis_filter.contour.field.component = vis_pb2.Field.COMPONENT_UNSPECIFIED
193
+ else:
194
+ vis_filter.contour.field.component = self.field.component.value
205
195
  for val in self.isovalues:
206
196
  vis_filter.contour.iso_values.append(val)
207
197
  return vis_filter
208
198
 
199
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
200
+ typ = filter.WhichOneof("value")
201
+ if typ != "contour":
202
+ raise TypeError(f"Expected 'contour', got {typ}")
203
+ self.id = filter.id
204
+ self.name = filter.name
205
+ self.field.quantity = VisQuantity(filter.contour.field.quantity_typ)
206
+ if not quantity_type._is_vector(self.field.quantity):
207
+ # This is a scalar so just set the component to magnitude which is the default.
208
+ self.field.component = FieldComponent.MAGNITUDE
209
+ else:
210
+ self.field.component = FieldComponent(filter.contour.field.component)
211
+ self.isovalues.clear()
212
+ for val in filter.contour.iso_values:
213
+ self.isovalues.append(val)
214
+
209
215
 
210
216
  class PlaneClip(Filter):
211
217
  """
@@ -254,6 +260,21 @@ class PlaneClip(Filter):
254
260
  vis_filter.clip.inverted = self.inverted
255
261
  return vis_filter
256
262
 
263
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
264
+ typ = filter.WhichOneof("value")
265
+ if typ != "clip":
266
+ raise TypeError(f"Expected 'clip', got {typ}")
267
+ clip_typ = filter.clip.WhichOneof("clip_function")
268
+ if clip_typ != "plane":
269
+ raise TypeError(f"Expected 'plane clip', got {clip_typ}")
270
+ self.id = filter.id
271
+ self.name = filter.name
272
+ self.plane.normal = Vector3()
273
+ self.plane.normal._from_proto(filter.clip.plane.normal)
274
+ self.plane.origin = Vector3()
275
+ self.plane.origin._from_proto(filter.clip.plane.origin)
276
+ self.inverted = filter.clip.inverted
277
+
257
278
 
258
279
  class BoxClip(Filter):
259
280
  """
@@ -306,6 +327,27 @@ class BoxClip(Filter):
306
327
  vis_filter.clip.inverted = self.inverted
307
328
  return vis_filter
308
329
 
330
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
331
+ typ = filter.WhichOneof("value")
332
+ if typ != "clip":
333
+ raise TypeError(f"Expected 'clip', got {typ}")
334
+ clip_typ = filter.clip.WhichOneof("clip_function")
335
+ if clip_typ != "box":
336
+ raise TypeError(f"Expected 'box', got {clip_typ}")
337
+ self.id = filter.id
338
+ self.name = filter.name
339
+ self.box.center = Vector3()
340
+ self.box.center._from_proto(filter.clip.box.center)
341
+ self.box.lengths = Vector3()
342
+ self.box.lengths._from_proto(filter.clip.box.lengths)
343
+ self.box.angles = Vector3()
344
+ self.box.angles._from_proto(filter.clip.box.angles)
345
+ # Backend units are radians, convert back to degrees
346
+ self.box.angles.x = self.box.angles.x * (180 / math.pi)
347
+ self.box.angles.y = self.box.angles.y * (180 / math.pi)
348
+ self.box.angles.z = self.box.angles.z * (180 / math.pi)
349
+ self.inverted = filter.clip.inverted
350
+
309
351
 
310
352
  class VectorGlyphs(Filter):
311
353
  """
@@ -376,10 +418,27 @@ class FixedSizeVectorGlyphs(VectorGlyphs):
376
418
  vis_filter.glyph.fixed_size_glyphs = self.size
377
419
  vis_filter.glyph.n_glyphs = self.sampling_rate
378
420
  vis_filter.glyph.sampling_mode = vis_pb2.GLYPH_SAMPLING_MODE_EVERY_NTH
421
+ if not quantity_type._is_vector(self.field.quantity):
422
+ raise ValueError("FixedSizeVectorGlyphs: field must be a vector type")
379
423
  vis_filter.glyph.field.quantity_typ = self.field.quantity.value
380
424
  vis_filter.glyph.field.component = self.field.component.value
381
425
  return vis_filter
382
426
 
427
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
428
+ typ = filter.WhichOneof("value")
429
+ if typ != "glyph":
430
+ raise TypeError(f"Expected 'glyph', got {typ}")
431
+ glyph_typ = filter.glyph.WhichOneof("glyph_size")
432
+ if glyph_typ != "fixed_size_glyphs":
433
+ raise TypeError(f"Expected 'fixed size', got {typ}")
434
+ self.id = filter.id
435
+ self.name = filter.name
436
+ self.n_glyphs = filter.glyph.n_glyphs
437
+ self.size = filter.glyph.fixed_size_glyphs
438
+ self.sampling_rate = filter.glyph.n_glyphs
439
+ self.field.quantity = VisQuantity(filter.glyph.field.quantity_typ)
440
+ self.field.component = FieldComponent(filter.glyph.field.component)
441
+
383
442
 
384
443
  class ScaledVectorGlyphs(VectorGlyphs):
385
444
  """
@@ -420,10 +479,27 @@ class ScaledVectorGlyphs(VectorGlyphs):
420
479
  vis_filter.glyph.glyph_scale_size = self.scale
421
480
  vis_filter.glyph.n_glyphs = self.sampling_rate
422
481
  vis_filter.glyph.sampling_mode = vis_pb2.GLYPH_SAMPLING_MODE_EVERY_NTH
482
+ if not quantity_type._is_vector(self.field.quantity):
483
+ raise ValueError("ScaledVectorGyph: field must be a vector type")
423
484
  vis_filter.glyph.field.quantity_typ = self.field.quantity.value
424
485
  vis_filter.glyph.field.component = self.field.component.value
425
486
  return vis_filter
426
487
 
488
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
489
+ typ = filter.WhichOneof("value")
490
+ if typ != "glyph":
491
+ raise TypeError(f"Expected 'glyph', got {typ}")
492
+ glyph_typ = filter.glyph.WhichOneof("glyph_size")
493
+ if glyph_typ != "glyph_scale_size":
494
+ raise TypeError(f"Expected 'scaled size', got {typ}")
495
+ self.id = filter.id
496
+ self.name = filter.name
497
+ self.n_glyphs = filter.glyph.n_glyphs
498
+ self.scale = filter.glyph.glyph_scale_size
499
+ self.sampling_rate = filter.glyph.n_glyphs
500
+ self.field.quantity = VisQuantity(filter.glyph.field.quantity_typ)
501
+ self.field.component = FieldComponent(filter.glyph.field.component)
502
+
427
503
 
428
504
  class Threshold(Filter):
429
505
  """
@@ -490,12 +566,34 @@ class Threshold(Filter):
490
566
  vis_filter.threshold.range.min = self.min_value
491
567
  vis_filter.threshold.range.max = self.max_value
492
568
  vis_filter.threshold.field.quantity_typ = self.field.quantity.value
569
+ if not quantity_type._is_vector(self.field.quantity):
570
+ vis_filter.threshold.field.component = vis_pb2.Field.COMPONENT_UNSPECIFIED
571
+ else:
572
+ vis_filter.threshold.field.component = self.field.component.value
493
573
  vis_filter.threshold.field.component = self.field.component.value
494
574
  vis_filter.threshold.smooth = self.smooth
495
575
  vis_filter.threshold.invert = self.invert
496
576
  vis_filter.threshold.strict = self.strict
497
577
  return vis_filter
498
578
 
579
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
580
+ typ = filter.WhichOneof("value")
581
+ if typ != "threshold":
582
+ raise TypeError(f"Expected 'threshold', got {typ}")
583
+ self.id = filter.id
584
+ self.name = filter.name
585
+ self.min_value = filter.threshold.range.min
586
+ self.max_value = filter.threshold.range.max
587
+ self.smooth = filter.threshold.smooth
588
+ self.invert = filter.threshold.invert
589
+ self.strict = filter.threshold.strict
590
+ self.field.quantity = VisQuantity(filter.threshold.field.quantity_typ)
591
+ if not quantity_type._is_vector(self.field.quantity):
592
+ # This is a scalar so just set the component to magnitude which is the default.
593
+ self.field.component = FieldComponent.MAGNITUDE
594
+ else:
595
+ self.field.component = FieldComponent(filter.threshold.field.component)
596
+
499
597
 
500
598
  class Streamlines(Filter):
501
599
  """
@@ -575,9 +673,29 @@ class RakeStreamlines(Streamlines):
575
673
  vis_filter.streamlines.max_length = self.max_length
576
674
  vis_filter.streamlines.rake.start.CopyFrom(_to_vector3(self.start)._to_proto())
577
675
  vis_filter.streamlines.rake.end.CopyFrom(_to_vector3(self.end)._to_proto())
676
+ if not quantity_type._is_vector(self.field.quantity):
677
+ raise ValueError("RakeStreamlines: field must be a vector type")
578
678
  vis_filter.streamlines.field.quantity_typ = self.field.quantity.value
579
679
  return vis_filter
580
680
 
681
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
682
+ typ = filter.WhichOneof("value")
683
+ if typ != "streamlines":
684
+ raise TypeError(f"Expected 'streamlines', got {typ}")
685
+ s_typ = filter.streamlines.WhichOneof("seed_type")
686
+ if s_typ != "rake":
687
+ raise TypeError(f"Expected 'rake streamlines', got {s_typ}")
688
+ self.id = filter.id
689
+ self.name = filter.name
690
+ self.n_streamlines = filter.streamlines.n_streamlines
691
+ self.max_length = filter.streamlines.max_length
692
+
693
+ self.start = Vector3()
694
+ self.start._from_proto(filter.streamlines.rake.start)
695
+ self.end = Vector3()
696
+ self.end._from_proto(filter.streamlines.rake.end)
697
+ self.field.quantity = VisQuantity(filter.streamlines.field.quantity_typ)
698
+
581
699
 
582
700
  class SurfaceStreamlines(Streamlines):
583
701
  """
@@ -693,9 +811,28 @@ class SurfaceStreamlines(Streamlines):
693
811
  raise ValueError("SurfaceStreamlines: need at least one surfaces specified.")
694
812
  for id in self._surface_names:
695
813
  vis_filter.streamlines.surface.surface_names.append(id)
814
+ if not quantity_type._is_vector(self.field.quantity):
815
+ raise ValueError("SurfaceStreamlines: field must be a vector type")
816
+ vis_filter.streamlines.field.component = self.field.component.value
696
817
  vis_filter.streamlines.field.quantity_typ = self.field.quantity.value
697
818
  return vis_filter
698
819
 
820
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
821
+ typ = filter.WhichOneof("value")
822
+ if typ != "streamlines":
823
+ raise TypeError(f"Expected 'streamlines', got {typ}")
824
+ s_typ = filter.streamlines.WhichOneof("seed_type")
825
+ if s_typ != "surface":
826
+ raise TypeError(f"Expected 'surface streamlines', got {s_typ}")
827
+ self.id = filter.id
828
+ self.name = filter.name
829
+ self.max_length = filter.streamlines.max_length
830
+ self.offset = filter.streamlines.surface.offset
831
+ self._surface_names.clear()
832
+ for s in filter.streamlines.surface.surface_names:
833
+ self._surface_names.append(s)
834
+ self.field.quantity = VisQuantity(filter.streamlines.field.quantity_typ)
835
+
699
836
 
700
837
  class SurfaceLIC(Filter):
701
838
  """
@@ -737,7 +874,7 @@ class SurfaceLIC(Filter):
737
874
 
738
875
  def add_surface(self, id: str) -> None:
739
876
  """
740
- Add a surface to generate compute the surface LIC on. Adding no
877
+ Add a surface to compute the surface LIC on. Adding no
741
878
  surfaces indicates that all surfaces will be used.
742
879
 
743
880
  Parameters
@@ -780,3 +917,22 @@ class SurfaceLIC(Filter):
780
917
  vis_filter.surface_lic.field.quantity_typ = self.field.quantity.value
781
918
  vis_filter.surface_lic.contrast = self.contrast
782
919
  return vis_filter
920
+
921
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
922
+ typ = filter.WhichOneof("value")
923
+ if typ != "surface_lic":
924
+ raise TypeError(f"Expected 'surface lic', got {typ}")
925
+ l_typ = filter.surface_lic.WhichOneof("lic_type")
926
+ if l_typ != "geometry":
927
+ # there is only one type of surface lic currently.
928
+ raise TypeError(f"Expected geometry', got {l_typ}")
929
+ self.id = filter.id
930
+ self.name = filter.name
931
+ self.contrast = filter.surface_lic.contrast
932
+ self._surface_names = []
933
+ for s in filter.surface_lic.geometry.surface_names:
934
+ self._surface_names.append(s)
935
+ if not quantity_type._is_vector(self.field.quantity):
936
+ raise ValueError("SurfaceLIC: field must be a vector type")
937
+ self.field.quantity = VisQuantity(filter.surface_lic.field.quantity_typ)
938
+ self.field.component = FieldComponent(filter.surface_lic.field.component)
@@ -1,3 +1,4 @@
1
+ # Copyright 2023-2024 Luminary Cloud, Inc. All Rights Reserved.
1
2
  from .display import DisplayAttributes
2
3
  from .filters import SurfaceStreamlines, Filter, SurfaceLIC
3
4
  from .._client import get_default_client
@@ -0,0 +1,38 @@
1
+ # Copyright 2023-2024 Luminary Cloud, Inc. All Rights Reserved.
2
+ import dataclasses as dc
3
+ from luminarycloud.types import Vector3, Vector3Like
4
+
5
+
6
+ @dc.dataclass
7
+ class Plane:
8
+ """
9
+ This class defines a plane.
10
+
11
+ .. warning:: This feature is experimental and may change or be removed in the future.
12
+
13
+ """
14
+
15
+ origin: Vector3Like = dc.field(default_factory=lambda: Vector3(x=0, y=0, z=0))
16
+ """A point defined on the plane. Default: [0,0,0]."""
17
+ normal: Vector3Like = dc.field(default_factory=lambda: Vector3(x=1, y=0, z=0))
18
+ """The vector orthogonal to the plane. Default: [0,1,0]"""
19
+
20
+
21
+ @dc.dataclass
22
+ class Box:
23
+ """
24
+ This class defines a box used for filter such as box clip.
25
+
26
+ .. warning:: This feature is experimental and may change or be removed in the future.
27
+
28
+ """
29
+
30
+ center: Vector3Like = dc.field(default_factory=lambda: Vector3(x=0, y=0, z=0))
31
+ """A point defined at the center of the box. Default: [0,0,0]."""
32
+ lengths: Vector3Like = dc.field(default_factory=lambda: Vector3(x=1, y=1, z=1))
33
+ """The the legnths of each side of the box. Default: [1,1,1]"""
34
+ angles: Vector3Like = dc.field(default_factory=lambda: Vector3(x=0, y=0, z=0))
35
+ """
36
+ The rotation of the box specified in Euler angles (degrees) and applied
37
+ in XYZ ordering. Default: [0,0,0]
38
+ """
@@ -0,0 +1,56 @@
1
+ # Copyright 2023-2024 Luminary Cloud, Inc. All Rights Reserved.
2
+ import io
3
+ import requests
4
+ import string, random
5
+ import luminarycloud._proto.api.v0.luminarycloud.common.common_pb2 as common_pb2
6
+ from ..enum.vis_enums import RenderStatusType, VisQuantity
7
+ from .._proto.api.v0.luminarycloud.vis import vis_pb2
8
+ from .._client import get_default_client
9
+
10
+
11
+ def generate_id(prefix: str) -> str:
12
+ return prefix + "".join(random.choices(string.ascii_lowercase, k=24))
13
+
14
+
15
+ class _InternalToken:
16
+ """Marker class to control instantiation access for vis outputs."""
17
+
18
+ pass
19
+
20
+
21
+ def _download_file(file: common_pb2.File) -> "io.BytesIO":
22
+ buffer = io.BytesIO()
23
+ if file.signed_url:
24
+ response = requests.get(file.signed_url, stream=True)
25
+ response.raise_for_status()
26
+ for chunk in response.iter_content(chunk_size=8192):
27
+ buffer.write(chunk)
28
+ elif file.full_contents:
29
+ buffer.write(file.full_contents)
30
+ else:
31
+ raise Exception("file respose contains no data.")
32
+ # Reset buffer position to the beginning for reading
33
+ buffer.seek(0)
34
+ return buffer
35
+
36
+
37
+ def _get_status(project_id: str, extract_id: str) -> RenderStatusType:
38
+ """
39
+ Get a previously created set of render outputs by project and extract id. This
40
+ can be used by both extracts and images since the status type is just an alias.
41
+
42
+ .. warning:: This feature is experimental and may change or be removed in the future.
43
+
44
+ Parameters
45
+ ----------
46
+ project_id : str
47
+ The project id to of the extract.
48
+ extract_id: str
49
+ The id to of the extract.
50
+
51
+ """
52
+ req = vis_pb2.GetExtractRequest()
53
+ req.extract_id = extract_id
54
+ req.project_id = project_id
55
+ res: vis_pb2.GetExtractResponse = get_default_client().GetExtract(req)
56
+ return RenderStatusType(res.extract.status)