@geode/opengeodeweb-front 10.35.0-rc.2 → 10.35.0-rc.4

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.
@@ -1,11 +1,10 @@
1
- import type { Vector3, ViewStreamLike } from "./vtk_types";
2
1
  import { centerCameraOnPosition, useHybridViewerCamera } from "./camera";
3
2
  import { Status } from "@ogw_front/utils/status";
3
+ import type { ViewStreamLike } from "./vtk_types";
4
4
  import { WHEEL_TIME_OUT_MS } from "./constants";
5
5
  import { useHybridViewerCore } from "./core";
6
6
  import { useHybridViewerHighlight } from "./highlight";
7
7
  import { useViewerStore } from "@ogw_front/stores/viewer";
8
- import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
9
8
 
10
9
  type ContainerRef = Ref<{ $el: HTMLElement } | undefined>;
11
10
 
@@ -44,37 +43,26 @@ async function resize(width: number, height: number): Promise<void> {
44
43
  await remoteRender();
45
44
  }
46
45
 
47
- function performClickPicking(event: MouseEvent, containerElement: HTMLElement): void {
46
+ async function performClickPicking(
47
+ event: MouseEvent,
48
+ containerElement: HTMLElement,
49
+ ): Promise<void> {
48
50
  const { genericRenderWindow } = useHybridViewerCore();
49
51
  const { syncRemoteCamera } = useHybridViewerCamera();
50
52
  const viewerStore = useViewerStore();
51
53
  const rect = containerElement.getBoundingClientRect();
52
- const schema = viewer_schemas.opengeodeweb_viewer.viewer.get_point_position;
53
- const params = {
54
- x: Math.round(event.clientX - rect.left),
55
- y: Math.round(rect.height - (event.clientY - rect.top)),
56
- };
57
- void viewerStore.request(
58
- {
59
- schema,
60
- params,
61
- },
62
- {
63
- response_function: (response: unknown) => {
64
- // oxlint-disable-next-line no-unsafe-type-assertion -- response shape is defined by the get_point_position schema.
65
- const { x, y, z } = response as { x: number; y: number; z: number };
66
- const pickedPos: Vector3 = [x, y, z];
67
- if (!genericRenderWindow.value || !pickedPos.some((val) => val !== 0)) {
68
- return;
69
- }
70
- const renderer = genericRenderWindow.value.getRenderer();
71
- const camera = renderer.getActiveCamera();
72
- centerCameraOnPosition(camera, pickedPos);
73
- genericRenderWindow.value.getRenderWindow().render();
74
- syncRemoteCamera();
75
- },
76
- },
54
+ const pickedPos = await viewerStore.pick_world_position(
55
+ event.clientX - rect.left,
56
+ rect.height - (event.clientY - rect.top),
77
57
  );
58
+ if (!genericRenderWindow.value || !pickedPos.some((val) => val !== 0)) {
59
+ return;
60
+ }
61
+ const renderer = genericRenderWindow.value.getRenderer();
62
+ const camera = renderer.getActiveCamera();
63
+ centerCameraOnPosition(camera, pickedPos);
64
+ genericRenderWindow.value.getRenderWindow().render();
65
+ syncRemoteCamera();
78
66
  }
79
67
 
80
68
  function setContainer(container: ContainerRef | undefined): void {
@@ -114,7 +102,7 @@ function setContainer(container: ContainerRef | undefined): void {
114
102
  return;
115
103
  }
116
104
  if (event.button === 0 && is_picking.value) {
117
- performClickPicking(event, containerElement);
105
+ void performClickPicking(event, containerElement);
118
106
  is_picking.value = false;
119
107
  return;
120
108
  }
@@ -0,0 +1,74 @@
1
+ import type { CameraOptions, Vector3 } from "./vtk_types";
2
+ import {
3
+ applyCameraOptions,
4
+ centerCameraOnPosition,
5
+ getCameraOptions,
6
+ useHybridViewerCamera,
7
+ } from "./camera";
8
+ import { requireRenderWindow, useHybridViewerCore } from "./core";
9
+ import type { Position } from "@vueuse/core";
10
+ import { useViewerStore } from "@ogw_front/stores/viewer";
11
+ import { newInstance as vtkCamera } from "@kitware/vtk.js/Rendering/Core/Camera";
12
+
13
+ interface ZoomBox {
14
+ start: Position;
15
+ end: Position;
16
+ }
17
+
18
+ interface Viewport {
19
+ width: number;
20
+ height: number;
21
+ }
22
+
23
+ function viewportShapedBox(start: Position, end: Position, { width, height }: Viewport): ZoomBox {
24
+ const deltaX = end.x - start.x;
25
+ const deltaY = end.y - start.y;
26
+ const aspect = Math.max(width, 1) / Math.max(height, 1);
27
+ const boxWidth = Math.max(Math.abs(deltaX), Math.abs(deltaY) * aspect);
28
+ return {
29
+ start,
30
+ end: {
31
+ x: start.x + (Math.sign(deltaX) || 1) * boxWidth,
32
+ y: start.y + (Math.sign(deltaY) || 1) * (boxWidth / aspect),
33
+ },
34
+ };
35
+ }
36
+
37
+ function computeZoomToBoxCamera(
38
+ camera: CameraOptions,
39
+ box: ZoomBox,
40
+ { width }: Viewport,
41
+ target: Vector3,
42
+ ): CameraOptions {
43
+ const zoomCamera = vtkCamera();
44
+ applyCameraOptions(zoomCamera, camera);
45
+ centerCameraOnPosition(zoomCamera, target);
46
+ // The box is viewport-shaped (see viewportShapedBox), so its width alone gives the zoom factor.
47
+ zoomCamera.dolly(width / Math.abs(box.end.x - box.start.x));
48
+ return getCameraOptions(zoomCamera);
49
+ }
50
+
51
+ const useHybridViewerZoomBox = createSharedComposable(() => {
52
+ const is_zoom_box_active = ref(false);
53
+
54
+ // Leaves the mode first so a second box cannot be drawn while the pick is pending. Request errors are reported by the viewer store.
55
+ async function zoomToBox(box: ZoomBox, viewport: Viewport): Promise<void> {
56
+ is_zoom_box_active.value = false;
57
+ const target = await useViewerStore().pick_world_position(
58
+ (box.start.x + box.end.x) / 2,
59
+ viewport.height - (box.start.y + box.end.y) / 2,
60
+ );
61
+ const { genericRenderWindow } = useHybridViewerCore();
62
+ const { setCamera } = useHybridViewerCamera();
63
+ const camera = requireRenderWindow(genericRenderWindow).getRenderer().getActiveCamera();
64
+ setCamera(computeZoomToBoxCamera(getCameraOptions(camera), box, viewport, target));
65
+ }
66
+
67
+ return {
68
+ is_zoom_box_active,
69
+ zoomToBox,
70
+ };
71
+ });
72
+
73
+ export { computeZoomToBoxCamera, useHybridViewerZoomBox, viewportShapedBox };
74
+ export type { ZoomBox };
package/nuxt.config.ts CHANGED
@@ -152,6 +152,7 @@ export default defineNuxtConfig({
152
152
  "@kitware/vtk.js/IO/XML/XMLPolyDataReader",
153
153
  "@kitware/vtk.js/Rendering/Core/Actor",
154
154
  "@kitware/vtk.js/Rendering/Core/AnnotatedCubeActor",
155
+ "@kitware/vtk.js/Rendering/Core/Camera",
155
156
  "@kitware/vtk.js/Rendering/Core/ColorTransferFunction",
156
157
  "@kitware/vtk.js/Rendering/Core/Mapper",
157
158
  "@kitware/vtk.js/Rendering/Misc/GenericRenderWindow",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geode/opengeodeweb-front",
3
- "version": "10.35.0-rc.2",
3
+ "version": "10.35.0-rc.4",
4
4
  "description": "OpenSource Vue/Nuxt/Pinia/Vuetify framework for web applications",
5
5
  "homepage": "https://github.com/Geode-solutions/OpenGeodeWeb-Front",
6
6
  "bugs": {