luminarycloud 0.15.5__py3-none-any.whl → 0.16.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. luminarycloud/_client/client.py +5 -0
  2. luminarycloud/_helpers/__init__.py +1 -0
  3. luminarycloud/_helpers/_code_representation.py +21 -4
  4. luminarycloud/_helpers/download.py +67 -1
  5. luminarycloud/_proto/api/v0/luminarycloud/inference/inference_pb2.py +9 -9
  6. luminarycloud/_proto/api/v0/luminarycloud/inference/inference_pb2.pyi +7 -4
  7. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.py +45 -21
  8. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.pyi +65 -0
  9. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.py +34 -0
  10. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.pyi +12 -0
  11. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2.py +194 -7
  12. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2.pyi +407 -5
  13. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2_grpc.py +171 -0
  14. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2_grpc.pyi +64 -0
  15. luminarycloud/_proto/api/v0/luminarycloud/upload/upload_pb2.py +4 -2
  16. luminarycloud/_proto/api/v0/luminarycloud/upload/upload_pb2_grpc.py +34 -0
  17. luminarycloud/_proto/api/v0/luminarycloud/upload/upload_pb2_grpc.pyi +12 -0
  18. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py +128 -107
  19. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi +48 -3
  20. luminarycloud/_proto/assistant/assistant_pb2.py +82 -61
  21. luminarycloud/_proto/assistant/assistant_pb2.pyi +40 -0
  22. luminarycloud/_proto/assistant/assistant_pb2_grpc.py +34 -0
  23. luminarycloud/_proto/assistant/assistant_pb2_grpc.pyi +12 -0
  24. luminarycloud/_proto/base/base_pb2.py +7 -6
  25. luminarycloud/_proto/base/base_pb2.pyi +4 -0
  26. luminarycloud/_proto/client/simulation_pb2.py +351 -351
  27. luminarycloud/_proto/client/simulation_pb2.pyi +105 -97
  28. luminarycloud/_proto/geometry/geometry_pb2.py +68 -68
  29. luminarycloud/_proto/geometry/geometry_pb2.pyi +15 -7
  30. luminarycloud/_proto/hexmesh/hexmesh_pb2.py +40 -15
  31. luminarycloud/_proto/hexmesh/hexmesh_pb2.pyi +58 -1
  32. luminarycloud/_proto/inferenceservice/inferenceservice_pb2.py +11 -11
  33. luminarycloud/_proto/inferenceservice/inferenceservice_pb2.pyi +12 -4
  34. luminarycloud/_proto/lcstatus/codes_pb2.py +3 -2
  35. luminarycloud/_proto/lcstatus/codes_pb2.pyi +4 -0
  36. luminarycloud/_proto/quantity/quantity_pb2.py +11 -2
  37. luminarycloud/_proto/quantity/quantity_pb2.pyi +6 -0
  38. luminarycloud/_proto/table/table_pb2.pyi +4 -2
  39. luminarycloud/_proto/upload/upload_pb2.py +27 -7
  40. luminarycloud/_proto/upload/upload_pb2.pyi +31 -0
  41. luminarycloud/enum/quantity_type.py +19 -0
  42. luminarycloud/enum/tables.py +1 -0
  43. luminarycloud/enum/vis_enums.py +20 -0
  44. luminarycloud/feature_modification.py +6 -7
  45. luminarycloud/geometry.py +24 -0
  46. luminarycloud/geometry_version.py +23 -0
  47. luminarycloud/mesh.py +8 -1
  48. luminarycloud/params/simulation/adjoint_.py +4 -4
  49. luminarycloud/params/simulation/material/material_fluid_.py +1 -1
  50. luminarycloud/params/simulation/material/material_solid_.py +1 -1
  51. luminarycloud/params/simulation/output_.py +1 -1
  52. luminarycloud/params/simulation/physics/fluid/initialization/fluid_existing_solution_.py +28 -0
  53. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/__init__.py +1 -0
  54. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_auto_.py +30 -0
  55. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_on_.py +1 -1
  56. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation_.py +6 -2
  57. luminarycloud/params/simulation/physics/fluid/solution_controls_fluid_.py +4 -0
  58. luminarycloud/params/simulation/simulation_param_.py +6 -0
  59. luminarycloud/physics_ai/__init__.py +4 -0
  60. luminarycloud/physics_ai/inference.py +140 -4
  61. luminarycloud/physics_ai/solution.py +60 -0
  62. luminarycloud/project.py +9 -7
  63. luminarycloud/simulation_param.py +29 -15
  64. luminarycloud/simulation_template.py +14 -10
  65. luminarycloud/tables.py +11 -12
  66. luminarycloud/thirdparty/__init__.py +12 -0
  67. luminarycloud/thirdparty/onshape.py +170 -0
  68. luminarycloud/vis/__init__.py +2 -0
  69. luminarycloud/vis/data_extraction.py +44 -6
  70. luminarycloud/vis/display.py +26 -11
  71. luminarycloud/vis/filters.py +226 -67
  72. luminarycloud/vis/primitives.py +3 -2
  73. luminarycloud/vis/visualization.py +198 -41
  74. luminarycloud/volume_selection.py +2 -2
  75. {luminarycloud-0.15.5.dist-info → luminarycloud-0.16.1.dist-info}/METADATA +6 -6
  76. {luminarycloud-0.15.5.dist-info → luminarycloud-0.16.1.dist-info}/RECORD +77 -73
  77. {luminarycloud-0.15.5.dist-info → luminarycloud-0.16.1.dist-info}/WHEEL +0 -0
