@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.
- package/{server → .build/server}/utils/app_config.js +10 -9
- package/{server → .build/server}/utils/cleanup.js +31 -17
- package/{server → .build/server}/utils/cloud.js +1 -4
- package/{server → .build/server}/utils/microservices.js +21 -9
- package/{server → .build/server}/utils/path.js +4 -4
- package/{server → .build/server}/utils/scripts.js +9 -9
- package/.build/server/utils/server_config.js +51 -0
- package/.build/server/utils/stream.js +6 -0
- package/{server → .build/server}/utils/ws_client.js +18 -3
- package/{shared → .build/shared}/scripts.js +10 -10
- package/.build/shared/utils/call_raw.js +31 -0
- package/{shared → .build/shared}/utils/call_schema.js +2 -2
- package/.build/shared/utils/fetch_raw.js +52 -0
- package/{shared → .build/shared}/utils/fetch_schema.js +2 -2
- package/{shared → .build/shared}/utils/file.js +3 -1
- package/{shared → .build/shared}/utils/response_handlers/load.js +10 -7
- package/{shared → .build/shared}/utils/validate_schema.js +1 -1
- package/app/components/ActionButton.vue +6 -6
- package/app/components/CameraManager/List.vue +5 -5
- package/app/components/CameraManager/Saver.vue +3 -5
- package/app/components/CameraManager.vue +6 -4
- package/app/components/CameraOrientation.vue +12 -12
- package/app/components/ClippingPlaneCard.vue +4 -2
- package/app/components/ClippingPlanes.vue +8 -8
- package/app/components/CrsSelector.vue +9 -10
- package/app/components/DeleteDialog.vue +4 -2
- package/app/components/DragAndDrop.vue +10 -12
- package/app/components/DragAndDropInternal/DragAndDropInline.vue +4 -2
- package/app/components/ExtensionSelector.vue +4 -4
- package/app/components/FeedBack/ErrorBanner.vue +3 -1
- package/app/components/FeedBack/Snackers.vue +4 -3
- package/app/components/FileSelector.vue +10 -8
- package/app/components/FileUploader.vue +11 -11
- package/app/components/GlassCard.vue +1 -1
- package/app/components/HybridRenderingView.vue +7 -5
- package/app/components/HybridViewerTooltip.vue +7 -7
- package/app/components/Launcher.vue +1 -1
- package/app/components/Loading/EcoMessages.vue +9 -3
- package/app/components/Loading.vue +2 -2
- package/app/components/MissingFilesSelector.vue +12 -10
- package/app/components/ObjectSelector.vue +10 -9
- package/app/components/PackagesVersions.vue +6 -5
- package/app/components/Recaptcha.vue +3 -3
- package/app/components/RemoteRenderingView.vue +6 -7
- package/app/components/Ruler.vue +3 -3
- package/app/components/Screenshot.vue +6 -6
- package/app/components/SearchBar.vue +4 -2
- package/app/components/ShrinkFilter.vue +7 -7
- package/app/components/Step.vue +6 -5
- package/app/components/Stepper.vue +4 -3
- package/app/components/ToolPanel.vue +6 -3
- package/app/components/ViewToolbar.vue +25 -28
- package/app/components/Viewer/ContextMenu/CenterButton.vue +7 -5
- package/app/components/Viewer/ContextMenu/CircularItems.vue +3 -3
- package/app/components/Viewer/ContextMenu/ContextMenu.vue +22 -19
- package/app/components/Viewer/ContextMenu/ContextMenuItem.vue +10 -8
- package/app/components/Viewer/ContextMenu/InfoCard.vue +11 -12
- package/app/components/Viewer/EdgedCurve/SpecificEdgesOptions.vue +13 -17
- package/app/components/Viewer/Generic/Mesh/CellsOptions.vue +11 -15
- package/app/components/Viewer/Generic/Mesh/EdgesOptions.vue +12 -16
- package/app/components/Viewer/Generic/Mesh/PointsOptions.vue +8 -12
- package/app/components/Viewer/Generic/Mesh/PolygonsOptions.vue +11 -15
- package/app/components/Viewer/Generic/Mesh/PolyhedraOptions.vue +11 -15
- package/app/components/Viewer/Generic/Model/BlocksOptions.vue +67 -38
- package/app/components/Viewer/Generic/Model/CornersOptions.vue +53 -23
- package/app/components/Viewer/Generic/Model/EdgesOptions.vue +1 -3
- package/app/components/Viewer/Generic/Model/LinesOptions.vue +67 -38
- package/app/components/Viewer/Generic/Model/ModelStyleCard.vue +31 -15
- package/app/components/Viewer/Generic/Model/ModelStyleOptions.vue +2 -3
- package/app/components/Viewer/Generic/Model/PointsOptions.vue +6 -6
- package/app/components/Viewer/Generic/Model/SurfacesOptions.vue +69 -38
- package/app/components/Viewer/ObjectTree/Base/CommonTreeView.vue +64 -46
- package/app/components/Viewer/ObjectTree/Base/Controls.vue +5 -5
- package/app/components/Viewer/ObjectTree/Base/ItemLabel.vue +13 -9
- package/app/components/Viewer/ObjectTree/Base/StickyHeader.vue +5 -5
- package/app/components/Viewer/ObjectTree/Base/TreeRow.vue +10 -10
- package/app/components/Viewer/ObjectTree/Box.vue +6 -4
- package/app/components/Viewer/ObjectTree/Layout.vue +23 -21
- package/app/components/Viewer/ObjectTree/Views/GlobalObjects.vue +14 -14
- package/app/components/Viewer/ObjectTree/Views/{ModelCollections.vue → ModelTree.vue} +59 -24
- package/app/components/Viewer/Options/AttributeColorBar.vue +4 -2
- package/app/components/Viewer/Options/AttributeRangeSelector.vue +4 -2
- package/app/components/Viewer/Options/AttributeSelector.vue +7 -9
- package/app/components/Viewer/Options/ColorMapList.vue +15 -13
- package/app/components/Viewer/Options/ColorMapPicker.vue +4 -4
- package/app/components/Viewer/Options/ColorPicker.vue +223 -41
- package/app/components/Viewer/Options/ColoringTypeSelector.vue +16 -16
- package/app/components/Viewer/Options/ColormapQuickPicker.vue +7 -5
- package/app/components/Viewer/Options/OptionsSection.vue +1 -1
- package/app/components/Viewer/Options/TextureItem.vue +8 -6
- package/app/components/Viewer/Options/TexturesSelector.vue +1 -1
- package/app/components/Viewer/OverlappingObjectsPicker.vue +8 -9
- package/app/components/Viewer/PointSet/SpecificPointsOptions.vue +2 -6
- package/app/components/Viewer/Solid/SpecificPolyhedraOptions.vue +12 -16
- package/app/components/Viewer/Surface/PolygonsOptions.vue +12 -16
- package/app/components/Viewer/Ui.vue +2 -2
- package/app/components/Wrapper.vue +1 -4
- package/app/components/ZScaling.vue +5 -3
- package/app/components/csv-preview/CsvPreviewer.vue +38 -37
- package/app/components/csv-preview/CsvSettings.vue +6 -4
- package/app/components/csv-preview/CsvTable.vue +1 -1
- package/app/composables/batch_style.ts +5 -6
- package/app/composables/clipping_planes_widget.ts +73 -181
- package/app/composables/clipping_planes_widget_entries.ts +189 -0
- package/app/composables/copy_to_clipboard.ts +7 -0
- package/app/composables/global_attribute_style.ts +163 -83
- package/app/composables/hover_highlight.ts +46 -14
- package/app/composables/model_collections.ts +26 -13
- package/app/composables/model_components.ts +26 -13
- package/app/composables/project_manager.ts +76 -19
- package/app/composables/responsive_middle_truncate.ts +13 -13
- package/app/composables/stepper_tree.ts +34 -11
- package/app/composables/tree_filter.ts +66 -44
- package/app/composables/tree_keyboard_nav.ts +25 -11
- package/app/composables/tree_scroll.ts +44 -14
- package/app/composables/use_adaptive_styles.ts +66 -23
- package/app/composables/use_overlapping_picker.ts +66 -16
- package/app/composables/use_quick_colormap.ts +16 -5
- package/app/composables/virtual_tree.ts +75 -43
- package/app/composables/vtk_implicit_plane_widget.d.ts +2 -0
- package/app/plugins/auto_store_register.ts +2 -7
- package/app/plugins/click_outside_ignore_snackbars.client.ts +39 -0
- package/app/stores/app.ts +57 -192
- package/app/stores/app_helpers/extension.ts +179 -0
- package/app/stores/back.ts +37 -21
- package/app/stores/camera_manager.ts +22 -20
- package/app/stores/cloud.ts +17 -13
- package/app/stores/data.ts +88 -47
- package/app/stores/data_helpers/collections.ts +36 -38
- package/app/stores/data_helpers/mesh.ts +45 -36
- package/app/stores/data_style.ts +50 -28
- package/app/stores/feedback.ts +6 -6
- package/app/stores/hybrid_viewer.ts +41 -52
- package/app/stores/infra.ts +39 -37
- package/app/stores/menu.ts +23 -14
- package/app/stores/treeview.ts +72 -42
- package/app/stores/viewer.ts +39 -27
- package/app/utils/attributes.ts +3 -3
- package/app/utils/clipping_planes.ts +111 -14
- package/app/utils/color_picker.ts +57 -0
- package/app/utils/colormap.ts +58 -35
- package/app/utils/default_styles/index.ts +2 -2
- package/app/utils/default_styles/meshes.ts +107 -13
- package/app/utils/default_styles/models.ts +83 -14
- package/app/utils/extension.ts +47 -20
- package/app/utils/import_workflow.ts +21 -13
- package/app/utils/name_cleaner.ts +1 -1
- package/app/utils/string.ts +1 -1
- package/app/utils/treeview.ts +2 -2
- package/internal/database/base_database.ts +7 -3
- package/internal/database/database.ts +36 -26
- package/internal/database/extended_database.ts +1 -1
- package/internal/stores/data_style/mesh/cells/cell.ts +70 -34
- package/internal/stores/data_style/mesh/cells/color.ts +12 -6
- package/internal/stores/data_style/mesh/cells/common.ts +18 -8
- package/internal/stores/data_style/mesh/cells/index.ts +122 -42
- package/internal/stores/data_style/mesh/cells/textures.ts +12 -6
- package/internal/stores/data_style/mesh/cells/vertex.ts +75 -34
- package/internal/stores/data_style/mesh/cells/visibility.ts +15 -4
- package/internal/stores/data_style/mesh/edges/color.ts +12 -6
- package/internal/stores/data_style/mesh/edges/common.ts +14 -6
- package/internal/stores/data_style/mesh/edges/edge.ts +71 -39
- package/internal/stores/data_style/mesh/edges/index.ts +117 -42
- package/internal/stores/data_style/mesh/edges/vertex.ts +76 -39
- package/internal/stores/data_style/mesh/edges/visibility.ts +15 -4
- package/internal/stores/data_style/mesh/edges/width.ts +12 -4
- package/internal/stores/data_style/mesh/index.ts +30 -11
- package/internal/stores/data_style/mesh/points/color.ts +12 -6
- package/internal/stores/data_style/mesh/points/common.ts +21 -8
- package/internal/stores/data_style/mesh/points/index.ts +101 -50
- package/internal/stores/data_style/mesh/points/size.ts +12 -4
- package/internal/stores/data_style/mesh/points/vertex.ts +75 -34
- package/internal/stores/data_style/mesh/points/visibility.ts +17 -7
- package/internal/stores/data_style/mesh/polygons/color.ts +12 -6
- package/internal/stores/data_style/mesh/polygons/common.ts +23 -6
- package/internal/stores/data_style/mesh/polygons/index.ts +130 -70
- package/internal/stores/data_style/mesh/polygons/polygon.ts +77 -43
- package/internal/stores/data_style/mesh/polygons/textures.ts +12 -6
- package/internal/stores/data_style/mesh/polygons/vertex.ts +79 -39
- package/internal/stores/data_style/mesh/polygons/visibility.ts +16 -6
- package/internal/stores/data_style/mesh/polyhedra/color.ts +12 -6
- package/internal/stores/data_style/mesh/polyhedra/common.ts +14 -6
- package/internal/stores/data_style/mesh/polyhedra/index.ts +115 -56
- package/internal/stores/data_style/mesh/polyhedra/polyhedron.ts +80 -39
- package/internal/stores/data_style/mesh/polyhedra/vertex.ts +79 -39
- package/internal/stores/data_style/mesh/polyhedra/visibility.ts +16 -6
- package/internal/stores/data_style/model/blocks/color.ts +43 -13
- package/internal/stores/data_style/model/blocks/common.ts +21 -6
- package/internal/stores/data_style/model/blocks/index.ts +89 -59
- package/internal/stores/data_style/model/blocks/polyhedron.ts +101 -44
- package/internal/stores/data_style/model/blocks/vertex.ts +107 -42
- package/internal/stores/data_style/model/blocks/visibility.ts +17 -4
- package/internal/stores/data_style/model/color.ts +171 -83
- package/internal/stores/data_style/model/common.ts +70 -21
- package/internal/stores/data_style/model/corners/color.ts +43 -11
- package/internal/stores/data_style/model/corners/common.ts +25 -6
- package/internal/stores/data_style/model/corners/index.ts +66 -41
- package/internal/stores/data_style/model/corners/vertex.ts +105 -74
- package/internal/stores/data_style/model/corners/visibility.ts +19 -4
- package/internal/stores/data_style/model/edges/common.ts +12 -4
- package/internal/stores/data_style/model/edges/index.ts +2 -1
- package/internal/stores/data_style/model/edges/visibility.ts +24 -7
- package/internal/stores/data_style/model/index.ts +24 -11
- package/internal/stores/data_style/model/lines/color.ts +41 -11
- package/internal/stores/data_style/model/lines/common.ts +17 -6
- package/internal/stores/data_style/model/lines/edge.ts +105 -42
- package/internal/stores/data_style/model/lines/index.ts +86 -59
- package/internal/stores/data_style/model/lines/vertex.ts +105 -42
- package/internal/stores/data_style/model/lines/visibility.ts +17 -4
- package/internal/stores/data_style/model/points/common.ts +8 -4
- package/internal/stores/data_style/model/points/index.ts +10 -3
- package/internal/stores/data_style/model/points/size.ts +12 -4
- package/internal/stores/data_style/model/points/visibility.ts +16 -6
- package/internal/stores/data_style/model/selection.ts +80 -58
- package/internal/stores/data_style/model/surfaces/color.ts +41 -11
- package/internal/stores/data_style/model/surfaces/common.ts +23 -6
- package/internal/stores/data_style/model/surfaces/index.ts +89 -59
- package/internal/stores/data_style/model/surfaces/polygon.ts +107 -67
- package/internal/stores/data_style/model/surfaces/vertex.ts +111 -67
- package/internal/stores/data_style/model/surfaces/visibility.ts +18 -5
- package/internal/stores/data_style/model/visibility.ts +82 -20
- package/internal/stores/data_style/state.ts +77 -65
- package/internal/stores/hybrid_viewer/brightness.ts +49 -31
- package/internal/stores/hybrid_viewer/camera.ts +191 -177
- package/internal/stores/hybrid_viewer/camera_animation.ts +11 -10
- package/internal/stores/hybrid_viewer/core.ts +64 -0
- package/internal/stores/hybrid_viewer/filters.ts +10 -16
- package/internal/stores/hybrid_viewer/highlight.ts +91 -130
- package/internal/stores/hybrid_viewer/ruler.ts +24 -15
- package/internal/stores/hybrid_viewer/scene.ts +96 -117
- package/internal/stores/hybrid_viewer/viewport.ts +74 -65
- package/internal/stores/hybrid_viewer/vtk_types.ts +13 -29
- package/internal/utils/api_fetch.ts +54 -23
- package/internal/utils/upload_file.ts +74 -53
- package/internal/utils/viewer_call.ts +22 -13
- package/internal/utils/ws_client.ts +24 -13
- package/nuxt.config.ts +58 -1
- package/package.json +20 -8
- package/server/api/cloud/extensions/run.post.ts +6 -10
- package/server/api/local/app/project_folder_path.post.ts +4 -4
- package/server/api/local/app/run_back.post.ts +5 -7
- package/server/api/local/app/run_viewer.post.ts +5 -7
- package/server/api/local/extensions/kill.post.ts +4 -3
- package/server/api/local/extensions/run.post.ts +7 -10
- package/server/api/local/extensions/upload.put.ts +44 -54
- package/server/api/microservice/app/get_is_app_ready.get.ts +4 -5
- package/server/api/microservice/app/set_app_base_url.post.ts +5 -6
- package/server/api/microservice/app/set_back_base_url.post.ts +5 -6
- package/server/api/microservice/app/set_is_app_ready.post.ts +5 -6
- package/server/api/microservice/app/set_viewer_base_url.post.ts +5 -6
- package/server/api/microservice/extensions/download.post.ts +5 -4
- package/server/api/serverless/run_cloud.post.ts +53 -11
- package/server/utils/app_config.ts +29 -22
- package/server/utils/cleanup.ts +60 -30
- package/server/utils/cloud.ts +9 -8
- package/server/utils/extension.ts +23 -9
- package/server/utils/microservices.ts +33 -24
- package/server/utils/path.ts +4 -4
- package/server/utils/scripts.ts +26 -23
- package/server/utils/server.ts +2 -2
- package/server/utils/server_config.ts +41 -27
- package/server/utils/stream.ts +6 -0
- package/server/utils/ws_client.ts +42 -8
- package/shared/scripts.ts +15 -10
- package/shared/utils/call_raw.ts +23 -16
- package/shared/utils/call_schema.ts +5 -8
- package/shared/utils/fetch_raw.ts +87 -47
- package/shared/utils/fetch_schema.ts +6 -9
- package/shared/utils/file.ts +8 -2
- package/shared/utils/response_handlers/load.ts +26 -11
- package/shared/utils/types.ts +9 -9
- package/shared/utils/validate_schema.ts +1 -1
- package/app/components/Viewer/ObjectTree/Views/ModelComponents.vue +0 -276
- package/server/types/vendor.d.ts +0 -64
- package/server/utils/server_config.js +0 -43
- package/shared/utils/call_raw.js +0 -30
- package/shared/utils/fetch_raw.js +0 -40
- /package/{opengeodeweb_front_schemas.js → .build/opengeodeweb_front_schemas.js} +0 -0
- /package/{server → .build/server}/utils/server.js +0 -0
- /package/{shared → .build/shared}/app_mode.js +0 -0
- /package/{shared → .build/shared}/utils/parse_boolean.js +0 -0
- /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 {
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
)
|
|
26
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
|
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
|
|
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
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
import {
|
|
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
|
|
25
|
-
|
|
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 } =
|
|
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 } =
|
|
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 } =
|
|
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 } =
|
|
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
|
-
|
|
2
|
-
|
|
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
|
-
|
|
14
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
140
|
-
|
|
141
|
-
performClear,
|
|
142
|
-
performRemoveItem,
|
|
143
|
-
performSetVisibility,
|
|
144
|
-
performSetZScaling,
|
|
145
|
-
useHybridViewerScene,
|
|
146
|
-
};
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
export { useHybridViewerScene };
|