@geode/opengeodeweb-front 10.31.0 → 10.31.1-rc.1
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/app/components/CameraOrientation.vue +1 -1
- package/app/stores/hybrid_viewer.js +45 -259
- package/internal/stores/{hybrid_viewer_brightness.js → hybrid_viewer/brightness.js} +29 -5
- package/internal/stores/{hybrid_viewer_camera.js → hybrid_viewer/camera.js} +105 -55
- package/internal/stores/hybrid_viewer/filters.js +38 -0
- package/internal/stores/hybrid_viewer/highlight.js +162 -0
- package/internal/stores/hybrid_viewer/scene.js +141 -0
- package/internal/stores/hybrid_viewer/viewport.js +148 -0
- package/package.json +3 -3
- package/internal/stores/hybrid_viewer.js +0 -300
- package/internal/stores/hybrid_viewer_highlight.js +0 -114
- /package/internal/stores/{hybrid_viewer_camera_animation.js → hybrid_viewer/camera_animation.js} +0 -0
- /package/internal/stores/{hybrid_viewer_constants.js → hybrid_viewer/constants.js} +0 -0
|
@@ -1,300 +0,0 @@
|
|
|
1
|
-
import { centerCameraOnPosition } from "./hybrid_viewer_camera";
|
|
2
|
-
|
|
3
|
-
function performClickPicking(event, options) {
|
|
4
|
-
const { container, viewerStore, viewer_schemas, genericRenderWindow, syncRemoteCamera } = options;
|
|
5
|
-
const rect = container.getBoundingClientRect();
|
|
6
|
-
const schema = viewer_schemas.opengeodeweb_viewer.viewer.get_point_position;
|
|
7
|
-
const params = {
|
|
8
|
-
x: Math.round(event.clientX - rect.left),
|
|
9
|
-
y: Math.round(rect.height - (event.clientY - rect.top)),
|
|
10
|
-
};
|
|
11
|
-
viewerStore.request(
|
|
12
|
-
{
|
|
13
|
-
schema,
|
|
14
|
-
params,
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
response_function: ({ x, y, z }) => {
|
|
18
|
-
const pickedPos = [x, y, z];
|
|
19
|
-
if (pickedPos.some((val) => val !== 0)) {
|
|
20
|
-
const camera = genericRenderWindow.getRenderer().getActiveCamera();
|
|
21
|
-
centerCameraOnPosition(camera, pickedPos);
|
|
22
|
-
genericRenderWindow.getRenderWindow().render();
|
|
23
|
-
syncRemoteCamera();
|
|
24
|
-
}
|
|
25
|
-
},
|
|
26
|
-
},
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function performHoverHighlight(event, options) {
|
|
31
|
-
const {
|
|
32
|
-
is_hover_highlight,
|
|
33
|
-
genericRenderWindow,
|
|
34
|
-
viewerStore,
|
|
35
|
-
viewer_schemas,
|
|
36
|
-
hover_highlight_field_type,
|
|
37
|
-
hybridDb,
|
|
38
|
-
onResponse,
|
|
39
|
-
} = options;
|
|
40
|
-
if (!is_hover_highlight.value) {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
const container = genericRenderWindow.getContainer();
|
|
44
|
-
if (!container) {
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
const rect = container.getBoundingClientRect();
|
|
48
|
-
const schema = viewer_schemas.opengeodeweb_viewer.viewer.highlight;
|
|
49
|
-
const params = {
|
|
50
|
-
x: Math.round(event.clientX - rect.left),
|
|
51
|
-
y: Math.round(rect.height - (event.clientY - rect.top)),
|
|
52
|
-
field_type: hover_highlight_field_type.value,
|
|
53
|
-
ids: Object.keys(hybridDb),
|
|
54
|
-
};
|
|
55
|
-
viewerStore.request(
|
|
56
|
-
{
|
|
57
|
-
schema,
|
|
58
|
-
params,
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
response_function: onResponse,
|
|
62
|
-
},
|
|
63
|
-
);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function performClearHoverHighlight(options) {
|
|
67
|
-
const { viewerStore, viewer_schemas, hover_highlight_field_type, hybridDb } = options;
|
|
68
|
-
const schema = viewer_schemas.opengeodeweb_viewer.viewer.highlight;
|
|
69
|
-
const params = {
|
|
70
|
-
x: -1,
|
|
71
|
-
y: -1,
|
|
72
|
-
field_type: hover_highlight_field_type.value,
|
|
73
|
-
ids: Object.keys(hybridDb),
|
|
74
|
-
};
|
|
75
|
-
viewerStore.request({ schema, params });
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
async function performAddItem(id, options) {
|
|
79
|
-
const {
|
|
80
|
-
genericRenderWindow,
|
|
81
|
-
dataStore,
|
|
82
|
-
vtkXMLPolyDataReader,
|
|
83
|
-
vtkActor,
|
|
84
|
-
vtkMapper,
|
|
85
|
-
actorColor,
|
|
86
|
-
hybridDb,
|
|
87
|
-
} = options;
|
|
88
|
-
if (!genericRenderWindow) {
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
const value = await dataStore.item(id);
|
|
92
|
-
if (value && !dataStore.isItemViewable(value)) {
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
const reader = vtkXMLPolyDataReader();
|
|
96
|
-
await reader.parseAsArrayBuffer(new TextEncoder().encode(value.binary_light_viewable));
|
|
97
|
-
const actor = vtkActor();
|
|
98
|
-
const mapper = vtkMapper();
|
|
99
|
-
const polydata = reader.getOutputData(0);
|
|
100
|
-
mapper.setInputData(polydata);
|
|
101
|
-
actor.getProperty().setColor(actorColor);
|
|
102
|
-
actor.setMapper(mapper);
|
|
103
|
-
const renderer = genericRenderWindow.getRenderer();
|
|
104
|
-
if (hybridDb[id] && hybridDb[id].actor) {
|
|
105
|
-
renderer.removeActor(hybridDb[id].actor);
|
|
106
|
-
}
|
|
107
|
-
const isFirst = renderer.getActors().length === 0;
|
|
108
|
-
renderer.addActor(actor);
|
|
109
|
-
if (isFirst) {
|
|
110
|
-
renderer.resetCamera();
|
|
111
|
-
}
|
|
112
|
-
hybridDb[id] = { actor, polydata, mapper };
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
async function performSetZScaling(z_scale, options) {
|
|
116
|
-
const { zScale, genericRenderWindow, gridActor, viewerStore, viewer_schemas, remoteRender } =
|
|
117
|
-
options;
|
|
118
|
-
zScale.value = z_scale;
|
|
119
|
-
const renderer = genericRenderWindow.getRenderer();
|
|
120
|
-
for (const actor of renderer.getActors()) {
|
|
121
|
-
if (actor !== gridActor) {
|
|
122
|
-
const scale = actor.getScale();
|
|
123
|
-
actor.setScale(scale[0], scale[1], z_scale);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
renderer.resetCamera();
|
|
127
|
-
genericRenderWindow.getRenderWindow().render();
|
|
128
|
-
const schema = viewer_schemas.opengeodeweb_viewer.viewer.set_z_scaling;
|
|
129
|
-
const params = { z_scale };
|
|
130
|
-
await viewerStore.request({ schema, params });
|
|
131
|
-
remoteRender();
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
function performSetContainer(options) {
|
|
135
|
-
const {
|
|
136
|
-
container,
|
|
137
|
-
genericRenderWindow,
|
|
138
|
-
imageStyleSetter,
|
|
139
|
-
resize,
|
|
140
|
-
useMousePressed,
|
|
141
|
-
useEventListener,
|
|
142
|
-
is_picking,
|
|
143
|
-
is_moving,
|
|
144
|
-
clickPickingCallback,
|
|
145
|
-
viewerStore,
|
|
146
|
-
viewer_schemas,
|
|
147
|
-
syncRemoteCamera,
|
|
148
|
-
hoverHighlight,
|
|
149
|
-
wheelTimeoutMs,
|
|
150
|
-
wheelEventEndTimeout,
|
|
151
|
-
wheelTimeoutSetter,
|
|
152
|
-
} = options;
|
|
153
|
-
|
|
154
|
-
if (!container.value) {
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
genericRenderWindow.setContainer(container.value.$el);
|
|
159
|
-
const webGLRenderWindow = genericRenderWindow.getApiSpecificRenderWindow();
|
|
160
|
-
webGLRenderWindow.setUseBackgroundImage(true);
|
|
161
|
-
const imageStyle = webGLRenderWindow.getReferenceByName("bgImage").style;
|
|
162
|
-
Object.assign(imageStyle, { transition: "opacity 0.1s ease-in", zIndex: 1 });
|
|
163
|
-
imageStyleSetter(imageStyle);
|
|
164
|
-
|
|
165
|
-
resize(container.value.$el.offsetWidth, container.value.$el.offsetHeight);
|
|
166
|
-
|
|
167
|
-
let has_dragged = false;
|
|
168
|
-
useMousePressed({
|
|
169
|
-
target: container,
|
|
170
|
-
onPressed: (event) => {
|
|
171
|
-
if (event.button !== 0 && event.button !== 1) {
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
if (event.button === 0 && is_picking.value) {
|
|
175
|
-
clickPickingCallback(event, {
|
|
176
|
-
container: container.value.$el,
|
|
177
|
-
viewerStore,
|
|
178
|
-
viewer_schemas,
|
|
179
|
-
genericRenderWindow,
|
|
180
|
-
syncRemoteCamera,
|
|
181
|
-
});
|
|
182
|
-
is_picking.value = false;
|
|
183
|
-
return;
|
|
184
|
-
}
|
|
185
|
-
is_moving.value = true;
|
|
186
|
-
has_dragged = false;
|
|
187
|
-
event.stopPropagation();
|
|
188
|
-
},
|
|
189
|
-
onReleased: () => {
|
|
190
|
-
is_moving.value = false;
|
|
191
|
-
if (has_dragged) {
|
|
192
|
-
genericRenderWindow.getRenderer().resetCameraClippingRange();
|
|
193
|
-
syncRemoteCamera();
|
|
194
|
-
}
|
|
195
|
-
has_dragged = false;
|
|
196
|
-
},
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
useEventListener(container, "mousemove", (event) => {
|
|
200
|
-
if (is_moving.value) {
|
|
201
|
-
has_dragged = true;
|
|
202
|
-
if (imageStyle) {
|
|
203
|
-
imageStyle.opacity = 0;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
hoverHighlight(event);
|
|
207
|
-
});
|
|
208
|
-
useEventListener(container, "wheel", () => {
|
|
209
|
-
is_moving.value = true;
|
|
210
|
-
if (imageStyle) {
|
|
211
|
-
imageStyle.opacity = 0;
|
|
212
|
-
}
|
|
213
|
-
clearTimeout(wheelEventEndTimeout);
|
|
214
|
-
wheelTimeoutSetter(
|
|
215
|
-
setTimeout(() => {
|
|
216
|
-
is_moving.value = false;
|
|
217
|
-
genericRenderWindow.getRenderer().resetCameraClippingRange();
|
|
218
|
-
syncRemoteCamera();
|
|
219
|
-
}, wheelTimeoutMs),
|
|
220
|
-
);
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
function performRemoveItem(id, options) {
|
|
225
|
-
const { genericRenderWindow, hybridDb } = options;
|
|
226
|
-
if (!hybridDb[id]) {
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
genericRenderWindow.getRenderer().removeActor(hybridDb[id].actor);
|
|
230
|
-
genericRenderWindow.getRenderWindow().render();
|
|
231
|
-
delete hybridDb[id];
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
function performSetVisibility(id, visibility, options) {
|
|
235
|
-
const { genericRenderWindow, hybridDb } = options;
|
|
236
|
-
if (!hybridDb[id]) {
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
hybridDb[id].actor.setVisibility(visibility);
|
|
240
|
-
genericRenderWindow.getRenderWindow().render();
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
function performClear(options) {
|
|
244
|
-
const { genericRenderWindow, hybridDb } = options;
|
|
245
|
-
const renderer = genericRenderWindow.getRenderer();
|
|
246
|
-
for (const actor of renderer.getActors()) {
|
|
247
|
-
renderer.removeActor(actor);
|
|
248
|
-
}
|
|
249
|
-
genericRenderWindow.getRenderWindow().render();
|
|
250
|
-
for (const id of Object.keys(hybridDb)) {
|
|
251
|
-
delete hybridDb[id];
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
async function performSetClippingPlanes(ids, planes, options) {
|
|
256
|
-
const { viewerStore, viewer_schemas, remoteRender } = options;
|
|
257
|
-
const schema = viewer_schemas.opengeodeweb_viewer.viewer.clipping_planes;
|
|
258
|
-
const params = { ids, planes };
|
|
259
|
-
await viewerStore.request({ schema, params });
|
|
260
|
-
await remoteRender();
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
async function performSetShrink(ids, shrink_factor, options) {
|
|
264
|
-
const { viewerStore, viewer_schemas, remoteRender } = options;
|
|
265
|
-
const schema = viewer_schemas.opengeodeweb_viewer.viewer.shrink;
|
|
266
|
-
const params = { ids, shrink_factor };
|
|
267
|
-
await viewerStore.request({ schema, params });
|
|
268
|
-
await remoteRender();
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
async function performResize(width, height, options) {
|
|
272
|
-
const { viewerStore, status, Status, genericRenderWindow, viewStream, remoteRender } = options;
|
|
273
|
-
if (viewerStore.status !== Status.CONNECTED || status.value !== Status.CREATED) {
|
|
274
|
-
return;
|
|
275
|
-
}
|
|
276
|
-
const webGLRenderWindow = genericRenderWindow.getApiSpecificRenderWindow();
|
|
277
|
-
const canvas = webGLRenderWindow.getCanvas();
|
|
278
|
-
canvas.width = width;
|
|
279
|
-
canvas.height = height;
|
|
280
|
-
await nextTick();
|
|
281
|
-
webGLRenderWindow.setSize(width, height);
|
|
282
|
-
viewStream.setSize(width, height);
|
|
283
|
-
genericRenderWindow.getRenderWindow().render();
|
|
284
|
-
remoteRender();
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
export {
|
|
288
|
-
performAddItem,
|
|
289
|
-
performClear,
|
|
290
|
-
performClearHoverHighlight,
|
|
291
|
-
performClickPicking,
|
|
292
|
-
performHoverHighlight,
|
|
293
|
-
performRemoveItem,
|
|
294
|
-
performResize,
|
|
295
|
-
performSetClippingPlanes,
|
|
296
|
-
performSetContainer,
|
|
297
|
-
performSetShrink,
|
|
298
|
-
performSetVisibility,
|
|
299
|
-
performSetZScaling,
|
|
300
|
-
};
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import { HOVER_DEBOUNCE_MS, HOVER_TIMEOUT_MS } from "./hybrid_viewer_constants";
|
|
2
|
-
import { database } from "@ogw_internal/database/database.js";
|
|
3
|
-
import { performHoverHighlight } from "./hybrid_viewer";
|
|
4
|
-
|
|
5
|
-
function createClearHoverData(hoverTimeoutRef, hoverData, currentHoverId) {
|
|
6
|
-
return function clearHoverData() {
|
|
7
|
-
if (hoverTimeoutRef.value) {
|
|
8
|
-
clearTimeout(hoverTimeoutRef.value);
|
|
9
|
-
hoverTimeoutRef.value = undefined;
|
|
10
|
-
}
|
|
11
|
-
hoverData.value = undefined;
|
|
12
|
-
currentHoverId.value = undefined;
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function createHoverHighlight(options) {
|
|
17
|
-
const {
|
|
18
|
-
genericRenderWindow,
|
|
19
|
-
is_hover_highlight,
|
|
20
|
-
viewerStore,
|
|
21
|
-
viewer_schemas,
|
|
22
|
-
hover_highlight_field_type,
|
|
23
|
-
hybridDb,
|
|
24
|
-
hoverData,
|
|
25
|
-
hoverPosition,
|
|
26
|
-
currentHoverId,
|
|
27
|
-
hoverTimeoutRef,
|
|
28
|
-
clearHoverData,
|
|
29
|
-
} = options;
|
|
30
|
-
|
|
31
|
-
return useDebounceFn((event) => {
|
|
32
|
-
const containerElement = genericRenderWindow.value?.getContainer();
|
|
33
|
-
let relativeMousePosition = { x: 0, y: 0 };
|
|
34
|
-
if (containerElement) {
|
|
35
|
-
const containerRect = containerElement.getBoundingClientRect();
|
|
36
|
-
relativeMousePosition = {
|
|
37
|
-
x: event.clientX - containerRect.left,
|
|
38
|
-
y: event.clientY - containerRect.top,
|
|
39
|
-
};
|
|
40
|
-
} else {
|
|
41
|
-
relativeMousePosition = { x: event.clientX, y: event.clientY };
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
performHoverHighlight(event, {
|
|
45
|
-
is_hover_highlight,
|
|
46
|
-
genericRenderWindow: genericRenderWindow.value,
|
|
47
|
-
viewerStore,
|
|
48
|
-
viewer_schemas,
|
|
49
|
-
hover_highlight_field_type,
|
|
50
|
-
hybridDb,
|
|
51
|
-
onResponse: async (response) => {
|
|
52
|
-
const isResponseValid =
|
|
53
|
-
response && response.id && response.picked_id !== undefined && response.picked_id !== -1;
|
|
54
|
-
if (!is_hover_highlight.value || !isResponseValid) {
|
|
55
|
-
clearHoverData();
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const hoverKey = `${response.id}_${response.field_type}_${response.picked_id}`;
|
|
60
|
-
if (currentHoverId.value === hoverKey) {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (hoverTimeoutRef.value) {
|
|
65
|
-
clearTimeout(hoverTimeoutRef.value);
|
|
66
|
-
hoverTimeoutRef.value = undefined;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
hoverData.value = undefined;
|
|
70
|
-
currentHoverId.value = hoverKey;
|
|
71
|
-
|
|
72
|
-
let componentInfo = undefined;
|
|
73
|
-
let modelName = undefined;
|
|
74
|
-
|
|
75
|
-
const modelRecord = await database.data.get(response.id);
|
|
76
|
-
if (modelRecord) {
|
|
77
|
-
modelName = modelRecord.name;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
if (response.geode_id) {
|
|
81
|
-
const component = await database.model_components
|
|
82
|
-
.where("[id+geode_id]")
|
|
83
|
-
.equals([response.id, response.geode_id])
|
|
84
|
-
.first();
|
|
85
|
-
if (component) {
|
|
86
|
-
componentInfo = {
|
|
87
|
-
name: component.name,
|
|
88
|
-
id: component.geode_id,
|
|
89
|
-
type: component.type,
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const newHoverData = {
|
|
95
|
-
modelId: response.id,
|
|
96
|
-
modelName,
|
|
97
|
-
blockName: response.geode_id,
|
|
98
|
-
pickedId: response.picked_id,
|
|
99
|
-
fieldType: response.field_type,
|
|
100
|
-
component: componentInfo,
|
|
101
|
-
attributes: response.attributes || {},
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
hoverTimeoutRef.value = setTimeout(() => {
|
|
105
|
-
hoverPosition.value = relativeMousePosition;
|
|
106
|
-
hoverData.value = newHoverData;
|
|
107
|
-
hoverTimeoutRef.value = undefined;
|
|
108
|
-
}, HOVER_TIMEOUT_MS);
|
|
109
|
-
},
|
|
110
|
-
});
|
|
111
|
-
}, HOVER_DEBOUNCE_MS);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export { createClearHoverData, createHoverHighlight };
|
/package/internal/stores/{hybrid_viewer_camera_animation.js → hybrid_viewer/camera_animation.js}
RENAMED
|
File without changes
|
|
File without changes
|