@@ -13,6 +13,7 @@ from luminarycloud.types import Vector3, Vector3Like
13
13
 
14
14
  from .._client import get_default_client
15
15
  from .._helpers._get_project_id import _get_project_id
16
+ from .._helpers._code_representation import CodeRepr
16
17
  from .._proto.quantity import quantity_pb2 as quantitypb
17
18
  from .._proto.api.v0.luminarycloud.vis import vis_pb2
18
19
  from ..types import SimulationID, MeshID
@@ -23,9 +24,6 @@ from luminarycloud.enum import (
23
24
  EntityType,
24
25
  SceneMode,
25
26
  VisQuantity,
26
- FieldComponent,
27
- Representation,
28
- ColorMapPreset,
29
27
  )
30
28
  from ..exceptions import NotFoundError
31
29
  from ..geometry import Geometry, get_geometry
@@ -46,6 +44,7 @@ from .filters import (
46
44
  ScaledVectorGlyphs,
47
45
  FixedSizeVectorGlyphs,
48
46
  Isosurface,
47
+ _filter_to_obj_name,
49
48
  )
50
49
  from .interactive_scene import InteractiveScene
51
50
  from .vis_util import _InternalToken, _download_file, _get_status
@@ -58,7 +57,7 @@ def _is_valid_color(obj: common_pb2.Vector3) -> bool:
58
57
 
59
58
 
60
59
  @dc.dataclass
61
- class DirectionalCamera:
60
+ class DirectionalCamera(CodeRepr):
62
61
  """
63
62
  Class defining a directional camera for visualization. Directional
64
63
  camera are oriented around the visible objects in the scene and will
@@ -102,7 +101,7 @@ class DirectionalCamera:
102
101
 
103
102
 
104
103
  @dc.dataclass
105
- class LookAtCamera:
104
+ class LookAtCamera(CodeRepr):
106
105
  """
107
106
  Class defining a look at camera for visualization. Unlike the directional
108
107
  camera which is placed relative to what is visisble, the the look at camera
@@ -335,7 +334,7 @@ class RenderOutput:
335
334
  self._deleted = True
336
335
 
337
336
 
338
- class Scene:
337
+ class Scene(CodeRepr):
339
338
  """
340
339
  The scene class is the base for any visualization. The scene is constructed
341
340
  with what "entity" you want to visualize: a solution, a mesh, or
@@ -427,20 +426,18 @@ class Scene:
427
426
  simulation = get_simulation(self._solution.simulation_id)
428
427
  mesh_meta = get_mesh_metadata(simulation.mesh_id)
429
428
  mesh = get_mesh(simulation.mesh_id)
430
- try:
431
- geom = mesh.geometry_version().geometry()
432
- except NotFoundError:
429
+ geo_ver = mesh.geometry_version()
430
+ if geo_ver is None:
433
431
  self._has_tags = False
434
- except Exception as e:
435
- raise ValueError("An unknown error occurred retrieving tags")
432
+ else:
433
+ geom = geo_ver.geometry()
436
434
  elif self._entity_type == EntityType.MESH:
437
435
  mesh_meta = get_mesh_metadata(self._mesh.id)
438
- try:
439
- geom = get_geometry(self._mesh.geometry_version().geometry_id)
440
- except NotFoundError:
436
+ geo_ver = self._mesh.geometry_version()
437
+ if geo_ver is None:
441
438
  self._has_tags = False
442
- except Exception as e:
443
- raise ValueError("An unknown error occurred retrieving tags")
439
+ else:
440
+ geom = geo_ver.geometry()
444
441
  else:
445
442
  geom = self._geometry
446
443
 
@@ -510,7 +507,7 @@ class Scene:
510
507
  display attributes using tags, then surface ids.
511
508
  """
