@geode/opengeodeweb-front 10.34.0-rc.2 → 10.34.0-rc.21
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/.build/opengeodeweb_front_schemas.js +175 -0
- package/.build/server/utils/app_config.js +57 -0
- package/.build/server/utils/cleanup.js +135 -0
- package/.build/server/utils/cloud.js +156 -0
- package/.build/server/utils/microservices.js +153 -0
- package/.build/server/utils/path.js +108 -0
- package/.build/server/utils/scripts.js +134 -0
- package/.build/server/utils/server.js +44 -0
- package/.build/server/utils/server_config.js +51 -0
- package/.build/server/utils/stream.js +6 -0
- package/.build/server/utils/ws_client.js +100 -0
- package/.build/shared/app_mode.js +8 -0
- package/.build/shared/scripts.js +49 -0
- package/.build/shared/utils/call_raw.js +31 -0
- package/.build/shared/utils/call_schema.js +28 -0
- package/.build/shared/utils/fetch_raw.js +52 -0
- package/.build/shared/utils/fetch_schema.js +32 -0
- package/.build/shared/utils/file.js +14 -0
- package/.build/shared/utils/parse_boolean.js +23 -0
- package/.build/shared/utils/response_handlers/load.js +50 -0
- package/.build/shared/utils/types.js +1 -0
- package/.build/shared/utils/validate_schema.js +17 -0
- package/README.md +8 -0
- package/app/assets/{geode_objects.js → geode_objects.ts} +8 -1
- package/app/components/ActionButton.vue +28 -12
- package/app/components/Basic/Slider.vue +2 -2
- package/app/components/Basic/Switch.vue +2 -2
- package/app/components/CameraManager/List.vue +11 -11
- package/app/components/CameraManager/Saver.vue +8 -4
- package/app/components/CameraManager.vue +24 -12
- package/app/components/CameraOrientation.vue +31 -17
- package/app/components/ClippingPlaneCard.vue +13 -12
- package/app/components/ClippingPlanes.vue +31 -21
- package/app/components/CrsSelector.vue +26 -18
- package/app/components/DeleteDialog.vue +18 -16
- package/app/components/DragAndDrop.vue +55 -37
- package/app/components/DragAndDropInternal/DragAndDropInline.vue +31 -16
- package/app/components/DragAndDropInternal/DragAndDropOverlay.vue +32 -19
- package/app/components/ExtensionSelector.vue +34 -18
- package/app/components/FeedBack/ErrorBanner.vue +4 -3
- package/app/components/FeedBack/Snackers.vue +6 -5
- package/app/components/FetchingData.vue +8 -12
- package/app/components/FileSelector.vue +27 -17
- package/app/components/FileUploader.vue +51 -30
- package/app/components/GlassCard.vue +17 -13
- package/app/components/HybridRenderingView.vue +25 -12
- package/app/components/HybridViewerTooltip.vue +28 -26
- package/app/components/InfraConnected.vue +1 -1
- package/app/components/Launcher.vue +12 -10
- package/app/components/Loading/EcoMessages.vue +24 -13
- package/app/components/Loading/Header.vue +6 -7
- package/app/components/Loading/Progress.vue +6 -7
- package/app/components/Loading.vue +10 -14
- package/app/components/MissingFilesSelector.vue +35 -19
- package/app/components/ObjectSelector.vue +37 -21
- package/app/components/PackagesVersions.vue +16 -8
- package/app/components/Recaptcha.vue +17 -23
- package/app/components/RemoteRenderingView.vue +21 -15
- package/app/components/Ruler.vue +11 -9
- package/app/components/Screenshot.vue +25 -19
- package/app/components/SearchBar.vue +12 -6
- package/app/components/ShrinkFilter.vue +19 -14
- package/app/components/Step.vue +32 -12
- package/app/components/Stepper.vue +19 -7
- package/app/components/ToolPanel.vue +29 -13
- package/app/components/ViewToolbar.vue +53 -44
- package/app/components/Viewer/ContextMenu/CenterButton.vue +16 -9
- package/app/components/Viewer/ContextMenu/CircularItems.vue +13 -10
- package/app/components/Viewer/ContextMenu/ContextMenu.vue +40 -32
- package/app/components/Viewer/ContextMenu/ContextMenuItem.vue +31 -17
- package/app/components/Viewer/ContextMenu/InfoCard.vue +38 -22
- package/app/components/Viewer/EdgedCurve/PointsOptions.vue +8 -5
- package/app/components/Viewer/EdgedCurve/SpecificEdgesOptions.vue +67 -48
- package/app/components/Viewer/Generic/Mesh/CellsOptions.vue +74 -50
- package/app/components/Viewer/Generic/Mesh/EdgesOptions.vue +69 -50
- package/app/components/Viewer/Generic/Mesh/PointsOptions.vue +47 -35
- package/app/components/Viewer/Generic/Mesh/PolygonsOptions.vue +91 -51
- package/app/components/Viewer/Generic/Mesh/PolyhedraOptions.vue +74 -49
- package/app/components/Viewer/Generic/Model/BlocksOptions.vue +115 -53
- package/app/components/Viewer/Generic/Model/CornersOptions.vue +75 -37
- package/app/components/Viewer/Generic/Model/EdgesOptions.vue +13 -9
- package/app/components/Viewer/Generic/Model/LinesOptions.vue +110 -61
- package/app/components/Viewer/Generic/Model/ModelStyleCard.vue +32 -21
- package/app/components/Viewer/Generic/Model/ModelStyleOptions.vue +9 -5
- package/app/components/Viewer/Generic/Model/PointsOptions.vue +19 -13
- package/app/components/Viewer/Generic/Model/SurfacesOptions.vue +119 -49
- package/app/components/Viewer/Grid/2D/CellsOptions.vue +8 -5
- package/app/components/Viewer/Grid/2D/EdgesOptions.vue +8 -5
- package/app/components/Viewer/Grid/2D/PointsOptions.vue +8 -5
- package/app/components/Viewer/Grid/3D/CellsOptions.vue +8 -5
- package/app/components/Viewer/Grid/3D/EdgesOptions.vue +8 -5
- package/app/components/Viewer/Grid/3D/FacetsOptions.vue +8 -5
- package/app/components/Viewer/Grid/3D/PointsOptions.vue +8 -5
- package/app/components/Viewer/ObjectTree/Base/CommonTreeView.vue +120 -76
- package/app/components/Viewer/ObjectTree/Base/Controls.vue +25 -10
- package/app/components/Viewer/ObjectTree/Base/ItemLabel.vue +42 -17
- package/app/components/Viewer/ObjectTree/Base/StickyHeader.vue +22 -9
- package/app/components/Viewer/ObjectTree/Base/TreeRow.vue +29 -14
- package/app/components/Viewer/ObjectTree/Box.vue +32 -15
- package/app/components/Viewer/ObjectTree/Layout.vue +55 -35
- package/app/components/Viewer/ObjectTree/Views/GlobalObjects.vue +63 -34
- package/app/components/Viewer/ObjectTree/Views/{ModelCollections.vue → ModelTree.vue} +101 -39
- package/app/components/Viewer/Options/AttributeColorBar.vue +14 -6
- package/app/components/Viewer/Options/AttributeRangeSelector.vue +8 -4
- package/app/components/Viewer/Options/AttributeSelector.vue +64 -33
- package/app/components/Viewer/Options/ColorMapList.vue +52 -24
- package/app/components/Viewer/Options/ColorMapPicker.vue +15 -11
- package/app/components/Viewer/Options/ColorPicker.vue +239 -50
- package/app/components/Viewer/Options/ColoringTypeSelector.vue +87 -67
- package/app/components/Viewer/Options/ColormapQuickPicker.vue +16 -12
- package/app/components/Viewer/Options/OptionsSection.vue +7 -5
- package/app/components/Viewer/Options/Sliders/Size.vue +3 -3
- package/app/components/Viewer/Options/Sliders/Slider.vue +9 -6
- package/app/components/Viewer/Options/Sliders/Width.vue +3 -3
- package/app/components/Viewer/Options/TextureItem.vue +29 -22
- package/app/components/Viewer/Options/TexturesSelector.vue +23 -12
- package/app/components/Viewer/Options/VisibilitySwitch.vue +3 -3
- package/app/components/Viewer/OverlappingObjectsPicker.vue +27 -12
- package/app/components/Viewer/PointSet/SpecificPointsOptions.vue +38 -26
- package/app/components/Viewer/Solid/EdgesOptions.vue +8 -5
- package/app/components/Viewer/Solid/PointsOptions.vue +8 -5
- package/app/components/Viewer/Solid/PolygonsOptions.vue +8 -5
- package/app/components/Viewer/Solid/SpecificPolyhedraOptions.vue +73 -48
- package/app/components/Viewer/Surface/EdgesOptions.vue +8 -5
- package/app/components/Viewer/Surface/PointsOptions.vue +8 -5
- package/app/components/Viewer/Surface/PolygonsOptions.vue +79 -49
- package/app/components/Viewer/Surface/Triangulated/TrianglesOptions.vue +8 -5
- package/app/components/Viewer/TetrahedralSolid/TetrahedraOptions.vue +8 -5
- package/app/components/Viewer/TetrahedralSolid/TrianglesOptions.vue +8 -5
- package/app/components/Viewer/Ui.vue +19 -14
- package/app/components/Wrapper.vue +16 -10
- package/app/components/ZScaling.vue +18 -10
- package/app/components/csv-preview/CsvPreviewer.vue +72 -50
- package/app/components/csv-preview/CsvSettings.vue +30 -50
- package/app/components/csv-preview/CsvTable.vue +34 -14
- package/app/composables/{batch_style.js → batch_style.ts} +9 -7
- package/app/composables/clipping_planes_widget.ts +204 -0
- 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 +303 -0
- package/app/composables/hover_highlight.ts +127 -0
- package/app/composables/{model_collections.js → model_collections.ts} +28 -9
- package/app/composables/{model_components.js → model_components.ts} +28 -9
- package/app/composables/{project_manager.js → project_manager.ts} +77 -20
- package/app/composables/responsive_middle_truncate.ts +48 -0
- package/app/composables/{run_function_when_microservices_connected.js → run_function_when_microservices_connected.ts} +1 -1
- package/app/composables/stepper_tree.ts +79 -0
- package/app/composables/tree_filter.ts +194 -0
- package/app/composables/{tree_keyboard_nav.js → tree_keyboard_nav.ts} +62 -20
- package/app/composables/{tree_scroll.js → tree_scroll.ts} +61 -12
- package/app/composables/use_adaptive_styles.ts +186 -0
- package/app/composables/use_overlapping_picker.ts +263 -0
- package/app/composables/use_quick_colormap.ts +55 -0
- package/app/composables/virtual_tree.ts +271 -0
- package/app/composables/vtk_implicit_plane_widget.d.ts +2 -0
- package/app/plugins/{auto_store_register.js → auto_store_register.ts} +3 -5
- package/app/plugins/click_outside_ignore_snackbars.client.ts +36 -0
- package/app/stores/app.ts +252 -0
- package/app/stores/app_helpers/extension.ts +179 -0
- package/app/stores/{back.js → back.ts} +54 -28
- package/app/stores/camera_manager.ts +80 -0
- package/app/stores/{cloud.js → cloud.ts} +18 -13
- package/app/stores/data.ts +392 -0
- package/app/stores/data_helpers/collections.ts +138 -0
- package/app/stores/data_helpers/mesh.ts +169 -0
- package/app/stores/data_style.ts +167 -0
- package/app/stores/{feedback.js → feedback.ts} +19 -8
- package/app/stores/{hybrid_viewer.js → hybrid_viewer.ts} +49 -45
- package/app/stores/infra.ts +106 -0
- package/app/stores/{menu.js → menu.ts} +67 -36
- package/app/stores/treeview.ts +383 -0
- package/app/stores/{viewer.js → viewer.ts} +75 -42
- package/app/utils/attributes.ts +40 -0
- package/app/utils/clipping_planes.ts +222 -0
- package/app/utils/color_picker.js +54 -0
- package/app/utils/colormap.ts +102 -0
- package/app/utils/default_styles/{constants.js → constants.ts} +25 -12
- package/app/utils/default_styles/{index.js → index.ts} +4 -3
- package/app/utils/default_styles/meshes.ts +264 -0
- package/app/utils/default_styles/{models.js → models.ts} +106 -52
- package/app/utils/{extension.js → extension.ts} +63 -19
- package/app/utils/{import_workflow.js → import_workflow.ts} +39 -22
- package/app/utils/{log.js → log.ts} +12 -2
- package/app/utils/{name_cleaner.js → name_cleaner.ts} +6 -6
- package/app/utils/status.ts +19 -0
- package/app/utils/{stores.js → stores.ts} +5 -5
- package/app/utils/{string.js → string.ts} +6 -6
- package/app/utils/{treeview.js → treeview.ts} +4 -1
- package/internal/database/{base_database.js → base_database.ts} +7 -3
- package/internal/database/database.ts +102 -0
- package/internal/database/{extended_database.js → extended_database.ts} +5 -1
- package/internal/database/tables/camera_positions.ts +6 -0
- package/internal/database/tables/{data.js → data.ts} +3 -1
- package/internal/database/tables/data_style.ts +6 -0
- package/internal/database/tables/model_component_datastyle.ts +6 -0
- package/internal/database/tables/model_component_type_datastyle.ts +6 -0
- package/internal/database/tables/model_components.ts +6 -0
- package/internal/database/tables/model_components_relation.ts +6 -0
- package/internal/database/tables/table_definition.ts +5 -0
- package/internal/stores/data_style/mesh/cells/cell.ts +279 -0
- package/internal/stores/data_style/mesh/cells/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/cells/common.ts +50 -0
- package/internal/stores/data_style/mesh/cells/index.ts +161 -0
- package/internal/stores/data_style/mesh/cells/{textures.js → textures.ts} +14 -8
- package/internal/stores/data_style/mesh/cells/vertex.ts +285 -0
- package/internal/stores/data_style/mesh/cells/visibility.ts +46 -0
- package/internal/stores/data_style/mesh/edges/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/edges/common.ts +41 -0
- package/internal/stores/data_style/mesh/edges/edge.ts +279 -0
- package/internal/stores/data_style/mesh/edges/index.ts +155 -0
- package/internal/stores/data_style/mesh/edges/vertex.ts +285 -0
- package/internal/stores/data_style/mesh/edges/visibility.ts +45 -0
- package/internal/stores/data_style/mesh/edges/width.ts +42 -0
- package/internal/stores/data_style/mesh/{index.js → index.ts} +34 -14
- package/internal/stores/data_style/mesh/points/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/points/common.ts +51 -0
- package/internal/stores/data_style/mesh/points/index.ts +133 -0
- package/internal/stores/data_style/mesh/points/size.ts +43 -0
- package/internal/stores/data_style/mesh/points/vertex.ts +285 -0
- package/internal/stores/data_style/mesh/points/visibility.ts +49 -0
- package/internal/stores/data_style/mesh/polygons/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/polygons/common.ts +50 -0
- package/internal/stores/data_style/mesh/polygons/index.ts +167 -0
- package/internal/stores/data_style/mesh/polygons/polygon.ts +282 -0
- package/internal/stores/data_style/mesh/polygons/{textures.js → textures.ts} +14 -8
- package/internal/stores/data_style/mesh/polygons/vertex.ts +288 -0
- package/internal/stores/data_style/mesh/polygons/visibility.ts +48 -0
- package/internal/stores/data_style/mesh/polyhedra/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/polyhedra/common.ts +41 -0
- package/internal/stores/data_style/mesh/polyhedra/index.ts +157 -0
- package/internal/stores/data_style/mesh/polyhedra/polyhedron.ts +294 -0
- package/internal/stores/data_style/mesh/polyhedra/vertex.ts +288 -0
- package/internal/stores/data_style/mesh/polyhedra/visibility.ts +48 -0
- package/internal/stores/data_style/model/blocks/{color.js → color.ts} +50 -13
- package/internal/stores/data_style/model/blocks/common.ts +67 -0
- package/internal/stores/data_style/model/blocks/{index.js → index.ts} +111 -66
- package/internal/stores/data_style/model/blocks/polyhedron.ts +363 -0
- package/internal/stores/data_style/model/blocks/vertex.ts +349 -0
- package/internal/stores/data_style/model/blocks/visibility.ts +37 -0
- package/internal/stores/data_style/model/color.ts +348 -0
- package/internal/stores/data_style/model/common.ts +262 -0
- package/internal/stores/data_style/model/corners/{color.js → color.ts} +49 -10
- package/internal/stores/data_style/model/corners/common.ts +71 -0
- package/internal/stores/data_style/model/corners/{index.js → index.ts} +86 -47
- package/internal/stores/data_style/model/corners/vertex.ts +315 -0
- package/internal/stores/data_style/model/corners/visibility.ts +39 -0
- package/internal/stores/data_style/model/edges/common.ts +29 -0
- package/internal/stores/data_style/model/edges/{index.js → index.ts} +2 -7
- package/internal/stores/data_style/model/edges/visibility.ts +55 -0
- package/internal/stores/data_style/model/{index.js → index.ts} +24 -11
- package/internal/stores/data_style/model/lines/{color.js → color.ts} +47 -10
- package/internal/stores/data_style/model/lines/common.ts +63 -0
- package/internal/stores/data_style/model/lines/edge.ts +343 -0
- package/internal/stores/data_style/model/lines/{index.js → index.ts} +108 -66
- package/internal/stores/data_style/model/lines/vertex.ts +344 -0
- package/internal/stores/data_style/model/lines/visibility.ts +37 -0
- package/internal/stores/data_style/model/points/common.ts +25 -0
- package/internal/stores/data_style/model/points/index.ts +35 -0
- package/internal/stores/data_style/model/points/size.ts +44 -0
- package/internal/stores/data_style/model/points/visibility.ts +46 -0
- package/internal/stores/data_style/model/selection.ts +138 -0
- package/internal/stores/data_style/model/surfaces/{color.js → color.ts} +47 -10
- package/internal/stores/data_style/model/surfaces/common.ts +69 -0
- package/internal/stores/data_style/model/surfaces/{index.js → index.ts} +113 -66
- package/internal/stores/data_style/model/surfaces/polygon.ts +347 -0
- package/internal/stores/data_style/model/surfaces/vertex.ts +351 -0
- package/internal/stores/data_style/model/surfaces/visibility.ts +37 -0
- package/internal/stores/data_style/model/{visibility.js → visibility.ts} +112 -32
- package/internal/stores/data_style/state.ts +281 -0
- package/internal/stores/data_style/types.ts +30 -0
- package/internal/stores/hybrid_viewer/brightness.ts +124 -0
- package/internal/stores/hybrid_viewer/camera.ts +326 -0
- package/internal/stores/hybrid_viewer/{camera_animation.js → camera_animation.ts} +30 -12
- package/internal/stores/hybrid_viewer/{constants.js → constants.ts} +2 -2
- package/internal/stores/hybrid_viewer/core.ts +64 -0
- package/internal/stores/hybrid_viewer/{filters.js → filters.ts} +10 -13
- package/internal/stores/hybrid_viewer/highlight.ts +183 -0
- package/internal/stores/hybrid_viewer/{ruler.js → ruler.ts} +50 -22
- package/internal/stores/hybrid_viewer/scene.ts +125 -0
- package/internal/stores/hybrid_viewer/viewport.ts +177 -0
- package/internal/stores/hybrid_viewer/vtk_types.ts +58 -0
- package/internal/utils/api_fetch.ts +133 -0
- package/internal/utils/upload_file.ts +115 -0
- package/internal/utils/viewer_call.ts +99 -0
- package/internal/utils/ws_client.ts +54 -0
- package/nuxt.config.ts +168 -0
- package/opengeodeweb_front_schemas.json +2 -2
- package/package.json +49 -13
- package/server/api/cloud/extensions/{run.post.js → run.post.ts} +16 -12
- package/server/api/local/app/project_folder_path.post.ts +33 -0
- package/server/api/local/app/run_back.post.ts +39 -0
- package/server/api/local/app/run_viewer.post.ts +39 -0
- package/server/api/local/extensions/{kill.post.js → kill.post.ts} +15 -8
- package/server/api/local/extensions/{run.post.js → run.post.ts} +17 -12
- package/server/api/local/extensions/upload.put.ts +71 -0
- package/server/api/microservice/app/{get_is_app_ready.get.js → get_is_app_ready.get.ts} +5 -5
- package/server/api/microservice/app/schemas/get_is_app_ready.json +1 -1
- package/server/api/microservice/app/set_app_base_url.post.ts +29 -0
- package/server/api/microservice/app/set_back_base_url.post.ts +26 -0
- package/server/api/microservice/app/set_is_app_ready.post.ts +29 -0
- package/server/api/microservice/app/set_viewer_base_url.post.ts +26 -0
- package/server/api/microservice/extensions/{download.post.js → download.post.ts} +13 -6
- package/server/api/serverless/run_cloud.post.ts +92 -0
- package/server/utils/{app_config.js → app_config.ts} +40 -18
- package/server/utils/{cleanup.js → cleanup.ts} +76 -29
- package/server/utils/{cloud.js → cloud.ts} +33 -17
- package/server/utils/{extension.js → extension.ts} +31 -4
- package/server/utils/{microservices.js → microservices.ts} +68 -27
- package/server/utils/{path.js → path.ts} +36 -17
- package/server/utils/{scripts.js → scripts.ts} +49 -33
- package/server/utils/{server.js → server.ts} +13 -6
- package/server/utils/server_config.ts +74 -0
- package/server/utils/stream.ts +6 -0
- package/server/utils/ws_client.ts +165 -0
- package/shared/{scripts.js → scripts.ts} +15 -10
- package/shared/utils/call_raw.ts +73 -0
- package/shared/utils/{call_schema.js → call_schema.ts} +15 -6
- package/shared/utils/fetch_raw.ts +125 -0
- package/shared/utils/{fetch_schema.js → fetch_schema.ts} +16 -7
- package/shared/utils/file.ts +22 -0
- package/shared/utils/{parse_boolean.js → parse_boolean.ts} +1 -1
- package/shared/utils/response_handlers/load.ts +109 -0
- package/shared/utils/types.ts +27 -0
- package/shared/utils/{validate_schema.js → validate_schema.ts} +3 -1
- package/.github/workflows/config.json +0 -5
- package/.github/workflows/deploy.yml +0 -15
- package/.github/workflows/manual_release.yml +0 -11
- package/.github/workflows/merge_request.yml +0 -9
- package/.github/workflows/pr_update.yml +0 -11
- package/.github/workflows/prepare_deploy.yml +0 -9
- package/.github/workflows/schedule.yml +0 -18
- package/.github/workflows/test.yml +0 -14
- package/.github/workflows/test_pr.yml +0 -12
- package/.oxlintrc.json +0 -150
- package/.releaserc +0 -11
- package/app/components/Viewer/ObjectTree/Views/ModelComponents.vue +0 -224
- package/app/composables/clipping_planes_widget.js +0 -249
- package/app/composables/global_attribute_style.js +0 -181
- package/app/composables/hover_highlight.js +0 -91
- package/app/composables/responsive_middle_truncate.js +0 -34
- package/app/composables/stepper_tree.js +0 -56
- package/app/composables/tree_filter.js +0 -138
- package/app/composables/use_adaptive_styles.js +0 -120
- package/app/composables/use_overlapping_picker.js +0 -169
- package/app/composables/use_quick_colormap.js +0 -32
- package/app/composables/virtual_tree.js +0 -191
- package/app/stores/app.js +0 -326
- package/app/stores/camera_manager.js +0 -57
- package/app/stores/data.js +0 -278
- package/app/stores/data_helpers/collections.js +0 -96
- package/app/stores/data_helpers/mesh.js +0 -122
- package/app/stores/data_style.js +0 -116
- package/app/stores/infra.js +0 -95
- package/app/stores/treeview.js +0 -290
- package/app/utils/attributes.js +0 -23
- package/app/utils/clipping_planes.js +0 -110
- package/app/utils/colormap.js +0 -64
- package/app/utils/default_styles/meshes.js +0 -191
- package/app/utils/status.js +0 -10
- package/commitlint.config.js +0 -20
- package/internal/database/database.js +0 -80
- package/internal/database/tables/camera_positions.js +0 -4
- package/internal/database/tables/data_style.js +0 -4
- package/internal/database/tables/model_component_datastyle.js +0 -4
- package/internal/database/tables/model_component_type_datastyle.js +0 -4
- package/internal/database/tables/model_components.js +0 -4
- package/internal/database/tables/model_components_relation.js +0 -4
- package/internal/stores/data_style/mesh/cells/cell.js +0 -196
- package/internal/stores/data_style/mesh/cells/common.js +0 -39
- package/internal/stores/data_style/mesh/cells/index.js +0 -81
- package/internal/stores/data_style/mesh/cells/vertex.js +0 -193
- package/internal/stores/data_style/mesh/cells/visibility.js +0 -35
- package/internal/stores/data_style/mesh/edges/common.js +0 -32
- package/internal/stores/data_style/mesh/edges/edge.js +0 -195
- package/internal/stores/data_style/mesh/edges/index.js +0 -81
- package/internal/stores/data_style/mesh/edges/vertex.js +0 -196
- package/internal/stores/data_style/mesh/edges/visibility.js +0 -34
- package/internal/stores/data_style/mesh/edges/width.js +0 -34
- package/internal/stores/data_style/mesh/points/common.js +0 -37
- package/internal/stores/data_style/mesh/points/index.js +0 -82
- package/internal/stores/data_style/mesh/points/size.js +0 -35
- package/internal/stores/data_style/mesh/points/vertex.js +0 -193
- package/internal/stores/data_style/mesh/points/visibility.js +0 -37
- package/internal/stores/data_style/mesh/polygons/common.js +0 -32
- package/internal/stores/data_style/mesh/polygons/index.js +0 -107
- package/internal/stores/data_style/mesh/polygons/polygon.js +0 -196
- package/internal/stores/data_style/mesh/polygons/vertex.js +0 -196
- package/internal/stores/data_style/mesh/polygons/visibility.js +0 -38
- package/internal/stores/data_style/mesh/polyhedra/common.js +0 -32
- package/internal/stores/data_style/mesh/polyhedra/index.js +0 -98
- package/internal/stores/data_style/mesh/polyhedra/polyhedron.js +0 -196
- package/internal/stores/data_style/mesh/polyhedra/vertex.js +0 -196
- package/internal/stores/data_style/mesh/polyhedra/visibility.js +0 -38
- package/internal/stores/data_style/model/blocks/common.js +0 -51
- package/internal/stores/data_style/model/blocks/polyhedron.js +0 -215
- package/internal/stores/data_style/model/blocks/vertex.js +0 -204
- package/internal/stores/data_style/model/blocks/visibility.js +0 -20
- package/internal/stores/data_style/model/color.js +0 -218
- package/internal/stores/data_style/model/common.js +0 -141
- package/internal/stores/data_style/model/corners/common.js +0 -51
- package/internal/stores/data_style/model/corners/vertex.js +0 -204
- package/internal/stores/data_style/model/corners/visibility.js +0 -20
- package/internal/stores/data_style/model/edges/common.js +0 -20
- package/internal/stores/data_style/model/edges/visibility.js +0 -38
- package/internal/stores/data_style/model/lines/common.js +0 -51
- package/internal/stores/data_style/model/lines/edge.js +0 -203
- package/internal/stores/data_style/model/lines/vertex.js +0 -204
- package/internal/stores/data_style/model/lines/visibility.js +0 -20
- package/internal/stores/data_style/model/points/common.js +0 -20
- package/internal/stores/data_style/model/points/index.js +0 -25
- package/internal/stores/data_style/model/points/size.js +0 -36
- package/internal/stores/data_style/model/points/visibility.js +0 -36
- package/internal/stores/data_style/model/selection.js +0 -89
- package/internal/stores/data_style/model/surfaces/common.js +0 -51
- package/internal/stores/data_style/model/surfaces/polygon.js +0 -215
- package/internal/stores/data_style/model/surfaces/vertex.js +0 -215
- package/internal/stores/data_style/model/surfaces/visibility.js +0 -20
- package/internal/stores/data_style/state.js +0 -197
- package/internal/stores/hybrid_viewer/brightness.js +0 -82
- package/internal/stores/hybrid_viewer/camera.js +0 -274
- package/internal/stores/hybrid_viewer/highlight.js +0 -170
- package/internal/stores/hybrid_viewer/scene.js +0 -136
- package/internal/stores/hybrid_viewer/viewport.js +0 -140
- package/internal/utils/api_fetch.js +0 -52
- package/internal/utils/upload_file.js +0 -57
- package/internal/utils/viewer_call.js +0 -49
- package/internal/utils/ws_client.js +0 -29
- package/nuxt.config.js +0 -106
- package/scripts/generate_geode_objects.js +0 -24
- package/server/api/local/app/project_folder_path.post.js +0 -29
- package/server/api/local/app/run_back.post.js +0 -33
- package/server/api/local/app/run_viewer.post.js +0 -33
- package/server/api/local/extensions/upload.put.js +0 -72
- package/server/api/microservice/app/set_app_base_url.post.js +0 -25
- package/server/api/microservice/app/set_back_base_url.post.js +0 -22
- package/server/api/microservice/app/set_is_app_ready.post.js +0 -25
- package/server/api/microservice/app/set_viewer_base_url.post.js +0 -22
- package/server/api/serverless/run_cloud.post.js +0 -44
- package/server/utils/server_config.js +0 -58
- package/server/utils/ws_client.js +0 -112
- package/shared/utils/call_raw.js +0 -46
- package/shared/utils/fetch_raw.js +0 -61
- package/shared/utils/file.js +0 -16
- package/shared/utils/response_handlers/load.js +0 -74
- package/tests/integration/data/uploads/test.og_brep +0 -0
- package/tests/integration/data/uploads/test.og_edc2d +0 -0
- package/tests/integration/data/uploads/test.og_edc3d +0 -0
- package/tests/integration/data/uploads/test.og_psf3d +0 -0
- package/tests/integration/data/uploads/test.og_rgd2d +0 -0
- package/tests/integration/data/uploads/test.og_rgd3d +0 -0
- package/tests/integration/data/uploads/test.vtu +0 -22
- package/tests/integration/setup.js +0 -92
- package/tests/integration/stores/data_style/mesh/cells.nuxt.test.js +0 -343
- package/tests/integration/stores/data_style/mesh/edges.nuxt.test.js +0 -254
- package/tests/integration/stores/data_style/mesh/index.nuxt.test.js +0 -62
- package/tests/integration/stores/data_style/mesh/points.nuxt.test.js +0 -201
- package/tests/integration/stores/data_style/mesh/polygons.nuxt.test.js +0 -260
- package/tests/integration/stores/data_style/mesh/polyhedra.nuxt.test.js +0 -267
- package/tests/integration/stores/data_style/model/blocks.nuxt.test.js +0 -397
- package/tests/integration/stores/data_style/model/corners.nuxt.test.js +0 -264
- package/tests/integration/stores/data_style/model/edges.nuxt.test.js +0 -71
- package/tests/integration/stores/data_style/model/index.nuxt.test.js +0 -92
- package/tests/integration/stores/data_style/model/lines.nuxt.test.js +0 -379
- package/tests/integration/stores/data_style/model/points.nuxt.test.js +0 -95
- package/tests/integration/stores/data_style/model/surfaces.nuxt.test.js +0 -574
- package/tests/integration/stores/viewer.nuxt.test.js +0 -69
- package/tests/setup_indexeddb.js +0 -4
- package/tests/unit/components/CrsSelector.nuxt.test.js +0 -55
- package/tests/unit/components/DragAndDrop.nuxt.test.js +0 -89
- package/tests/unit/components/ExtensionSelector.nuxt.test.js +0 -65
- package/tests/unit/components/FeedBack/ErrorsBanner.nuxt.test.js +0 -41
- package/tests/unit/components/FeedBack/Snackers.nuxt.test.js +0 -49
- package/tests/unit/components/FileSelector.nuxt.test.js +0 -124
- package/tests/unit/components/FileUploader.nuxt.test.js +0 -69
- package/tests/unit/components/MissingFilesSelector.nuxt.test.js +0 -77
- package/tests/unit/components/ObjectSelector.nuxt.test.js +0 -118
- package/tests/unit/components/PackagesVersions.nuxt.test.js +0 -42
- package/tests/unit/components/Step.nuxt.test.js +0 -51
- package/tests/unit/components/Stepper.nuxt.test.js +0 -41
- package/tests/unit/components/ToolPanel.nuxt.test.js +0 -66
- package/tests/unit/composables/api_fetch.nuxt.test.js +0 -75
- package/tests/unit/composables/project_manager.nuxt.test.js +0 -299
- package/tests/unit/composables/run_function_when_microservices_connected.nuxt.test.js +0 -57
- package/tests/unit/composables/upload_file.nuxt.test.js +0 -45
- package/tests/unit/composables/virtual_tree.nuxt.test.js +0 -63
- package/tests/unit/plugins/project_load.nuxt.test.js +0 -98
- package/tests/unit/stores/app.nuxt.test.js +0 -189
- package/tests/unit/stores/back.nuxt.test.js +0 -147
- package/tests/unit/stores/cloud.nuxt.test.js +0 -90
- package/tests/unit/stores/data.nuxt.test.js +0 -162
- package/tests/unit/stores/feedback.nuxt.test.js +0 -90
- package/tests/unit/stores/infra.nuxt.test.js +0 -313
- package/tests/unit/stores/treeview.nuxt.test.js +0 -63
- package/tests/unit/stores/viewer.nuxt.test.js +0 -161
- package/tests/unit/utils/validate_schema.nuxt.test.js +0 -38
- package/tests/utils.js +0 -20
- package/tests/vitest.config.js +0 -67
- /package/server/api/local/app/{kill.post.js → kill.post.ts} +0 -0
- /package/shared/{app_mode.js → app_mode.ts} +0 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { BACKGROUND_GREY_VALUE, RGB_MAX } from "./constants";
|
|
2
|
+
import { useHybridViewerCore } from "./core";
|
|
3
|
+
|
|
4
|
+
const RGBA_CHANNELS = 4;
|
|
5
|
+
const SAMPLE_SIZE = 10;
|
|
6
|
+
const TOTAL_CHANNELS = 400;
|
|
7
|
+
|
|
8
|
+
interface Rect {
|
|
9
|
+
x: number;
|
|
10
|
+
y: number;
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// The decoded background image handed to us by the viewer's image stream (see app/stores/hybrid_viewer.ts's onImageReady) - draw-able onto a 2D canvas.
|
|
16
|
+
type DrawableImage = CanvasImageSource & { width: number; height: number };
|
|
17
|
+
|
|
18
|
+
interface BrightnessOptions {
|
|
19
|
+
latestImage: DrawableImage | undefined;
|
|
20
|
+
offscreenCtx: CanvasRenderingContext2D | undefined;
|
|
21
|
+
offscreenCanvas: HTMLCanvasElement | undefined;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface RelativeRect {
|
|
25
|
+
relX: number;
|
|
26
|
+
relY: number;
|
|
27
|
+
relW: number;
|
|
28
|
+
relH: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function mapRect(rect: Rect, latestImage: DrawableImage, canvasRect: DOMRect): RelativeRect {
|
|
32
|
+
const scaleX = latestImage.width / canvasRect.width;
|
|
33
|
+
const scaleY = latestImage.height / canvasRect.height;
|
|
34
|
+
return {
|
|
35
|
+
relX: (rect.x - canvasRect.left) * scaleX,
|
|
36
|
+
relY: (rect.y - canvasRect.top) * scaleY,
|
|
37
|
+
relW: rect.width * scaleX,
|
|
38
|
+
relH: rect.height * scaleY,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function sampleMinBrightness(
|
|
43
|
+
ctx: CanvasRenderingContext2D,
|
|
44
|
+
image: DrawableImage,
|
|
45
|
+
relRect: RelativeRect,
|
|
46
|
+
): number {
|
|
47
|
+
ctx.drawImage(
|
|
48
|
+
image,
|
|
49
|
+
Math.max(0, relRect.relX),
|
|
50
|
+
Math.max(0, relRect.relY),
|
|
51
|
+
Math.min(image.width, relRect.relW),
|
|
52
|
+
Math.min(image.height, relRect.relH),
|
|
53
|
+
0,
|
|
54
|
+
0,
|
|
55
|
+
SAMPLE_SIZE,
|
|
56
|
+
SAMPLE_SIZE,
|
|
57
|
+
);
|
|
58
|
+
const { data } = ctx.getImageData(0, 0, SAMPLE_SIZE, SAMPLE_SIZE);
|
|
59
|
+
let minBrightness = 1;
|
|
60
|
+
for (let i = 0; i < TOTAL_CHANNELS; i += RGBA_CHANNELS) {
|
|
61
|
+
const brightness = ((data[i] ?? 0) + (data[i + 1] ?? 0) + (data[i + 2] ?? 0)) / (3 * RGB_MAX);
|
|
62
|
+
if (brightness < minBrightness) {
|
|
63
|
+
minBrightness = brightness;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return minBrightness;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function computeAverageBrightness(rect: Rect, options: BrightnessOptions): number {
|
|
70
|
+
const { latestImage, offscreenCtx, offscreenCanvas } = options;
|
|
71
|
+
const { genericRenderWindow } = useHybridViewerCore();
|
|
72
|
+
if (!latestImage || !offscreenCtx || !offscreenCanvas || !genericRenderWindow.value) {
|
|
73
|
+
return BACKGROUND_GREY_VALUE / RGB_MAX;
|
|
74
|
+
}
|
|
75
|
+
// oxlint-disable-next-line no-unsafe-assignment -- vtk.js has no types for getApiSpecificRenderWindow(); narrowed below.
|
|
76
|
+
const webGLRenderWindow = genericRenderWindow.value.getApiSpecificRenderWindow();
|
|
77
|
+
// oxlint-disable-next-line no-unsafe-type-assertion -- trusted vtk.js OpenGL render window API boundary.
|
|
78
|
+
const apiSpecificRenderWindow = webGLRenderWindow as unknown as {
|
|
79
|
+
getCanvas: () => HTMLCanvasElement | null | undefined;
|
|
80
|
+
};
|
|
81
|
+
const canvas = apiSpecificRenderWindow.getCanvas();
|
|
82
|
+
if (canvas === undefined || canvas === null) {
|
|
83
|
+
return BACKGROUND_GREY_VALUE / RGB_MAX;
|
|
84
|
+
}
|
|
85
|
+
if (rect.width <= 0 || rect.height <= 0) {
|
|
86
|
+
return BACKGROUND_GREY_VALUE / RGB_MAX;
|
|
87
|
+
}
|
|
88
|
+
const relRect = mapRect(rect, latestImage, canvas.getBoundingClientRect());
|
|
89
|
+
if (relRect.relW <= 0 || relRect.relH <= 0) {
|
|
90
|
+
return BACKGROUND_GREY_VALUE / RGB_MAX;
|
|
91
|
+
}
|
|
92
|
+
offscreenCanvas.width = SAMPLE_SIZE;
|
|
93
|
+
offscreenCanvas.height = SAMPLE_SIZE;
|
|
94
|
+
try {
|
|
95
|
+
return sampleMinBrightness(offscreenCtx, latestImage, relRect);
|
|
96
|
+
} catch {
|
|
97
|
+
return BACKGROUND_GREY_VALUE / RGB_MAX;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function useHybridViewerBrightness(): {
|
|
101
|
+
latestImage: Ref<DrawableImage | undefined>;
|
|
102
|
+
getAverageBrightness: (rect: Rect) => number;
|
|
103
|
+
} {
|
|
104
|
+
const latestImage = ref<DrawableImage | undefined>(undefined);
|
|
105
|
+
const offscreenCanvas: HTMLCanvasElement | undefined =
|
|
106
|
+
typeof document === "undefined" ? undefined : document.createElement("canvas");
|
|
107
|
+
const offscreenCtx: CanvasRenderingContext2D | undefined = offscreenCanvas
|
|
108
|
+
? (offscreenCanvas.getContext("2d", {
|
|
109
|
+
willReadFrequently: true,
|
|
110
|
+
}) ?? undefined)
|
|
111
|
+
: undefined;
|
|
112
|
+
function getAverageBrightness(rect: Rect): number {
|
|
113
|
+
return computeAverageBrightness(rect, {
|
|
114
|
+
latestImage: latestImage.value,
|
|
115
|
+
offscreenCtx,
|
|
116
|
+
offscreenCanvas,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
latestImage,
|
|
121
|
+
getAverageBrightness,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
export { computeAverageBrightness, useHybridViewerBrightness };
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import type { CameraOptions, Vector3, vtkCamera, vtkOpenGLRenderWindow } from "./vtk_types";
|
|
2
|
+
import {
|
|
3
|
+
LONG_ANIMATION_DURATION,
|
|
4
|
+
SHORT_ANIMATION_DURATION,
|
|
5
|
+
animateCamera,
|
|
6
|
+
computeAnimationDuration,
|
|
7
|
+
} from "./camera_animation";
|
|
8
|
+
import { requireRenderWindow, useHybridViewerCore } from "./core";
|
|
9
|
+
import { dot } from "@kitware/vtk.js/Common/Core/Math";
|
|
10
|
+
import { useHybridViewerScene } from "./scene";
|
|
11
|
+
import { useViewerStore } from "@ogw_front/stores/viewer";
|
|
12
|
+
import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
|
|
13
|
+
|
|
14
|
+
const BUMP_MULTIPLIER = 0.2;
|
|
15
|
+
const ALIGNMENT_THRESHOLD = 0.9;
|
|
16
|
+
const EASE_EXPONENT = 1.1;
|
|
17
|
+
|
|
18
|
+
interface OrientationConfig {
|
|
19
|
+
position: Vector3;
|
|
20
|
+
view_up: Vector3;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const ORIENTATIONS: Record<string, OrientationConfig> = {
|
|
24
|
+
zplus: {
|
|
25
|
+
position: [0, 0, 1],
|
|
26
|
+
view_up: [0, 1, 0],
|
|
27
|
+
},
|
|
28
|
+
zminus: {
|
|
29
|
+
position: [0, 0, -1],
|
|
30
|
+
view_up: [0, 1, 0],
|
|
31
|
+
},
|
|
32
|
+
yplus: {
|
|
33
|
+
position: [0, 1, 0],
|
|
34
|
+
view_up: [0, 0, 1],
|
|
35
|
+
},
|
|
36
|
+
yminus: {
|
|
37
|
+
position: [0, -1, 0],
|
|
38
|
+
view_up: [0, 0, 1],
|
|
39
|
+
},
|
|
40
|
+
xplus: {
|
|
41
|
+
position: [1, 0, 0],
|
|
42
|
+
view_up: [0, 0, 1],
|
|
43
|
+
},
|
|
44
|
+
xminus: {
|
|
45
|
+
position: [-1, 0, 0],
|
|
46
|
+
view_up: [0, 0, 1],
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
function getImageStyle(): CSSStyleDeclaration | undefined {
|
|
51
|
+
const { genericRenderWindow } = useHybridViewerCore();
|
|
52
|
+
if (!genericRenderWindow.value) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
// oxlint-disable-next-line no-unsafe-assignment -- vtk.js has no types for getApiSpecificRenderWindow(); narrowed below.
|
|
56
|
+
const apiSpecificRenderWindow = genericRenderWindow.value.getApiSpecificRenderWindow();
|
|
57
|
+
// oxlint-disable-next-line no-unsafe-type-assertion -- trusted vtk.js OpenGL render window API boundary.
|
|
58
|
+
const webGLRenderWindow = apiSpecificRenderWindow as unknown as vtkOpenGLRenderWindow;
|
|
59
|
+
const bgImage: unknown = webGLRenderWindow.getReferenceByName("bgImage");
|
|
60
|
+
return bgImage instanceof HTMLImageElement ? bgImage.style : undefined;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function getCameraOptions(camera: vtkCamera): CameraOptions {
|
|
64
|
+
return {
|
|
65
|
+
focal_point: [...(camera.getFocalPoint() ?? [0, 0, 0])] as Vector3,
|
|
66
|
+
view_up: [...(camera.getViewUp() ?? [0, 0, 0])] as Vector3,
|
|
67
|
+
position: [...(camera.getPosition() ?? [0, 0, 0])] as Vector3,
|
|
68
|
+
view_angle: camera.getViewAngle(),
|
|
69
|
+
clipping_range: [...(camera.getClippingRange() ?? [0, 0])] as [number, number],
|
|
70
|
+
distance: camera.getDistance(),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function applyCameraOptions(
|
|
75
|
+
camera: vtkCamera | undefined,
|
|
76
|
+
options: Partial<CameraOptions> | undefined,
|
|
77
|
+
): void {
|
|
78
|
+
if (camera && options) {
|
|
79
|
+
camera.set({
|
|
80
|
+
focalPoint: options.focal_point,
|
|
81
|
+
viewUp: options.view_up,
|
|
82
|
+
position: options.position,
|
|
83
|
+
viewAngle: options.view_angle,
|
|
84
|
+
clippingRange: options.clipping_range,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const BOUNDS_LENGTH = 6;
|
|
90
|
+
|
|
91
|
+
function isBounds(value: unknown): value is [number, number, number, number, number, number] {
|
|
92
|
+
return (
|
|
93
|
+
Array.isArray(value) &&
|
|
94
|
+
value.length === BOUNDS_LENGTH &&
|
|
95
|
+
value.every((item): item is number => typeof item === "number")
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function toBounds(value: unknown): [number, number, number, number, number, number] {
|
|
100
|
+
if (!isBounds(value)) {
|
|
101
|
+
throw new Error("Expected a six-element numeric bounds array");
|
|
102
|
+
}
|
|
103
|
+
return value;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function centerCameraOnPosition(
|
|
107
|
+
camera: vtkCamera | undefined,
|
|
108
|
+
pickedPosition: Vector3 | undefined,
|
|
109
|
+
): void {
|
|
110
|
+
if (!camera || !pickedPosition) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const position = camera.getPosition();
|
|
114
|
+
const directionOfProjection = camera.getDirectionOfProjection();
|
|
115
|
+
const distance = dot(
|
|
116
|
+
[
|
|
117
|
+
pickedPosition[0] - position[0],
|
|
118
|
+
pickedPosition[1] - position[1],
|
|
119
|
+
pickedPosition[2] - position[2],
|
|
120
|
+
],
|
|
121
|
+
directionOfProjection,
|
|
122
|
+
);
|
|
123
|
+
camera.setFocalPoint(...pickedPosition);
|
|
124
|
+
camera.setPosition(
|
|
125
|
+
pickedPosition[0] - distance * directionOfProjection[0],
|
|
126
|
+
pickedPosition[1] - distance * directionOfProjection[1],
|
|
127
|
+
pickedPosition[2] - distance * directionOfProjection[2],
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Shared via createSharedComposable (rather than merged into the parent hybridViewer store) so sibling slices, e.g. viewport.ts and ruler.ts, can read camera_options/setCamera/syncRemoteCamera 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.
|
|
132
|
+
const useHybridViewerCamera = createSharedComposable(() => {
|
|
133
|
+
const camera_options = reactive<Record<string, unknown>>({});
|
|
134
|
+
|
|
135
|
+
function performSyncRemoteCamera(): void {
|
|
136
|
+
const { genericRenderWindow, remoteRender } = useHybridViewerCore();
|
|
137
|
+
const viewerStore = useViewerStore();
|
|
138
|
+
const renderer = requireRenderWindow(genericRenderWindow).getRenderer();
|
|
139
|
+
const camera = renderer.getActiveCamera();
|
|
140
|
+
const options_camera = getCameraOptions(camera);
|
|
141
|
+
const schema = viewer_schemas.opengeodeweb_viewer.viewer.update_camera;
|
|
142
|
+
const params = {
|
|
143
|
+
camera_options: options_camera,
|
|
144
|
+
};
|
|
145
|
+
viewerStore
|
|
146
|
+
.request(
|
|
147
|
+
{
|
|
148
|
+
schema,
|
|
149
|
+
params,
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
response_function: async () => {
|
|
153
|
+
await remoteRender().catch(() => undefined);
|
|
154
|
+
Object.assign(camera_options, options_camera);
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
)
|
|
158
|
+
// oxlint-disable-next-line promise/prefer-await-to-then -- fire-and-forget inside a sync caller; see codebase convention in global_attribute_style.ts.
|
|
159
|
+
.catch(() => undefined);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function syncRemoteCamera(): void {
|
|
163
|
+
performSyncRemoteCamera();
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function performSetCamera(targetCameraOptions: CameraOptions): void {
|
|
167
|
+
const { genericRenderWindow, is_moving } = useHybridViewerCore();
|
|
168
|
+
const imageStyle = getImageStyle();
|
|
169
|
+
const renderer = requireRenderWindow(genericRenderWindow).getRenderer();
|
|
170
|
+
const camera = renderer.getActiveCamera();
|
|
171
|
+
const startState = getCameraOptions(camera);
|
|
172
|
+
const duration = computeAnimationDuration(startState, targetCameraOptions);
|
|
173
|
+
is_moving.value = true;
|
|
174
|
+
if (imageStyle) {
|
|
175
|
+
imageStyle.opacity = "0";
|
|
176
|
+
}
|
|
177
|
+
animateCamera({
|
|
178
|
+
camera,
|
|
179
|
+
startState,
|
|
180
|
+
targetState: targetCameraOptions,
|
|
181
|
+
duration,
|
|
182
|
+
bumpMultiplier: 0,
|
|
183
|
+
easeExponent: EASE_EXPONENT,
|
|
184
|
+
onUpdate: () => {
|
|
185
|
+
const renderWindow = requireRenderWindow(genericRenderWindow).getRenderWindow();
|
|
186
|
+
renderWindow.render();
|
|
187
|
+
},
|
|
188
|
+
onEnd: () => {
|
|
189
|
+
applyCameraOptions(camera, targetCameraOptions);
|
|
190
|
+
const renderWindow = requireRenderWindow(genericRenderWindow).getRenderWindow();
|
|
191
|
+
renderWindow.render();
|
|
192
|
+
is_moving.value = false;
|
|
193
|
+
performSyncRemoteCamera();
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function setCamera(targetCameraOptions: CameraOptions): void {
|
|
199
|
+
performSetCamera(targetCameraOptions);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function resetCamera(): void {
|
|
203
|
+
const { genericRenderWindow } = useHybridViewerCore();
|
|
204
|
+
const renderer = requireRenderWindow(genericRenderWindow).getRenderer();
|
|
205
|
+
renderer.resetCamera();
|
|
206
|
+
const renderWindow = requireRenderWindow(genericRenderWindow).getRenderWindow();
|
|
207
|
+
renderWindow.render();
|
|
208
|
+
syncRemoteCamera();
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
async function performFocusCameraOnObject(id: string, block_ids: string[] = []): Promise<void> {
|
|
212
|
+
const { genericRenderWindow } = useHybridViewerCore();
|
|
213
|
+
const { hybridDb } = useHybridViewerScene();
|
|
214
|
+
if (!hybridDb[id]) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
const viewerStore = useViewerStore();
|
|
218
|
+
const bounds: [number, number, number, number, number, number] =
|
|
219
|
+
block_ids.length > 0
|
|
220
|
+
? toBounds(
|
|
221
|
+
await viewerStore.request({
|
|
222
|
+
schema: viewer_schemas.opengeodeweb_viewer.model.get_blocks_bounds,
|
|
223
|
+
params: {
|
|
224
|
+
id,
|
|
225
|
+
block_ids,
|
|
226
|
+
},
|
|
227
|
+
}),
|
|
228
|
+
)
|
|
229
|
+
: hybridDb[id].actor.getBounds();
|
|
230
|
+
const renderer = requireRenderWindow(genericRenderWindow).getRenderer();
|
|
231
|
+
const camera = renderer.getActiveCamera();
|
|
232
|
+
const startOptions = getCameraOptions(camera);
|
|
233
|
+
renderer.resetCamera(bounds);
|
|
234
|
+
const targetOptions = getCameraOptions(camera);
|
|
235
|
+
applyCameraOptions(camera, startOptions);
|
|
236
|
+
performSetCamera(targetOptions);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
async function focusCameraOnObject(id: string, block_ids: string[] = []): Promise<void> {
|
|
240
|
+
await performFocusCameraOnObject(id, block_ids);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function performCameraOrientation(orientation: string): void {
|
|
244
|
+
const config = ORIENTATIONS[orientation.toLowerCase()];
|
|
245
|
+
if (!config) {
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
const { genericRenderWindow, is_moving } = useHybridViewerCore();
|
|
249
|
+
const imageStyle = getImageStyle();
|
|
250
|
+
const renderer = requireRenderWindow(genericRenderWindow).getRenderer();
|
|
251
|
+
const camera = renderer.getActiveCamera();
|
|
252
|
+
const startState = getCameraOptions(camera);
|
|
253
|
+
applyCameraOptions(camera, {
|
|
254
|
+
...config,
|
|
255
|
+
focal_point: [0, 0, 0],
|
|
256
|
+
});
|
|
257
|
+
renderer.resetCamera();
|
|
258
|
+
const targetState = getCameraOptions(camera);
|
|
259
|
+
applyCameraOptions(camera, startState);
|
|
260
|
+
const alignment = dot(camera.getDirectionOfProjection(), config.position);
|
|
261
|
+
const duration =
|
|
262
|
+
alignment > ALIGNMENT_THRESHOLD ? LONG_ANIMATION_DURATION : SHORT_ANIMATION_DURATION;
|
|
263
|
+
is_moving.value = true;
|
|
264
|
+
if (imageStyle) {
|
|
265
|
+
imageStyle.opacity = "0";
|
|
266
|
+
}
|
|
267
|
+
animateCamera({
|
|
268
|
+
camera,
|
|
269
|
+
startState,
|
|
270
|
+
targetState,
|
|
271
|
+
duration,
|
|
272
|
+
bumpMultiplier: BUMP_MULTIPLIER,
|
|
273
|
+
easeExponent: EASE_EXPONENT,
|
|
274
|
+
onUpdate: () => {
|
|
275
|
+
const renderWindow = requireRenderWindow(genericRenderWindow).getRenderWindow();
|
|
276
|
+
renderWindow.render();
|
|
277
|
+
},
|
|
278
|
+
onEnd: () => {
|
|
279
|
+
is_moving.value = false;
|
|
280
|
+
performSyncRemoteCamera();
|
|
281
|
+
},
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
function setCameraOrientation(orientation: string): void {
|
|
286
|
+
performCameraOrientation(orientation);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
return {
|
|
290
|
+
camera_options,
|
|
291
|
+
syncRemoteCamera,
|
|
292
|
+
setCamera,
|
|
293
|
+
resetCamera,
|
|
294
|
+
focusCameraOnObject,
|
|
295
|
+
setCameraOrientation,
|
|
296
|
+
};
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
interface CameraSnapshot {
|
|
300
|
+
zScale?: number;
|
|
301
|
+
camera_options?: CameraOptions;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
async function applySnapshot(snapshot: CameraSnapshot | undefined): Promise<void> {
|
|
305
|
+
if (!snapshot) {
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
if (typeof snapshot.zScale === "number") {
|
|
309
|
+
await useHybridViewerScene().setZScaling(snapshot.zScale);
|
|
310
|
+
}
|
|
311
|
+
if (snapshot.camera_options) {
|
|
312
|
+
useHybridViewerCamera().setCamera(snapshot.camera_options);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
export {
|
|
316
|
+
ALIGNMENT_THRESHOLD,
|
|
317
|
+
BUMP_MULTIPLIER,
|
|
318
|
+
EASE_EXPONENT,
|
|
319
|
+
ORIENTATIONS,
|
|
320
|
+
applyCameraOptions,
|
|
321
|
+
applySnapshot,
|
|
322
|
+
centerCameraOnPosition,
|
|
323
|
+
getCameraOptions,
|
|
324
|
+
useHybridViewerCamera,
|
|
325
|
+
};
|
|
326
|
+
export type { CameraSnapshot };
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CameraOptions, Vector3, vtkCamera } from "./vtk_types";
|
|
1
2
|
import { dot } from "@kitware/vtk.js/Common/Core/Math";
|
|
2
3
|
|
|
3
4
|
const NEAR_ZERO_THRESHOLD = 1e-10;
|
|
@@ -6,15 +7,15 @@ const LONG_ANIMATION_DURATION = 1000;
|
|
|
6
7
|
const SHORT_ANIMATION_DURATION = 500;
|
|
7
8
|
const MID_ANIMATION_RATIO = 0.5;
|
|
8
9
|
|
|
9
|
-
function vecSub(vector, other) {
|
|
10
|
+
function vecSub(vector: Vector3, other: Vector3): Vector3 {
|
|
10
11
|
return [vector[0] - other[0], vector[1] - other[1], vector[2] - other[2]];
|
|
11
12
|
}
|
|
12
13
|
|
|
13
|
-
function vecLength(vector) {
|
|
14
|
+
function vecLength(vector: Vector3): number {
|
|
14
15
|
return Math.hypot(vector[0], vector[1], vector[2]);
|
|
15
16
|
}
|
|
16
17
|
|
|
17
|
-
function vecNormalize(vector) {
|
|
18
|
+
function vecNormalize(vector: Vector3): Vector3 {
|
|
18
19
|
const len = vecLength(vector);
|
|
19
20
|
if (len < NEAR_ZERO_THRESHOLD) {
|
|
20
21
|
return [0, 0, 1];
|
|
@@ -22,7 +23,7 @@ function vecNormalize(vector) {
|
|
|
22
23
|
return [vector[0] / len, vector[1] / len, vector[2] / len];
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
function slerp(from, target, ratio, mid) {
|
|
26
|
+
function slerp(from: Vector3, target: Vector3, ratio: number, mid?: Vector3): Vector3 {
|
|
26
27
|
const normFrom = vecNormalize(from);
|
|
27
28
|
const normTarget = vecNormalize(target);
|
|
28
29
|
let dotProduct =
|
|
@@ -51,7 +52,7 @@ function slerp(from, target, ratio, mid) {
|
|
|
51
52
|
];
|
|
52
53
|
}
|
|
53
54
|
|
|
54
|
-
function computeAnimationDuration(startState, targetState) {
|
|
55
|
+
function computeAnimationDuration(startState: CameraOptions, targetState: CameraOptions): number {
|
|
55
56
|
const startDir = vecNormalize(vecSub(startState.position, startState.focal_point));
|
|
56
57
|
const targetDir = vecNormalize(vecSub(targetState.position, targetState.focal_point));
|
|
57
58
|
const dotProduct = Math.max(-1, Math.min(1, dot(startDir, targetDir)));
|
|
@@ -62,7 +63,18 @@ function computeAnimationDuration(startState, targetState) {
|
|
|
62
63
|
);
|
|
63
64
|
}
|
|
64
65
|
|
|
65
|
-
|
|
66
|
+
interface AnimateCameraOptions {
|
|
67
|
+
camera: vtkCamera;
|
|
68
|
+
startState: CameraOptions;
|
|
69
|
+
targetState: CameraOptions;
|
|
70
|
+
duration: number;
|
|
71
|
+
bumpMultiplier: number;
|
|
72
|
+
easeExponent: number;
|
|
73
|
+
onUpdate: () => void;
|
|
74
|
+
onEnd: () => void;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function animateCamera(options: AnimateCameraOptions): void {
|
|
66
78
|
const {
|
|
67
79
|
camera,
|
|
68
80
|
startState,
|
|
@@ -83,7 +95,7 @@ function animateCamera(options) {
|
|
|
83
95
|
const startTargetDot =
|
|
84
96
|
normStart[0] * normTarget[0] + normStart[1] * normTarget[1] + normStart[2] * normTarget[2];
|
|
85
97
|
|
|
86
|
-
let antipodalMid = undefined;
|
|
98
|
+
let antipodalMid: Vector3 | undefined = undefined;
|
|
87
99
|
if (startTargetDot < -SLERP_LINEAR_THRESHOLD) {
|
|
88
100
|
const normUp = vecNormalize(startState.view_up);
|
|
89
101
|
antipodalMid = vecNormalize([
|
|
@@ -94,7 +106,7 @@ function animateCamera(options) {
|
|
|
94
106
|
}
|
|
95
107
|
|
|
96
108
|
const startTime = performance.now();
|
|
97
|
-
function animate(currentTime) {
|
|
109
|
+
function animate(currentTime: number): void {
|
|
98
110
|
const progress = Math.min((currentTime - startTime) / duration, 1);
|
|
99
111
|
const ease =
|
|
100
112
|
duration > SHORT_ANIMATION_DURATION
|
|
@@ -103,12 +115,18 @@ function animateCamera(options) {
|
|
|
103
115
|
const bump = bumpMultiplier * Math.sin(Math.PI * progress);
|
|
104
116
|
const dir = slerp(startDir, targetDir, ease, antipodalMid);
|
|
105
117
|
const dist = startDist + (targetDist - startDist) * ease + bump;
|
|
106
|
-
const focalPoint =
|
|
107
|
-
|
|
108
|
-
|
|
118
|
+
const focalPoint: Vector3 = [
|
|
119
|
+
startState.focal_point[0] + (targetState.focal_point[0] - startState.focal_point[0]) * ease,
|
|
120
|
+
startState.focal_point[1] + (targetState.focal_point[1] - startState.focal_point[1]) * ease,
|
|
121
|
+
startState.focal_point[2] + (targetState.focal_point[2] - startState.focal_point[2]) * ease,
|
|
122
|
+
];
|
|
109
123
|
const viewUp = slerp(startState.view_up, targetState.view_up, ease);
|
|
110
124
|
camera.set({
|
|
111
|
-
position:
|
|
125
|
+
position: [
|
|
126
|
+
focalPoint[0] + dir[0] * dist,
|
|
127
|
+
focalPoint[1] + dir[1] * dist,
|
|
128
|
+
focalPoint[2] + dir[2] * dist,
|
|
129
|
+
],
|
|
112
130
|
viewUp,
|
|
113
131
|
focalPoint,
|
|
114
132
|
});
|
|
@@ -3,9 +3,9 @@ const BACKGROUND_GREY_VALUE = 180;
|
|
|
3
3
|
const ACTOR_DARK_VALUE = 20;
|
|
4
4
|
|
|
5
5
|
const bgVal = BACKGROUND_GREY_VALUE / RGB_MAX;
|
|
6
|
-
const BACKGROUND_COLOR = [bgVal, bgVal, bgVal];
|
|
6
|
+
const BACKGROUND_COLOR: [number, number, number] = [bgVal, bgVal, bgVal];
|
|
7
7
|
const actVal = ACTOR_DARK_VALUE / RGB_MAX;
|
|
8
|
-
const ACTOR_COLOR = [actVal, actVal, actVal];
|
|
8
|
+
const ACTOR_COLOR: [number, number, number] = [actVal, actVal, actVal];
|
|
9
9
|
const HOVER_TIMEOUT_MS = 500;
|
|
10
10
|
const WHEEL_TIME_OUT_MS = 600;
|
|
11
11
|
const HOVER_DEBOUNCE_MS = 50;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Status } from "@ogw_front/utils/status";
|
|
2
|
+
import type { ViewStreamLike } from "./vtk_types";
|
|
3
|
+
import type { vtkGenericRenderWindow as VtkGenericRenderWindow } from "@kitware/vtk.js/Rendering/Misc/GenericRenderWindow";
|
|
4
|
+
import { useViewerStore } from "@ogw_front/stores/viewer";
|
|
5
|
+
import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
|
|
6
|
+
|
|
7
|
+
interface GenericRenderWindowHolder {
|
|
8
|
+
value?: VtkGenericRenderWindow;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// `genericRenderWindow.value` is only ever read from these functions after the viewer has been initialized (see app/stores/hybrid_viewer.ts's initHybridViewer), so requireRenderWindow throwing on that path would indicate a real bug rather than an expected state.
|
|
12
|
+
function requireRenderWindow(holder: GenericRenderWindowHolder): VtkGenericRenderWindow {
|
|
13
|
+
if (!holder.value) {
|
|
14
|
+
throw new Error("genericRenderWindow accessed before the viewer was initialized");
|
|
15
|
+
}
|
|
16
|
+
return holder.value;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Render-window, status and drag/pick state shared across the hybrid viewer's slice composables (app/stores/hybrid_viewer.ts and internal/stores/hybrid_viewer/*), plus the debounced remote-render call they all trigger. Shared via createSharedComposable (a singleton per mounted tree, not a Pinia store) so those slices can depend on it directly instead of on the composed hybridViewer store, which would create an import cycle; a real Pinia store here would also pull its own $id/$patch/... properties into the composed store's spread and collapse its inferred type.
|
|
20
|
+
const useHybridViewerCore = createSharedComposable(() => {
|
|
21
|
+
const genericRenderWindow = reactive<GenericRenderWindowHolder>({});
|
|
22
|
+
const status = ref(Status.NOT_CREATED);
|
|
23
|
+
const is_moving = ref(false);
|
|
24
|
+
const is_picking = ref(false);
|
|
25
|
+
const viewStream = ref<ViewStreamLike | undefined>(undefined);
|
|
26
|
+
|
|
27
|
+
let renderPromise: Promise<void> | undefined = undefined;
|
|
28
|
+
let renderPending = false;
|
|
29
|
+
|
|
30
|
+
async function remoteRender(): Promise<void> {
|
|
31
|
+
if (renderPromise) {
|
|
32
|
+
renderPending = true;
|
|
33
|
+
await renderPromise;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
renderPromise = (async (): Promise<void> => {
|
|
38
|
+
try {
|
|
39
|
+
const viewerStore = useViewerStore();
|
|
40
|
+
const schema = viewer_schemas.opengeodeweb_viewer.viewer.render;
|
|
41
|
+
await viewerStore.request({ schema });
|
|
42
|
+
} finally {
|
|
43
|
+
renderPromise = undefined;
|
|
44
|
+
if (renderPending) {
|
|
45
|
+
renderPending = false;
|
|
46
|
+
await remoteRender();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
})();
|
|
50
|
+
return renderPromise;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
genericRenderWindow,
|
|
55
|
+
status,
|
|
56
|
+
is_moving,
|
|
57
|
+
is_picking,
|
|
58
|
+
viewStream,
|
|
59
|
+
remoteRender,
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
export { requireRenderWindow, useHybridViewerCore };
|
|
64
|
+
export type { GenericRenderWindowHolder };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useHybridViewerCore } from "./core";
|
|
2
2
|
import { useViewerStore } from "@ogw_front/stores/viewer";
|
|
3
3
|
import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
|
|
4
4
|
|
|
5
|
-
async function
|
|
5
|
+
async function setClippingPlanes(ids: string[], planes: unknown): Promise<void> {
|
|
6
6
|
const viewerStore = useViewerStore();
|
|
7
|
-
const { remoteRender } =
|
|
7
|
+
const { remoteRender } = useHybridViewerCore();
|
|
8
8
|
const schema = viewer_schemas.opengeodeweb_viewer.viewer.clipping_planes;
|
|
9
9
|
const params = {
|
|
10
10
|
ids,
|
|
@@ -16,9 +16,9 @@ async function performSetClippingPlanes(ids, planes) {
|
|
|
16
16
|
});
|
|
17
17
|
await remoteRender();
|
|
18
18
|
}
|
|
19
|
-
async function
|
|
19
|
+
async function setShrink(ids: string[], shrink_factor: number): Promise<void> {
|
|
20
20
|
const viewerStore = useViewerStore();
|
|
21
|
-
const { remoteRender } =
|
|
21
|
+
const { remoteRender } = useHybridViewerCore();
|
|
22
22
|
const schema = viewer_schemas.opengeodeweb_viewer.viewer.shrink;
|
|
23
23
|
const params = {
|
|
24
24
|
ids,
|
|
@@ -30,16 +30,13 @@ async function performSetShrink(ids, shrink_factor) {
|
|
|
30
30
|
});
|
|
31
31
|
await remoteRender();
|
|
32
32
|
}
|
|
33
|
-
function useHybridViewerFilters() {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
async function setShrink(ids, shrink_factor) {
|
|
38
|
-
await performSetShrink(ids, shrink_factor);
|
|
39
|
-
}
|
|
33
|
+
function useHybridViewerFilters(): {
|
|
34
|
+
setClippingPlanes: (ids: string[], planes: unknown) => Promise<void>;
|
|
35
|
+
setShrink: (ids: string[], shrink_factor: number) => Promise<void>;
|
|
36
|
+
} {
|
|
40
37
|
return {
|
|
41
38
|
setClippingPlanes,
|
|
42
39
|
setShrink,
|
|
43
40
|
};
|
|
44
41
|
}
|
|
45
|
-
export {
|
|
42
|
+
export { useHybridViewerFilters };
|