luminarycloud 0.19.1__py3-none-any.whl → 0.20.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.
@@ -129,6 +129,8 @@ class Client(
129
129
  ("grpc.keepalive_timeout_ms", 5000),
130
130
  ("grpc.keepalive_permit_without_calls", 1),
131
131
  ("grpc.http2.max_pings_without_data", 10),
132
+ ("grpc.max_receive_message_length", 32 * 1024 * 1024),
133
+ ("grpc.max_send_message_length", 32 * 1024 * 1024),
132
134
  ]
133
135
  if grpc_channel_options:
134
136
  grpc_channel_options_with_keep_alive.extend(grpc_channel_options)
@@ -1,7 +1,7 @@
1
1
  # Copyright 2023-2024 Luminary Cloud, Inc. All Rights Reserved.
2
2
  import logging
3
3
  from time import time, sleep
4
- from luminarycloud.exceptions import DeadlineExceededError
4
+ from luminarycloud.exceptions import DeadlineExceededError, Timeout
5
5
 
6
6
  from .._proto.api.v0.luminarycloud.mesh.mesh_pb2 import Mesh, GetMeshRequest
7
7
  from .._client import Client
@@ -32,19 +32,20 @@ def wait_for_mesh(
32
32
 
33
33
  Raises
34
34
  ------
35
- TimeoutError
35
+ Timeout
36
36
  """
37
37
  deadline = time() + timeout_seconds
38
38
  while True:
39
39
  if time() >= deadline:
40
- logger.error("`wait_for_mesh` timed out.")
41
- raise TimeoutError
40
+ raise Timeout("Timed out waiting for mesh to be ready.")
42
41
  # It seems this call sometimes hangs. It seems as well that python gRPC is known to hang
43
42
  # in some cases, so we'll add a deadline and catch deadline exceeded errors to retry.
44
43
  try:
45
44
  response = client.GetMesh(GetMeshRequest(id=mesh.id), timeout=15)
46
45
  except DeadlineExceededError:
47
- logger.error("Deadline exceeded while waiting for mesh.")
46
+ logger.debug(
47
+ "Request deadline exceeded while waiting for mesh status. Will retry if the `wait_for_mesh` deadline has not expired."
48
+ )
48
49
  sleep(max(0, min(interval_seconds, deadline - time())))
49
50
  continue
50
51
  status = response.mesh.status
@@ -2,6 +2,7 @@
2
2
  import io
3
3
  import logging
4
4
  from time import time, sleep
5
+ from luminarycloud.exceptions import Timeout
5
6
 
6
7
  from .._proto.api.v0.luminarycloud.simulation.simulation_pb2 import (
7
8
  GetSimulationResponse,
@@ -42,7 +43,7 @@ def wait_for_simulation(
42
43
 
43
44
  Raises
44
45
  ------
45
- TimeoutError
46
+ Timeout
46
47
  """
47
48
  deadline = time() + timeout_seconds
48
49
  # latest_iter is used to avoid printing the same iteration's residuals multiple times
@@ -66,8 +67,7 @@ def wait_for_simulation(
66
67
  ]:
67
68
  return status
68
69
  if time() >= deadline:
69
- logger.error("`wait_for_simulation` timed out.")
70
- raise TimeoutError
70
+ raise Timeout("Timed out waiting for simulation to finish")
71
71
  sleep(max(0, min(interval_seconds, deadline - time())))
72
72
 
73
73
 
@@ -20,7 +20,7 @@ from luminarycloud._proto.table import table_pb2 as proto_dot_table_dot_table__p
20
20
  from luminarycloud._proto.api.v0.luminarycloud.common import common_pb2 as proto_dot_api_dot_v0_dot_luminarycloud_dot_common_dot_common__pb2
21
21
 
22
22
 
23
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(proto/api/v0/luminarycloud/vis/vis.proto\x12\'luminary.proto.api.v0.luminarycloud.vis\x1a\x1cgoogle/api/annotations.proto\x1a\x1bproto/options/options.proto\x1a\x1dproto/quantity/quantity.proto\x1a\x17proto/table/table.proto\x1a.proto/api/v0/luminarycloud/common/common.proto\"=\n\x03Pan\x12\x1a\n\x01x\x18\x01 \x01(\x01\x42\x0f\x82\xb2\x19\x0b\n\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x12\x1a\n\x01y\x18\x02 \x01(\x01\x42\x0f\x82\xb2\x19\x0b\n\t\t\x00\x00\x00\x00\x00\x00\x00\x00\"\xa4\x02\n\x0c\x43\x61meraLookAt\x12\x45\n\x08position\x18\x01 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12\x44\n\x07look_at\x18\x02 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12?\n\x02up\x18\x03 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12>\n\x03pan\x18\x04 \x01(\x0b\x32,.luminary.proto.api.v0.luminarycloud.vis.PanH\x00\x88\x01\x01\x42\x06\n\x04_pan\"}\n\nResolution\x12\x36\n\x05width\x18\x01 \x01(\x05\x42\'\x82\xb2\x19\x03\x30\x80\x0f\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00Y@\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xb0@\x8a\xb2\x19\x02\x18\x00\x12\x37\n\x06height\x18\x02 \x01(\x05\x42\'\x82\xb2\x19\x03\x30\xb8\x08\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00Y@\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xb0@\x8a\xb2\x19\x02\x18\x00\"\xde\x02\n\x06\x43\x61mera\x12U\n\nprojection\x18\x01 \x01(\x0e\x32\x39.luminary.proto.api.v0.luminarycloud.vis.CameraProjectionB\x06\x82\xb2\x19\x02 \x02\x12U\n\tdirection\x18\x02 \x01(\x0e\x32\x38.luminary.proto.api.v0.luminarycloud.vis.CameraDirectionB\x06\x82\xb2\x19\x02 \x03H\x00\x12H\n\x07look_at\x18\x03 \x01(\x0b\x32\x35.luminary.proto.api.v0.luminarycloud.vis.CameraLookAtH\x00\x12\x42\n\x04zoom\x18\x04 \x01(\x01\x42/\x82\xb2\x19\x0b\n\t\t\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\x02\x18\x00H\x01\x88\x01\x01\x42\x0f\n\rspecificationB\x07\n\x05_zoom\"\xb2\x01\n\x17\x41nimationSettingsStatic\x12?\n\x06\x63\x61mera\x18\x01 \x01(\x0b\x32/.luminary.proto.api.v0.luminarycloud.vis.Camera\x12G\n\nresolution\x18\x02 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.vis.Resolution\x12\r\n\x05label\x18\x03 \x01(\t\"\xee\x02\n\x19\x41nimationSettingsTimeStep\x12?\n\x06\x63\x61mera\x18\x01 \x01(\x0b\x32/.luminary.proto.api.v0.luminarycloud.vis.Camera\x12G\n\nresolution\x18\x04 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.vis.Resolution\x12\x61\n\x06\x66ormat\x18\x05 \x01(\x0e\x32I.luminary.proto.api.v0.luminarycloud.vis.AnimationSettingsTimeStep.FormatB\x06\x82\xb2\x19\x02 \x02\x12\x13\n\x0bskip_frames\x18\x06 \x01(\x05\x12\r\n\x05label\x18\x07 \x01(\t\"@\n\x06\x46ormat\x12\x16\n\x12\x46ORMAT_UNSPECIFIED\x10\x00\x12\x0e\n\nFORMAT_GIF\x10\x01\x12\x0e\n\nFORMAT_MP4\x10\x02\"a\n\x0eStaticSettings\x12O\n\x05items\x18\x01 \x03(\x0b\x32@.luminary.proto.api.v0.luminarycloud.vis.AnimationSettingsStatic\"e\n\x10TimeStepSettings\x12Q\n\x05items\x18\x01 \x03(\x0b\x32\x42.luminary.proto.api.v0.luminarycloud.vis.AnimationSettingsTimeStep\"\xbe\x01\n\x13\x41nimationProperties\x12J\n\x07statics\x18\x01 \x01(\x0b\x32\x37.luminary.proto.api.v0.luminarycloud.vis.StaticSettingsH\x00\x12O\n\ntime_steps\x18\x02 \x01(\x0b\x32\x39.luminary.proto.api.v0.luminarycloud.vis.TimeStepSettingsH\x00\x42\n\n\x08settings\"\x8e\x02\n\x05\x46ield\x12;\n\x0cquantity_typ\x18\x01 \x01(\x0e\x32%.luminary.proto.quantity.QuantityType\x12K\n\tcomponent\x18\x02 \x01(\x0e\x32\x38.luminary.proto.api.v0.luminarycloud.vis.Field.Component\"{\n\tComponent\x12\x19\n\x15\x43OMPONENT_UNSPECIFIED\x10\x00\x12\x0f\n\x0b\x43OMPONENT_X\x10\x01\x12\x0f\n\x0b\x43OMPONENT_Y\x10\x02\x12\x0f\n\x0b\x43OMPONENT_Z\x10\x03\x12 \n\x13\x43OMPONENT_MAGNITUDE\x10\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\"\xe7\x01\n\x11\x44isplayAttributes\x12=\n\x05\x66ield\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Field\x12\x14\n\x07visible\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12O\n\x0erepresentation\x18\x03 \x01(\x0e\x32\x37.luminary.proto.api.v0.luminarycloud.vis.Representation\x12\x14\n\x07opacity\x18\x04 \x01(\x01H\x01\x88\x01\x01\x42\n\n\x08_visibleB\n\n\x08_opacity\"\x91\x01\n\x05Plane\x12\x43\n\x06origin\x18\x01 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12\x43\n\x06normal\x18\x02 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\"\x8a\x01\n\x04\x41\x41\x42\x42\x12@\n\x03min\x18\x01 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12@\n\x03max\x18\x02 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\"_\n\x05Slice\x12=\n\x05plane\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Plane\x12\x17\n\x0fproject_vectors\x18\x02 \x01(\x08\"\\\n\x07\x43ontour\x12=\n\x05\x66ield\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Field\x12\x12\n\niso_values\x18\x02 \x03(\x01\"\x81\x02\n\tThreshold\x12=\n\x05\x66ield\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Field\x12=\n\x05range\x18\x02 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Range\x12\x1b\n\x06smooth\x18\x03 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x01H\x00\x88\x01\x01\x12\x1b\n\x06invert\x18\x04 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x00H\x01\x88\x01\x01\x12\x1b\n\x06strict\x18\x05 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x00H\x02\x88\x01\x01\x42\t\n\x07_smoothB\t\n\x07_invertB\t\n\x07_strict\"\x96\x01\n\x0eSeedRakeConfig\x12\x42\n\x05start\x18\x01 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12@\n\x03\x65nd\x18\x02 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\"\xed\x01\n\x11SeedSurfaceConfig\x12$\n\x06offset\x18\x01 \x01(\x01\x42\x0f\x82\xb2\x19\x0b\n\t\t\x00\x00\x00\x00\x00\x00\x00\x00H\x00\x88\x01\x01\x12\'\n\x12project_on_surface\x18\x02 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x00H\x01\x88\x01\x01\x12@\n\x0bsample_rate\x18\x03 \x01(\x05\x42&\x82\xb2\x19\x02\x30\n\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00@\x8f@\x8a\xb2\x19\x02\x18\x00H\x02\x88\x01\x01\x12\x15\n\rsurface_names\x18\x04 \x03(\tB\t\n\x07_offsetB\x15\n\x13_project_on_surfaceB\x0e\n\x0c_sample_rate\"\xcd\x03\n\x0eSeedGridConfig\x12=\n\x08rake_res\x18\x01 \x01(\x05\x42&\x82\xb2\x19\x02\x30\x02\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00@\x8f@\x8a\xb2\x19\x02\x18\x00H\x00\x88\x01\x01\x12=\n\x08seed_res\x18\x02 \x01(\x05\x42&\x82\xb2\x19\x02\x30\n\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00@\x8f@\x8a\xb2\x19\x02\x18\x00H\x01\x88\x01\x01\x12\x19\n\x0cseed_spacing\x18\x03 \x01(\x01H\x02\x88\x01\x01\x12\x19\n\x0crake_spacing\x18\x04 \x01(\x01H\x03\x88\x01\x01\x12\x43\n\x06\x63\x65nter\x18\x05 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12\x42\n\x05u_vec\x18\x06 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12\x42\n\x05v_vec\x18\x07 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3B\x0b\n\t_rake_resB\x0b\n\t_seed_resB\x0f\n\r_seed_spacingB\x0f\n\r_rake_spacing\"\x92\x04\n\x0bStreamlines\x12G\n\x04rake\x18\x01 \x01(\x0b\x32\x37.luminary.proto.api.v0.luminarycloud.vis.SeedRakeConfigH\x00\x12M\n\x07surface\x18\x02 \x01(\x0b\x32:.luminary.proto.api.v0.luminarycloud.vis.SeedSurfaceConfigH\x00\x12G\n\x04grid\x18\x03 \x01(\x0b\x32\x37.luminary.proto.api.v0.luminarycloud.vis.SeedGridConfigH\x00\x12\x42\n\rn_streamlines\x18\x04 \x01(\x05\x42&\x82\xb2\x19\x02\x30\x64\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00@\x8f@\x8a\xb2\x19\x02\x18\x00H\x01\x88\x01\x01\x12\x17\n\nmax_length\x18\x05 \x01(\x01H\x02\x88\x01\x01\x12X\n\tdirection\x18\x06 \x01(\x0e\x32=.luminary.proto.api.v0.luminarycloud.vis.StreamlinesDirectionB\x06\x82\xb2\x19\x02 \x01\x12=\n\x05\x66ield\x18\x07 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.FieldB\x0b\n\tseed_typeB\x10\n\x0e_n_streamlinesB\r\n\x0b_max_length\"\xb4\x02\n\x05Glyph\x12=\n\x05\x66ield\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Field\x12=\n\x08n_glyphs\x18\x02 \x01(\x05\x42&\x82\xb2\x19\x02\x30\x64\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00@\x8f@\x8a\xb2\x19\x02\x18\x00H\x01\x88\x01\x01\x12Y\n\rsampling_mode\x18\x03 \x01(\x0e\x32:.luminary.proto.api.v0.luminarycloud.vis.GlyphSamplingModeB\x06\x82\xb2\x19\x02 \x01\x12\x1b\n\x11\x66ixed_size_glyphs\x18\x04 \x01(\x01H\x00\x12\x1a\n\x10glyph_scale_size\x18\x05 \x01(\x01H\x00\x42\x0c\n\nglyph_sizeB\x0b\n\t_n_glyphs\"+\n\x12SurfaceLICGeomtery\x12\x15\n\rsurface_names\x18\x01 \x03(\t\"\x91\x01\n\x0fSurfaceLICPlane\x12=\n\x05plane\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Plane\x12?\n\x08\x63lip_box\x18\x02 \x01(\x0b\x32-.luminary.proto.api.v0.luminarycloud.vis.AABB\"\xb6\x02\n\nSurfaceLIC\x12=\n\x05\x66ield\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Field\x12O\n\x08geometry\x18\x02 \x01(\x0b\x32;.luminary.proto.api.v0.luminarycloud.vis.SurfaceLICGeomteryH\x00\x12I\n\x05plane\x18\x03 \x01(\x0b\x32\x38.luminary.proto.api.v0.luminarycloud.vis.SurfaceLICPlaneH\x00\x12\x41\n\x08\x63ontrast\x18\x04 \x01(\x01\x42/\x82\xb2\x19\x0b\n\t\t\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\t\t\x9a\x99\x99\x99\x99\x99\xc9?\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\x08@\x8a\xb2\x19\x02\x18\x00\x42\n\n\x08lic_type\"s\n\x11IntersectionCurve\x12=\n\x05plane\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Plane\x12\x10\n\x08surfaces\x18\x02 \x03(\t\x12\r\n\x05label\x18\x03 \x01(\t\"\x1a\n\x18LineSampleMeshResolution\"\x8e\x02\n\nLineSample\x12\x42\n\x05start\x18\x01 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12@\n\x03\x65nd\x18\x02 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12\r\n\x05label\x18\x03 \x01(\t\x12\\\n\x0fmesh_resolution\x18\x04 \x01(\x0b\x32\x41.luminary.proto.api.v0.luminarycloud.vis.LineSampleMeshResolutionH\x00\x42\r\n\x0bsample_type\"\xb9\x05\n\x06\x46ilter\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12?\n\x05slice\x18\x03 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.SliceH\x00\x12=\n\x04\x63lip\x18\x04 \x01(\x0b\x32-.luminary.proto.api.v0.luminarycloud.vis.ClipH\x00\x12\x43\n\x07\x63ontour\x18\x05 \x01(\x0b\x32\x30.luminary.proto.api.v0.luminarycloud.vis.ContourH\x00\x12G\n\tthreshold\x18\x07 \x01(\x0b\x32\x32.luminary.proto.api.v0.luminarycloud.vis.ThresholdH\x00\x12K\n\x0bstreamlines\x18\x08 \x01(\x0b\x32\x34.luminary.proto.api.v0.luminarycloud.vis.StreamlinesH\x00\x12?\n\x05glyph\x18\t \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.GlyphH\x00\x12J\n\x0bsurface_lic\x18\n \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.vis.SurfaceLICH\x00\x12X\n\x12intersection_curve\x18\x0b \x01(\x0b\x32:.luminary.proto.api.v0.luminarycloud.vis.IntersectionCurveH\x00\x12J\n\x0bline_sample\x18\x0c \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.vis.LineSampleH\x00\x42\x07\n\x05value\"\x18\n\nMeshEntity\x12\n\n\x02id\x18\x01 \x01(\t\"3\n\x10SimulationEntity\x12\n\n\x02id\x18\x01 \x01(\t\x12\x13\n\x0bsolution_id\x18\x02 \x01(\t\"9\n\x0eGeometryEntity\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1b\n\x13geometry_version_id\x18\x02 \x01(\t\"\xfc\x01\n\rExtractEntity\x12\x43\n\x04mesh\x18\x01 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.vis.MeshEntityH\x00\x12O\n\nsimulation\x18\x02 \x01(\x0b\x32\x39.luminary.proto.api.v0.luminarycloud.vis.SimulationEntityH\x00\x12K\n\x08geometry\x18\x03 \x01(\x0b\x32\x37.luminary.proto.api.v0.luminarycloud.vis.GeometryEntityH\x00\x42\x08\n\x06\x65ntity\"!\n\x05Range\x12\x0b\n\x03min\x18\x01 \x01(\x01\x12\x0b\n\x03max\x18\x02 \x01(\x01\"\xc4\x0b\n\x08\x43olorMap\x12=\n\x05\x66ield\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Field\x12K\n\x04name\x18\x02 \x01(\x0e\x32\x35.luminary.proto.api.v0.luminarycloud.vis.ColorMapNameB\x06\x82\xb2\x19\x02 \x03\x12\x42\n\x05range\x18\x03 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.RangeH\x02\x88\x01\x01\x12\x1c\n\x07visible\x18\x04 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x01H\x03\x88\x01\x01\x12\x1f\n\ndiscretize\x18\x05 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x00H\x04\x88\x01\x01\x12=\n\x08n_colors\x18\x06 \x01(\x05\x42&\x82\xb2\x19\x02\x30\x08\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00@\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00p@\x8a\xb2\x19\x02\x18\x00H\x05\x88\x01\x01\x12i\n\x12\x61utomatic_location\x18\x07 \x01(\x0e\x32\x43.luminary.proto.api.v0.luminarycloud.vis.ColorMap.AutomaticLocationB\x06\x82\xb2\x19\x02 \x01H\x00\x12\x66\n\x1alower_left_anchor_location\x18\x08 \x01(\x0b\x32@.luminary.proto.api.v0.luminarycloud.vis.ColorMap.AnchorLocationH\x00\x12U\n\x0e\x61utomatic_tick\x18\n \x01(\x0b\x32;.luminary.proto.api.v0.luminarycloud.vis.ColorMap.AutomaticH\x01\x12Y\n\x11min_max_only_tick\x18\x0b \x01(\x0b\x32<.luminary.proto.api.v0.luminarycloud.vis.ColorMap.MinMaxOnlyH\x01\x12G\n\ttext_size\x18\x11 \x01(\x01\x42/\x82\xb2\x19\x0b\n\t\t\x00\x00\x00\x00\x00\x00\x42@\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00Y@\x8a\xb2\x19\x02\x18\x00H\x06\x88\x01\x01\x12\x1f\n\nhorizontal\x18\x12 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x00H\x07\x88\x01\x01\x12\x43\n\x05width\x18\x13 \x01(\x01\x42/\x82\xb2\x19\x0b\n\t\t\xfc\xa9\xf1\xd2Mb\x80?\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\x02\x18\x00H\x08\x88\x01\x01\x12\x44\n\x06height\x18\x14 \x01(\x01\x42/\x82\xb2\x19\x0b\n\t\t\xbaI\x0c\x02+\x87\x96?\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\x02\x18\x00H\t\x88\x01\x01\x1a\x9e\x01\n\x0e\x41nchorLocation\x12?\n\x01x\x18\x01 \x01(\x01\x42/\x82\xb2\x19\x0b\n\t\tq=\n\xd7\xa3p\xed?\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\x02\x18\x00H\x00\x88\x01\x01\x12?\n\x01y\x18\x02 \x01(\x01\x42/\x82\xb2\x19\x0b\n\t\t\xe1z\x14\xaeG\xe1\xda?\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\x02\x18\x00H\x01\x88\x01\x01\x42\x04\n\x02_xB\x04\n\x02_y\x1a\x0b\n\tAutomatic\x1a\x0c\n\nMinMaxOnly\"\xad\x01\n\x11\x41utomaticLocation\x12\"\n\x1e\x41UTOMATIC_LOCATION_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x41UTOMATIC_LOCATION_RIGHT\x10\x01\x12\x1b\n\x17\x41UTOMATIC_LOCATION_LEFT\x10\x02\x12\x1d\n\x19\x41UTOMATIC_LOCATION_BOTTOM\x10\x03\x12\x1a\n\x16\x41UTOMATIC_LOCATION_TOP\x10\x04\x42\n\n\x08locationB\x14\n\x12tick_specificationB\x08\n\x06_rangeB\n\n\x08_visibleB\r\n\x0b_discretizeB\x0b\n\t_n_colorsB\x0c\n\n_text_sizeB\r\n\x0b_horizontalB\x08\n\x06_widthB\t\n\x07_height\"\xbb\x01\n\x05\x43olor\x12+\n\x01r\x18\x01 \x01(\x01\x42 \x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\x02\x18\x00\x12+\n\x01g\x18\x02 \x01(\x01\x42 \x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\x02\x18\x00\x12+\n\x01\x62\x18\x03 \x01(\x01\x42 \x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\x02\x18\x00\x12+\n\x01\x61\x18\x04 \x01(\x01\x42 \x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\x02\x18\x00\"e\n\x14\x42\x61\x63kgroundProperties\x12?\n\x05\x63olor\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.ColorH\x00\x42\x0c\n\nproperties\";\n\x0fTriadProperties\x12\x1c\n\x07visible\x18\x01 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x01H\x00\x88\x01\x01\x42\n\n\x08_visible\"(\n\x11\x46ilterConnections\x12\x13\n\x0b\x63hildren_id\x18\x01 \x03(\t\">\n\x12\x41xesGridProperties\x12\x1c\n\x07visible\x18\x01 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x00H\x00\x88\x01\x01\x42\n\n\x08_visible\"\x8b\n\n\x0b\x45xtractSpec\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12K\n\x0b\x65ntity_type\x18\x03 \x01(\x0b\x32\x36.luminary.proto.api.v0.luminarycloud.vis.ExtractEntity\x12Y\n\x14\x61xes_grid_properties\x18\x04 \x01(\x0b\x32;.luminary.proto.api.v0.luminarycloud.vis.AxesGridProperties\x12@\n\x07\x66ilters\x18\x05 \x03(\x0b\x32/.luminary.proto.api.v0.luminarycloud.vis.Filter\x12g\n\x12\x66ilter_connections\x18\x06 \x03(\x0b\x32K.luminary.proto.api.v0.luminarycloud.vis.ExtractSpec.FilterConnectionsEntry\x12]\n\x19global_display_attributes\x18\x07 \x01(\x0b\x32:.luminary.proto.api.v0.luminarycloud.vis.DisplayAttributes\x12g\n\x12\x64isplay_attributes\x18\x08 \x03(\x0b\x32K.luminary.proto.api.v0.luminarycloud.vis.ExtractSpec.DisplayAttributesEntry\x12\x45\n\ncolor_maps\x18\t \x03(\x0b\x32\x31.luminary.proto.api.v0.luminarycloud.vis.ColorMap\x12Z\n\x14\x61nimation_properties\x18\n \x01(\x0b\x32<.luminary.proto.api.v0.luminarycloud.vis.AnimationProperties\x12R\n\x10triad_properties\x18\x0b \x01(\x0b\x32\x38.luminary.proto.api.v0.luminarycloud.vis.TriadProperties\x12\x61\n\x15\x62\x61\x63kground_properties\x18\x0c \x01(\x0b\x32=.luminary.proto.api.v0.luminarycloud.vis.BackgroundPropertiesH\x00\x88\x01\x01\x12 \n\x13supersampling_ratio\x18\r \x01(\x05H\x01\x88\x01\x01\x12\x16\n\tdata_only\x18\x0e \x01(\x08H\x02\x88\x01\x01\x1at\n\x16\x46ilterConnectionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12I\n\x05value\x18\x02 \x01(\x0b\x32:.luminary.proto.api.v0.luminarycloud.vis.FilterConnections:\x02\x38\x01\x1at\n\x16\x44isplayAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12I\n\x05value\x18\x02 \x01(\x0b\x32:.luminary.proto.api.v0.luminarycloud.vis.DisplayAttributes:\x02\x38\x01\x42\x18\n\x16_background_propertiesB\x16\n\x14_supersampling_ratioB\x0c\n\n_data_only\"n\n\x14\x43reateExtractRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x42\n\x04spec\x18\x02 \x01(\x0b\x32\x34.luminary.proto.api.v0.luminarycloud.vis.ExtractSpec\"\x9c\x01\n\x07\x45xtract\x12\x12\n\nextract_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x12\n\nproject_id\x18\x04 \x01(\t\x12\x46\n\x06status\x18\x05 \x01(\x0e\x32\x36.luminary.proto.api.v0.luminarycloud.vis.ExtractStatus\"\xd5\x01\n\x03\x42ox\x12\x43\n\x06\x63\x65nter\x18\x01 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12\x44\n\x07lengths\x18\x02 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12\x43\n\x06\x61ngles\x18\x03 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\"\xe9\x01\n\x04\x43lip\x12?\n\x05plane\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.PlaneH\x00\x12;\n\x03\x62ox\x18\x02 \x01(\x0b\x32,.luminary.proto.api.v0.luminarycloud.vis.BoxH\x00\x12\x1d\n\x08inverted\x18\x05 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x00H\x01\x88\x01\x01\x12\x1b\n\x06smooth\x18\x06 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x01H\x02\x88\x01\x01\x42\x0f\n\rclip_functionB\x0b\n\t_invertedB\t\n\x07_smooth\"Z\n\x15\x43reateExtractResponse\x12\x41\n\x07\x65xtract\x18\x01 \x01(\x0b\x32\x30.luminary.proto.api.v0.luminarycloud.vis.Extract\"W\n\x12GetExtractResponse\x12\x41\n\x07\x65xtract\x18\x01 \x01(\x0b\x32\x30.luminary.proto.api.v0.luminarycloud.vis.Extract\"\\\n\x16GetExtractSpecResponse\x12\x42\n\x04spec\x18\x01 \x01(\x0b\x32\x34.luminary.proto.api.v0.luminarycloud.vis.ExtractSpec\";\n\x11GetExtractRequest\x12\x12\n\nextract_id\x18\x01 \x01(\t\x12\x12\n\nproject_id\x18\x02 \x01(\t\"@\n\x16\x44ownloadExtractRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x12\n\nextract_id\x18\x02 \x01(\t\"Y\n\x06Images\x12?\n\x05\x66iles\x18\x01 \x03(\x0b\x32\x30.luminary.proto.api.v0.luminarycloud.common.File\x12\x0e\n\x06labels\x18\x02 \x03(\t\"\x9f\x01\n\x17\x44ownloadExtractResponse\x12?\n\x06images\x18\x01 \x01(\x0b\x32/.luminary.proto.api.v0.luminarycloud.vis.Images\x12\x43\n\tline_data\x18\x02 \x01(\x0b\x32\x30.luminary.proto.api.v0.luminarycloud.common.File\"\x84\x01\n\x13ListExtractsRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x46\n\x06\x65ntity\x18\x02 \x01(\x0b\x32\x36.luminary.proto.api.v0.luminarycloud.vis.ExtractEntity\x12\x11\n\tdata_only\x18\x03 \x01(\x08\"Z\n\x14ListExtractsResponse\x12\x42\n\x08\x65xtracts\x18\x01 \x03(\x0b\x32\x30.luminary.proto.api.v0.luminarycloud.vis.Extract\">\n\x14\x44\x65leteExtractRequest\x12\x12\n\nextract_id\x18\x01 \x01(\t\x12\x12\n\nproject_id\x18\x02 \x01(\t\"\x17\n\x15\x44\x65leteExtractResponse\"\xa4\x03\n\x18GetRenderDataUrlsRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x46\n\x06\x65ntity\x18\x02 \x01(\x0b\x32\x36.luminary.proto.api.v0.luminarycloud.vis.ExtractEntity\x12@\n\x07\x66ilters\x18\x03 \x03(\x0b\x32/.luminary.proto.api.v0.luminarycloud.vis.Filter\x12t\n\x12\x66ilter_connections\x18\x04 \x03(\x0b\x32X.luminary.proto.api.v0.luminarycloud.vis.GetRenderDataUrlsRequest.FilterConnectionsEntry\x1at\n\x16\x46ilterConnectionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12I\n\x05value\x18\x02 \x01(\x0b\x32:.luminary.proto.api.v0.luminarycloud.vis.FilterConnections:\x02\x38\x01\"j\n\x0eRenderDataUrls\x12\x12\n\nfilter_ids\x18\x01 \x03(\t\x12\x44\n\ndata_files\x18\x03 \x03(\x0b\x32\x30.luminary.proto.api.v0.luminarycloud.common.File\"\xa2\x01\n\x19GetRenderDataUrlsResponse\x12\x1c\n\x0fworkspace_state\x18\x01 \x01(\tH\x00\x88\x01\x01\x12J\n\x04urls\x18\x02 \x01(\x0b\x32\x37.luminary.proto.api.v0.luminarycloud.vis.RenderDataUrlsH\x01\x88\x01\x01\x42\x12\n\x10_workspace_stateB\x07\n\x05_urls\"~\n\x19ListSolutionFieldsRequest\x12M\n\nsimulation\x18\x01 \x01(\x0b\x32\x39.luminary.proto.api.v0.luminarycloud.vis.SimulationEntity\x12\x12\n\nproject_id\x18\x02 \x01(\t\"T\n\x17ListSolutionFieldsReply\x12\x39\n\nquantities\x18\x01 \x03(\x0e\x32%.luminary.proto.quantity.QuantityType\"\x9e\x03\n\x0fLineDataExtract\x12R\n\x05lines\x18\x01 \x03(\x0b\x32\x43.luminary.proto.api.v0.luminarycloud.vis.LineDataExtract.LinesEntry\x12T\n\x06labels\x18\x02 \x03(\x0b\x32\x44.luminary.proto.api.v0.luminarycloud.vis.LineDataExtract.LabelsEntry\x1a\x44\n\x05Table\x12;\n\x0blines_table\x18\x01 \x03(\x0b\x32&.luminary.proto.table.RectilinearTable\x1al\n\nLinesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12M\n\x05value\x18\x02 \x01(\x0b\x32>.luminary.proto.api.v0.luminarycloud.vis.LineDataExtract.Table:\x02\x38\x01\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01*\x82\x01\n\x0f\x43\x61meraDirection\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nX_POSITIVE\x10\x01\x12\x0e\n\nY_POSITIVE\x10\x02\x12\x0e\n\nZ_POSITIVE\x10\x03\x12\x0e\n\nX_NEGATIVE\x10\x04\x12\x0e\n\nY_NEGATIVE\x10\x05\x12\x0e\n\nZ_NEGATIVE\x10\x06*5\n\x10\x43\x61meraProjection\x12\x10\n\x0cORTHOGRAPHIC\x10\x00\x12\x0f\n\x0bPERSPECTIVE\x10\x01*P\n\x0eRepresentation\x12\x0b\n\x07SURFACE\x10\x00\x12\x16\n\x12SURFACE_WITH_EDGES\x10\x01\x12\r\n\tWIREFRAME\x10\x02\x12\n\n\x06POINTS\x10\x03*\xa4\x01\n\x14StreamlinesDirection\x12%\n!STREAMLINES_DIRECTION_UNSPECIFIED\x10\x00\x12!\n\x1dSTREAMLINES_DIRECTION_FORWARD\x10\x01\x12\"\n\x1eSTREAMLINES_DIRECTION_BACKWARD\x10\x02\x12\x1e\n\x1aSTREAMLINES_DIRECTION_BOTH\x10\x03*[\n\x11GlyphSamplingMode\x12#\n\x1fGLYPH_SAMPLING_MODE_UNSPECIFIED\x10\x00\x12!\n\x1dGLYPH_SAMPLING_MODE_EVERY_NTH\x10\x01*\xea\x01\n\x0c\x43olorMapName\x12\x1e\n\x1a\x43OLOR_MAP_NAME_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43OLOR_MAP_NAME_VIRIDIS\x10\x01\x12\x1f\n\x1b\x43OLOR_MAP_NAME_COOL_TO_WARM\x10\x02\x12\x18\n\x14\x43OLOR_MAP_NAME_TURBO\x10\x03\x12\x16\n\x12\x43OLOR_MAP_NAME_JET\x10\x04\x12\x17\n\x13\x43OLOR_MAP_NAME_WAVE\x10\x05\x12\x17\n\x13\x43OLOR_MAP_NAME_XRAY\x10\x06\x12\x19\n\x15\x43OLOR_MAP_NAME_PLASMA\x10\x07*C\n\rExtractStatus\x12\x0b\n\x07Invalid\x10\x00\x12\n\n\x06\x41\x63tive\x10\x01\x12\r\n\tCompleted\x10\x02\x12\n\n\x06\x46\x61iled\x10\x03*h\n\x14RenderDataUrlsStatus\x12\x19\n\x15RenderDataUrlsInvalid\x10\x00\x12\x1b\n\x17RenderDataUrlsCompleted\x10\x02\x12\x18\n\x14RenderDataUrlsFailed\x10\x03\x32\xb8\t\n\rVisAPIService\x12\x90\x01\n\rCreateExtract\x12=.luminary.proto.api.v0.luminarycloud.vis.CreateExtractRequest\x1a>.luminary.proto.api.v0.luminarycloud.vis.CreateExtractResponse\"\x00\x12\x87\x01\n\nGetExtract\x12:.luminary.proto.api.v0.luminarycloud.vis.GetExtractRequest\x1a;.luminary.proto.api.v0.luminarycloud.vis.GetExtractResponse\"\x00\x12\x8f\x01\n\x0eGetExtractSpec\x12:.luminary.proto.api.v0.luminarycloud.vis.GetExtractRequest\x1a?.luminary.proto.api.v0.luminarycloud.vis.GetExtractSpecResponse\"\x00\x12\x96\x01\n\x0f\x44ownloadExtract\x12?.luminary.proto.api.v0.luminarycloud.vis.DownloadExtractRequest\x1a@.luminary.proto.api.v0.luminarycloud.vis.DownloadExtractResponse\"\x00\x12\x8d\x01\n\x0cListExtracts\x12<.luminary.proto.api.v0.luminarycloud.vis.ListExtractsRequest\x1a=.luminary.proto.api.v0.luminarycloud.vis.ListExtractsResponse\"\x00\x12\x90\x01\n\rDeleteExtract\x12=.luminary.proto.api.v0.luminarycloud.vis.DeleteExtractRequest\x1a>.luminary.proto.api.v0.luminarycloud.vis.DeleteExtractResponse\"\x00\x12\x9c\x01\n\x11GetRenderDataUrls\x12\x41.luminary.proto.api.v0.luminarycloud.vis.GetRenderDataUrlsRequest\x1a\x42.luminary.proto.api.v0.luminarycloud.vis.GetRenderDataUrlsResponse\"\x00\x12\x9c\x01\n\x12ListSolutionFields\x12\x42.luminary.proto.api.v0.luminarycloud.vis.ListSolutionFieldsRequest\x1a@.luminary.proto.api.v0.luminarycloud.vis.ListSolutionFieldsReply\"\x00\x42\x37Z5luminarycloud.com/core/proto/api/v0/luminarycloud/visb\x06proto3')
23
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(proto/api/v0/luminarycloud/vis/vis.proto\x12\'luminary.proto.api.v0.luminarycloud.vis\x1a\x1cgoogle/api/annotations.proto\x1a\x1bproto/options/options.proto\x1a\x1dproto/quantity/quantity.proto\x1a\x17proto/table/table.proto\x1a.proto/api/v0/luminarycloud/common/common.proto\"=\n\x03Pan\x12\x1a\n\x01x\x18\x01 \x01(\x01\x42\x0f\x82\xb2\x19\x0b\n\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x12\x1a\n\x01y\x18\x02 \x01(\x01\x42\x0f\x82\xb2\x19\x0b\n\t\t\x00\x00\x00\x00\x00\x00\x00\x00\"\xa4\x02\n\x0c\x43\x61meraLookAt\x12\x45\n\x08position\x18\x01 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12\x44\n\x07look_at\x18\x02 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12?\n\x02up\x18\x03 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12>\n\x03pan\x18\x04 \x01(\x0b\x32,.luminary.proto.api.v0.luminarycloud.vis.PanH\x00\x88\x01\x01\x42\x06\n\x04_pan\"}\n\nResolution\x12\x36\n\x05width\x18\x01 \x01(\x05\x42\'\x82\xb2\x19\x03\x30\x80\x0f\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00Y@\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xb0@\x8a\xb2\x19\x02\x18\x00\x12\x37\n\x06height\x18\x02 \x01(\x05\x42\'\x82\xb2\x19\x03\x30\xb8\x08\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00Y@\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xb0@\x8a\xb2\x19\x02\x18\x00\"\xde\x02\n\x06\x43\x61mera\x12U\n\nprojection\x18\x01 \x01(\x0e\x32\x39.luminary.proto.api.v0.luminarycloud.vis.CameraProjectionB\x06\x82\xb2\x19\x02 \x02\x12U\n\tdirection\x18\x02 \x01(\x0e\x32\x38.luminary.proto.api.v0.luminarycloud.vis.CameraDirectionB\x06\x82\xb2\x19\x02 \x03H\x00\x12H\n\x07look_at\x18\x03 \x01(\x0b\x32\x35.luminary.proto.api.v0.luminarycloud.vis.CameraLookAtH\x00\x12\x42\n\x04zoom\x18\x04 \x01(\x01\x42/\x82\xb2\x19\x0b\n\t\t\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\x02\x18\x00H\x01\x88\x01\x01\x42\x0f\n\rspecificationB\x07\n\x05_zoom\"\xb2\x01\n\x17\x41nimationSettingsStatic\x12?\n\x06\x63\x61mera\x18\x01 \x01(\x0b\x32/.luminary.proto.api.v0.luminarycloud.vis.Camera\x12G\n\nresolution\x18\x02 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.vis.Resolution\x12\r\n\x05label\x18\x03 \x01(\t\"\xee\x02\n\x19\x41nimationSettingsTimeStep\x12?\n\x06\x63\x61mera\x18\x01 \x01(\x0b\x32/.luminary.proto.api.v0.luminarycloud.vis.Camera\x12G\n\nresolution\x18\x04 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.vis.Resolution\x12\x61\n\x06\x66ormat\x18\x05 \x01(\x0e\x32I.luminary.proto.api.v0.luminarycloud.vis.AnimationSettingsTimeStep.FormatB\x06\x82\xb2\x19\x02 \x02\x12\x13\n\x0bskip_frames\x18\x06 \x01(\x05\x12\r\n\x05label\x18\x07 \x01(\t\"@\n\x06\x46ormat\x12\x16\n\x12\x46ORMAT_UNSPECIFIED\x10\x00\x12\x0e\n\nFORMAT_GIF\x10\x01\x12\x0e\n\nFORMAT_MP4\x10\x02\"a\n\x0eStaticSettings\x12O\n\x05items\x18\x01 \x03(\x0b\x32@.luminary.proto.api.v0.luminarycloud.vis.AnimationSettingsStatic\"e\n\x10TimeStepSettings\x12Q\n\x05items\x18\x01 \x03(\x0b\x32\x42.luminary.proto.api.v0.luminarycloud.vis.AnimationSettingsTimeStep\"\xbe\x01\n\x13\x41nimationProperties\x12J\n\x07statics\x18\x01 \x01(\x0b\x32\x37.luminary.proto.api.v0.luminarycloud.vis.StaticSettingsH\x00\x12O\n\ntime_steps\x18\x02 \x01(\x0b\x32\x39.luminary.proto.api.v0.luminarycloud.vis.TimeStepSettingsH\x00\x42\n\n\x08settings\"\x8e\x02\n\x05\x46ield\x12;\n\x0cquantity_typ\x18\x01 \x01(\x0e\x32%.luminary.proto.quantity.QuantityType\x12K\n\tcomponent\x18\x02 \x01(\x0e\x32\x38.luminary.proto.api.v0.luminarycloud.vis.Field.Component\"{\n\tComponent\x12\x19\n\x15\x43OMPONENT_UNSPECIFIED\x10\x00\x12\x0f\n\x0b\x43OMPONENT_X\x10\x01\x12\x0f\n\x0b\x43OMPONENT_Y\x10\x02\x12\x0f\n\x0b\x43OMPONENT_Z\x10\x03\x12 \n\x13\x43OMPONENT_MAGNITUDE\x10\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\"\xe7\x01\n\x11\x44isplayAttributes\x12=\n\x05\x66ield\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Field\x12\x14\n\x07visible\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12O\n\x0erepresentation\x18\x03 \x01(\x0e\x32\x37.luminary.proto.api.v0.luminarycloud.vis.Representation\x12\x14\n\x07opacity\x18\x04 \x01(\x01H\x01\x88\x01\x01\x42\n\n\x08_visibleB\n\n\x08_opacity\"\x91\x01\n\x05Plane\x12\x43\n\x06origin\x18\x01 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12\x43\n\x06normal\x18\x02 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\"\x8a\x01\n\x04\x41\x41\x42\x42\x12@\n\x03min\x18\x01 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12@\n\x03max\x18\x02 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\"_\n\x05Slice\x12=\n\x05plane\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Plane\x12\x17\n\x0fproject_vectors\x18\x02 \x01(\x08\"\\\n\x07\x43ontour\x12=\n\x05\x66ield\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Field\x12\x12\n\niso_values\x18\x02 \x03(\x01\"\x81\x02\n\tThreshold\x12=\n\x05\x66ield\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Field\x12=\n\x05range\x18\x02 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Range\x12\x1b\n\x06smooth\x18\x03 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x01H\x00\x88\x01\x01\x12\x1b\n\x06invert\x18\x04 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x00H\x01\x88\x01\x01\x12\x1b\n\x06strict\x18\x05 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x00H\x02\x88\x01\x01\x42\t\n\x07_smoothB\t\n\x07_invertB\t\n\x07_strict\"\x96\x01\n\x0eSeedRakeConfig\x12\x42\n\x05start\x18\x01 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12@\n\x03\x65nd\x18\x02 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\"\xed\x01\n\x11SeedSurfaceConfig\x12$\n\x06offset\x18\x01 \x01(\x01\x42\x0f\x82\xb2\x19\x0b\n\t\t\x00\x00\x00\x00\x00\x00\x00\x00H\x00\x88\x01\x01\x12\'\n\x12project_on_surface\x18\x02 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x00H\x01\x88\x01\x01\x12@\n\x0bsample_rate\x18\x03 \x01(\x05\x42&\x82\xb2\x19\x02\x30\n\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00@\x8f@\x8a\xb2\x19\x02\x18\x00H\x02\x88\x01\x01\x12\x15\n\rsurface_names\x18\x04 \x03(\tB\t\n\x07_offsetB\x15\n\x13_project_on_surfaceB\x0e\n\x0c_sample_rate\"\xcd\x03\n\x0eSeedGridConfig\x12=\n\x08rake_res\x18\x01 \x01(\x05\x42&\x82\xb2\x19\x02\x30\x02\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00@\x8f@\x8a\xb2\x19\x02\x18\x00H\x00\x88\x01\x01\x12=\n\x08seed_res\x18\x02 \x01(\x05\x42&\x82\xb2\x19\x02\x30\n\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00@\x8f@\x8a\xb2\x19\x02\x18\x00H\x01\x88\x01\x01\x12\x19\n\x0cseed_spacing\x18\x03 \x01(\x01H\x02\x88\x01\x01\x12\x19\n\x0crake_spacing\x18\x04 \x01(\x01H\x03\x88\x01\x01\x12\x43\n\x06\x63\x65nter\x18\x05 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12\x42\n\x05u_vec\x18\x06 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12\x42\n\x05v_vec\x18\x07 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3B\x0b\n\t_rake_resB\x0b\n\t_seed_resB\x0f\n\r_seed_spacingB\x0f\n\r_rake_spacing\"\x92\x04\n\x0bStreamlines\x12G\n\x04rake\x18\x01 \x01(\x0b\x32\x37.luminary.proto.api.v0.luminarycloud.vis.SeedRakeConfigH\x00\x12M\n\x07surface\x18\x02 \x01(\x0b\x32:.luminary.proto.api.v0.luminarycloud.vis.SeedSurfaceConfigH\x00\x12G\n\x04grid\x18\x03 \x01(\x0b\x32\x37.luminary.proto.api.v0.luminarycloud.vis.SeedGridConfigH\x00\x12\x42\n\rn_streamlines\x18\x04 \x01(\x05\x42&\x82\xb2\x19\x02\x30\x64\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00@\x8f@\x8a\xb2\x19\x02\x18\x00H\x01\x88\x01\x01\x12\x17\n\nmax_length\x18\x05 \x01(\x01H\x02\x88\x01\x01\x12X\n\tdirection\x18\x06 \x01(\x0e\x32=.luminary.proto.api.v0.luminarycloud.vis.StreamlinesDirectionB\x06\x82\xb2\x19\x02 \x01\x12=\n\x05\x66ield\x18\x07 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.FieldB\x0b\n\tseed_typeB\x10\n\x0e_n_streamlinesB\r\n\x0b_max_length\"\xb4\x02\n\x05Glyph\x12=\n\x05\x66ield\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Field\x12=\n\x08n_glyphs\x18\x02 \x01(\x05\x42&\x82\xb2\x19\x02\x30\x64\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00@\x8f@\x8a\xb2\x19\x02\x18\x00H\x01\x88\x01\x01\x12Y\n\rsampling_mode\x18\x03 \x01(\x0e\x32:.luminary.proto.api.v0.luminarycloud.vis.GlyphSamplingModeB\x06\x82\xb2\x19\x02 \x01\x12\x1b\n\x11\x66ixed_size_glyphs\x18\x04 \x01(\x01H\x00\x12\x1a\n\x10glyph_scale_size\x18\x05 \x01(\x01H\x00\x42\x0c\n\nglyph_sizeB\x0b\n\t_n_glyphs\"+\n\x12SurfaceLICGeomtery\x12\x15\n\rsurface_names\x18\x01 \x03(\t\"\x91\x01\n\x0fSurfaceLICPlane\x12=\n\x05plane\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Plane\x12?\n\x08\x63lip_box\x18\x02 \x01(\x0b\x32-.luminary.proto.api.v0.luminarycloud.vis.AABB\"\xb6\x02\n\nSurfaceLIC\x12=\n\x05\x66ield\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Field\x12O\n\x08geometry\x18\x02 \x01(\x0b\x32;.luminary.proto.api.v0.luminarycloud.vis.SurfaceLICGeomteryH\x00\x12I\n\x05plane\x18\x03 \x01(\x0b\x32\x38.luminary.proto.api.v0.luminarycloud.vis.SurfaceLICPlaneH\x00\x12\x41\n\x08\x63ontrast\x18\x04 \x01(\x01\x42/\x82\xb2\x19\x0b\n\t\t\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\t\t\x9a\x99\x99\x99\x99\x99\xc9?\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\x08@\x8a\xb2\x19\x02\x18\x00\x42\n\n\x08lic_type\"s\n\x11IntersectionCurve\x12=\n\x05plane\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Plane\x12\x10\n\x08surfaces\x18\x02 \x03(\t\x12\r\n\x05label\x18\x03 \x01(\t\"\x1a\n\x18LineSampleMeshResolution\"\x8e\x02\n\nLineSample\x12\x42\n\x05start\x18\x01 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12@\n\x03\x65nd\x18\x02 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12\r\n\x05label\x18\x03 \x01(\t\x12\\\n\x0fmesh_resolution\x18\x04 \x01(\x0b\x32\x41.luminary.proto.api.v0.luminarycloud.vis.LineSampleMeshResolutionH\x00\x42\r\n\x0bsample_type\"\xb9\x05\n\x06\x46ilter\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12?\n\x05slice\x18\x03 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.SliceH\x00\x12=\n\x04\x63lip\x18\x04 \x01(\x0b\x32-.luminary.proto.api.v0.luminarycloud.vis.ClipH\x00\x12\x43\n\x07\x63ontour\x18\x05 \x01(\x0b\x32\x30.luminary.proto.api.v0.luminarycloud.vis.ContourH\x00\x12G\n\tthreshold\x18\x07 \x01(\x0b\x32\x32.luminary.proto.api.v0.luminarycloud.vis.ThresholdH\x00\x12K\n\x0bstreamlines\x18\x08 \x01(\x0b\x32\x34.luminary.proto.api.v0.luminarycloud.vis.StreamlinesH\x00\x12?\n\x05glyph\x18\t \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.GlyphH\x00\x12J\n\x0bsurface_lic\x18\n \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.vis.SurfaceLICH\x00\x12X\n\x12intersection_curve\x18\x0b \x01(\x0b\x32:.luminary.proto.api.v0.luminarycloud.vis.IntersectionCurveH\x00\x12J\n\x0bline_sample\x18\x0c \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.vis.LineSampleH\x00\x42\x07\n\x05value\"\x18\n\nMeshEntity\x12\n\n\x02id\x18\x01 \x01(\t\"3\n\x10SimulationEntity\x12\n\n\x02id\x18\x01 \x01(\t\x12\x13\n\x0bsolution_id\x18\x02 \x01(\t\"9\n\x0eGeometryEntity\x12\n\n\x02id\x18\x01 \x01(\t\x12\x1b\n\x13geometry_version_id\x18\x02 \x01(\t\"\xfc\x01\n\rExtractEntity\x12\x43\n\x04mesh\x18\x01 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.vis.MeshEntityH\x00\x12O\n\nsimulation\x18\x02 \x01(\x0b\x32\x39.luminary.proto.api.v0.luminarycloud.vis.SimulationEntityH\x00\x12K\n\x08geometry\x18\x03 \x01(\x0b\x32\x37.luminary.proto.api.v0.luminarycloud.vis.GeometryEntityH\x00\x42\x08\n\x06\x65ntity\"!\n\x05Range\x12\x0b\n\x03min\x18\x01 \x01(\x01\x12\x0b\n\x03max\x18\x02 \x01(\x01\"\xc4\x0b\n\x08\x43olorMap\x12=\n\x05\x66ield\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.Field\x12K\n\x04name\x18\x02 \x01(\x0e\x32\x35.luminary.proto.api.v0.luminarycloud.vis.ColorMapNameB\x06\x82\xb2\x19\x02 \x03\x12\x42\n\x05range\x18\x03 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.RangeH\x02\x88\x01\x01\x12\x1c\n\x07visible\x18\x04 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x01H\x03\x88\x01\x01\x12\x1f\n\ndiscretize\x18\x05 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x00H\x04\x88\x01\x01\x12=\n\x08n_colors\x18\x06 \x01(\x05\x42&\x82\xb2\x19\x02\x30\x08\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00@\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00p@\x8a\xb2\x19\x02\x18\x00H\x05\x88\x01\x01\x12i\n\x12\x61utomatic_location\x18\x07 \x01(\x0e\x32\x43.luminary.proto.api.v0.luminarycloud.vis.ColorMap.AutomaticLocationB\x06\x82\xb2\x19\x02 \x01H\x00\x12\x66\n\x1alower_left_anchor_location\x18\x08 \x01(\x0b\x32@.luminary.proto.api.v0.luminarycloud.vis.ColorMap.AnchorLocationH\x00\x12U\n\x0e\x61utomatic_tick\x18\n \x01(\x0b\x32;.luminary.proto.api.v0.luminarycloud.vis.ColorMap.AutomaticH\x01\x12Y\n\x11min_max_only_tick\x18\x0b \x01(\x0b\x32<.luminary.proto.api.v0.luminarycloud.vis.ColorMap.MinMaxOnlyH\x01\x12G\n\ttext_size\x18\x11 \x01(\x01\x42/\x82\xb2\x19\x0b\n\t\t\x00\x00\x00\x00\x00\x00\x42@\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00Y@\x8a\xb2\x19\x02\x18\x00H\x06\x88\x01\x01\x12\x1f\n\nhorizontal\x18\x12 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x00H\x07\x88\x01\x01\x12\x43\n\x05width\x18\x13 \x01(\x01\x42/\x82\xb2\x19\x0b\n\t\t\xfc\xa9\xf1\xd2Mb\x80?\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\x02\x18\x00H\x08\x88\x01\x01\x12\x44\n\x06height\x18\x14 \x01(\x01\x42/\x82\xb2\x19\x0b\n\t\t\xbaI\x0c\x02+\x87\x96?\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\x02\x18\x00H\t\x88\x01\x01\x1a\x9e\x01\n\x0e\x41nchorLocation\x12?\n\x01x\x18\x01 \x01(\x01\x42/\x82\xb2\x19\x0b\n\t\tq=\n\xd7\xa3p\xed?\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\x02\x18\x00H\x00\x88\x01\x01\x12?\n\x01y\x18\x02 \x01(\x01\x42/\x82\xb2\x19\x0b\n\t\t\xe1z\x14\xaeG\xe1\xda?\x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\x02\x18\x00H\x01\x88\x01\x01\x42\x04\n\x02_xB\x04\n\x02_y\x1a\x0b\n\tAutomatic\x1a\x0c\n\nMinMaxOnly\"\xad\x01\n\x11\x41utomaticLocation\x12\"\n\x1e\x41UTOMATIC_LOCATION_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x41UTOMATIC_LOCATION_RIGHT\x10\x01\x12\x1b\n\x17\x41UTOMATIC_LOCATION_LEFT\x10\x02\x12\x1d\n\x19\x41UTOMATIC_LOCATION_BOTTOM\x10\x03\x12\x1a\n\x16\x41UTOMATIC_LOCATION_TOP\x10\x04\x42\n\n\x08locationB\x14\n\x12tick_specificationB\x08\n\x06_rangeB\n\n\x08_visibleB\r\n\x0b_discretizeB\x0b\n\t_n_colorsB\x0c\n\n_text_sizeB\r\n\x0b_horizontalB\x08\n\x06_widthB\t\n\x07_height\"\xbb\x01\n\x05\x43olor\x12+\n\x01r\x18\x01 \x01(\x01\x42 \x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\x02\x18\x00\x12+\n\x01g\x18\x02 \x01(\x01\x42 \x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\x02\x18\x00\x12+\n\x01\x62\x18\x03 \x01(\x01\x42 \x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\x02\x18\x00\x12+\n\x01\x61\x18\x04 \x01(\x01\x42 \x8a\xb2\x19\t\t\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xb2\x19\t\x11\x00\x00\x00\x00\x00\x00\xf0?\x8a\xb2\x19\x02\x18\x00\"e\n\x14\x42\x61\x63kgroundProperties\x12?\n\x05\x63olor\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.ColorH\x00\x42\x0c\n\nproperties\";\n\x0fTriadProperties\x12\x1c\n\x07visible\x18\x01 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x01H\x00\x88\x01\x01\x42\n\n\x08_visible\"(\n\x11\x46ilterConnections\x12\x13\n\x0b\x63hildren_id\x18\x01 \x03(\t\">\n\x12\x41xesGridProperties\x12\x1c\n\x07visible\x18\x01 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x00H\x00\x88\x01\x01\x42\n\n\x08_visible\"\x8b\n\n\x0b\x45xtractSpec\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12K\n\x0b\x65ntity_type\x18\x03 \x01(\x0b\x32\x36.luminary.proto.api.v0.luminarycloud.vis.ExtractEntity\x12Y\n\x14\x61xes_grid_properties\x18\x04 \x01(\x0b\x32;.luminary.proto.api.v0.luminarycloud.vis.AxesGridProperties\x12@\n\x07\x66ilters\x18\x05 \x03(\x0b\x32/.luminary.proto.api.v0.luminarycloud.vis.Filter\x12g\n\x12\x66ilter_connections\x18\x06 \x03(\x0b\x32K.luminary.proto.api.v0.luminarycloud.vis.ExtractSpec.FilterConnectionsEntry\x12]\n\x19global_display_attributes\x18\x07 \x01(\x0b\x32:.luminary.proto.api.v0.luminarycloud.vis.DisplayAttributes\x12g\n\x12\x64isplay_attributes\x18\x08 \x03(\x0b\x32K.luminary.proto.api.v0.luminarycloud.vis.ExtractSpec.DisplayAttributesEntry\x12\x45\n\ncolor_maps\x18\t \x03(\x0b\x32\x31.luminary.proto.api.v0.luminarycloud.vis.ColorMap\x12Z\n\x14\x61nimation_properties\x18\n \x01(\x0b\x32<.luminary.proto.api.v0.luminarycloud.vis.AnimationProperties\x12R\n\x10triad_properties\x18\x0b \x01(\x0b\x32\x38.luminary.proto.api.v0.luminarycloud.vis.TriadProperties\x12\x61\n\x15\x62\x61\x63kground_properties\x18\x0c \x01(\x0b\x32=.luminary.proto.api.v0.luminarycloud.vis.BackgroundPropertiesH\x00\x88\x01\x01\x12 \n\x13supersampling_ratio\x18\r \x01(\x05H\x01\x88\x01\x01\x12\x16\n\tdata_only\x18\x0e \x01(\x08H\x02\x88\x01\x01\x1at\n\x16\x46ilterConnectionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12I\n\x05value\x18\x02 \x01(\x0b\x32:.luminary.proto.api.v0.luminarycloud.vis.FilterConnections:\x02\x38\x01\x1at\n\x16\x44isplayAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12I\n\x05value\x18\x02 \x01(\x0b\x32:.luminary.proto.api.v0.luminarycloud.vis.DisplayAttributes:\x02\x38\x01\x42\x18\n\x16_background_propertiesB\x16\n\x14_supersampling_ratioB\x0c\n\n_data_only\"n\n\x14\x43reateExtractRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x42\n\x04spec\x18\x02 \x01(\x0b\x32\x34.luminary.proto.api.v0.luminarycloud.vis.ExtractSpec\"\x9c\x01\n\x07\x45xtract\x12\x12\n\nextract_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x12\n\nproject_id\x18\x04 \x01(\t\x12\x46\n\x06status\x18\x05 \x01(\x0e\x32\x36.luminary.proto.api.v0.luminarycloud.vis.ExtractStatus\"\xd5\x01\n\x03\x42ox\x12\x43\n\x06\x63\x65nter\x18\x01 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12\x44\n\x07lengths\x18\x02 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\x12\x43\n\x06\x61ngles\x18\x03 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.common.Vector3\"\xe9\x01\n\x04\x43lip\x12?\n\x05plane\x18\x01 \x01(\x0b\x32..luminary.proto.api.v0.luminarycloud.vis.PlaneH\x00\x12;\n\x03\x62ox\x18\x02 \x01(\x0b\x32,.luminary.proto.api.v0.luminarycloud.vis.BoxH\x00\x12\x1d\n\x08inverted\x18\x05 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x00H\x01\x88\x01\x01\x12\x1b\n\x06smooth\x18\x06 \x01(\x08\x42\x06\x82\xb2\x19\x02(\x01H\x02\x88\x01\x01\x42\x0f\n\rclip_functionB\x0b\n\t_invertedB\t\n\x07_smooth\"Z\n\x15\x43reateExtractResponse\x12\x41\n\x07\x65xtract\x18\x01 \x01(\x0b\x32\x30.luminary.proto.api.v0.luminarycloud.vis.Extract\"W\n\x12GetExtractResponse\x12\x41\n\x07\x65xtract\x18\x01 \x01(\x0b\x32\x30.luminary.proto.api.v0.luminarycloud.vis.Extract\"\\\n\x16GetExtractSpecResponse\x12\x42\n\x04spec\x18\x01 \x01(\x0b\x32\x34.luminary.proto.api.v0.luminarycloud.vis.ExtractSpec\";\n\x11GetExtractRequest\x12\x12\n\nextract_id\x18\x01 \x01(\t\x12\x12\n\nproject_id\x18\x02 \x01(\t\"@\n\x16\x44ownloadExtractRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x12\n\nextract_id\x18\x02 \x01(\t\"Y\n\x06Images\x12?\n\x05\x66iles\x18\x01 \x03(\x0b\x32\x30.luminary.proto.api.v0.luminarycloud.common.File\x12\x0e\n\x06labels\x18\x02 \x03(\t\"\x9f\x01\n\x17\x44ownloadExtractResponse\x12?\n\x06images\x18\x01 \x01(\x0b\x32/.luminary.proto.api.v0.luminarycloud.vis.Images\x12\x43\n\tline_data\x18\x02 \x01(\x0b\x32\x30.luminary.proto.api.v0.luminarycloud.common.File\"\x84\x01\n\x13ListExtractsRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x46\n\x06\x65ntity\x18\x02 \x01(\x0b\x32\x36.luminary.proto.api.v0.luminarycloud.vis.ExtractEntity\x12\x11\n\tdata_only\x18\x03 \x01(\x08\"Z\n\x14ListExtractsResponse\x12\x42\n\x08\x65xtracts\x18\x01 \x03(\x0b\x32\x30.luminary.proto.api.v0.luminarycloud.vis.Extract\">\n\x14\x44\x65leteExtractRequest\x12\x12\n\nextract_id\x18\x01 \x01(\t\x12\x12\n\nproject_id\x18\x02 \x01(\t\"\x17\n\x15\x44\x65leteExtractResponse\"\xa4\x03\n\x18GetRenderDataUrlsRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x46\n\x06\x65ntity\x18\x02 \x01(\x0b\x32\x36.luminary.proto.api.v0.luminarycloud.vis.ExtractEntity\x12@\n\x07\x66ilters\x18\x03 \x03(\x0b\x32/.luminary.proto.api.v0.luminarycloud.vis.Filter\x12t\n\x12\x66ilter_connections\x18\x04 \x03(\x0b\x32X.luminary.proto.api.v0.luminarycloud.vis.GetRenderDataUrlsRequest.FilterConnectionsEntry\x1at\n\x16\x46ilterConnectionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12I\n\x05value\x18\x02 \x01(\x0b\x32:.luminary.proto.api.v0.luminarycloud.vis.FilterConnections:\x02\x38\x01\"j\n\x0eRenderDataUrls\x12\x12\n\nfilter_ids\x18\x01 \x03(\t\x12\x44\n\ndata_files\x18\x03 \x03(\x0b\x32\x30.luminary.proto.api.v0.luminarycloud.common.File\"\xa2\x01\n\x19GetRenderDataUrlsResponse\x12\x1c\n\x0fworkspace_state\x18\x01 \x01(\tH\x00\x88\x01\x01\x12J\n\x04urls\x18\x02 \x01(\x0b\x32\x37.luminary.proto.api.v0.luminarycloud.vis.RenderDataUrlsH\x01\x88\x01\x01\x42\x12\n\x10_workspace_stateB\x07\n\x05_urls\"~\n\x19ListSolutionFieldsRequest\x12M\n\nsimulation\x18\x01 \x01(\x0b\x32\x39.luminary.proto.api.v0.luminarycloud.vis.SimulationEntity\x12\x12\n\nproject_id\x18\x02 \x01(\t\"T\n\x17ListSolutionFieldsReply\x12\x39\n\nquantities\x18\x01 \x03(\x0e\x32%.luminary.proto.quantity.QuantityType\".\n\x0b\x43\x61meraEntry\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tcamera_id\x18\x02 \x01(\x03\"(\n\x12ListCamerasRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\"X\n\x10ListCamerasReply\x12\x44\n\x06\x63\x61mera\x18\x01 \x03(\x0b\x32\x34.luminary.proto.api.v0.luminarycloud.vis.CameraEntry\"n\n\x10GetCameraRequest\x12\x11\n\tcamera_id\x18\x01 \x01(\x03\x12G\n\nresolution\x18\x02 \x01(\x0b\x32\x33.luminary.proto.api.v0.luminarycloud.vis.Resolution\"Q\n\x0eGetCameraReply\x12?\n\x06\x63\x61mera\x18\x01 \x01(\x0b\x32/.luminary.proto.api.v0.luminarycloud.vis.Camera\"\x9e\x03\n\x0fLineDataExtract\x12R\n\x05lines\x18\x01 \x03(\x0b\x32\x43.luminary.proto.api.v0.luminarycloud.vis.LineDataExtract.LinesEntry\x12T\n\x06labels\x18\x02 \x03(\x0b\x32\x44.luminary.proto.api.v0.luminarycloud.vis.LineDataExtract.LabelsEntry\x1a\x44\n\x05Table\x12;\n\x0blines_table\x18\x01 \x03(\x0b\x32&.luminary.proto.table.RectilinearTable\x1al\n\nLinesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12M\n\x05value\x18\x02 \x01(\x0b\x32>.luminary.proto.api.v0.luminarycloud.vis.LineDataExtract.Table:\x02\x38\x01\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01*\x82\x01\n\x0f\x43\x61meraDirection\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x0e\n\nX_POSITIVE\x10\x01\x12\x0e\n\nY_POSITIVE\x10\x02\x12\x0e\n\nZ_POSITIVE\x10\x03\x12\x0e\n\nX_NEGATIVE\x10\x04\x12\x0e\n\nY_NEGATIVE\x10\x05\x12\x0e\n\nZ_NEGATIVE\x10\x06*5\n\x10\x43\x61meraProjection\x12\x10\n\x0cORTHOGRAPHIC\x10\x00\x12\x0f\n\x0bPERSPECTIVE\x10\x01*P\n\x0eRepresentation\x12\x0b\n\x07SURFACE\x10\x00\x12\x16\n\x12SURFACE_WITH_EDGES\x10\x01\x12\r\n\tWIREFRAME\x10\x02\x12\n\n\x06POINTS\x10\x03*\xa4\x01\n\x14StreamlinesDirection\x12%\n!STREAMLINES_DIRECTION_UNSPECIFIED\x10\x00\x12!\n\x1dSTREAMLINES_DIRECTION_FORWARD\x10\x01\x12\"\n\x1eSTREAMLINES_DIRECTION_BACKWARD\x10\x02\x12\x1e\n\x1aSTREAMLINES_DIRECTION_BOTH\x10\x03*[\n\x11GlyphSamplingMode\x12#\n\x1fGLYPH_SAMPLING_MODE_UNSPECIFIED\x10\x00\x12!\n\x1dGLYPH_SAMPLING_MODE_EVERY_NTH\x10\x01*\xea\x01\n\x0c\x43olorMapName\x12\x1e\n\x1a\x43OLOR_MAP_NAME_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43OLOR_MAP_NAME_VIRIDIS\x10\x01\x12\x1f\n\x1b\x43OLOR_MAP_NAME_COOL_TO_WARM\x10\x02\x12\x18\n\x14\x43OLOR_MAP_NAME_TURBO\x10\x03\x12\x16\n\x12\x43OLOR_MAP_NAME_JET\x10\x04\x12\x17\n\x13\x43OLOR_MAP_NAME_WAVE\x10\x05\x12\x17\n\x13\x43OLOR_MAP_NAME_XRAY\x10\x06\x12\x19\n\x15\x43OLOR_MAP_NAME_PLASMA\x10\x07*C\n\rExtractStatus\x12\x0b\n\x07Invalid\x10\x00\x12\n\n\x06\x41\x63tive\x10\x01\x12\r\n\tCompleted\x10\x02\x12\n\n\x06\x46\x61iled\x10\x03*h\n\x14RenderDataUrlsStatus\x12\x19\n\x15RenderDataUrlsInvalid\x10\x00\x12\x1b\n\x17RenderDataUrlsCompleted\x10\x02\x12\x18\n\x14RenderDataUrlsFailed\x10\x03\x32\xc6\x0b\n\rVisAPIService\x12\x90\x01\n\rCreateExtract\x12=.luminary.proto.api.v0.luminarycloud.vis.CreateExtractRequest\x1a>.luminary.proto.api.v0.luminarycloud.vis.CreateExtractResponse\"\x00\x12\x87\x01\n\nGetExtract\x12:.luminary.proto.api.v0.luminarycloud.vis.GetExtractRequest\x1a;.luminary.proto.api.v0.luminarycloud.vis.GetExtractResponse\"\x00\x12\x8f\x01\n\x0eGetExtractSpec\x12:.luminary.proto.api.v0.luminarycloud.vis.GetExtractRequest\x1a?.luminary.proto.api.v0.luminarycloud.vis.GetExtractSpecResponse\"\x00\x12\x96\x01\n\x0f\x44ownloadExtract\x12?.luminary.proto.api.v0.luminarycloud.vis.DownloadExtractRequest\x1a@.luminary.proto.api.v0.luminarycloud.vis.DownloadExtractResponse\"\x00\x12\x8d\x01\n\x0cListExtracts\x12<.luminary.proto.api.v0.luminarycloud.vis.ListExtractsRequest\x1a=.luminary.proto.api.v0.luminarycloud.vis.ListExtractsResponse\"\x00\x12\x90\x01\n\rDeleteExtract\x12=.luminary.proto.api.v0.luminarycloud.vis.DeleteExtractRequest\x1a>.luminary.proto.api.v0.luminarycloud.vis.DeleteExtractResponse\"\x00\x12\x9c\x01\n\x11GetRenderDataUrls\x12\x41.luminary.proto.api.v0.luminarycloud.vis.GetRenderDataUrlsRequest\x1a\x42.luminary.proto.api.v0.luminarycloud.vis.GetRenderDataUrlsResponse\"\x00\x12\x9c\x01\n\x12ListSolutionFields\x12\x42.luminary.proto.api.v0.luminarycloud.vis.ListSolutionFieldsRequest\x1a@.luminary.proto.api.v0.luminarycloud.vis.ListSolutionFieldsReply\"\x00\x12\x87\x01\n\x0bListCameras\x12;.luminary.proto.api.v0.luminarycloud.vis.ListCamerasRequest\x1a\x39.luminary.proto.api.v0.luminarycloud.vis.ListCamerasReply\"\x00\x12\x81\x01\n\tGetCamera\x12\x39.luminary.proto.api.v0.luminarycloud.vis.GetCameraRequest\x1a\x37.luminary.proto.api.v0.luminarycloud.vis.GetCameraReply\"\x00\x42\x37Z5luminarycloud.com/core/proto/api/v0/luminarycloud/visb\x06proto3')
24
24
 
25
25
  _CAMERADIRECTION = DESCRIPTOR.enum_types_by_name['CameraDirection']
26
26
  CameraDirection = enum_type_wrapper.EnumTypeWrapper(_CAMERADIRECTION)
@@ -140,6 +140,11 @@ _RENDERDATAURLS = DESCRIPTOR.message_types_by_name['RenderDataUrls']
140
140
  _GETRENDERDATAURLSRESPONSE = DESCRIPTOR.message_types_by_name['GetRenderDataUrlsResponse']
141
141
  _LISTSOLUTIONFIELDSREQUEST = DESCRIPTOR.message_types_by_name['ListSolutionFieldsRequest']
142
142
  _LISTSOLUTIONFIELDSREPLY = DESCRIPTOR.message_types_by_name['ListSolutionFieldsReply']
143
+ _CAMERAENTRY = DESCRIPTOR.message_types_by_name['CameraEntry']
144
+ _LISTCAMERASREQUEST = DESCRIPTOR.message_types_by_name['ListCamerasRequest']
145
+ _LISTCAMERASREPLY = DESCRIPTOR.message_types_by_name['ListCamerasReply']
146
+ _GETCAMERAREQUEST = DESCRIPTOR.message_types_by_name['GetCameraRequest']
147
+ _GETCAMERAREPLY = DESCRIPTOR.message_types_by_name['GetCameraReply']
143
148
  _LINEDATAEXTRACT = DESCRIPTOR.message_types_by_name['LineDataExtract']
144
149
  _LINEDATAEXTRACT_TABLE = _LINEDATAEXTRACT.nested_types_by_name['Table']
145
150
  _LINEDATAEXTRACT_LINESENTRY = _LINEDATAEXTRACT.nested_types_by_name['LinesEntry']
@@ -615,6 +620,41 @@ ListSolutionFieldsReply = _reflection.GeneratedProtocolMessageType('ListSolution
615
620
  })