512
509
  if not surface_id in self._surface_ids:
513
- raise ValueError(f"Id {id} not a boundary id")
510
+ raise ValueError(f"Id {surface_id} not a boundary id")
514
511
  self._surface_visibilities[surface_id] = visible
515
512
 
516
513
  if self._interactive_scene:
@@ -858,6 +855,158 @@ class Scene:
858
855
  raise ValueError(f"Scene.clone: id {id} not present in tags or surface ids")
859
856
  return cloned
860
857
 
858
+ def to_code(self, obj_name: str, hide_defaults: bool = True) -> str:
859
+ """
860
+ This function will produce a code string that reproduces the scene
861
+ in its current state.
862
+
863
+ Parameters
864
+ ----------
865
+ obj_name: str
866
+ the object name of the scene.
867
+ hide_defaults: bool, optional
868
+ If True, the code will make a best effort not include default values for attributes.
869
+ """
870
+ imports = "import luminarycloud as lc\n"
871
+ imports += "import luminarycloud.vis as vis\n"
872
+ imports += "from luminarycloud.types import Vector3\n"
873
+ imports += "from luminarycloud.enum import (\n"
874
+ imports += " ColorMapPreset,\n"
875
+ imports += " FieldComponent,\n"
876
+ imports += " CameraProjection,\n"
877
+ imports += " CameraDirection,\n"
878
+ imports += " RenderStatusType,\n"
879
+ imports += " Representation,\n"
880
+ imports += " VisQuantity,\n"
881
+ imports += " StreamlineDirection,\n"
882
+ imports += " SurfaceStreamlineMode,\n"
883
+ imports += ")\n"
884
+
885
+ # This isn't technically needed, but I think its useful.
886
+ code = f"# project id = '{self._project_id}'\n"
887
+ code += "\n# Find the entity to build the scene from\n"
888
+ if self._entity_type == EntityType.SIMULATION:
889
+ imports += "from luminarycloud.simulation import get_simulation\n"
890
+
891
+ code += f"simulation = get_simulation('{self._solution.simulation_id}')\n"
892
+ code += "for sol in simulation.list_solutions():\n"
893
+ code += f" if sol.id == '{self._solution.id}':\n"
894
+ code += f" solution = sol\n"
895
+ code += f" break\n"
896
+ code += "scene = vis.Scene(solution)\n"
897
+ elif self._entity_type == EntityType.MESH:
898
+ imports += "from luminarycloud.mesh import get_mesh\n"
899
+
900
+ code += f"mesh = get_mesh('{self._mesh.id}')\n"
901
+ code += "scene = vis.Scene(mesh)\n"
902
+ else:
903
+ imports += "from luminarycloud.geometry import get_geometry\n"
904
+ code += f"geom = get_geometry('{self._geometry.id}')\n"
905
+ code += "scene = vis.Scene(geom)\n"
906
+
907
+ code += "\n"
908
+
909
+ code += "# Set the scene attributes\n"
910
+ code += self.global_display_attrs._to_code_helper(
911
+ obj_name=f"{obj_name}.global_display_attrs", hide_defaults=hide_defaults
912
+ )
913
+ code += "\n"
914
+
915
+ code += f"{obj_name}.triad_visible = {self.triad_visible}\n"
916
+ code += f"{obj_name}.axes_grid_visible = {self.axes_grid_visible}\n"
917
+ code += f"{obj_name}.background_color = {self.background_color}\n"
918
+ code += f"{obj_name}.auto_color_map_annotations = {self.auto_color_map_annotations}\n"
919
+ code += f"{obj_name}.supersampling = {self.supersampling}\n"
920
+
921
+ code += "\n"
922
+ code += "# Set surface visibilities\n"
923
+ for surface_id, visible in self._surface_visibilities.items():
924
+ if surface_id in self._surface_ids:
925
+ code += f"{obj_name}.surface_visibility('{surface_id}', {visible})\n"
926
+ elif surface_id in self._tag_ids:
927
+ code += f"{obj_name}.tag_visibility('{surface_id}', {visible})\n"
928
+ else:
929
+ raise ValueError(f"Surface id {surface_id} not found in surface or tag ids")
930
+ code += "\n"
931
+
932
+ cam_count = 0
933
+
934
+ code += "# Add cameras\n"
935
+ for camera in self._cameras:
936
+ camera_name = f"camera{cam_count}"
937
+ code += camera._to_code_helper(camera_name, hide_defaults=hide_defaults)
938
+ code += f"scene.add_camera({camera_name})\n"
939
+ cam_count += 1
940
+ code += "\n"
941
+
942
+ # We can have many of the same type of filter so we need to track how
943
+ # many times we have seen a filter type to create the object name.
944
+ name_map: Dict[str, int] = {}
945
+ # Filters can be connected so we need to track what the ids are so we
946
+ # can connected them.
947
+ ids_to_obj_name: Dict[str, str] = {}
948
+ has_connections = False
949
+ for filter in self._filters:
950
+ # Name objects numerically: slice0, slice1, etc.
951
+ if filter._parent_id != "":
952
+ has_connections = True
953
+ name = _filter_to_obj_name(filter)
954
+ if name in name_map:
955
+ name_map[obj_name] += 1
956
+ else:
957
+ name_map[obj_name] = 0
958
+ obj_name = f"{name}{name_map[obj_name]}"
959
+ ids_to_obj_name[filter.id] = obj_name
960
+ code += filter._to_code_helper(obj_name, hide_defaults=hide_defaults)
961
+ code += f"scene.add_filter({obj_name})\n"
962
+ code += "\n"
963
+
964
+ if has_connections:
965
+ code += "# Connect filters\n"
966
+ for filter in self._filters:
967
+ if filter._parent_id != "":
968
+ code += f"{ids_to_obj_name[filter.id]}.set_parent({ids_to_obj_name[filter._parent_id]})\n"
969
+ code += "\n"
970
+ if len(self._color_maps) != 0:
971
+ cmap_count = 0
972
+ code += "# Add color maps\n"
973
+ for color_map in self._color_maps:
974
+ cmap_name = f"color_map{cmap_count}"
975
+ code += color_map._to_code_helper(cmap_name, hide_defaults=hide_defaults)
976
+ code += f"scene.add_color_map({cmap_name})\n"
977
+ cmap_count += 1
978
+ code += "\n"
979
+
980
+ imports += "\n"
981
+ # The code gen is very verbose, so we can do some string replacements
982
+ # since we are importing the luminarycloud.vis package.
983
+ cleanup_list: List[str] = [
984
+ "luminarycloud.vis.display",
985
+ "luminarycloud.vis.visualization",
986
+ "luminarycloud.vis.filters",
987
+ ]
988
+ for cleanup in cleanup_list:
989
+ code = code.replace(cleanup, "vis")
990
+ # Many classes initialize the attributes, so we don't need to explicitly
991
+ # creat new objects for them. Additionally, its easier to do this here than
992
+ # in the individual classes.
993
+ remove_list: List[str] = [
994
+ "vis.DataRange()",
995
+ "luminarycloud.vis.primitives.Plane()",
996
+ "luminarycloud.vis.primitives.Box()",
997
+ "vis.DisplayAttributes()",
998
+ ]
999
+ # Remove entire lines containing any remove_list item
1000
+ code_lines = code.splitlines()
1001
+ filtered_lines = [
1002
+ line
1003
+ for line in code_lines
1004
+ if not any(remove_item in line for remove_item in remove_list)
1005
+ ]
1006
+ code = "\n".join(filtered_lines)
1007
+
1008
+ return imports + code
1009
+
861
1010
 
