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.
- luminarycloud/__init__.py +1 -0
- luminarycloud/_helpers/_create_geometry.py +36 -17
- luminarycloud/_helpers/_create_simulation.py +2 -0
- luminarycloud/_helpers/_entity_identifier.py +6 -0
- luminarycloud/_helpers/named_variables.py +6 -15
- luminarycloud/_helpers/warnings/experimental.py +6 -2
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.py +77 -55
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.pyi +34 -2
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.py +33 -0
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.pyi +10 -0
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.py +45 -15
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.pyi +104 -22
- luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.py +12 -12
- luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.pyi +10 -2
- luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2.py +27 -105
- luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2.pyi +24 -173
- luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2_grpc.py +17 -113
- luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2_grpc.pyi +16 -44
- luminarycloud/_proto/api/v0/luminarycloud/upload/upload_pb2.py +4 -2
- luminarycloud/_proto/api/v0/luminarycloud/upload/upload_pb2_grpc.py +37 -0
- luminarycloud/_proto/api/v0/luminarycloud/upload/upload_pb2_grpc.pyi +20 -0
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py +221 -143
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi +154 -7
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.py +33 -0
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.pyi +10 -0
- luminarycloud/_proto/assistant/assistant_pb2.py +62 -61
- luminarycloud/_proto/client/simulation_pb2.py +349 -309
- luminarycloud/_proto/client/simulation_pb2.pyi +97 -2
- luminarycloud/_proto/fvm/solver_results_pb2.py +25 -11
- luminarycloud/_proto/fvm/solver_results_pb2.pyi +24 -1
- luminarycloud/_proto/geometry/geometry_pb2.py +63 -64
- luminarycloud/_proto/namedvariableset/namedvariableset_pb2.py +49 -0
- luminarycloud/_proto/namedvariableset/namedvariableset_pb2.pyi +53 -0
- luminarycloud/_proto/upload/upload_pb2.py +27 -7
- luminarycloud/_proto/upload/upload_pb2.pyi +31 -0
- luminarycloud/_wrapper.py +26 -7
- luminarycloud/enum/__init__.py +2 -0
- luminarycloud/enum/physics_ai_lifecycle_state.py +30 -0
- luminarycloud/enum/quantity_type.py +43 -0
- luminarycloud/enum/vis_enums.py +6 -2
- luminarycloud/geometry.py +46 -2
- luminarycloud/named_variable_set.py +10 -5
- luminarycloud/params/enum/_enum_wrappers.py +68 -0
- luminarycloud/params/simulation/_lib.py +1 -1
- luminarycloud/params/simulation/adaptive_mesh_refinement/boundary_layer_profile_.py +5 -6
- luminarycloud/params/simulation/adaptive_mesh_refinement_.py +6 -7
- luminarycloud/params/simulation/adjoint_.py +3 -4
- luminarycloud/params/simulation/basic/gravity/gravity_off_.py +3 -4
- luminarycloud/params/simulation/basic/gravity/gravity_on_.py +3 -4
- luminarycloud/params/simulation/basic/gravity_.py +3 -4
- luminarycloud/params/simulation/body_frame_.py +3 -4
- luminarycloud/params/simulation/entity_relationships/volume_material_relationship_.py +9 -6
- luminarycloud/params/simulation/entity_relationships/volume_physics_relationship_.py +9 -6
- luminarycloud/params/simulation/entity_relationships_.py +3 -4
- luminarycloud/params/simulation/general_.py +3 -4
- luminarycloud/params/simulation/material/fluid/boussinesq_approximation/boussinesq_off_.py +3 -4
- luminarycloud/params/simulation/material/fluid/boussinesq_approximation/boussinesq_on_.py +5 -6
- luminarycloud/params/simulation/material/fluid/boussinesq_approximation_.py +3 -4
- luminarycloud/params/simulation/material/fluid/material_model/ideal_gas_.py +5 -6
- luminarycloud/params/simulation/material/fluid/material_model/incompressible_fluid_.py +4 -5
- luminarycloud/params/simulation/material/fluid/material_model/incompressible_fluid_with_energy_.py +5 -6
- luminarycloud/params/simulation/material/fluid/material_model_.py +3 -4
- luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/prescribed_conductivity_.py +4 -5
- luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/prescribed_prandtl_number_.py +4 -5
- luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/temperature_dependent_conductivity_.py +3 -4
- luminarycloud/params/simulation/material/fluid/thermal_conductivity_model_.py +3 -4
- luminarycloud/params/simulation/material/fluid/viscosity_model/prescribed_viscosity_.py +4 -5
- luminarycloud/params/simulation/material/fluid/viscosity_model/sutherland_.py +6 -7
- luminarycloud/params/simulation/material/fluid/viscosity_model/temperature_dependent_viscosity_.py +3 -4
- luminarycloud/params/simulation/material/fluid/viscosity_model_.py +3 -4
- luminarycloud/params/simulation/material/material_fluid_.py +4 -5
- luminarycloud/params/simulation/material/material_solid_.py +6 -7
- luminarycloud/params/simulation/material_entity_.py +6 -5
- luminarycloud/params/simulation/monitor_plane_.py +4 -5
- luminarycloud/params/simulation/motion_data/frame_transforms/no_transform_.py +3 -4
- luminarycloud/params/simulation/motion_data/frame_transforms/rotational_transform_.py +3 -4
- luminarycloud/params/simulation/motion_data/frame_transforms/translational_transform_.py +3 -4
- luminarycloud/params/simulation/motion_data/frame_transforms_.py +3 -4
- luminarycloud/params/simulation/motion_data/motion_type/constant_angular_motion_.py +3 -4
- luminarycloud/params/simulation/motion_data/motion_type/constant_translation_motion_.py +3 -4
- luminarycloud/params/simulation/motion_data/motion_type_.py +3 -4
- luminarycloud/params/simulation/motion_data_.py +3 -4
- luminarycloud/params/simulation/multi_physics_coupling_options_.py +3 -4
- luminarycloud/params/simulation/output_.py +3 -4
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_normal_vector_.py +3 -4
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_rotation_angles_.py +3 -4
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection_.py +3 -4
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk_.py +5 -6
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_line_.py +3 -4
- luminarycloud/params/simulation/particle_group/particle_group_type/probe_points_.py +3 -4
- luminarycloud/params/simulation/particle_group/particle_group_type/source_points_.py +3 -4
- luminarycloud/params/simulation/particle_group/particle_group_type_.py +3 -4
- luminarycloud/params/simulation/particle_group_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/adjoint_controls_fluid_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/basic_fluid_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/farfield_.py +9 -10
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/fan_curve_inlet_.py +5 -6
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mach_inlet_.py +5 -6
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mass_flow_inlet_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/total_pressure_inlet_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/velocity_components_inlet_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/velocity_magnitude_inlet_.py +5 -6
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/fan_curve_outlet_.py +5 -6
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_pressure_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_corrected_mass_flow_rate_.py +7 -8
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_mass_flow_rate_.py +5 -6
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/symmetry_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/turbulence_boundary_conditions_.py +9 -10
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/prescribed_heat_flux_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/prescribed_temperature_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/no_slip_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/slip_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/wall_model_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/wall_energy_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/wall_momentum_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions_fluid_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/initialization/fluid_existing_solution_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/initialization/fluid_farfield_values_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/initialization/fluid_prescribed_values_.py +5 -6
- luminarycloud/params/simulation/physics/fluid/initialization/turbulence_initialization_.py +9 -10
- luminarycloud/params/simulation/physics/fluid/initialization_fluid_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/physical_behavior/blade_element_airfoil_data_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_blade_element_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_radial_distribution_.py +6 -7
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_uniform_thrust_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/fan_curve_internal_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model/actuator_line_blade_element_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/blade_element_params_.py +5 -6
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_acceleration_source_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_mass_source_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/physical_behavior_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/porous_behavior_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_explicit_relaxation_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_off_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_on_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation_.py +9 -10
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/cfl_based_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/fixed_pseudo_time_step_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/solution_controls_fluid_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ec2_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/fds_.py +5 -6
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ld2_.py +5 -6
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/rhie_chow_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order/first_order_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order/second_order_.py +8 -9
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/spatial_discretization_fluid_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/ddes_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/ddes_vtm_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/iddes_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/constants/custom_komega_sst_constants_.py +16 -17
- luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/constants/default_komega_sst_constants_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/komega_sst_constants_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/constants/custom_spalart_allmaras_constants_.py +15 -16
- luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/constants/default_spalart_allmaras_constants_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/spalart_allmaras_constants_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/amd_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/sigma_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/smagorinsky_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/vreman_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/wale_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence_.py +6 -7
- luminarycloud/params/simulation/physics/fluid_.py +8 -7
- luminarycloud/params/simulation/physics/heat/adjoint_controls_heat_.py +3 -4
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_convection_.py +5 -6
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_heat_flux_.py +4 -5
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_integrated_heat_flux_.py +4 -5
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_symmetry_.py +3 -4
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_temperature_.py +4 -5
- luminarycloud/params/simulation/physics/heat/boundary_conditions_heat_.py +3 -4
- luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/heat_source_type_power_.py +4 -5
- luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/heat_source_type_power_per_unit_of_volume_.py +4 -5
- luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type_.py +3 -4
- luminarycloud/params/simulation/physics/heat/heat_source_.py +3 -4
- luminarycloud/params/simulation/physics/heat/initialization/heat_existing_solution_.py +3 -4
- luminarycloud/params/simulation/physics/heat/initialization/heat_prescribed_values_.py +4 -5
- luminarycloud/params/simulation/physics/heat/initialization_heat_.py +3 -4
- luminarycloud/params/simulation/physics/heat/solution_controls/heat_relaxation_method/heat_implicit_relaxation_.py +4 -5
- luminarycloud/params/simulation/physics/heat/solution_controls/heat_relaxation_method_.py +3 -4
- luminarycloud/params/simulation/physics/heat/solution_controls_heat_.py +4 -5
- luminarycloud/params/simulation/physics/heat/spatial_discretization_heat_.py +5 -6
- luminarycloud/params/simulation/physics/heat_.py +5 -5
- luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/rotational_periodicity_.py +3 -4
- luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/translational_periodicity_.py +3 -4
- luminarycloud/params/simulation/physics/periodic_pair/periodicity_type_.py +3 -4
- luminarycloud/params/simulation/physics/periodic_pair_.py +3 -4
- luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/gauss_seidel_.py +3 -4
- luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/krylov_amg_.py +4 -5
- luminarycloud/params/simulation/physics/solution_controls/linear_solver_type_.py +4 -5
- luminarycloud/params/simulation/physics_.py +6 -5
- luminarycloud/params/simulation/simulation_param_.py +3 -4
- luminarycloud/params/simulation/sliding_interfaces_.py +3 -4
- luminarycloud/params/simulation/surface_name_.py +3 -4
- luminarycloud/params/simulation/time/compute_statistics/compute_statistics_off_.py +3 -4
- luminarycloud/params/simulation/time/compute_statistics/compute_statistics_on_.py +3 -4
- luminarycloud/params/simulation/time/compute_statistics_.py +3 -4
- luminarycloud/params/simulation/time/time_marching/time_explicit_.py +3 -4
- luminarycloud/params/simulation/time/time_marching/time_implicit_.py +3 -4
- luminarycloud/params/simulation/time/time_marching_.py +3 -4
- luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_off_.py +3 -4
- luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_on_.py +4 -5
- luminarycloud/params/simulation/time/time_step_ramp_.py +3 -4
- luminarycloud/params/simulation/time_.py +4 -5
- luminarycloud/params/simulation/volume_entity_.py +6 -5
- luminarycloud/physics_ai/__init__.py +2 -0
- luminarycloud/physics_ai/architectures.py +42 -8
- luminarycloud/physics_ai/inference.py +0 -2
- luminarycloud/physics_ai/models.py +44 -15
- luminarycloud/project.py +54 -3
- luminarycloud/simulation_template.py +21 -6
- luminarycloud/solution.py +1 -1
- luminarycloud/types/__init__.py +2 -0
- luminarycloud/types/adfloat.py +50 -8
- luminarycloud/types/ids.py +2 -0
- luminarycloud/vis/__init__.py +12 -2
- luminarycloud/vis/data_extraction.py +546 -0
- luminarycloud/vis/display.py +61 -6
- luminarycloud/vis/filters.py +199 -43
- luminarycloud/vis/interactive_scene.py +1 -0
- luminarycloud/vis/primitives.py +38 -0
- luminarycloud/vis/vis_util.py +56 -0
- luminarycloud/vis/visualization.py +224 -70
- {luminarycloud-0.15.3.dist-info → luminarycloud-0.15.5.dist-info}/METADATA +2 -1
- {luminarycloud-0.15.3.dist-info → luminarycloud-0.15.5.dist-info}/RECORD +241 -235
- luminarycloud/_proto/luminarycloud/luminarycloud_api.pb +0 -0
- {luminarycloud-0.15.3.dist-info → luminarycloud-0.15.5.dist-info}/WHEEL +0 -0
luminarycloud/vis/filters.py
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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
|
|
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)
|
|
@@ -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)
|