@geode/opengeodeweb-front 10.34.0-rc.8 → 10.34.0

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 (282) hide show
  1. package/{server → .build/server}/utils/app_config.js +10 -9
  2. package/{server → .build/server}/utils/cleanup.js +31 -17
  3. package/{server → .build/server}/utils/cloud.js +1 -4
  4. package/{server → .build/server}/utils/microservices.js +21 -9
  5. package/{server → .build/server}/utils/path.js +4 -4
  6. package/{server → .build/server}/utils/scripts.js +9 -9
  7. package/.build/server/utils/server_config.js +51 -0
  8. package/.build/server/utils/stream.js +6 -0
  9. package/{server → .build/server}/utils/ws_client.js +18 -3
  10. package/{shared → .build/shared}/scripts.js +10 -10
  11. package/.build/shared/utils/call_raw.js +31 -0
  12. package/{shared → .build/shared}/utils/call_schema.js +2 -2
  13. package/.build/shared/utils/fetch_raw.js +52 -0
  14. package/{shared → .build/shared}/utils/fetch_schema.js +2 -2
  15. package/{shared → .build/shared}/utils/file.js +3 -1
  16. package/{shared → .build/shared}/utils/response_handlers/load.js +10 -7
  17. package/{shared → .build/shared}/utils/validate_schema.js +1 -1
  18. package/app/components/ActionButton.vue +6 -6
  19. package/app/components/CameraManager/List.vue +5 -5
  20. package/app/components/CameraManager/Saver.vue +3 -5
  21. package/app/components/CameraManager.vue +6 -4
  22. package/app/components/CameraOrientation.vue +12 -12
  23. package/app/components/ClippingPlaneCard.vue +4 -2
  24. package/app/components/ClippingPlanes.vue +8 -8
  25. package/app/components/CrsSelector.vue +9 -10
  26. package/app/components/DeleteDialog.vue +4 -2
  27. package/app/components/DragAndDrop.vue +10 -12
  28. package/app/components/DragAndDropInternal/DragAndDropInline.vue +4 -2
  29. package/app/components/ExtensionSelector.vue +4 -4
  30. package/app/components/FeedBack/ErrorBanner.vue +3 -1
  31. package/app/components/FeedBack/Snackers.vue +4 -3
  32. package/app/components/FileSelector.vue +10 -8
  33. package/app/components/FileUploader.vue +11 -11
  34. package/app/components/GlassCard.vue +1 -1
  35. package/app/components/HybridRenderingView.vue +7 -5
  36. package/app/components/HybridViewerTooltip.vue +7 -7
  37. package/app/components/Launcher.vue +1 -1
  38. package/app/components/Loading/EcoMessages.vue +9 -3
  39. package/app/components/Loading.vue +2 -2
  40. package/app/components/MissingFilesSelector.vue +12 -10
  41. package/app/components/ObjectSelector.vue +10 -9
  42. package/app/components/PackagesVersions.vue +6 -5
  43. package/app/components/Recaptcha.vue +3 -3
  44. package/app/components/RemoteRenderingView.vue +6 -7
  45. package/app/components/Ruler.vue +3 -3
  46. package/app/components/Screenshot.vue +6 -6
  47. package/app/components/SearchBar.vue +4 -2
  48. package/app/components/ShrinkFilter.vue +7 -7
  49. package/app/components/Step.vue +6 -5
  50. package/app/components/Stepper.vue +4 -3
  51. package/app/components/ToolPanel.vue +6 -3
  52. package/app/components/ViewToolbar.vue +25 -28
  53. package/app/components/Viewer/ContextMenu/CenterButton.vue +7 -5
  54. package/app/components/Viewer/ContextMenu/CircularItems.vue +3 -3
  55. package/app/components/Viewer/ContextMenu/ContextMenu.vue +22 -19
  56. package/app/components/Viewer/ContextMenu/ContextMenuItem.vue +10 -8
  57. package/app/components/Viewer/ContextMenu/InfoCard.vue +11 -12
  58. package/app/components/Viewer/EdgedCurve/SpecificEdgesOptions.vue +13 -17
  59. package/app/components/Viewer/Generic/Mesh/CellsOptions.vue +11 -15
  60. package/app/components/Viewer/Generic/Mesh/EdgesOptions.vue +12 -16
  61. package/app/components/Viewer/Generic/Mesh/PointsOptions.vue +8 -12
  62. package/app/components/Viewer/Generic/Mesh/PolygonsOptions.vue +11 -15
  63. package/app/components/Viewer/Generic/Mesh/PolyhedraOptions.vue +11 -15
  64. package/app/components/Viewer/Generic/Model/BlocksOptions.vue +67 -38
  65. package/app/components/Viewer/Generic/Model/CornersOptions.vue +53 -23
  66. package/app/components/Viewer/Generic/Model/EdgesOptions.vue +1 -3
  67. package/app/components/Viewer/Generic/Model/LinesOptions.vue +67 -38
  68. package/app/components/Viewer/Generic/Model/ModelStyleCard.vue +31 -15
  69. package/app/components/Viewer/Generic/Model/ModelStyleOptions.vue +2 -3
  70. package/app/components/Viewer/Generic/Model/PointsOptions.vue +6 -6
  71. package/app/components/Viewer/Generic/Model/SurfacesOptions.vue +69 -38
  72. package/app/components/Viewer/ObjectTree/Base/CommonTreeView.vue +64 -46
  73. package/app/components/Viewer/ObjectTree/Base/Controls.vue +5 -5
  74. package/app/components/Viewer/ObjectTree/Base/ItemLabel.vue +13 -9
  75. package/app/components/Viewer/ObjectTree/Base/StickyHeader.vue +5 -5
  76. package/app/components/Viewer/ObjectTree/Base/TreeRow.vue +10 -10
  77. package/app/components/Viewer/ObjectTree/Box.vue +6 -4
  78. package/app/components/Viewer/ObjectTree/Layout.vue +23 -21
  79. package/app/components/Viewer/ObjectTree/Views/GlobalObjects.vue +14 -14
  80. package/app/components/Viewer/ObjectTree/Views/{ModelCollections.vue → ModelTree.vue} +59 -24
  81. package/app/components/Viewer/Options/AttributeColorBar.vue +4 -2
  82. package/app/components/Viewer/Options/AttributeRangeSelector.vue +4 -2
  83. package/app/components/Viewer/Options/AttributeSelector.vue +7 -9
  84. package/app/components/Viewer/Options/ColorMapList.vue +15 -13
  85. package/app/components/Viewer/Options/ColorMapPicker.vue +4 -4
  86. package/app/components/Viewer/Options/ColorPicker.vue +223 -41
  87. package/app/components/Viewer/Options/ColoringTypeSelector.vue +16 -16
  88. package/app/components/Viewer/Options/ColormapQuickPicker.vue +7 -5
  89. package/app/components/Viewer/Options/OptionsSection.vue +1 -1
  90. package/app/components/Viewer/Options/TextureItem.vue +8 -6
  91. package/app/components/Viewer/Options/TexturesSelector.vue +1 -1
  92. package/app/components/Viewer/OverlappingObjectsPicker.vue +8 -9
  93. package/app/components/Viewer/PointSet/SpecificPointsOptions.vue +2 -6
  94. package/app/components/Viewer/Solid/SpecificPolyhedraOptions.vue +12 -16
  95. package/app/components/Viewer/Surface/PolygonsOptions.vue +12 -16
  96. package/app/components/Viewer/Ui.vue +2 -2
  97. package/app/components/Wrapper.vue +1 -4
  98. package/app/components/ZScaling.vue +5 -3
  99. package/app/components/csv-preview/CsvPreviewer.vue +38 -37
  100. package/app/components/csv-preview/CsvSettings.vue +6 -4
  101. package/app/components/csv-preview/CsvTable.vue +1 -1
  102. package/app/composables/batch_style.ts +5 -6
  103. package/app/composables/clipping_planes_widget.ts +73 -181
  104. package/app/composables/clipping_planes_widget_entries.ts +189 -0
  105. package/app/composables/copy_to_clipboard.ts +7 -0
  106. package/app/composables/global_attribute_style.ts +163 -83
  107. package/app/composables/hover_highlight.ts +46 -14
  108. package/app/composables/model_collections.ts +26 -13
  109. package/app/composables/model_components.ts +26 -13
  110. package/app/composables/project_manager.ts +76 -19
  111. package/app/composables/responsive_middle_truncate.ts +13 -13
  112. package/app/composables/stepper_tree.ts +34 -11
  113. package/app/composables/tree_filter.ts +66 -44
  114. package/app/composables/tree_keyboard_nav.ts +25 -11
  115. package/app/composables/tree_scroll.ts +44 -14
  116. package/app/composables/use_adaptive_styles.ts +66 -23
  117. package/app/composables/use_overlapping_picker.ts +66 -16
  118. package/app/composables/use_quick_colormap.ts +16 -5
  119. package/app/composables/virtual_tree.ts +75 -43
  120. package/app/composables/vtk_implicit_plane_widget.d.ts +2 -0
  121. package/app/plugins/auto_store_register.ts +2 -7
  122. package/app/plugins/click_outside_ignore_snackbars.client.ts +39 -0
  123. package/app/stores/app.ts +57 -192
  124. package/app/stores/app_helpers/extension.ts +179 -0
  125. package/app/stores/back.ts +37 -21
  126. package/app/stores/camera_manager.ts +22 -20
  127. package/app/stores/cloud.ts +17 -13
  128. package/app/stores/data.ts +88 -47
  129. package/app/stores/data_helpers/collections.ts +36 -38
  130. package/app/stores/data_helpers/mesh.ts +45 -36
  131. package/app/stores/data_style.ts +50 -28
  132. package/app/stores/feedback.ts +6 -6
  133. package/app/stores/hybrid_viewer.ts +41 -52
  134. package/app/stores/infra.ts +39 -37
  135. package/app/stores/menu.ts +23 -14
  136. package/app/stores/treeview.ts +72 -42
  137. package/app/stores/viewer.ts +39 -27
  138. package/app/utils/attributes.ts +3 -3
  139. package/app/utils/clipping_planes.ts +111 -14
  140. package/app/utils/color_picker.ts +57 -0
  141. package/app/utils/colormap.ts +58 -35
  142. package/app/utils/default_styles/index.ts +2 -2
  143. package/app/utils/default_styles/meshes.ts +107 -13
  144. package/app/utils/default_styles/models.ts +83 -14
  145. package/app/utils/extension.ts +47 -20
  146. package/app/utils/import_workflow.ts +21 -13
  147. package/app/utils/name_cleaner.ts +1 -1
  148. package/app/utils/string.ts +1 -1
  149. package/app/utils/treeview.ts +2 -2
  150. package/internal/database/base_database.ts +7 -3
  151. package/internal/database/database.ts +36 -26
  152. package/internal/database/extended_database.ts +1 -1
  153. package/internal/stores/data_style/mesh/cells/cell.ts +70 -34
  154. package/internal/stores/data_style/mesh/cells/color.ts +12 -6
  155. package/internal/stores/data_style/mesh/cells/common.ts +18 -8
  156. package/internal/stores/data_style/mesh/cells/index.ts +122 -42
  157. package/internal/stores/data_style/mesh/cells/textures.ts +12 -6
  158. package/internal/stores/data_style/mesh/cells/vertex.ts +75 -34
  159. package/internal/stores/data_style/mesh/cells/visibility.ts +15 -4
  160. package/internal/stores/data_style/mesh/edges/color.ts +12 -6
  161. package/internal/stores/data_style/mesh/edges/common.ts +14 -6
  162. package/internal/stores/data_style/mesh/edges/edge.ts +71 -39
  163. package/internal/stores/data_style/mesh/edges/index.ts +117 -42
  164. package/internal/stores/data_style/mesh/edges/vertex.ts +76 -39
  165. package/internal/stores/data_style/mesh/edges/visibility.ts +15 -4
  166. package/internal/stores/data_style/mesh/edges/width.ts +12 -4
  167. package/internal/stores/data_style/mesh/index.ts +30 -11
  168. package/internal/stores/data_style/mesh/points/color.ts +12 -6
  169. package/internal/stores/data_style/mesh/points/common.ts +21 -8
  170. package/internal/stores/data_style/mesh/points/index.ts +101 -50
  171. package/internal/stores/data_style/mesh/points/size.ts +12 -4
  172. package/internal/stores/data_style/mesh/points/vertex.ts +75 -34
  173. package/internal/stores/data_style/mesh/points/visibility.ts +17 -7
  174. package/internal/stores/data_style/mesh/polygons/color.ts +12 -6
  175. package/internal/stores/data_style/mesh/polygons/common.ts +23 -6
  176. package/internal/stores/data_style/mesh/polygons/index.ts +130 -70
  177. package/internal/stores/data_style/mesh/polygons/polygon.ts +77 -43
  178. package/internal/stores/data_style/mesh/polygons/textures.ts +12 -6
  179. package/internal/stores/data_style/mesh/polygons/vertex.ts +79 -39
  180. package/internal/stores/data_style/mesh/polygons/visibility.ts +16 -6
  181. package/internal/stores/data_style/mesh/polyhedra/color.ts +12 -6
  182. package/internal/stores/data_style/mesh/polyhedra/common.ts +14 -6
  183. package/internal/stores/data_style/mesh/polyhedra/index.ts +115 -56
  184. package/internal/stores/data_style/mesh/polyhedra/polyhedron.ts +80 -39
  185. package/internal/stores/data_style/mesh/polyhedra/vertex.ts +79 -39
  186. package/internal/stores/data_style/mesh/polyhedra/visibility.ts +16 -6
  187. package/internal/stores/data_style/model/blocks/color.ts +43 -13
  188. package/internal/stores/data_style/model/blocks/common.ts +21 -6
  189. package/internal/stores/data_style/model/blocks/index.ts +89 -59
  190. package/internal/stores/data_style/model/blocks/polyhedron.ts +101 -44
  191. package/internal/stores/data_style/model/blocks/vertex.ts +107 -42
  192. package/internal/stores/data_style/model/blocks/visibility.ts +17 -4
  193. package/internal/stores/data_style/model/color.ts +171 -83
  194. package/internal/stores/data_style/model/common.ts +70 -21
  195. package/internal/stores/data_style/model/corners/color.ts +43 -11
  196. package/internal/stores/data_style/model/corners/common.ts +25 -6
  197. package/internal/stores/data_style/model/corners/index.ts +66 -41
  198. package/internal/stores/data_style/model/corners/vertex.ts +105 -74
  199. package/internal/stores/data_style/model/corners/visibility.ts +19 -4
  200. package/internal/stores/data_style/model/edges/common.ts +12 -4
  201. package/internal/stores/data_style/model/edges/index.ts +2 -1
  202. package/internal/stores/data_style/model/edges/visibility.ts +24 -7
  203. package/internal/stores/data_style/model/index.ts +24 -11
  204. package/internal/stores/data_style/model/lines/color.ts +41 -11
  205. package/internal/stores/data_style/model/lines/common.ts +17 -6
  206. package/internal/stores/data_style/model/lines/edge.ts +105 -42
  207. package/internal/stores/data_style/model/lines/index.ts +86 -59
  208. package/internal/stores/data_style/model/lines/vertex.ts +105 -42
  209. package/internal/stores/data_style/model/lines/visibility.ts +17 -4
  210. package/internal/stores/data_style/model/points/common.ts +8 -4
  211. package/internal/stores/data_style/model/points/index.ts +10 -3
  212. package/internal/stores/data_style/model/points/size.ts +12 -4
  213. package/internal/stores/data_style/model/points/visibility.ts +16 -6
  214. package/internal/stores/data_style/model/selection.ts +80 -58
  215. package/internal/stores/data_style/model/surfaces/color.ts +41 -11
  216. package/internal/stores/data_style/model/surfaces/common.ts +23 -6
  217. package/internal/stores/data_style/model/surfaces/index.ts +89 -59
  218. package/internal/stores/data_style/model/surfaces/polygon.ts +107 -67
  219. package/internal/stores/data_style/model/surfaces/vertex.ts +111 -67
  220. package/internal/stores/data_style/model/surfaces/visibility.ts +18 -5
  221. package/internal/stores/data_style/model/visibility.ts +82 -20
  222. package/internal/stores/data_style/state.ts +77 -65
  223. package/internal/stores/hybrid_viewer/brightness.ts +49 -31
  224. package/internal/stores/hybrid_viewer/camera.ts +191 -177
  225. package/internal/stores/hybrid_viewer/camera_animation.ts +11 -10
  226. package/internal/stores/hybrid_viewer/core.ts +64 -0
  227. package/internal/stores/hybrid_viewer/filters.ts +10 -16
  228. package/internal/stores/hybrid_viewer/highlight.ts +91 -130
  229. package/internal/stores/hybrid_viewer/ruler.ts +24 -15
  230. package/internal/stores/hybrid_viewer/scene.ts +96 -117
  231. package/internal/stores/hybrid_viewer/viewport.ts +74 -65
  232. package/internal/stores/hybrid_viewer/vtk_types.ts +13 -29
  233. package/internal/utils/api_fetch.ts +54 -23
  234. package/internal/utils/upload_file.ts +74 -53
  235. package/internal/utils/viewer_call.ts +22 -13
  236. package/internal/utils/ws_client.ts +24 -13
  237. package/nuxt.config.ts +58 -1
  238. package/package.json +20 -8
  239. package/server/api/cloud/extensions/run.post.ts +6 -10
  240. package/server/api/local/app/project_folder_path.post.ts +4 -4
  241. package/server/api/local/app/run_back.post.ts +5 -7
  242. package/server/api/local/app/run_viewer.post.ts +5 -7
  243. package/server/api/local/extensions/kill.post.ts +4 -3
  244. package/server/api/local/extensions/run.post.ts +7 -10
  245. package/server/api/local/extensions/upload.put.ts +44 -54
  246. package/server/api/microservice/app/get_is_app_ready.get.ts +4 -5
  247. package/server/api/microservice/app/set_app_base_url.post.ts +5 -6
  248. package/server/api/microservice/app/set_back_base_url.post.ts +5 -6
  249. package/server/api/microservice/app/set_is_app_ready.post.ts +5 -6
  250. package/server/api/microservice/app/set_viewer_base_url.post.ts +5 -6
  251. package/server/api/microservice/extensions/download.post.ts +5 -4
  252. package/server/api/serverless/run_cloud.post.ts +53 -11
  253. package/server/utils/app_config.ts +29 -22
  254. package/server/utils/cleanup.ts +60 -30
  255. package/server/utils/cloud.ts +9 -8
  256. package/server/utils/extension.ts +23 -9
  257. package/server/utils/microservices.ts +33 -24
  258. package/server/utils/path.ts +4 -4
  259. package/server/utils/scripts.ts +26 -23
  260. package/server/utils/server.ts +2 -2
  261. package/server/utils/server_config.ts +41 -27
  262. package/server/utils/stream.ts +6 -0
  263. package/server/utils/ws_client.ts +42 -8
  264. package/shared/scripts.ts +15 -10
  265. package/shared/utils/call_raw.ts +23 -16
  266. package/shared/utils/call_schema.ts +5 -8
  267. package/shared/utils/fetch_raw.ts +87 -47
  268. package/shared/utils/fetch_schema.ts +6 -9
  269. package/shared/utils/file.ts +8 -2
  270. package/shared/utils/response_handlers/load.ts +26 -11
  271. package/shared/utils/types.ts +9 -9
  272. package/shared/utils/validate_schema.ts +1 -1
  273. package/app/components/Viewer/ObjectTree/Views/ModelComponents.vue +0 -276
  274. package/server/types/vendor.d.ts +0 -64
  275. package/server/utils/server_config.js +0 -43
  276. package/shared/utils/call_raw.js +0 -30
  277. package/shared/utils/fetch_raw.js +0 -40
  278. /package/{opengeodeweb_front_schemas.js → .build/opengeodeweb_front_schemas.js} +0 -0
  279. /package/{server → .build/server}/utils/server.js +0 -0
  280. /package/{shared → .build/shared}/app_mode.js +0 -0
  281. /package/{shared → .build/shared}/utils/parse_boolean.js +0 -0
  282. /package/{shared → .build/shared}/utils/types.js +0 -0