862
1011
  def list_quantities(solution: Solution) -> List[VisQuantity]:
863
1012
  """
@@ -954,7 +1103,7 @@ def list_renders(entity: Geometry | Mesh | Solution) -> List[RenderOutput]:
954
1103
  return results
955
1104
 
956
1105
 
957
- def _reconstruct(extract_id: str, project_id: str) -> Scene:
1106
+ def _spec_to_scene(spec: vis_pb2.ExtractSpec) -> Scene:
958
1107
  """
959
1108
  This function reconstructs a scene from an extract id and project id. The
960
1109
  resulting scene should produce an identical image to the one that was
@@ -965,28 +1114,24 @@ def _reconstruct(extract_id: str, project_id: str) -> Scene:
965
1114
  When we get the extract back, we don't know if it was auto-generated or not.
966
1115
  Thus, the resulting color maps will be much more verbose than the original.
967
1116
  """
968
- req = vis_pb2.GetExtractRequest()
969
- req.extract_id = extract_id
970
- req.project_id = project_id
971
- res: vis_pb2.GetExtractSpecResponse = get_default_client().GetExtractSpec(req)
972
- if res.spec.data_only:
1117
+ if spec.data_only:
973
1118
  raise ValueError("Error: cannot reconstruct a scene from a data only extract")
974
1119
 
975
- entity = res.spec.entity_type.WhichOneof("entity")
1120
+ entity = spec.entity_type.WhichOneof("entity")
976
1121
  if entity == "geometry":
977
- geom = get_geometry(res.spec.entity_type.geometry.id)
1122
+ geom = get_geometry(spec.entity_type.geometry.id)
978
1123
  scene = Scene(geom)
979
1124
  elif entity == "mesh":
980
- mesh_id = MeshID(res.spec.entity_type.mesh.id)
1125
+ mesh_id = MeshID(spec.entity_type.mesh.id)
981
1126
  mesh = get_mesh(mesh_id)
982
1127
  scene = Scene(mesh)
983
1128
  elif entity == "simulation":
984
- sim_id = SimulationID(res.spec.entity_type.simulation.id)
1129
+ sim_id = SimulationID(spec.entity_type.simulation.id)
985
1130
  sim = get_simulation(sim_id)
986
1131
  sols = sim.list_solutions()
987
1132
  found = False
988
1133
  for sol in sols:
989
- if sol.id == res.spec.entity_type.simulation.solution_id:
1134
+ if sol.id == spec.entity_type.simulation.solution_id:
990
1135
  scene = Scene(sol)
991
1136
  found = True
992
1137
  break
@@ -1003,7 +1148,7 @@ def _reconstruct(extract_id: str, project_id: str) -> Scene:
1003
1148
  # keep track of filter ids so we connect them later and keep track of
1004
1149
  # surface and tag visibilties.
1005
1150
  filter_ids: List[str] = []
1006
- for filter in res.spec.filters:
1151
+ for filter in spec.filters:
1007
1152
  filter_ids.append(filter.id)
1008
1153
  typ = filter.WhichOneof("value")
1009
1154
  pfilter: Filter | None = None
@@ -1042,13 +1187,13 @@ def _reconstruct(extract_id: str, project_id: str) -> Scene:
1042
1187
  pfilter._from_proto(filter)
1043
1188
  # Set the display attributes
1044
1189
  pattrs = DisplayAttributes()
1045
- attrs = res.spec.display_attributes[pfilter.id]
1190
+ attrs = spec.display_attributes[pfilter.id]
1046
1191
  assert attrs is not None, "Internal error: display attributes not set"
1047
1192
  pfilter.display_attrs._from_proto(attrs)
1048
1193
  scene.add_filter(pfilter)
1049
1194
 
1050
1195
  # Connect filters to their parents.
1051
- for parent_id, children in res.spec.filter_connections.items():
1196
+ for parent_id, children in spec.filter_connections.items():
1052
1197
  parent_filter = next((f for f in scene._filters if f.id == parent_id), None)
1053
1198
  if parent_filter is not None:
1054
1199
  for child_id in children.children_id:
@@ -1063,17 +1208,17 @@ def _reconstruct(extract_id: str, project_id: str) -> Scene:
1063
1208
  raise ValueError(f"Error: parent filter {parent_id} not found in the scene filters")
1064
1209
 
1065
1210
  # scene attributes
1066
- scene.supersampling = res.spec.supersampling_ratio
1067
- scene.triad_visible = res.spec.triad_properties.visible
1068
- scene.axes_grid_visible = res.spec.axes_grid_properties.visible
1211
+ scene.supersampling = spec.supersampling_ratio
1212
+ scene.triad_visible = spec.triad_properties.visible
1213
+ scene.axes_grid_visible = spec.axes_grid_properties.visible
1069
1214
  scene.background_color = Vector3(
1070
- x=res.spec.background_properties.color.r,
1071
- y=res.spec.background_properties.color.g,
1072
- z=res.spec.background_properties.color.b,
1215
+ x=spec.background_properties.color.r,
1216
+ y=spec.background_properties.color.g,
1217
+ z=spec.background_properties.color.b,
1073
1218
  )
1074
- scene.global_display_attrs._from_proto(res.spec.global_display_attributes)
1219
+ scene.global_display_attrs._from_proto(spec.global_display_attributes)
1075
1220
 
1076
- for id, attrs in res.spec.display_attributes.items():
1221
+ for id, attrs in spec.display_attributes.items():
1077
1222
  if id in filter_ids:
1078
1223
  continue # Skip filters, we already processed them.
1079
1224
  if id in scene._surface_ids or id in scene._tag_ids:
@@ -1081,7 +1226,7 @@ def _reconstruct(extract_id: str, project_id: str) -> Scene:
1081
1226
  # attributes are set in the global display attributes.
1082
1227
  scene._surface_visibilities[id] = attrs.visible
1083
1228
 
1084
- for static_ani in res.spec.animation_properties.statics.items:
1229
+ for static_ani in spec.animation_properties.statics.items:
1085
1230
  cam_typ = static_ani.camera.WhichOneof("specification")
1086
1231
  if cam_typ == "direction":
1087
1232
  cam = DirectionalCamera()
@@ -1093,8 +1238,20 @@ def _reconstruct(extract_id: str, project_id: str) -> Scene:
1093
1238
  scene.add_camera(l_cam)
1094
1239
 
1095
1240
  # Add color maps
1096
- for color_map in res.spec.color_maps:
1241
+ for color_map in spec.color_maps:
1097
1242
  cmap = ColorMap()
1098
1243
  cmap._from_proto(color_map)
1099
1244
  scene.add_color_map(cmap)
1100
1245
  return scene
1246
+
1247
+
1248
+ def _reconstruct(extract_id: str, project_id: str) -> Scene:
1249
+ """
1250
+ Helper function to reconstruct a scene from an extract id and project id.
1251
+ This helper exists to do sdk integration testing.
1252
+ """
1253
+ req = vis_pb2.GetExtractRequest()
1254
+ req.extract_id = extract_id
1255
+ req.project_id = project_id
1256
+ res: vis_pb2.GetExtractSpecResponse = get_default_client().GetExtractSpec(req)
1257
+ return _spec_to_scene(res.spec)
@@ -157,8 +157,8 @@ class VolumeSelection:
157
157
  cad_url = finish_res.url
158
158
 
159
159
  feature = gpb.Feature(feature_name=feature_name)
160
- getattr(feature, "import").CopyFrom(
161
- gpb.Import(
160
+ feature.import_geometry.CopyFrom(
161
+ gpb.ImportGeometry(
162
162
  geometry_url=cad_url,
163
163
  scaling=scaling,
164
164
  force_discrete=force_discrete,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: luminarycloud
3
- Version: 0.15.5
3
+ Version: 0.16.1
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/
@@ -13,13 +13,13 @@ Requires-Dist: grpcio-status~=1.51
13
13
  Requires-Dist: grpcio-tools~=1.51
14
14
  Requires-Dist: grpcio~=1.51
15
15
  Requires-Dist: importlib-metadata~=6.0.0
16
- Requires-Dist: opentelemetry-api~=1.25.0
17
- Requires-Dist: opentelemetry-exporter-otlp-proto-common~=1.25.0
18
- Requires-Dist: opentelemetry-exporter-otlp-proto-http~=1.25.0
16
+ Requires-Dist: opentelemetry-api~=1.25
17
+ Requires-Dist: opentelemetry-exporter-otlp-proto-common~=1.25
18
+ Requires-Dist: opentelemetry-exporter-otlp-proto-http~=1.25
19
19
  Requires-Dist: opentelemetry-instrumentation-grpc~=0.46b0
20
20
  Requires-Dist: opentelemetry-instrumentation~=0.46b0
21
- Requires-Dist: opentelemetry-proto~=1.25.0
22
- Requires-Dist: opentelemetry-sdk~=1.25.0
21
+ Requires-Dist: opentelemetry-proto~=1.25
22
+ Requires-Dist: opentelemetry-sdk~=1.25
23
23
  Requires-Dist: opentelemetry-semantic-conventions~=0.46b0
24
24
  Requires-Dist: protobuf~=4.21
25
25
  Requires-Dist: pyjwt~=2.6