616
621
  _sym_db.RegisterMessage(ListSolutionFieldsReply)
617
622
 
623
+ CameraEntry = _reflection.GeneratedProtocolMessageType('CameraEntry', (_message.Message,), {
624
+ 'DESCRIPTOR' : _CAMERAENTRY,
625
+ '__module__' : 'proto.api.v0.luminarycloud.vis.vis_pb2'
626
+ # @@protoc_insertion_point(class_scope:luminary.proto.api.v0.luminarycloud.vis.CameraEntry)
627
+ })
628
+ _sym_db.RegisterMessage(CameraEntry)
629
+
630
+ ListCamerasRequest = _reflection.GeneratedProtocolMessageType('ListCamerasRequest', (_message.Message,), {
631
+ 'DESCRIPTOR' : _LISTCAMERASREQUEST,
632
+ '__module__' : 'proto.api.v0.luminarycloud.vis.vis_pb2'
633
+ # @@protoc_insertion_point(class_scope:luminary.proto.api.v0.luminarycloud.vis.ListCamerasRequest)
634
+ })
635
+ _sym_db.RegisterMessage(ListCamerasRequest)
636
+
637
+ ListCamerasReply = _reflection.GeneratedProtocolMessageType('ListCamerasReply', (_message.Message,), {
638
+ 'DESCRIPTOR' : _LISTCAMERASREPLY,
639
+ '__module__' : 'proto.api.v0.luminarycloud.vis.vis_pb2'
640
+ # @@protoc_insertion_point(class_scope:luminary.proto.api.v0.luminarycloud.vis.ListCamerasReply)
641
+ })
642
+ _sym_db.RegisterMessage(ListCamerasReply)
643
+
644
+ GetCameraRequest = _reflection.GeneratedProtocolMessageType('GetCameraRequest', (_message.Message,), {
645
+ 'DESCRIPTOR' : _GETCAMERAREQUEST,
646
+ '__module__' : 'proto.api.v0.luminarycloud.vis.vis_pb2'
647
+ # @@protoc_insertion_point(class_scope:luminary.proto.api.v0.luminarycloud.vis.GetCameraRequest)
648
+ })
649
+ _sym_db.RegisterMessage(GetCameraRequest)
650
+
651
+ GetCameraReply = _reflection.GeneratedProtocolMessageType('GetCameraReply', (_message.Message,), {
652
+ 'DESCRIPTOR' : _GETCAMERAREPLY,
653
+ '__module__' : 'proto.api.v0.luminarycloud.vis.vis_pb2'
654
+ # @@protoc_insertion_point(class_scope:luminary.proto.api.v0.luminarycloud.vis.GetCameraReply)
655
+ })
656
+ _sym_db.RegisterMessage(GetCameraReply)
657
+
618
658
  LineDataExtract = _reflection.GeneratedProtocolMessageType('LineDataExtract', (_message.Message,), {
619
659
 
620
660
  'Table' : _reflection.GeneratedProtocolMessageType('Table', (_message.Message,), {
@@ -741,22 +781,22 @@ if _descriptor._USE_C_DESCRIPTORS == False:
741
781
  _LINEDATAEXTRACT_LINESENTRY._serialized_options = b'8\001'
742
782
  _LINEDATAEXTRACT_LABELSENTRY._options = None
743
783
  _LINEDATAEXTRACT_LABELSENTRY._serialized_options = b'8\001'
744
- _CAMERADIRECTION._serialized_start=13286
745
- _CAMERADIRECTION._serialized_end=13416
746
- _CAMERAPROJECTION._serialized_start=13418
747
- _CAMERAPROJECTION._serialized_end=13471
748
- _REPRESENTATION._serialized_start=13473
749
- _REPRESENTATION._serialized_end=13553
750
- _STREAMLINESDIRECTION._serialized_start=13556
751
- _STREAMLINESDIRECTION._serialized_end=13720
752
- _GLYPHSAMPLINGMODE._serialized_start=13722
753
- _GLYPHSAMPLINGMODE._serialized_end=13813
754
- _COLORMAPNAME._serialized_start=13816
755
- _COLORMAPNAME._serialized_end=14050
756
- _EXTRACTSTATUS._serialized_start=14052
757
- _EXTRACTSTATUS._serialized_end=14119
758
- _RENDERDATAURLSSTATUS._serialized_start=14121
759
- _RENDERDATAURLSSTATUS._serialized_end=14225
784
+ _CAMERADIRECTION._serialized_start=13661
785
+ _CAMERADIRECTION._serialized_end=13791
786
+ _CAMERAPROJECTION._serialized_start=13793
787
+ _CAMERAPROJECTION._serialized_end=13846
788
+ _REPRESENTATION._serialized_start=13848
789
+ _REPRESENTATION._serialized_end=13928
790
+ _STREAMLINESDIRECTION._serialized_start=13931
791
+ _STREAMLINESDIRECTION._serialized_end=14095
792
+ _GLYPHSAMPLINGMODE._serialized_start=14097
793
+ _GLYPHSAMPLINGMODE._serialized_end=14188
794
+ _COLORMAPNAME._serialized_start=14191
795
+ _COLORMAPNAME._serialized_end=14425
796
+ _EXTRACTSTATUS._serialized_start=14427
797
+ _EXTRACTSTATUS._serialized_end=14494
798
+ _RENDERDATAURLSSTATUS._serialized_start=14496
799
+ _RENDERDATAURLSSTATUS._serialized_end=14600
760
800
  _PAN._serialized_start=248
761
801
  _PAN._serialized_end=309
762
802
  _CAMERALOOKAT._serialized_start=312
@@ -895,14 +935,24 @@ if _descriptor._USE_C_DESCRIPTORS == False:
895
935
  _LISTSOLUTIONFIELDSREQUEST._serialized_end=12780
896
936
  _LISTSOLUTIONFIELDSREPLY._serialized_start=12782
897
937
  _LISTSOLUTIONFIELDSREPLY._serialized_end=12866
898
- _LINEDATAEXTRACT._serialized_start=12869
899
- _LINEDATAEXTRACT._serialized_end=13283
900
- _LINEDATAEXTRACT_TABLE._serialized_start=13058
901
- _LINEDATAEXTRACT_TABLE._serialized_end=13126
902
- _LINEDATAEXTRACT_LINESENTRY._serialized_start=13128
903
- _LINEDATAEXTRACT_LINESENTRY._serialized_end=13236
904
- _LINEDATAEXTRACT_LABELSENTRY._serialized_start=13238
905
- _LINEDATAEXTRACT_LABELSENTRY._serialized_end=13283
906
- _VISAPISERVICE._serialized_start=14228
907
- _VISAPISERVICE._serialized_end=15436
938
+ _CAMERAENTRY._serialized_start=12868
939
+ _CAMERAENTRY._serialized_end=12914
940
+ _LISTCAMERASREQUEST._serialized_start=12916
941
+ _LISTCAMERASREQUEST._serialized_end=12956
942
+ _LISTCAMERASREPLY._serialized_start=12958
943
+ _LISTCAMERASREPLY._serialized_end=13046
944
+ _GETCAMERAREQUEST._serialized_start=13048
945
+ _GETCAMERAREQUEST._serialized_end=13158
946
+ _GETCAMERAREPLY._serialized_start=13160
947
+ _GETCAMERAREPLY._serialized_end=13241
948
+ _LINEDATAEXTRACT._serialized_start=13244
949
+ _LINEDATAEXTRACT._serialized_end=13658
950
+ _LINEDATAEXTRACT_TABLE._serialized_start=13433
951
+ _LINEDATAEXTRACT_TABLE._serialized_end=13501
952
+ _LINEDATAEXTRACT_LINESENTRY._serialized_start=13503
953
+ _LINEDATAEXTRACT_LINESENTRY._serialized_end=13611
954
+ _LINEDATAEXTRACT_LABELSENTRY._serialized_start=13613
955
+ _LINEDATAEXTRACT_LABELSENTRY._serialized_end=13658
956
+ _VISAPISERVICE._serialized_start=14603
957
+ _VISAPISERVICE._serialized_end=16081
908
958
  # @@protoc_insertion_point(module_scope)
@@ -1906,6 +1906,91 @@ class ListSolutionFieldsReply(google.protobuf.message.Message):
1906
1906
 
1907
1907
  global___ListSolutionFieldsReply = ListSolutionFieldsReply
1908
1908
 
1909
+ class CameraEntry(google.protobuf.message.Message):
1910
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
1911
+
1912
+ NAME_FIELD_NUMBER: builtins.int
1913
+ CAMERA_ID_FIELD_NUMBER: builtins.int
1914
+ name: builtins.str
1915
+ camera_id: builtins.int
1916
+ def __init__(
1917
+ self,
1918
+ *,
1919
+ name: builtins.str = ...,
1920
+ camera_id: builtins.int = ...,
1921
+ ) -> None: ...
1922
+ def ClearField(self, field_name: typing_extensions.Literal["camera_id", b"camera_id", "name", b"name"]) -> None: ...
1923
+
1924
+ global___CameraEntry = CameraEntry
1925
+
1926
+ class ListCamerasRequest(google.protobuf.message.Message):
1927
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
1928
+
1929
+ PROJECT_ID_FIELD_NUMBER: builtins.int
1930
+ project_id: builtins.str
1931
+ """Optional project id. Empty means list global cameras."""
1932
+ def __init__(
1933
+ self,
1934
+ *,
1935
+ project_id: builtins.str = ...,
1936
+ ) -> None: ...
1937
+ def ClearField(self, field_name: typing_extensions.Literal["project_id", b"project_id"]) -> None: ...
1938
+
1939
+ global___ListCamerasRequest = ListCamerasRequest
1940
+
1941
+ class ListCamerasReply(google.protobuf.message.Message):
1942
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
1943
+
1944
+ CAMERA_FIELD_NUMBER: builtins.int
1945
+ @property
1946
+ def camera(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___CameraEntry]: ...
1947
+ def __init__(
1948
+ self,
1949
+ *,
1950
+ camera: collections.abc.Iterable[global___CameraEntry] | None = ...,
1951
+ ) -> None: ...
1952
+ def ClearField(self, field_name: typing_extensions.Literal["camera", b"camera"]) -> None: ...
1953
+
1954
+ global___ListCamerasReply = ListCamerasReply
1955
+
1956
+ class GetCameraRequest(google.protobuf.message.Message):
1957
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
1958
+
1959
+ CAMERA_ID_FIELD_NUMBER: builtins.int
1960
+ RESOLUTION_FIELD_NUMBER: builtins.int
1961
+ camera_id: builtins.int
1962
+ @property
1963
+ def resolution(self) -> global___Resolution:
1964
+ """Exact camera params need an aspect ratio to produce the correct camera
1965
+ params
1966
+ """
1967
+ def __init__(
1968
+ self,
1969
+ *,
1970
+ camera_id: builtins.int = ...,
1971
+ resolution: global___Resolution | None = ...,
1972
+ ) -> None: ...
1973
+ def HasField(self, field_name: typing_extensions.Literal["resolution", b"resolution"]) -> builtins.bool: ...
1974
+ def ClearField(self, field_name: typing_extensions.Literal["camera_id", b"camera_id", "resolution", b"resolution"]) -> None: ...
1975
+
1976
+ global___GetCameraRequest = GetCameraRequest
1977
+
1978
+ class GetCameraReply(google.protobuf.message.Message):
1979
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
1980
+
1981
+ CAMERA_FIELD_NUMBER: builtins.int
1982
+ @property
1983
+ def camera(self) -> global___Camera: ...
1984
+ def __init__(
1985
+ self,
1986
+ *,
1987
+ camera: global___Camera | None = ...,
1988
+ ) -> None: ...
1989
+ def HasField(self, field_name: typing_extensions.Literal["camera", b"camera"]) -> builtins.bool: ...
1990
+ def ClearField(self, field_name: typing_extensions.Literal["camera", b"camera"]) -> None: ...
1991
+
1992
+ global___GetCameraReply = GetCameraReply
1993
+
1909
1994
  class LineDataExtract(google.protobuf.message.Message):
1910
1995
  """This is present to derserialize line data in python. Needs to be in sync
1911
1996
  with visualizationservice.proto.
@@ -54,6 +54,16 @@ class VisAPIServiceStub(object):
54
54
  request_serializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_vis_dot_vis__pb2.ListSolutionFieldsRequest.SerializeToString,
55
55
  response_deserializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_vis_dot_vis__pb2.ListSolutionFieldsReply.FromString,
56
56
  )
57
+ self.ListCameras = channel.unary_unary(
58
+ '/luminary.proto.api.v0.luminarycloud.vis.VisAPIService/ListCameras',
59
+ request_serializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_vis_dot_vis__pb2.ListCamerasRequest.SerializeToString,
60
+ response_deserializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_vis_dot_vis__pb2.ListCamerasReply.FromString,
61
+ )
62
+ self.GetCamera = channel.unary_unary(
63
+ '/luminary.proto.api.v0.luminarycloud.vis.VisAPIService/GetCamera',
64
+ request_serializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_vis_dot_vis__pb2.GetCameraRequest.SerializeToString,
65
+ response_deserializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_vis_dot_vis__pb2.GetCameraReply.FromString,
66
+ )
57
67
 
58
68
 
59
69
  class VisAPIServiceServicer(object):
@@ -107,6 +117,18 @@ class VisAPIServiceServicer(object):
107
117
  context.set_details('Method not implemented!')
108
118
  raise NotImplementedError('Method not implemented!')
109
119
 
120
+ def ListCameras(self, request, context):
121
+ """Missing associated documentation comment in .proto file."""
122
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
123
+ context.set_details('Method not implemented!')
124
+ raise NotImplementedError('Method not implemented!')
125
+
126
+ def GetCamera(self, request, context):
127
+ """Missing associated documentation comment in .proto file."""
128
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
129
+ context.set_details('Method not implemented!')
130
+ raise NotImplementedError('Method not implemented!')
131
+
110
132
 
111
133
  def add_VisAPIServiceServicer_to_server(servicer, server):
112
134
  rpc_method_handlers = {
@@ -150,6 +172,16 @@ def add_VisAPIServiceServicer_to_server(servicer, server):
150
172
  request_deserializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_vis_dot_vis__pb2.ListSolutionFieldsRequest.FromString,
151
173
  response_serializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_vis_dot_vis__pb2.ListSolutionFieldsReply.SerializeToString,
152
174
  ),
175
+ 'ListCameras': grpc.unary_unary_rpc_method_handler(
176
+ servicer.ListCameras,
177
+ request_deserializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_vis_dot_vis__pb2.ListCamerasRequest.FromString,
178
+ response_serializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_vis_dot_vis__pb2.ListCamerasReply.SerializeToString,
179
+ ),
180
+ 'GetCamera': grpc.unary_unary_rpc_method_handler(
181
+ servicer.GetCamera,
182
+ request_deserializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_vis_dot_vis__pb2.GetCameraRequest.FromString,
183
+ response_serializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_vis_dot_vis__pb2.GetCameraReply.SerializeToString,
184
+ ),
153
185
  }
154
186
  generic_handler = grpc.method_handlers_generic_handler(
155
187
  'luminary.proto.api.v0.luminarycloud.vis.VisAPIService', rpc_method_handlers)
@@ -295,3 +327,37 @@ class VisAPIService(object):
295
327
  proto_dot_api_dot_v0_dot_luminarycloud_dot_vis_dot_vis__pb2.ListSolutionFieldsReply.FromString,
296
328
  options, channel_credentials,
297
329
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
330
+
331
+ @staticmethod
332
+ def ListCameras(request,
333
+ target,
334
+ options=(),
335
+ channel_credentials=None,
336
+ call_credentials=None,
337
+ insecure=False,
338
+ compression=None,
339
+ wait_for_ready=None,
340
+ timeout=None,
341
+ metadata=None):
342
+ return grpc.experimental.unary_unary(request, target, '/luminary.proto.api.v0.luminarycloud.vis.VisAPIService/ListCameras',
343
+ proto_dot_api_dot_v0_dot_luminarycloud_dot_vis_dot_vis__pb2.ListCamerasRequest.SerializeToString,
344
+ proto_dot_api_dot_v0_dot_luminarycloud_dot_vis_dot_vis__pb2.ListCamerasReply.FromString,
345
+ options, channel_credentials,
346
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
347
+
348
+ @staticmethod
349
+ def GetCamera(request,
350
+ target,
351
+ options=(),
352
+ channel_credentials=None,
353
+ call_credentials=None,
354
+ insecure=False,
355
+ compression=None,
356
+ wait_for_ready=None,
357
+ timeout=None,
358
+ metadata=None):
359
+ return grpc.experimental.unary_unary(request, target, '/luminary.proto.api.v0.luminarycloud.vis.VisAPIService/GetCamera',
360
+ proto_dot_api_dot_v0_dot_luminarycloud_dot_vis_dot_vis__pb2.GetCameraRequest.SerializeToString,
361
+ proto_dot_api_dot_v0_dot_luminarycloud_dot_vis_dot_vis__pb2.GetCameraReply.FromString,
362
+ options, channel_credentials,
363
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@@ -40,6 +40,14 @@ class VisAPIServiceStub:
40
40
  luminarycloud._proto.api.v0.luminarycloud.vis.vis_pb2.ListSolutionFieldsRequest,
41
41
  luminarycloud._proto.api.v0.luminarycloud.vis.vis_pb2.ListSolutionFieldsReply,
42
42
  ]
43
+ ListCameras: grpc.UnaryUnaryMultiCallable[
44
+ luminarycloud._proto.api.v0.luminarycloud.vis.vis_pb2.ListCamerasRequest,
45
+ luminarycloud._proto.api.v0.luminarycloud.vis.vis_pb2.ListCamerasReply,
46
+ ]
47
+ GetCamera: grpc.UnaryUnaryMultiCallable[
48
+ luminarycloud._proto.api.v0.luminarycloud.vis.vis_pb2.GetCameraRequest,
49
+ luminarycloud._proto.api.v0.luminarycloud.vis.vis_pb2.GetCameraReply,
50
+ ]
43
51
 
44
52
  class VisAPIServiceServicer(metaclass=abc.ABCMeta):
45
53
  @abc.abstractmethod
@@ -90,5 +98,17 @@ class VisAPIServiceServicer(metaclass=abc.ABCMeta):
90
98
  request: luminarycloud._proto.api.v0.luminarycloud.vis.vis_pb2.ListSolutionFieldsRequest,
91
99
  context: grpc.ServicerContext,
92
100
  ) -> luminarycloud._proto.api.v0.luminarycloud.vis.vis_pb2.ListSolutionFieldsReply: ...
101
+ @abc.abstractmethod
102
+ def ListCameras(
103
+ self,
104
+ request: luminarycloud._proto.api.v0.luminarycloud.vis.vis_pb2.ListCamerasRequest,
105
+ context: grpc.ServicerContext,
106
+ ) -> luminarycloud._proto.api.v0.luminarycloud.vis.vis_pb2.ListCamerasReply: ...
107
+ @abc.abstractmethod
108
+ def GetCamera(
109
+ self,
110
+ request: luminarycloud._proto.api.v0.luminarycloud.vis.vis_pb2.GetCameraRequest,
111
+ context: grpc.ServicerContext,
112
+ ) -> luminarycloud._proto.api.v0.luminarycloud.vis.vis_pb2.GetCameraReply: ...
93
113
 
94
114
  def add_VisAPIServiceServicer_to_server(servicer: VisAPIServiceServicer, server: grpc.Server) -> None: ...
@@ -22,6 +22,12 @@ class SDKException(Exception):
22
22
  return [self.message]
23
23
 
24
24
 
25
+ class Timeout(SDKException):
26
+ """Raised when some long-running operation doesn't finish before its deadline."""
27
+
28
+ pass
29
+
30
+
25
31
  class RpcError(SDKException):
26
32
  """Raised when an RPC error occurs."""
27
33
 
@@ -70,6 +76,6 @@ class FailedPreconditionError(RpcError):
70
76
 
71
77
 
72
78
  class DeadlineExceededError(RpcError):
73
- """Raised when the deadline expired before the operation could complete. I.e. it timed out."""
79
+ """Raised when the gRPC deadline expired before the operation could complete. I.e. it timed out."""
74
80
 
75
81
  pass
luminarycloud/geometry.py CHANGED
@@ -42,6 +42,8 @@ class Geometry(ProtoWrapperBase):
42
42
  "Geometry name."
43
43
  status: GeometryStatus
44
44
  "The status of the geometry."
45
+ project_id: ProjectID
46
+ "The ID of the project this geometry belongs to."
45
47
 
46
48
  _proto: geometrypb.Geometry
47
49
 
@@ -63,7 +65,7 @@ class Geometry(ProtoWrapperBase):
63
65
  """
64
66
  Get the project this geometry belongs to.
65
67
  """
66
- return lc.get_project(ProjectID(self._proto.project_id))
68
+ return lc.get_project(self.project_id)
67
69
 
68
70
  def update(self, *, name: str | None = None) -> None:
69
71
  """
luminarycloud/mesh.py CHANGED
@@ -106,8 +106,7 @@ class Mesh(ProtoWrapperBase):
106
106
  interval_seconds=interval_seconds,
107
107
  timeout_seconds=timeout_seconds,
108
108
  )
109
- self._proto = get_mesh(self.id)._proto
110
- return self.status
109
+ return self.refresh().status
111
110
 
112
111
  def refresh(self) -> "Mesh":
113
112
  """
@@ -36,7 +36,6 @@ class PipelineRecord:
36
36
  class PipelineJobRecord:
37
37
  id: str
38
38
  pipeline_id: str
39
- project_id: str
40
39
  name: str
41
40
  description: str | None
42
41
  status: Literal["pending", "running", "completed", "failed", "cancelled"]
@@ -50,7 +49,6 @@ class PipelineJobRecord:
50
49
  return cls(
51
50
  id=json["id"],
52
51
  pipeline_id=json["pipeline_id"],
53
- project_id=json["project_id"],
54
52
  name=json["name"],
55
53
  description=json["description"],
56
54
  status=json["status"],
@@ -113,7 +111,7 @@ def get_pipeline(id: str) -> PipelineRecord:
113
111
 
114
112
 
115
113
  def create_pipeline_job(
116
- pipeline_id: str, args: PipelineArgs, project_id: str, name: str, description: str | None = None
114
+ pipeline_id: str, args: PipelineArgs, name: str, description: str | None = None
117
115
  ) -> PipelineJobRecord:
118
116
  """
119
117
  Create a new pipeline job.
@@ -124,8 +122,6 @@ def create_pipeline_job(
124
122
  ID of the pipeline to invoke.
125
123
  args : PipelineArgs
126
124
  Arguments to pass to the pipeline.
127
- project_id : str
128
- ID of the project to run the pipeline job in.
129
125
  name : str
130
126
  Name of the pipeline job.
131
127
  description : str, optional
@@ -136,7 +132,6 @@ def create_pipeline_job(
136
132
  body = {
137
133
  "name": name,
138
134
  "description": description,
139
- "project_id": project_id,
140
135
  "argument_names": [p.name for p in args.params],
141
136
  "argument_rows": arg_rows,
142
137
  }
@@ -124,8 +124,7 @@ class Simulation(ProtoWrapperBase):
124
124
  interval_seconds=interval_seconds,
125
125
  timeout_seconds=timeout_seconds,
126
126
  )
127
- self._proto = get_simulation(self.id)._proto
128
- return self.status
127
+ return self.refresh().status
129
128
 
130
129
  def refresh(self) -> "Simulation":
131
130
  """
@@ -4,8 +4,12 @@ from .visualization import (
4
4
  EntityType as EntityType,
5
5
  list_renders as list_renders,
6
6
  list_quantities as list_quantities,
7
+ list_quantities as list_quantities,
8
+ list_cameras as list_cameras,
9
+ get_camera as get_camera,
7
10
  DirectionalCamera as DirectionalCamera,
8
11
  LookAtCamera as LookAtCamera,
12
+ CameraEntry as CameraEntry,
9
13
  )
10
14
 
11
15
  from .primitives import (
@@ -52,3 +56,14 @@ from .interactive_scene import (
52
56
  from .interactive_inference import (
53
57
  InteractiveInference as InteractiveInference,
54
58
  )
59
+
60
+ # Unreleased/internal for testing now
61
+
62
+ # from .report import (
63
+ # Report as Report,
64
+ # )
65
+
66
+ # from .interactive_report import (
67
+ # InteractiveReport as InteractiveReport,
68
+ # ReportEntry as ReportEntry,
69
+ # )
@@ -22,6 +22,7 @@ from luminarycloud.params.simulation.physics.fluid.boundary_conditions import Fa
22
22
  from .._helpers._code_representation import CodeRepr
23
23
  from ..types import SimulationID
24
24
  from collections import defaultdict
25
+ import copy
25
26
 
26
27
 
27
28
  logger = logging.getLogger(__name__)
@@ -227,14 +228,14 @@ class ExtractOutput:
227
228
  extract_id: str,
228
229
  project_id: str,
229
230
  name: str,
230
- desciption: str,
231
+ description: str,
231
232
  status: ExtractStatusType,
232
233
  ) -> None:
233
234
  self._extract_id = extract_id
234
235
  self._project_id = project_id
235
236
  self.status = status
236
237
  self.name = name
237
- self.description = desciption
238
+ self.description = description
238
239
 
239
240
  def __repr__(self) -> str:
240
241
  return f"ExtractOutput (Id: {self._extract_id} status: {self.status})"
@@ -563,7 +564,7 @@ class DataExtractor:
563
564
  extract_id=res.extract.extract_id,
564
565
  project_id=self._project_id,
565
566
  name=name,
566
- desciption=description,
567
+ description=description,
567
568
  status=ExtractStatusType(res.extract.status),
568
569
  )
569
570
  return extract_output
@@ -657,6 +658,21 @@ class DataExtractor:
657
658
 
658
659
  return imports + code
659
660
 
661
+ def clone(self, solution: Solution) -> "DataExtractor":
662
+ """
663
+ Clone this extract based on a new solution. This is a deep copy
664
+ operation. Both solution must be compatible with one another, meaning
665
+ they share tags or surfaces ids for extractors such as
666
+ IntersectionCurve.
667
+ """
668
+ if not isinstance(solution, Solution):
669
+ raise TypeError("Expected a Solution object.")
670
+ cloned = DataExtractor(solution)
671
+ for extract in self._extracts:
672
+ copied_extract = copy.deepcopy(extract)
673
+ cloned.add_data_extract(copied_extract)
674
+ return cloned
675
+
660
676
 
661
677
  def list_data_extracts(solution: Solution) -> list[ExtractOutput]:
662
678
  """
@@ -700,7 +716,7 @@ def list_data_extracts(solution: Solution) -> list[ExtractOutput]:
700
716
  extract_id=extract.extract_id,
701
717
  project_id=extract.project_id,
702
718
  name=extract.name,
703
- desciption=extract.description,
719
+ description=extract.description,
704
720
  status=ExtractStatusType(extract.status),
705
721
  )
706
722
  # This need to be fixed on the backend, but manually refreshing works for now.
@@ -0,0 +1,124 @@
1
+ import io
2
+ from . import ExtractOutput
3
+ from .vis_util import _InternalToken, _get_status
4
+ from .visualization import RenderOutput
5
+ from ..enum import ExtractStatusType
6
+ from .._client import get_default_client
7
+ from .._proto.api.v0.luminarycloud.vis import vis_pb2
8
+
9
+ try:
10
+ import luminarycloud_jupyter as lcj
11
+ except ImportError:
12
+ lcj = None
13
+
14
+
15
+ # TODO Will/Matt: this could be something like what we store in the DB
16
+ # A report can contain a list of report entries that reference post proc.
17
+ # extracts + styling info for how they should be displayed
18
+ class ReportEntry:
19
+ def __init__(
20
+ self, project_id: str, extract_ids: list[str] = [], metadata: dict[str, str | float] = {}
21
+ ) -> None:
22
+ self._project_id = project_id
23
+ self._extract_ids = extract_ids
24
+ self._extracts: list[ExtractOutput | RenderOutput] = []
25
+ self._metadata = metadata
26
+
27
+ # Download all extracts for this report entry
28
+ def download_extracts(self) -> None:
29
+ self._extracts = []
30
+ for eid in self._extract_ids:
31
+ status = _get_status(self._project_id, eid)
32
+ if status != ExtractStatusType.COMPLETED:
33
+ raise Exception(f"Extract {eid} is not complete")
34
+ req = vis_pb2.DownloadExtractRequest()
35
+ req.extract_id = eid
36
+ req.project_id = self._project_id
37
+ # TODO: This is a bit awkward in that we download the extract to figure out what type
38
+ # it is, but this is just a temporary thing, later we'll have a report DB table that
39
+ # stores the extracts for a report and their types, etc.
40
+ res: vis_pb2.DownloadExtractResponse = get_default_client().DownloadExtract(req)
41
+ extract = (
42
+ ExtractOutput(_InternalToken())
43
+ if res.HasField("line_data")
44
+ else RenderOutput(_InternalToken())
45
+ )
46
+ extract._set_data(eid, self._project_id, eid, eid, status)
47
+ self._extracts.append(extract)
48
+
49
+
50
+ class InteractiveReport:
51
+ # TODO Will/Matt: this list of report entries could be how we store stuff in the DB
52
+ # for interactive reports, to reference the post proc. extracts. A report is essentially
53
+ # a bunch of extracts + metadata.
54
+ def __init__(self, entries: list[ReportEntry]) -> None:
55
+ if not lcj:
56
+ raise ImportError("InteractiveScene requires luminarycloud[jupyter] to be installed")
57
+
58
+ self.entries = entries
59
+ if len(self.entries) == 0:
60
+ raise ValueError("Invalid number of entries, must be > 0")
61
+
62
+ report_data = []
63
+ for row, re in enumerate(self.entries):
64
+ row_data = []
65
+ re.download_extracts()
66
+ for extract in re._extracts:
67
+ if isinstance(extract, RenderOutput):
68
+ image_and_label = extract.download_images()
69
+ row_data.extend([il[0] for il in image_and_label])
70
+ else:
71
+ plot_data = extract.download_data()
72
+ # Plot absolute pressure for each intersection curve we have
73
+ # TODO will: make these params of the extract/report entry
74
+ # We'll pick the first item that's not x/y/z coordinates to be the data we plot
75
+ x_axis = "x"
76
+ y_axis = [n for n in plot_data[0][0][0] if n != "x" and n != "y" and n != "z"][
77
+ 0
78
+ ]
79
+ scatter_plots = []
80
+ for p in plot_data:
81
+ data = p[0]
82
+ x_idx = data[0].index(x_axis)
83
+ y_idx = data[0].index(y_axis)
84
+
85
+ scatter_data = lcj.ScatterPlotData()
86
+ scatter_data.name = f"plot-{row}"
87
+ for r in data[1:]:
88
+ scatter_data.x.append(r[x_idx])
89
+ scatter_data.y.append(r[y_idx])
90
+ scatter_plots.append(scatter_data)
91
+ row_data.append(scatter_plots)
92
+
93
+ report_data.append(row_data)
94
+
95
+ # TODO Validate the grid configuration is valid, all report entries should have the
96
+ # same # of extract IDs and metadata keys
97
+ # maybe not needed, b/c this is something we'd control internally later?
98
+ nrows = len(report_data)
99
+ ncols = len(report_data[0]) if len(report_data) > 0 else 0
100
+
101
+ for i, r in enumerate(report_data):
102
+ if len(r) != ncols:
103
+ raise ValueError(
104
+ f"Invalid report configuration: row {i} does not have {ncols} columns"
105
+ )
106
+
107
+ self.widget = lcj.EnsembleWidget([re._metadata for re in self.entries], nrows, ncols)
108
+ for row, row_data in enumerate(report_data):
109
+ for col, col_data in enumerate(row_data):
110
+ if isinstance(col_data, list) and isinstance(col_data[0], lcj.ScatterPlotData):
111
+ x_axis = "x"
112
+ y_axis = "Absolute Pressure (Pa)"
113
+ self.widget.set_cell_scatter_plot(
114
+ row, col, f"{row} {y_axis} v {x_axis}", x_axis, y_axis, col_data
115
+ )
116
+ elif isinstance(col_data, io.BytesIO):
117
+ self.widget.set_cell_data(row, col, col_data.getvalue(), "jpg")
118
+
119
+ def _ipython_display_(self) -> None:
120
+ """
121
+ When the InteractiveReport is shown in Jupyter we show the underlying widget
122
+ to run the widget's frontend code
123
+ """
124
+ self.widget._ipython_display_()
@@ -18,7 +18,16 @@ try:
18
18
  import luminarycloud_jupyter as lcj
19
19
 
20
20
  if TYPE_CHECKING:
21
- from luminarycloud_jupyter import InteractiveLCVisWidget, LCVisPlaneWidget
21
+ from luminarycloud_jupyter import (
22
+ InteractiveLCVisWidget,
23
+ LCVisPlaneWidget,
24
+ LCVisLineWidget,
25
+ LCVisBoxWidget,
26
+ LCVisCylinderWidget,
27
+ LCVisHalfSphereWidget,
28
+ LCVisSphereWidget,
29
+ LCVisFinitePlaneWidget,
30
+ )
22
31
  except ImportError:
23
32
  lcj = None
24
33
 
@@ -134,7 +143,7 @@ class InteractiveScene:
134
143
  def set_surface_visibility(self, surface_id: str, visible: bool) -> None:
135
144
  self.widget.set_surface_visibility(surface_id, visible)
136
145
 
137
- def set_surface_color(self, surface_id: str, color: list[float]) -> None:
146
+ def set_surface_color(self, surface_id: str, color: "list[float]") -> None:
138
147
  self.widget.set_surface_color(surface_id, color)
139
148
 
140
149
  def set_display_attributes(self, object_id: str, attrs: DisplayAttributes) -> None:
@@ -199,6 +208,24 @@ class InteractiveScene:
199
208
  def add_plane_widget(self) -> "LCVisPlaneWidget":
200
209
  return self.widget.add_plane_widget()
201
210
 
211
+ def add_line_widget(self) -> "LCVisLineWidget":
212
+ return self.widget.add_line_widget()
213
+
214
+ def add_box_widget(self) -> "LCVisBoxWidget":
215
+ return self.widget.add_box_widget()
216
+
217
+ def add_cylinder_widget(self) -> "LCVisCylinderWidget":
218
+ return self.widget.add_cylinder_widget()
219
+
220
+ def add_half_sphere_widget(self) -> "LCVisHalfSphereWidget":
221
+ return self.widget.add_half_sphere_widget()
222
+
223
+ def add_finite_plane_widget(self) -> "LCVisFinitePlaneWidget":
224
+ return self.widget.add_finite_plane_widget()
225
+
226
+ def add_sphere_widget(self) -> "LCVisSphereWidget":
227
+ return self.widget.add_sphere_widget()
228
+
202
229
  def delete_widget(self, widget: "InteractiveLCVisWidget") -> None:
203
230
  self.widget.delete_widget(widget)
204
231
 
@@ -0,0 +1,98 @@
1
+ from .visualization import Scene, RenderOutput
2
+ from .data_extraction import DataExtractor, ExtractOutput
3
+ from ..enum import RenderStatusType, ExtractStatusType
4
+ from ..solution import Solution
5
+ from time import sleep
6
+
7
+
8
+ # Notes(matt): we need a good way to pass "legend" information to the report.
9
+ # The legend is list of scalar values that are associated with each solution in
10
+ # the report. Examples include outputs like lift or drag, scalar ranges in the
11
+ # solutions, or any user provided data. We could add a helper class to auto-produce
12
+ # the legend data for common use cases or the user could provide their own. The data
13
+ # would look like a csv file or a dictionary keyed on the solution/sim id, where each
14
+ # entry is a list of scalar values. We would also need a header to describe what the values
15
+ # are.
16
+ class Report:
17
+ def __init__(self, solutions: list[Solution]):
18
+ self._scenes: list[Scene] = []
19
+ self._data_extractors: list[DataExtractor] = []
20
+ self._solution: list[Solution] = solutions
21
+ # When we fire off requests we use these objects to track the progress.
22
+ self._extract_outputs: list[ExtractOutput] = []
23
+ self._render_outputs: list[RenderOutput] = []
24
+ for solution in solutions:
25
+ if not isinstance(solution, Solution):
26
+ raise TypeError("Expected a list of Solution objects.")
27
+
28
+ def add_scene(self, scene: Scene):
29
+ if not isinstance(scene, Scene):
30
+ raise TypeError("Expected a Scene object.")
31
+ self._scenes.append(scene)
32
+
33
+ def add_data_extractor(self, data_extractor: DataExtractor):
34
+ if not isinstance(data_extractor, DataExtractor):
35
+ raise TypeError("Expected a DataExtractor object.")
36
+ self._data_extractors.append(data_extractor)
37
+
38
+ def _check_status(self) -> bool:
39
+ """Check the status of all render outputs and extract outputs."""
40
+ still_pending = False
41
+ print("\n" + "=" * 60)
42
+ print("STATUS CHECK".center(60))
43
+ print("=" * 60)
44
+
45
+ if not self._render_outputs and not self._extract_outputs:
46
+ raise RuntimeError("No render outputs or extract outputs to check status.")
47
+
48
+ # Check render outputs
49
+ if self._render_outputs:
50
+ print(f"{'Type':<8} | {'ID':<20} | {'Status':<15}")
51
+ print("-" * 60)
52
+
53
+ for output in self._render_outputs:
54
+ if (
55
+ output.status != RenderStatusType.COMPLETED
56
+ and output.status != RenderStatusType.FAILED
57
+ ):
58
+ output.refresh()
59
+ still_pending = True
60
+ print(f"{'Render':<8} | {str(output._extract_id):<20} | {output.status.name:<15}")
61
+
62
+ # Check extract outputs
63
+ for output in self._extract_outputs:
64
+ if (
65
+ output.status != ExtractStatusType.COMPLETED
66
+ and output.status != ExtractStatusType.FAILED
67
+ ):
68
+ output.refresh()
69
+ still_pending = True
70
+ print(f"{'Extract':<8} | {str(output._extract_id):<20} | {output.status.name:<15}")
71
+
72
+ print("=" * 60)
73
+ return still_pending
74
+
75
+ def create_report_data(self):
76
+ for solution in self._solution:
77
+ for scene in self._scenes:
78
+ sol_scene = scene.clone(solution)
79
+ self._render_outputs.append(
80
+ sol_scene.render_images(
81
+ name="Report Scene", description="Generated Report Scene"
82
+ )
83
+ )
84
+ for extractor in self._data_extractors:
85
+ sol_extractor = extractor.clone(solution)
86
+ self._extract_outputs.append(
87
+ sol_extractor.create_extracts(
88
+ name="Report Extract", description="Generated Report Extract"
89
+ )
90
+ )
91
+
92
+ def wait_for_completion(self):
93
+ """Wait for all render and extract outputs to complete."""
94
+ if not self._render_outputs and not self._extract_outputs:
95
+ raise RuntimeError("No render outputs or extract outputs to wait for.")
96
+ while self._check_status():
97
+ sleep(5)
98
+ print("All render and extract outputs have completed.")
@@ -162,7 +162,7 @@ class LookAtCamera(CodeRepr):
162
162
  self.projection = CameraProjection(static_ani.camera.projection)
163
163
 
164
164
  def __repr__(self) -> str:
165
- return self._to_code_helper(obj_name="camera")
165
+ return self._to_code_helper(obj_name="camera", hide_defaults=False)
166
166
 
167
167
 
168
168
  class RenderOutput:
@@ -206,13 +206,18 @@ class RenderOutput:
206
206
  self._deleted = False
207
207
 
208
208
  def _set_data(
209
- self, extract_id: str, project_id: str, name: str, desciption: str, status: RenderStatusType
209
+ self,
210
+ extract_id: str,
211
+ project_id: str,
212
+ name: str,
213
+ description: str,
214
+ status: RenderStatusType,
210
215
  ) -> None:
211
216
  self._extract_id = extract_id
212
217
  self._project_id = project_id
213
218
  self.status = status
214
219
  self.name = name
215
- self.description = desciption
220
+ self.description = description
216
221
 
217
222
  def __repr__(self) -> str:
218
223
  return f"RenderOutput(Id: {self._extract_id} status: {self.status})"
@@ -806,7 +811,7 @@ class Scene(CodeRepr):
806
811
  extract_id=res.extract.extract_id,
807
812
  project_id=self._project_id,
808
813
  name=name,
809
- desciption=description,
814
+ description=description,
810
815
  status=RenderStatusType(res.extract.status),
811
816
  )
812
817
  return render_output
@@ -1145,7 +1150,7 @@ def list_renders(entity: Geometry | Mesh | Solution) -> List[RenderOutput]:
1145
1150
  extract_id=extract.extract_id,
1146
1151
  project_id=extract.project_id,
1147
1152
  name=extract.name,
1148
- desciption=extract.description,
1153
+ description=extract.description,
1149
1154
  status=RenderStatusType(extract.status),
1150
1155
  )
1151
1156
  # This need to be fixed on the backend, but manually refreshing works for now.
@@ -1315,3 +1320,60 @@ def _reconstruct(extract_id: str, project_id: str) -> Scene:
1315
1320
  req.project_id = project_id
1316
1321
  res: vis_pb2.GetExtractSpecResponse = get_default_client().GetExtractSpec(req)
1317
1322
  return _spec_to_scene(res.spec)
1323
+
1324
+
1325
+ @dc.dataclass
1326
+ class CameraEntry:
1327
+ camera_id: int
1328
+ name: str
1329
+
1330
+
1331
+ def list_cameras(project_id: str = "") -> List[CameraEntry]:
1332
+ """
1333
+ List all cameras in the specified project. If no project id is provided,
1334
+ global cameras are returned.
1335
+ """
1336
+ req = vis_pb2.ListCamerasRequest()
1337
+ req.project_id = project_id
1338
+ res: vis_pb2.ListCamerasReply = get_default_client().ListCameras(req)
1339
+ return [CameraEntry(camera_id=c.camera_id, name=c.name) for c in res.camera]
1340
+
1341
+
1342
+ def get_camera(entry: CameraEntry, width: int, height: int) -> LookAtCamera:
1343
+ """
1344
+ Instantiate a LookAt camera by its entry returned from list_cameras. The
1345
+ width and the height impact orthographic cameras. Most screens have a 16:9
1346
+ aspect ratio, so using the width = 1920 and height = 1080 is a good default
1347
+ to match cameras created in the UI, otherwise parts of the scene may be
1348
+ clipped.
1349
+
1350
+ .. warning:: This feature is experimental and may change or be removed in the future.
1351
+
1352
+ Parameters
1353
+ ----------
1354
+ entry: CameraEntry, required
1355
+ A camera entry returned from list_cameras.
1356
+ width: int, required
1357
+ The target width of the camera.
1358
+ height: int, required
1359
+ The target height of the camera.
1360
+ """
1361
+ req = vis_pb2.GetCameraRequest()
1362
+ req.camera_id = entry.camera_id
1363
+ req.resolution.width = width
1364
+ req.resolution.height = height
1365
+ res: vis_pb2.GetCameraReply = get_default_client().GetCamera(req)
1366
+ cam = LookAtCamera()
1367
+ cam.width = width
1368
+ cam.height = height
1369
+ cam.label = entry.name
1370
+ cam.up = Vector3()
1371
+ cam.up._from_proto(res.camera.look_at.up)
1372
+ cam.look_at = Vector3()
1373
+ cam.look_at._from_proto(res.camera.look_at.look_at)
1374
+ cam.position = Vector3()
1375
+ cam.position._from_proto(res.camera.look_at.position)
1376
+ cam.projection = CameraProjection(res.camera.projection)
1377
+ cam.pan_x = res.camera.look_at.pan.x
1378
+ cam.pan_y = res.camera.look_at.pan.y
1379
+ return cam
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: luminarycloud
3
- Version: 0.19.1
3
+ Version: 0.20.0
4
4
  Summary: Luminary Cloud SDK
5
5
  Project-URL: Homepage, https://www.luminarycloud.com/
6
6
  Project-URL: Documentation, https://app.luminarycloud.com/docs/api/
@@ -2,15 +2,15 @@ luminarycloud/__init__.py,sha256=mpNimnkWfQlpfQyo8Ugjx-gboUNug9hbsh-4m2A0JWY,331
2
2
  luminarycloud/_patch.py,sha256=5m2_HUos6-NGPvrz-bOlVr5FsyJNJlCkmytyYJkj6Bc,1661
3
3
  luminarycloud/_version.py,sha256=lOdK2s5vnq1K8KND-J-wO2A2MuUTouiYRhJwRwb6mcA,178
4
4
  luminarycloud/_wrapper.py,sha256=PwTyxIVoYCF2z5arlV5UEgNfFDduxGE1KC2NaOpasWU,7796
5
- luminarycloud/exceptions.py,sha256=SNEoC5Lu4li8x08doqPPiJ5V7pFskUyoASdlENj7Twk,1768
5
+ luminarycloud/exceptions.py,sha256=VVGtKREb8XcWea6TySVYh7dhGQpowafdhiTst1uN4EQ,1900
6
6
  luminarycloud/feature_modification.py,sha256=Pe5bw8SlaNdd36az_OTFXKWEQI-0_wUIy5sRIqp9itM,30684
7
- luminarycloud/geometry.py,sha256=r8mQOUOeu1oKoRe4BWqN1ZH_HQIwjv5cgqTORyVDUE0,20728
7
+ luminarycloud/geometry.py,sha256=tRPrdehQxFmST73BbpAnHHsvbK7kqe1gRYCgN3LpZTM,20790
8
8
  luminarycloud/geometry_version.py,sha256=lP4oHotRpyt4fQkoYkwtfbNfpB0xSHFGEynFLCy7hiA,6004
9
- luminarycloud/mesh.py,sha256=ohEQty2M0oqUF5jBOHj59e4GXVo1GOi-bZuF31BpbtM,4819
9
+ luminarycloud/mesh.py,sha256=6O4fTg8gWYLTrBsf0-MH6c7HL72iZbPUfGGk_II9PR4,4782
10
10
  luminarycloud/named_variable_set.py,sha256=RsfGJDoZFajbJ2a2fWc-ZHRsZts5U7ZY6rIXSjXL7bY,4568
11
11
  luminarycloud/project.py,sha256=fizJxgQ9PhHmPUfQ4vR0DVv90Rw_tlpAXlulVeg0708,32194
12
12
  luminarycloud/reference_values.py,sha256=vWIX1VXMctspeQIjNtjmZdex55K0jHf1xz5gsGeMCfo,4357
13
- luminarycloud/simulation.py,sha256=nFC7PJnMXHAjs-CelJUFYbbVVXy6oVeHvPo3MczGbzg,13108
13
+ luminarycloud/simulation.py,sha256=lvcKGRQ8-8cBtETaY7kkDN1w_AHoFzgLahxFjpatNwI,13065
14
14
  luminarycloud/simulation_param.py,sha256=fKad0d0rCUL4EbdLvQS7WTK6_US3vQ2pbG8uaSrhxx4,16732
15
15
  luminarycloud/simulation_queue.py,sha256=dbrxDxGROlxpCVaUmHItZ8uftfLQinCj53nYZ-CRleI,4702
16
16
  luminarycloud/simulation_template.py,sha256=ZsvgsUjW2nAJQ_JnZCsVdaRoogjpBIRNwhdXRxTmcSI,21526
@@ -27,7 +27,7 @@ luminarycloud/_auth/exceptions.py,sha256=XsjA6xxFGnufP5V7BOxnq_syuSRrLa-HWntncW5
27
27
  luminarycloud/_auth/util.py,sha256=EmDl9BBV0SuKVyyq7PyYXPyOEkWBJRIqPN46l2srjEg,1040
28
28
  luminarycloud/_client/__init__.py,sha256=q-q1lnJE9EirX5p_O15FnanUoSYdEOD5zP1XrUedKMU,681
29
29
  luminarycloud/_client/authentication_plugin.py,sha256=eJXs0b8pYih12fBU1vgJ8gGpAdtjfbqCuxSprjR-p9E,1351
30
- luminarycloud/_client/client.py,sha256=IDa_BS9LRN7tVSKch6B3AgrFkwakojw_etQJsYCHMGU,11176
30
+ luminarycloud/_client/client.py,sha256=KiugyhRBcWIQY61bS22HjTz0-beRdBms3NGkgC36388,11307
31
31
  luminarycloud/_client/config.py,sha256=o_HJsmPOLaeorYToR9_wzNhJYRoFnmeqcxCRAoUAqZk,236
32
32
  luminarycloud/_client/http_client.py,sha256=yWx6BJ5C40PRI6Y5qo7b4abUecME_QGcWu1IQVwMHDU,6423
33
33
  luminarycloud/_client/logging_interceptor.py,sha256=I7xJzTQoV5O_Ioi7OjWXI2mQWxdpbagu7QnzbJSFcHg,2593
@@ -44,8 +44,8 @@ luminarycloud/_helpers/_simulation_params_from_json.py,sha256=Iq7S8XUqh3Y-6cZ2rv
44
44
  luminarycloud/_helpers/_timestamp_to_datetime.py,sha256=Vh2-e7MRrxG8z7CMA-DRIIAhqGSUGYuIhW9csoh9pBw,299
45
45
  luminarycloud/_helpers/_upload_mesh.py,sha256=eiWBSheNNdejfH3gkE7UohPXLRT3COOPPTN-yn2OU24,11955
46
46
  luminarycloud/_helpers/_upload_table.py,sha256=B7Svu97Dr6UYt8pubD99kGvXkR0oKUtKSi3Ppj_qUMI,2211
47
- luminarycloud/_helpers/_wait_for_mesh.py,sha256=n5bwWpa398qcNh4CPcUfQEPPjk6dnxAGNY1VgaUGvRs,1779
48
- luminarycloud/_helpers/_wait_for_simulation.py,sha256=Hj_p1C4xl9ixUVhahUOLYaDn4Ox4lnBZNCDG_Q6y_t8,3500
47
+ luminarycloud/_helpers/_wait_for_mesh.py,sha256=p7Zp6ulifpZDAfRcN0kOPVjOU2e9oWutSrPIbMcsreg,1871
48
+ luminarycloud/_helpers/_wait_for_simulation.py,sha256=DusHJLmLi7NvLu3K7cfrb2ZSbPBrySK8t7TLS22oTms,3520
49
49
  luminarycloud/_helpers/cond.py,sha256=BZ0MDBxy2lvcVQyaj0x_qLqJFlsu-X_n9r_Gw1Ppk-c,16752
50
50
  luminarycloud/_helpers/defaults.py,sha256=jj6J3F2cjqO1CR5_F4ICxr44hTLC1GypD9Q4YQJRw68,1550
51
51
  luminarycloud/_helpers/download.py,sha256=R1wWWgzZsaC7tnPHeu8pZvim0bS-o_DHc_yKUzXNC6g,9495
@@ -118,10 +118,10 @@ luminarycloud/_proto/api/v0/luminarycloud/upload/upload_pb2.py,sha256=GSBDw-gXRD
118
118
  luminarycloud/_proto/api/v0/luminarycloud/upload/upload_pb2.pyi,sha256=XbFvpZvvrS7QcH5AFXfpRGl4hQvhd3QdKO6x0oTlCCU,165
119
119
  luminarycloud/_proto/api/v0/luminarycloud/upload/upload_pb2_grpc.py,sha256=eyC9tE7Rid-6OvRiSohEim8mkORz-cVa-ml4T3S8qBU,12767
120
120
  luminarycloud/_proto/api/v0/luminarycloud/upload/upload_pb2_grpc.pyi,sha256=Xknd7R7907K_Sv4rtixxvcBnyz5lA_RzgbHcrwM7qLo,6431
121
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py,sha256=F9GcQmdVcM7AMv0OkhYUvRgBmD2529zcujrHYGstwqU,73350
122
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi,sha256=tNAPKhNrKQfOM-6wGqvN539yscHWs4dzXEGl01OCGh8,92462
123
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.py,sha256=PULOpPrMZzNEC7IiCqjiIvddOGZVRr5K4vEK2z5mqtA,16410
124
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.pyi,sha256=8ArvZODsOVFgSTxDnpa_t3enWP13WROfP_UDZMqq8qs,4496
121
+ luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py,sha256=kaCgXHbnc9--biNbEXYnNpsW8Vv9ERJKnlB1BalFZ_o,76714
122
+ luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi,sha256=Uz_NEPpCc-aV80Q2-tm15Eamj6CklaUuEBIt3gCKaN0,95469
123
+ luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.py,sha256=aKoPboT8HQV4prwYV15B80C8o2j1TpSTGREG2aea2Uw,20130
124
+ luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.pyi,sha256=faJ8c5BRLeHBtAhMrzayo3VQ4pI0ZcgOup8w322-ngA,5462
125
125
  luminarycloud/_proto/assistant/assistant_pb2.py,sha256=zG3T15gNuEZE5yajkWfMUjl_nSdTJ6C-Mbd90_H_Svo,21590
126
126
  luminarycloud/_proto/assistant/assistant_pb2.pyi,sha256=-IwjZXxwyMtts9T3yiCWszonhfoD8t5U5SuIQHb2SKs,26829
127
127
  luminarycloud/_proto/assistant/assistant_pb2_grpc.py,sha256=jFKPYswcJ7jQaZFb1R3meXMDxmwUZyWwaj5tIOBfQ_U,13195
@@ -502,7 +502,7 @@ luminarycloud/physics_ai/training_jobs.py,sha256=e00WETgMqAps6N_PM8C3LmIcrUx3a-6
502
502
  luminarycloud/pipeline_util/dictable.py,sha256=_YhxibnVCUqSpBH-IHBqvjiYlnAYMbuQv9dWK0eZn7Y,1073
503
503
  luminarycloud/pipeline_util/yaml.py,sha256=RG3Gqv4ORaYX4lTyRVBsGVGE138zsxJIYzoWr4Aczrs,1883
504
504
  luminarycloud/pipelines/__init__.py,sha256=bOu2XBDzOb5n9R5JwYFowLuLoSWXWW7I4mGm43cXdSs,1348
505
- luminarycloud/pipelines/api.py,sha256=t33OgewD7m3R4shCK_2CnZ-R7jLJWPeMh04y0WPcHiY,4643
505
+ luminarycloud/pipelines/api.py,sha256=ZA36tmDbOD--WqZP_aqKMew026SASfwn-RmqhtqUbX8,4454
506
506
  luminarycloud/pipelines/arguments.py,sha256=cFbVzOumOUMzO4yB0aWblMH78fZvT-RMZEO-12EBWOs,3787
507
507
  luminarycloud/pipelines/core.py,sha256=W_E8vLec2Sxi7LDGfEzkxFKrbDDnaxpD3BI3nBL4lpU,14754
508
508
  luminarycloud/pipelines/operators.py,sha256=yYJ6SZu00zo73sSv3Hn5yfagBIKF9Z9r0ujg5b9uC08,5441
@@ -514,15 +514,17 @@ luminarycloud/types/adfloat.py,sha256=iSe08QPhQw-IK4j4GZcFM-OKlIHeLyKqUTLncIw2Iz
514
514
  luminarycloud/types/ids.py,sha256=1N0K4xezmi2Dno8TH68tvBgZZCmqYUPbNKujudrzkNg,715
515
515
  luminarycloud/types/matrix3.py,sha256=7E2CyDZBGL_YPiPyOKve2fhr0COL-7y2yJqqW70W7d8,922
516
516
  luminarycloud/types/vector3.py,sha256=agzBz6_vBN6YzKQUlqB94BYOdOaFAbetJKqOtCthkDQ,3381
517
- luminarycloud/vis/__init__.py,sha256=Ne9N8qvWufzMjXMy7JBRF6Oa_wByVEciyZK5o8xWwGk,1384
518
- luminarycloud/vis/data_extraction.py,sha256=xi4KBV2oirx0Lzd2HCQ7TuljhLRbyI2yrqiQyW3mWsw,28946
517
+ luminarycloud/vis/__init__.py,sha256=U-wbXLZn0pBmQaqLAMzyn0e-KJnWIe4UlvY25Hc9xys,1730
518
+ luminarycloud/vis/data_extraction.py,sha256=HSc4gSjXoH4jP_Fdot_qNCIuWA8D25hD_GkORy0xFfw,29599
519
519
  luminarycloud/vis/display.py,sha256=VxnBtFTGjKINt2cMrJ_SbBI1y_csin9kMVqR5jsHpLo,10312
520
520
  luminarycloud/vis/filters.py,sha256=WARUNUlx_fnuepGubMwbSRPOt56RBjBUVTYeRkqGv2c,48746
521
521
  luminarycloud/vis/interactive_inference.py,sha256=5CyhmU4G2Iz6Ar8pczZVXivk_CniSQk8fmxCLb6BsCk,5943
522
- luminarycloud/vis/interactive_scene.py,sha256=iczI7MifCVQHbSK9oeK2waZ5Nh2YwPrvSxG_xfWWux4,9548
522
+ luminarycloud/vis/interactive_report.py,sha256=HmQgkxVx_4iiPrPFc3xMVbNmvOQjzf6pBY2To3TzirQ,5562
523
+ luminarycloud/vis/interactive_scene.py,sha256=RVQEvXcjKo-9kLlFAO-oASoYYjLEqDQF7WPyTPocEzo,10425
523
524
  luminarycloud/vis/primitives.py,sha256=_EDSEAddSAFTRUU9at1Gxt-5chLO723f9c8V5atTeTg,4546
525
+ luminarycloud/vis/report.py,sha256=6CWDrwxs8oGKWh1RxzGfKLoxiv8AYHMOVx1bVc4W-zs,4231
524
526
  luminarycloud/vis/vis_util.py,sha256=AWGmHcfYXGmfe5t5Jbb1Fqe2nxVdEQbBitCaWSeT89M,1821
525
- luminarycloud/vis/visualization.py,sha256=vbjQGCZrCdM63_tseDNttMopZMSpN6FNO1icMgkl7Tc,56629
526
- luminarycloud-0.19.1.dist-info/METADATA,sha256=cmu6CJCpakgB-DTXk3aRt6sw6xo5mbZs17DZ4Z4pzvc,2574
527
- luminarycloud-0.19.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
528
- luminarycloud-0.19.1.dist-info/RECORD,,
527
+ luminarycloud/vis/visualization.py,sha256=88egJE4-9hucD9VGZ79q38WSBIaSnwKg9Z8iHNP2nSQ,58643
528
+ luminarycloud-0.20.0.dist-info/METADATA,sha256=W86HkKKXtkJ_tm620JHAc3ytT6FLe-FCH61ebrBfeJQ,2574
529
+ luminarycloud-0.20.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
530
+ luminarycloud-0.20.0.dist-info/RECORD,,