@@ -1,95 +1,80 @@
1
- // Not auto-fixable (eslint's sort-imports core rule has no autofixer) and this file's import order doesn't match its syntax-kind-then-alphabetical requirement - left as-is rather than manually reordered across the codebase for a purely cosmetic rule.
2
- // oxlint-disable eslint/sort-imports
3
1
  import { HOVER_DEBOUNCE_MS, HOVER_TIMEOUT_MS } from "./constants";
2
+ import type { HoverComponentInfo, HoverData } from "./vtk_types";
3
+ import type { IndexableType } from "dexie";
4
4
  import { database } from "@ogw_internal/database/database.js";
5
- import { useHybridViewerStore } from "@ogw_front/stores/hybrid_viewer";
5
+ import { useHybridViewerCore } from "./core";
6
+ import { useHybridViewerScene } from "./scene";
6
7
  import { useViewerStore } from "@ogw_front/stores/viewer";
7
8
  import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
8
- import type { IndexableType } from "dexie";
9
- import type { Ref } from "vue";
10
- import type { HoverComponentInfo, HoverData, HybridViewerStorePublic } from "./vtk_types";
11
9
 
12
10
  // The dynamic/RPC-shaped payload of the viewer's "highlight" schema response.
13
11
  interface HighlightResponse {
14
12
  id?: string;
15
13
  picked_id?: number;
16
14
  field_type?: string;
17
- geode_id?: string;
15
+ geode_id?: string | null;
18
16
  attributes?: Record<string, unknown>;
19
17
  }
20
18
 
21
- function createClearHoverData(
22
- hoverTimeoutRef: Ref<ReturnType<typeof setTimeout> | undefined>,
23
- hoverData: Ref<HoverData | undefined>,
24
- currentHoverId: Ref<string | undefined>,
25
- ) {
26
- return function clearHoverData(): void {
19
+ // Shared via createSharedComposable (rather than merged into the parent hybridViewer store) so sibling slices, e.g. ruler.ts and viewport.ts, can read hover state/clearHoverHighlight/hoverHighlight directly without importing the parent store and creating a cycle. A Pinia store would work too but its $id/$patch/... properties would leak into the composed store's spread and collapse its inferred type.
20
+ const useHybridViewerHighlight = createSharedComposable(() => {
21
+ const is_hover_highlight = ref(false);
22
+ const hover_highlight_field_type = ref("CELL");
23
+ const hoverData = ref<HoverData | undefined>(undefined);
24
+ const hoverPosition = ref({
25
+ x: 0,
26
+ y: 0,
27
+ });
28
+ const hoverTimeoutRef = ref<ReturnType<typeof setTimeout> | undefined>(undefined);
29
+ const currentHoverId = ref<string | undefined>(undefined);
30
+
31
+ function clearHoverData(): void {
27
32
  if (hoverTimeoutRef.value) {
28
33
  clearTimeout(hoverTimeoutRef.value);
29
34
  hoverTimeoutRef.value = undefined;
30
35
  }
31
36
  hoverData.value = undefined;
32
37
  currentHoverId.value = undefined;
33
- };
34
- }
35
-
36
- function performHoverHighlight(
37
- event: MouseEvent,
38
- onResponse: (response: unknown) => void | Promise<void>,
39
- ): void {
40
- const hybridViewerStore = useHybridViewerStore();
41
- const { genericRenderWindow, hybridDb } = hybridViewerStore as unknown as HybridViewerStorePublic;
42
- const { is_hover_highlight, hover_highlight_field_type } = storeToRefs(
43
- hybridViewerStore,
44
- ) as unknown as { is_hover_highlight: Ref<boolean>; hover_highlight_field_type: Ref<string> };
45
- if (!is_hover_highlight.value) {
46
- return;
47
- }
48
- const container = genericRenderWindow.value?.getContainer();
49
- if (!container) {
50
- return;
51
38
  }
52
- const viewerStore = useViewerStore();
53
- const rect = container.getBoundingClientRect();
54
- const schema = viewer_schemas.opengeodeweb_viewer.viewer.highlight;
55
- const params = {
56
- x: Math.round(event.clientX - rect.left),
57
- y: Math.round(rect.height - (event.clientY - rect.top)),
58
- field_type: hover_highlight_field_type.value,
59
- ids: Object.keys(hybridDb),
60
- };
61
- viewerStore.request(
62
- {
63
- schema,
64
- params,
65
- },
66
- {
67
- response_function: onResponse,
68
- },
69
- );
70
- }
71
39
 
72
- interface CreateHoverHighlightParams {
73
- hoverTimeoutRef: Ref<ReturnType<typeof setTimeout> | undefined>;
74
- currentHoverId: Ref<string | undefined>;
75
- clearHoverData: () => void;
76
- }
77
-
78
- function createHoverHighlight({
79
- hoverTimeoutRef,
80
- currentHoverId,
81
- clearHoverData,
82
- }: CreateHoverHighlightParams) {
83
- return useDebounceFn((event: MouseEvent) => {
84
- const hybridViewerStore = useHybridViewerStore();
85
- const { genericRenderWindow } = hybridViewerStore as unknown as HybridViewerStorePublic;
86
- const { is_hover_highlight, hoverData, hoverPosition } = storeToRefs(
87
- hybridViewerStore,
88
- ) as unknown as {
89
- is_hover_highlight: Ref<boolean>;
90
- hoverData: Ref<HoverData | undefined>;
91
- hoverPosition: Ref<{ x: number; y: number }>;
40
+ function requestHoverHighlight(
41
+ event: MouseEvent,
42
+ onResponse: (response: unknown) => void | Promise<void>,
43
+ ): void {
44
+ if (!is_hover_highlight.value) {
45
+ return;
46
+ }
47
+ const { genericRenderWindow } = useHybridViewerCore();
48
+ const { hybridDb } = useHybridViewerScene();
49
+ const container = genericRenderWindow.value?.getContainer();
50
+ if (!container) {
51
+ return;
52
+ }
53
+ const viewerStore = useViewerStore();
54
+ const rect = container.getBoundingClientRect();
55
+ const schema = viewer_schemas.opengeodeweb_viewer.viewer.highlight;
56
+ const params = {
57
+ x: Math.round(event.clientX - rect.left),
58
+ y: Math.round(rect.height - (event.clientY - rect.top)),
59
+ field_type: hover_highlight_field_type.value,
60
+ ids: Object.keys(hybridDb),
92
61
  };
62
+ viewerStore
63
+ .request(
64
+ {
65
+ schema,
66
+ params,
67
+ },
68
+ {
69
+ response_function: onResponse,
70
+ },
71
+ )
72
+ // oxlint-disable-next-line promise/prefer-await-to-then -- fire-and-forget inside a sync caller; see codebase convention in global_attribute_style.ts.
73
+ .catch(() => undefined);
74
+ }
75
+
76
+ const hoverHighlight = useDebounceFn((event: MouseEvent) => {
77
+ const { genericRenderWindow } = useHybridViewerCore();
93
78
  const containerElement = genericRenderWindow.value?.getContainer();
94
79
  const relativeMousePosition = containerElement
95
80
  ? {
@@ -100,11 +85,16 @@ function createHoverHighlight({
100
85
  x: event.clientX,
101
86
  y: event.clientY,
102
87
  };
103
- performHoverHighlight(event, async (rawResponse: unknown) => {
88
+ requestHoverHighlight(event, async (rawResponse: unknown) => {
89
+ // oxlint-disable-next-line no-unsafe-type-assertion -- trusted viewer RPC response boundary.
104
90
  const response = rawResponse as HighlightResponse | undefined;
105
- const isResponseValid =
106
- response && response.id && response.picked_id !== undefined && response.picked_id !== -1;
107
- if (!is_hover_highlight.value || !isResponseValid) {
91
+ if (
92
+ !is_hover_highlight.value ||
93
+ response === undefined ||
94
+ response.id === undefined ||
95
+ response.picked_id === undefined ||
96
+ response.picked_id === -1
97
+ ) {
108
98
  clearHoverData();
109
99
  return;
110
100
  }
@@ -120,19 +110,14 @@ function createHoverHighlight({
120
110
  currentHoverId.value = hoverKey;
121
111
  let componentInfo: HoverComponentInfo | undefined = undefined;
122
112
  let modelName: string | undefined = undefined;
123
- const modelRecord = (await database.data?.get(response.id as string)) as
124
- | { name?: string }
125
- | undefined;
113
+ const modelRecord = (await database.data?.get(response.id)) as { name?: string } | undefined;
126
114
  if (modelRecord) {
127
115
  modelName = modelRecord.name;
128
116
  }
129
117
  const modelComponentsTable = database.model_components;
130
- if (response.geode_id && modelComponentsTable) {
118
+ if (response.geode_id !== undefined && response.geode_id !== null && modelComponentsTable) {
131
119
  const components = modelComponentsTable.where("[id+geode_id]");
132
- const query = components.equals([
133
- response.id as string,
134
- response.geode_id,
135
- ] as IndexableType);
120
+ const query = components.equals([response.id, response.geode_id] as IndexableType);
136
121
  const component = (await query.first()) as
137
122
  | { name?: string; geode_id?: string; type?: string }
138
123
  | undefined;
@@ -145,13 +130,13 @@ function createHoverHighlight({
145
130
  }
146
131
  }
147
132
  const newHoverData: HoverData = {
148
- modelId: response.id as string,
133
+ modelId: response.id,
149
134
  modelName,
150
- blockName: response.geode_id,
135
+ blockName: response.geode_id ?? undefined,
151
136
  pickedId: response.picked_id,
152
137
  fieldType: response.field_type,
153
138
  component: componentInfo,
154
- attributes: response.attributes || {},
139
+ attributes: response.attributes ?? {},
155
140
  };
156
141
  hoverTimeoutRef.value = setTimeout(() => {
157
142
  hoverPosition.value = relativeMousePosition;
@@ -160,47 +145,29 @@ function createHoverHighlight({
160
145
  }, HOVER_TIMEOUT_MS);
161
146
  });
162
147
  }, HOVER_DEBOUNCE_MS);
163
- }
164
- function performClearHoverHighlight(): void {
165
- const hybridViewerStore = useHybridViewerStore();
166
- const { hybridDb } = hybridViewerStore as unknown as HybridViewerStorePublic;
167
- const { hover_highlight_field_type } = storeToRefs(hybridViewerStore) as unknown as {
168
- hover_highlight_field_type: Ref<string>;
169
- };
170
- const viewerStore = useViewerStore();
171
- const schema = viewer_schemas.opengeodeweb_viewer.viewer.highlight;
172
- const params = {
173
- x: -1,
174
- y: -1,
175
- field_type: hover_highlight_field_type.value,
176
- ids: Object.keys(hybridDb),
177
- };
178
- viewerStore.request({
179
- schema,
180
- params,
181
- });
182
- }
183
148
 
184
- function useHybridViewerHighlight() {
185
- const is_hover_highlight = ref(false);
186
- const hover_highlight_field_type = ref("CELL");
187
- const hoverData = ref<HoverData | undefined>(undefined);
188
- const hoverPosition = ref({
189
- x: 0,
190
- y: 0,
191
- });
192
- const hoverTimeoutRef = ref<ReturnType<typeof setTimeout> | undefined>(undefined);
193
- const currentHoverId = ref<string | undefined>(undefined);
194
- const clearHoverData = createClearHoverData(hoverTimeoutRef, hoverData, currentHoverId);
195
- const hoverHighlight = createHoverHighlight({
196
- hoverTimeoutRef,
197
- currentHoverId,
198
- clearHoverData,
199
- });
149
+ function requestClearHoverHighlight(): void {
150
+ const { hybridDb } = useHybridViewerScene();
151
+ const viewerStore = useViewerStore();
152
+ const schema = viewer_schemas.opengeodeweb_viewer.viewer.highlight;
153
+ const params = {
154
+ x: -1,
155
+ y: -1,
156
+ field_type: hover_highlight_field_type.value,
157
+ ids: Object.keys(hybridDb),
158
+ };
159
+ viewerStore
160
+ .request({
161
+ schema,
162
+ params,
163
+ })
164
+ // oxlint-disable-next-line promise/prefer-await-to-then -- fire-and-forget inside a sync caller; see codebase convention in global_attribute_style.ts.
165
+ .catch(() => undefined);
166
+ }
200
167
 
201
168
  function clearHoverHighlight(): void {
202
169
  clearHoverData();
203
- performClearHoverHighlight();
170
+ requestClearHoverHighlight();
204
171
  }
205
172
 
206
173
  return {
@@ -211,12 +178,6 @@ function useHybridViewerHighlight() {
211
178
  clearHoverHighlight,
212
179
  hoverHighlight,
213
180
  };
214
- }
181
+ });
215
182
 
216
- export {
217
- createClearHoverData,
218
- createHoverHighlight,
219
- performClearHoverHighlight,
220
- performHoverHighlight,
221
- useHybridViewerHighlight,
222
- };
183
+ export { useHybridViewerHighlight };
@@ -1,17 +1,26 @@
1
- // Not auto-fixable (eslint's sort-imports core rule has no autofixer) and this file's import order doesn't match its syntax-kind-then-alphabetical requirement - left as-is rather than manually reordered across the codebase for a purely cosmetic rule.
2
- // oxlint-disable eslint/sort-imports
3
- import { useHybridViewerStore } from "@ogw_front/stores/hybrid_viewer";
1
+ import { useHybridViewerCore } from "./core";
2
+ import { useHybridViewerHighlight } from "./highlight";
3
+ import { useHybridViewerScene } from "./scene";
4
4
  import { useViewerStore } from "@ogw_front/stores/viewer";
5
5
  import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
6
- import type { Ref } from "vue";
7
- import type { HybridViewerStorePublic } from "./vtk_types";
8
6
 
9
7
  interface RulerHoverState {
10
8
  active: boolean;
11
9
  fieldType: string;
12
10
  }
13
11
 
14
- function useHybridViewerRuler() {
12
+ function useHybridViewerRuler(): {
13
+ is_ruler_active: Ref<boolean>;
14
+ ruler_snap: Ref<boolean>;
15
+ ruler_point1: Ref<number[] | undefined>;
16
+ ruler_point2: Ref<number[] | undefined>;
17
+ ruler_distance: Ref<number | undefined>;
18
+ ruler_awaiting_point: Ref<number>;
19
+ handleRulerClick: (x: number, y: number) => Promise<void>;
20
+ applyRuler: () => Promise<void>;
21
+ clearRuler: () => Promise<void>;
22
+ deactivateRuler: () => void;
23
+ } {
15
24
  const is_ruler_active = ref(false);
16
25
  const ruler_snap = ref(false);
17
26
  const ruler_point1 = ref<number[] | undefined>(undefined);
@@ -21,11 +30,8 @@ function useHybridViewerRuler() {
21
30
  const ruler_previous_hover_state = ref<RulerHoverState>({ active: false, fieldType: "CELL" });
22
31
 
23
32
  function updateRulerSnapHighlight(): void {
24
- const hybridViewerStore = useHybridViewerStore();
25
- const { is_hover_highlight, hover_highlight_field_type } = storeToRefs(
26
- hybridViewerStore,
27
- ) as unknown as { is_hover_highlight: Ref<boolean>; hover_highlight_field_type: Ref<string> };
28
- const { clearHoverHighlight } = hybridViewerStore as unknown as HybridViewerStorePublic;
33
+ const { is_hover_highlight, hover_highlight_field_type, clearHoverHighlight } =
34
+ useHybridViewerHighlight();
29
35
 
30
36
  if (is_ruler_active.value && ruler_snap.value) {
31
37
  ruler_previous_hover_state.value = {
@@ -52,9 +58,10 @@ function useHybridViewerRuler() {
52
58
  const points = ruler_point2.value
53
59
  ? [ruler_point1.value, ruler_point2.value]
54
60
  : [ruler_point1.value];
55
- const { remoteRender } = useHybridViewerStore() as unknown as HybridViewerStorePublic;
61
+ const { remoteRender } = useHybridViewerCore();
56
62
  const viewerStore = useViewerStore();
57
63
  const schema = viewer_schemas.opengeodeweb_viewer.viewer.ruler;
64
+ // oxlint-disable-next-line no-unsafe-type-assertion -- response shape is defined by the ruler schema.
58
65
  const response = (await viewerStore.request({ schema, params: { points } })) as {
59
66
  distance?: number;
60
67
  };
@@ -63,7 +70,7 @@ function useHybridViewerRuler() {
63
70
  }
64
71
 
65
72
  async function handleRulerClick(x: number, y: number): Promise<void> {
66
- const { hybridDb } = useHybridViewerStore() as unknown as HybridViewerStorePublic;
73
+ const { hybridDb } = useHybridViewerScene();
67
74
  const viewerStore = useViewerStore();
68
75
  let coords: number[] | undefined = undefined;
69
76
  if (ruler_snap.value) {
@@ -74,6 +81,7 @@ function useHybridViewerRuler() {
74
81
  field_type: "POINT",
75
82
  ids: Object.keys(hybridDb),
76
83
  };
84
+ // oxlint-disable-next-line no-unsafe-type-assertion -- response shape is defined by the highlight schema.
77
85
  const response = (await viewerStore.request({ schema, params })) as {
78
86
  attributes?: { coordinates?: number[] };
79
87
  };
@@ -81,6 +89,7 @@ function useHybridViewerRuler() {
81
89
  } else {
82
90
  const schema = viewer_schemas.opengeodeweb_viewer.viewer.get_point_position;
83
91
  const params = { x: Math.round(x), y: Math.round(y) };
92
+ // oxlint-disable-next-line no-unsafe-type-assertion -- response shape is defined by the get_point_position schema.
84
93
  const response = (await viewerStore.request({ schema, params })) as {
85
94
  x: number;
86
95
  y: number;
@@ -105,7 +114,7 @@ function useHybridViewerRuler() {
105
114
  }
106
115
 
107
116
  function deactivateRuler(): void {
108
- const { clearHoverHighlight } = useHybridViewerStore() as unknown as HybridViewerStorePublic;
117
+ const { clearHoverHighlight } = useHybridViewerHighlight();
109
118
  is_ruler_active.value = false;
110
119
  clearHoverHighlight();
111
120
  }
@@ -116,7 +125,7 @@ function useHybridViewerRuler() {
116
125
  ruler_distance.value = undefined;
117
126
  ruler_awaiting_point.value = 1;
118
127
  deactivateRuler();
119
- const { remoteRender } = useHybridViewerStore() as unknown as HybridViewerStorePublic;
128
+ const { remoteRender } = useHybridViewerCore();
120
129
  const viewerStore = useViewerStore();
121
130
  const schema = viewer_schemas.opengeodeweb_viewer.viewer.reset_ruler;
122
131
  await viewerStore.request({ schema });
@@ -1,131 +1,116 @@
1
- // Not auto-fixable (eslint's sort-imports core rule has no autofixer) and this file's import order doesn't match its syntax-kind-then-alphabetical requirement - left as-is rather than manually reordered across the codebase for a purely cosmetic rule.
2
- // oxlint-disable eslint/sort-imports
1
+ import type { HybridDb, vtkActor as VtkActorInstance } from "./vtk_types";
2
+ import { requireRenderWindow, useHybridViewerCore } from "./core";
3
3
  import { ACTOR_COLOR } from "./constants";
4
4
  import { useDataStore } from "@ogw_front/stores/data";
5
- import { useHybridViewerStore } from "@ogw_front/stores/hybrid_viewer";
6
5
  import { useViewerStore } from "@ogw_front/stores/viewer";
7
6
  import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
8
7
  import { newInstance as vtkActor } from "@kitware/vtk.js/Rendering/Core/Actor";
9
8
  import { newInstance as vtkMapper } from "@kitware/vtk.js/Rendering/Core/Mapper";
9
+ import type vtkPolyData from "@kitware/vtk.js/Common/DataModel/PolyData";
10
10
  import { newInstance as vtkXMLPolyDataReader } from "@kitware/vtk.js/IO/XML/XMLPolyDataReader";
11
- import type { HybridDb, HybridViewerStorePublic, vtkActor as VtkActorInstance } from "./vtk_types";
12
11
 
13
- async function performAddItem(id: string): Promise<void> {
14
- const { genericRenderWindow, hybridDb } =
15
- useHybridViewerStore() as unknown as HybridViewerStorePublic;
16
- if (!genericRenderWindow.value) {
17
- return;
18
- }
19
- const dataStore = useDataStore();
20
- const value = await dataStore.item(id);
21
- if (value && !dataStore.isItemViewable(value)) {
22
- return;
23
- }
24
- const reader = vtkXMLPolyDataReader();
25
- await reader.parseAsArrayBuffer(
26
- new TextEncoder().encode(value.binary_light_viewable as string).buffer as ArrayBuffer,
27
- );
28
- const actor = vtkActor();
29
- const mapper = vtkMapper();
30
- const polydata = reader.getOutputData(0);
31
- mapper.setInputData(polydata);
32
- const property = actor.getProperty();
33
- property.setColor(ACTOR_COLOR);
34
- actor.setMapper(mapper);
35
- const renderer = genericRenderWindow.value.getRenderer();
36
- if (hybridDb[id] && hybridDb[id].actor) {
37
- renderer.removeActor(hybridDb[id].actor);
38
- }
39
- const actors = renderer.getActors();
40
- const isFirst = actors.length === 0;
41
- renderer.addActor(actor);
42
- if (isFirst) {
43
- renderer.resetCamera();
44
- }
45
- hybridDb[id] = {
46
- actor,
47
- polydata,
48
- mapper,
49
- };
50
- }
51
- function performRemoveItem(id: string): void {
52
- const { genericRenderWindow, hybridDb } =
53
- useHybridViewerStore() as unknown as HybridViewerStorePublic;
54
- if (!hybridDb[id]) {
55
- return;
56
- }
57
- const renderer = genericRenderWindow.value!.getRenderer();
58
- renderer.removeActor(hybridDb[id]!.actor);
59
- const renderWindow = genericRenderWindow.value!.getRenderWindow();
60
- renderWindow.render();
61
- delete hybridDb[id];
62
- }
63
- function performSetVisibility(id: string, visibility: boolean): void {
64
- const { genericRenderWindow, hybridDb } =
65
- useHybridViewerStore() as unknown as HybridViewerStorePublic;
66
- if (!hybridDb[id]) {
67
- return;
68
- }
69
- hybridDb[id]!.actor.setVisibility(visibility);
70
- const renderWindow = genericRenderWindow.value!.getRenderWindow();
71
- renderWindow.render();
72
- }
73
- async function performSetZScaling(z_scale: number): Promise<void> {
74
- const hybridViewerStore = useHybridViewerStore();
75
- const { genericRenderWindow, remoteRender } =
76
- hybridViewerStore as unknown as HybridViewerStorePublic;
77
- const { zScale } = storeToRefs(hybridViewerStore) as unknown as { zScale: Ref<number> };
78
- zScale.value = z_scale;
79
- const renderer = genericRenderWindow.value!.getRenderer();
80
- for (const actor of renderer.getActors() as VtkActorInstance[]) {
81
- const scale = actor.getScale();
82
- actor.setScale(scale[0] ?? 1, scale[1] ?? 1, z_scale);
83
- }
84
- renderer.resetCamera();
85
- const renderWindow = genericRenderWindow.value!.getRenderWindow();
86
- renderWindow.render();
87
- const viewerStore = useViewerStore();
88
- const schema = viewer_schemas.opengeodeweb_viewer.viewer.set_z_scaling;
89
- const params = {
90
- z_scale,
91
- };
92
- await viewerStore.request({
93
- schema,
94
- params,
95
- });
96
- await remoteRender();
97
- }
98
- function performClear(): void {
99
- const { genericRenderWindow, hybridDb } =
100
- useHybridViewerStore() as unknown as HybridViewerStorePublic;
101
- const renderer = genericRenderWindow.value!.getRenderer();
102
- for (const actor of renderer.getActors()) {
103
- renderer.removeActor(actor);
104
- }
105
- const renderWindow = genericRenderWindow.value!.getRenderWindow();
106
- renderWindow.render();
107
- for (const id of Object.keys(hybridDb)) {
108
- delete hybridDb[id];
109
- }
110
- }
111
- function useHybridViewerScene() {
12
+ // Shared via createSharedComposable (rather than merged into the parent hybridViewer store) so sibling slices, e.g. camera.ts and ruler.ts, can read hybridDb/setZScaling directly without importing the parent store and creating a cycle. A Pinia store would work too but its $id/$patch/... properties would leak into the composed store's spread and collapse its inferred type.
13
+ const useHybridViewerScene = createSharedComposable(() => {
112
14
  const hybridDb = reactive<HybridDb>({});
113
15
  const zScale = ref(1);
16
+
114
17
  async function addItem(id: string): Promise<void> {
115
- await performAddItem(id);
18
+ const { genericRenderWindow } = useHybridViewerCore();
19
+ if (!genericRenderWindow.value) {
20
+ return;
21
+ }
22
+ const dataStore = useDataStore();
23
+ const isViewable = await dataStore.isItemViewable(id);
24
+ if (!isViewable) {
25
+ return;
26
+ }
27
+ const value = await dataStore.item(id);
28
+ const reader = vtkXMLPolyDataReader();
29
+ reader.parseAsArrayBuffer(new TextEncoder().encode(value.binary_light_viewable).buffer);
30
+ const actor = vtkActor();
31
+ const mapper = vtkMapper();
32
+ // oxlint-disable-next-line no-unsafe-type-assertion -- vtk.js's algorithm interface types getOutputData as `any`; this reader always produces polydata.
33
+ const polydata = reader.getOutputData(0) as unknown as vtkPolyData;
34
+ mapper.setInputData(polydata);
35
+ const property = actor.getProperty();
36
+ property.setColor(ACTOR_COLOR);
37
+ actor.setMapper(mapper);
38
+ const renderer = genericRenderWindow.value.getRenderer();
39
+ if (hybridDb[id]) {
40
+ renderer.removeActor(hybridDb[id].actor);
41
+ }
42
+ const actors = renderer.getActors();
43
+ const isFirst = actors.length === 0;
44
+ renderer.addActor(actor);
45
+ if (isFirst) {
46
+ renderer.resetCamera();
47
+ }
48
+ hybridDb[id] = {
49
+ actor,
50
+ polydata,
51
+ mapper,
52
+ };
116
53
  }
54
+
117
55
  function removeItem(id: string): void {
118
- performRemoveItem(id);
56
+ const { genericRenderWindow } = useHybridViewerCore();
57
+ if (!hybridDb[id]) {
58
+ return;
59
+ }
60
+ const renderer = requireRenderWindow(genericRenderWindow).getRenderer();
61
+ renderer.removeActor(hybridDb[id].actor);
62
+ const renderWindow = requireRenderWindow(genericRenderWindow).getRenderWindow();
63
+ renderWindow.render();
64
+ Reflect.deleteProperty(hybridDb, id);
119
65
  }
66
+
120
67
  function setVisibility(id: string, visibility: boolean): void {
121
- performSetVisibility(id, visibility);
68
+ const { genericRenderWindow } = useHybridViewerCore();
69
+ if (!hybridDb[id]) {
70
+ return;
71
+ }
72
+ hybridDb[id].actor.setVisibility(visibility);
73
+ const renderWindow = requireRenderWindow(genericRenderWindow).getRenderWindow();
74
+ renderWindow.render();
122
75
  }
76
+
123
77
  async function setZScaling(z_scale: number): Promise<void> {
124
- await performSetZScaling(z_scale);
78
+ const { genericRenderWindow, remoteRender } = useHybridViewerCore();
79
+ zScale.value = z_scale;
80
+ const renderer = requireRenderWindow(genericRenderWindow).getRenderer();
81
+ // oxlint-disable-next-line no-unsafe-type-assertion -- renderer.getActors() is typed as vtkProp[] in vtk.js, but this scene only ever adds vtkActor instances.
82
+ for (const actor of renderer.getActors() as VtkActorInstance[]) {
83
+ const scale = actor.getScale();
84
+ actor.setScale(scale[0] ?? 1, scale[1] ?? 1, z_scale);
85
+ }
86
+ renderer.resetCamera();
87
+ const renderWindow = requireRenderWindow(genericRenderWindow).getRenderWindow();
88
+ renderWindow.render();
89
+ const viewerStore = useViewerStore();
90
+ const schema = viewer_schemas.opengeodeweb_viewer.viewer.set_z_scaling;
91
+ const params = {
92
+ z_scale,
93
+ };
94
+ await viewerStore.request({
95
+ schema,
96
+ params,
97
+ });
98
+ await remoteRender();
125
99
  }
100
+
126
101
  function clear(): void {
127
- performClear();
102
+ const { genericRenderWindow } = useHybridViewerCore();
103
+ const renderer = requireRenderWindow(genericRenderWindow).getRenderer();
104
+ for (const actor of renderer.getActors()) {
105
+ renderer.removeActor(actor);
106
+ }
107
+ const renderWindow = requireRenderWindow(genericRenderWindow).getRenderWindow();
108
+ renderWindow.render();
109
+ for (const id of Object.keys(hybridDb)) {
110
+ Reflect.deleteProperty(hybridDb, id);
111
+ }
128
112
  }
113
+
129
114
  return {
130
115
  hybridDb,
131
116
  zScale,
@@ -135,12 +120,6 @@ function useHybridViewerScene() {
135
120
  setZScaling,
136
121
  clear,
137
122
  };
138
- }
139
- export {
140
- performAddItem,
141
- performClear,
142
- performRemoveItem,
143
- performSetVisibility,
144
- performSetZScaling,
145
- useHybridViewerScene,
146
- };
123
+ });
124
+
125
+ export { useHybridViewerScene };