@giro3d/piero 1.0.0-beta.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/LICENSE +9 -0
- package/README.md +134 -0
- package/dist/Components.cjs.js +2 -0
- package/dist/Components.cjs.js.map +1 -0
- package/dist/Components.es.js +608 -0
- package/dist/Components.es.js.map +1 -0
- package/dist/assets/piero.css +9 -0
- package/dist/index.cjs.js +9 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.es.js +6971 -0
- package/dist/index.es.js.map +1 -0
- package/dist/modules.cjs.js +2 -0
- package/dist/modules.cjs.js.map +1 -0
- package/dist/modules.d.ts +2 -0
- package/dist/modules.es.js +856 -0
- package/dist/modules.es.js.map +1 -0
- package/dist/src/App.vue.d.ts +6 -0
- package/dist/src/api/BookmarkApi.d.ts +6 -0
- package/dist/src/api/DatasetApi.d.ts +61 -0
- package/dist/src/api/ViewApi.d.ts +4 -0
- package/dist/src/api/index.d.ts +4 -0
- package/dist/src/components/AlertToast.vue.d.ts +4 -0
- package/dist/src/components/AttributeGroup.vue.d.ts +7 -0
- package/dist/src/components/AttributeItem.vue.d.ts +6 -0
- package/dist/src/components/AttributePanel.vue.d.ts +14 -0
- package/dist/src/components/ColorFragment.vue.d.ts +6 -0
- package/dist/src/components/Configuration.d.ts +14 -0
- package/dist/src/components/CoordinateFragment.vue.d.ts +10 -0
- package/dist/src/components/DropdownView.vue.d.ts +13 -0
- package/dist/src/components/LinkFragment.vue.d.ts +10 -0
- package/dist/src/components/LoadingScreen.vue.d.ts +2 -0
- package/dist/src/components/MainView.vue.d.ts +5 -0
- package/dist/src/components/MinimapView.vue.d.ts +4 -0
- package/dist/src/components/ModalOverlay.vue.d.ts +25 -0
- package/dist/src/components/NavigationButtons.vue.d.ts +2 -0
- package/dist/src/components/OpacitySlider.vue.d.ts +10 -0
- package/dist/src/components/PanelContainer.vue.d.ts +10 -0
- package/dist/src/components/ProgressBar.vue.d.ts +14 -0
- package/dist/src/components/SearchOverlay.vue.d.ts +8 -0
- package/dist/src/components/SpinnerControl.vue.d.ts +2 -0
- package/dist/src/components/StatusBar.vue.d.ts +10 -0
- package/dist/src/components/SwitchToggle.vue.d.ts +25 -0
- package/dist/src/components/VisibilityControl.vue.d.ts +9 -0
- package/dist/src/components/atoms/ButtonArea.vue.d.ts +17 -0
- package/dist/src/components/atoms/ButtonWithIcon.vue.d.ts +11 -0
- package/dist/src/components/atoms/CompactList.vue.d.ts +17 -0
- package/dist/src/components/atoms/Icon.vue.d.ts +6 -0
- package/dist/src/components/atoms/IconList.vue.d.ts +17 -0
- package/dist/src/components/atoms/IconListButton.vue.d.ts +10 -0
- package/dist/src/components/atoms/ImportButton.vue.d.ts +13 -0
- package/dist/src/components/atoms/ListLabel.vue.d.ts +5 -0
- package/dist/src/components/atoms/ListLabelButton.vue.d.ts +11 -0
- package/dist/src/components/atoms/SectionCollapsible.vue.d.ts +30 -0
- package/dist/src/components/charts/BarChart.vue.d.ts +4 -0
- package/dist/src/components/charts/DoughnutChart.vue.d.ts +4 -0
- package/dist/src/components/panels/AboutPanel.vue.d.ts +2 -0
- package/dist/src/components/panels/AnalysisPanel.vue.d.ts +2 -0
- package/dist/src/components/panels/AnnotationItem.vue.d.ts +21 -0
- package/dist/src/components/panels/AnnotationPanel.vue.d.ts +2 -0
- package/dist/src/components/panels/BasemapItem.vue.d.ts +17 -0
- package/dist/src/components/panels/BookmarkItem.vue.d.ts +16 -0
- package/dist/src/components/panels/BookmarkPanel.vue.d.ts +2 -0
- package/dist/src/components/panels/DatagroupItem.vue.d.ts +18 -0
- package/dist/src/components/panels/DatasetItem.vue.d.ts +18 -0
- package/dist/src/components/panels/DatasetOrGroupItem.vue.d.ts +18 -0
- package/dist/src/components/panels/DatasetPanel.vue.d.ts +2 -0
- package/dist/src/components/panels/EmptyIndicator.vue.d.ts +6 -0
- package/dist/src/components/panels/LoadingIndicator.vue.d.ts +6 -0
- package/dist/src/components/panels/MeasurementItem.vue.d.ts +17 -0
- package/dist/src/components/panels/MeasurementPanel.vue.d.ts +2 -0
- package/dist/src/components/panels/OverlayItem.vue.d.ts +19 -0
- package/dist/src/components/panels/ShareBookmarkModal.vue.d.ts +5 -0
- package/dist/src/components/panels/analysis/ClippingBox.vue.d.ts +2 -0
- package/dist/src/components/panels/analysis/CrossSection.vue.d.ts +2 -0
- package/dist/src/components/panels/analysis/FloodingPlane.vue.d.ts +2 -0
- package/dist/src/components/panels/analysis/Statistics.vue.d.ts +2 -0
- package/dist/src/components/panels/analysis/ToolWrapper.vue.d.ts +28 -0
- package/dist/src/components/toolbar/ToolBar.vue.d.ts +9 -0
- package/dist/src/components/toolbar/ToolbarButton.vue.d.ts +12 -0
- package/dist/src/config-loader.d.ts +7 -0
- package/dist/src/constants.d.ts +7 -0
- package/dist/src/context.d.ts +35 -0
- package/dist/src/createPieroApp.d.ts +31 -0
- package/dist/src/events.d.ts +30 -0
- package/dist/src/giro3d/CameraControlsInspector.d.ts +17 -0
- package/dist/src/giro3d/EntityBuilder.d.ts +21 -0
- package/dist/src/giro3d/Graticule.d.ts +20 -0
- package/dist/src/giro3d/Grid.d.ts +11 -0
- package/dist/src/giro3d/LayerBuilder.d.ts +46 -0
- package/dist/src/giro3d/Measure3D.d.ts +20 -0
- package/dist/src/giro3d/Plane.d.ts +11 -0
- package/dist/src/giro3d/Skybox.d.ts +6 -0
- package/dist/src/giro3d/entities/FeatureCollectionEntity.d.ts +41 -0
- package/dist/src/giro3d/entities/PointCloudEntity.d.ts +45 -0
- package/dist/src/giro3d/entities/TiledPointCloudEntity.d.ts +13 -0
- package/dist/src/giro3d/entities/Tiles3dEntity.d.ts +11 -0
- package/dist/src/giro3d/entities/VectorLabelsEntity.d.ts +48 -0
- package/dist/src/giro3d/entities/VectorMeshEntity.d.ts +97 -0
- package/dist/src/giro3d/entities/VectorShapeEntity.d.ts +8 -0
- package/dist/src/giro3d/entities/flatPointCloud.d.ts +2 -0
- package/dist/src/giro3d/entities/tiledIfc.d.ts +2 -0
- package/dist/src/giro3d/entities/vector.d.ts +2 -0
- package/dist/src/giro3d/sources/GeopackageSource.d.ts +20 -0
- package/dist/src/giro3d/sources/ShapefileSource.d.ts +20 -0
- package/dist/src/giro3d/sources/mixins.d.ts +60 -0
- package/dist/src/index.d.ts +17 -0
- package/dist/src/loaders/csv.d.ts +3 -0
- package/dist/src/loaders/las.d.ts +3 -0
- package/dist/src/loaders/loader.d.ts +29 -0
- package/dist/src/loaders/loader.test.d.ts +1 -0
- package/dist/src/loaders/userData.d.ts +8 -0
- package/dist/src/loaders/vector.d.ts +4 -0
- package/dist/src/module.d.ts +11 -0
- package/dist/src/modules/IFCLoader.d.ts +9 -0
- package/dist/src/modules/PLYLoader.d.ts +9 -0
- package/dist/src/modules/PotreeLoader.d.ts +9 -0
- package/dist/src/modules/Tour.d.ts +17 -0
- package/dist/src/modules/ifc/IfcEntity.d.ts +84 -0
- package/dist/src/modules/ifc/IfcEntityInspector.d.ts +7 -0
- package/dist/src/modules/ifc/IfcPropertyView.vue.d.ts +6 -0
- package/dist/src/modules/ifc/IfcSubtree.vue.d.ts +7 -0
- package/dist/src/modules/index.d.ts +5 -0
- package/dist/src/modules/ply/PlyEntity.d.ts +33 -0
- package/dist/src/providers/Alticoding.d.ts +32 -0
- package/dist/src/providers/BanProvider.d.ts +11 -0
- package/dist/src/providers/Geocoding.d.ts +7 -0
- package/dist/src/providers/IgnProvider.d.ts +11 -0
- package/dist/src/services/AnalysisManager.d.ts +10 -0
- package/dist/src/services/AnnotationManager.d.ts +48 -0
- package/dist/src/services/CameraController.d.ts +99 -0
- package/dist/src/services/DatasetManager.d.ts +27 -0
- package/dist/src/services/Giro3DManager.d.ts +42 -0
- package/dist/src/services/Highlighter.d.ts +11 -0
- package/dist/src/services/LayerManager.d.ts +37 -0
- package/dist/src/services/MeasureTool.d.ts +13 -0
- package/dist/src/services/MeasurementManager.d.ts +31 -0
- package/dist/src/services/MinimapController.d.ts +19 -0
- package/dist/src/services/Picker.d.ts +53 -0
- package/dist/src/services/analysis/ClippingBoxManager.d.ts +41 -0
- package/dist/src/services/analysis/CrossSectionManager.d.ts +9 -0
- package/dist/src/services/analysis/FloodingPlaneManager.d.ts +11 -0
- package/dist/src/stores/analysis.d.ts +1571 -0
- package/dist/src/stores/annotations.d.ts +60 -0
- package/dist/src/stores/bookmarks.d.ts +21 -0
- package/dist/src/stores/camera.d.ts +39 -0
- package/dist/src/stores/datasets.d.ts +49 -0
- package/dist/src/stores/giro3d.d.ts +45 -0
- package/dist/src/stores/layers.d.ts +40 -0
- package/dist/src/stores/measurement.d.ts +45 -0
- package/dist/src/stores/modules.d.ts +11 -0
- package/dist/src/stores/notifications.d.ts +8 -0
- package/dist/src/stores/statistics.d.ts +8 -0
- package/dist/src/types/Annotation.d.ts +35 -0
- package/dist/src/types/AnnotationMode.d.ts +7 -0
- package/dist/src/types/BaseLayer.d.ts +30 -0
- package/dist/src/types/Bookmark.d.ts +19 -0
- package/dist/src/types/CameraPosition.d.ts +7 -0
- package/dist/src/types/Configuration.d.ts +106 -0
- package/dist/src/types/Dataset.d.ts +78 -0
- package/dist/src/types/Feature.d.ts +13 -0
- package/dist/src/types/FloodingPlane.d.ts +14 -0
- package/dist/src/types/IFCTypes.d.ts +5 -0
- package/dist/src/types/LayerObject.d.ts +20 -0
- package/dist/src/types/Measure.d.ts +20 -0
- package/dist/src/types/MeasurementMode.d.ts +7 -0
- package/dist/src/types/Named.d.ts +5 -0
- package/dist/src/types/NavigationMode.d.ts +2 -0
- package/dist/src/types/Notification.d.ts +8 -0
- package/dist/src/types/OLGeometry.d.ts +1 -0
- package/dist/src/types/Overlay.d.ts +24 -0
- package/dist/src/types/VectorStyle.d.ts +31 -0
- package/dist/src/types/Viewbox.d.ts +7 -0
- package/dist/src/types/configuration/analysis.d.ts +26 -0
- package/dist/src/types/configuration/bookmark.d.ts +16 -0
- package/dist/src/types/configuration/camera.d.ts +19 -0
- package/dist/src/types/configuration/color.d.ts +18 -0
- package/dist/src/types/configuration/datasets/cityjson.d.ts +9 -0
- package/dist/src/types/configuration/datasets/core.d.ts +49 -0
- package/dist/src/types/configuration/datasets/featureCollection.d.ts +6 -0
- package/dist/src/types/configuration/datasets/ifc.d.ts +10 -0
- package/dist/src/types/configuration/datasets/index.d.ts +27 -0
- package/dist/src/types/configuration/datasets/layer.d.ts +43 -0
- package/dist/src/types/configuration/datasets/ply.d.ts +10 -0
- package/dist/src/types/configuration/datasets/pointCloud.d.ts +12 -0
- package/dist/src/types/configuration/datasets/potreePointCloud.d.ts +10 -0
- package/dist/src/types/configuration/datasets/tiledIfc.d.ts +9 -0
- package/dist/src/types/configuration/datasets/tiledPointCloud.d.ts +9 -0
- package/dist/src/types/configuration/datasets/vector.d.ts +34 -0
- package/dist/src/types/configuration/features.d.ts +2 -0
- package/dist/src/types/configuration/geographic.d.ts +51 -0
- package/dist/src/types/configuration/layers/core.d.ts +50 -0
- package/dist/src/types/configuration/layers/index.d.ts +51 -0
- package/dist/src/types/configuration/sources/bingMaps.d.ts +5 -0
- package/dist/src/types/configuration/sources/core/baseConfig.d.ts +70 -0
- package/dist/src/types/configuration/sources/core/tiled.d.ts +19 -0
- package/dist/src/types/configuration/sources/core/vector.d.ts +13 -0
- package/dist/src/types/configuration/sources/core/vectorTile.d.ts +8 -0
- package/dist/src/types/configuration/sources/customVector.d.ts +7 -0
- package/dist/src/types/configuration/sources/customVectorTile.d.ts +8 -0
- package/dist/src/types/configuration/sources/geojson.d.ts +5 -0
- package/dist/src/types/configuration/sources/geotiff.d.ts +8 -0
- package/dist/src/types/configuration/sources/gpx.d.ts +5 -0
- package/dist/src/types/configuration/sources/kml.d.ts +5 -0
- package/dist/src/types/configuration/sources/mvt.d.ts +10 -0
- package/dist/src/types/configuration/sources/osm.d.ts +5 -0
- package/dist/src/types/configuration/sources/stadiaMaps.d.ts +5 -0
- package/dist/src/types/configuration/sources/wms.d.ts +15 -0
- package/dist/src/types/configuration/sources/wmts.d.ts +15 -0
- package/dist/src/types/configuration/sources/xyz.d.ts +9 -0
- package/dist/src/types/utilities.d.ts +5 -0
- package/dist/src/utils/Components.d.ts +8 -0
- package/dist/src/utils/Configuration.d.ts +15 -0
- package/dist/src/utils/Download.d.ts +11 -0
- package/dist/src/utils/Fetcher.d.ts +77 -0
- package/dist/src/utils/Measure.d.ts +7 -0
- package/dist/src/utils/OLFeatures.d.ts +57 -0
- package/dist/src/utils/Projections.d.ts +10 -0
- package/dist/src/utils/Types.d.ts +11 -0
- package/package.json +103 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/api/BookmarkApi.ts","../src/components/Configuration.ts","../src/giro3d/entities/FeatureCollectionEntity.ts","../src/giro3d/entities/PointCloudEntity.ts","../src/giro3d/entities/flatPointCloud.ts","../src/giro3d/entities/Tiles3dEntity.ts","../src/giro3d/entities/tiledIfc.ts","../src/giro3d/entities/TiledPointCloudEntity.ts","../src/providers/IgnProvider.ts","../src/providers/Alticoding.ts","../src/utils/Projections.ts","../src/utils/OLFeatures.ts","../src/giro3d/entities/VectorMeshEntity.ts","../src/giro3d/sources/GeopackageSource.ts","../src/giro3d/sources/ShapefileSource.ts","../src/constants.ts","../src/giro3d/entities/VectorLabelsEntity.ts","../src/giro3d/entities/VectorShapeEntity.ts","../src/giro3d/entities/vector.ts","../src/giro3d/EntityBuilder.ts","../src/loaders/csv.ts","../src/loaders/las.ts","../src/loaders/vector.ts","../src/loaders/loader.ts","../src/services/Highlighter.ts","../src/giro3d/Measure3D.ts","../src/types/Feature.ts","../src/giro3d/Grid.ts","../src/giro3d/LayerBuilder.ts","../src/giro3d/Plane.ts","../src/stores/giro3d.ts","../src/giro3d/Graticule.ts","../src/types/LayerObject.ts","../src/types/BaseLayer.ts","../src/types/Overlay.ts","../src/stores/layers.ts","../src/services/LayerManager.ts","../src/services/Picker.ts","../src/api/DatasetApi.ts","../src/types/FloodingPlane.ts","../src/services/analysis/FloodingPlaneManager.ts","../src/services/analysis/ClippingBoxManager.ts","../src/services/analysis/CrossSectionManager.ts","../src/services/AnalysisManager.ts","../src/stores/annotations.ts","../src/stores/notifications.ts","../src/types/Annotation.ts","../src/types/Notification.ts","../src/utils/Measure.ts","../src/services/AnnotationManager.ts","../src/types/CameraPosition.ts","../src/giro3d/CameraControlsInspector.ts","../src/services/CameraController.ts","../src/events.ts","../src/services/DatasetManager.ts","../src/services/MeasureTool.ts","../src/stores/measurement.ts","../src/types/Measure.ts","../src/services/MeasurementManager.ts","../src/services/Giro3DManager.ts","../src/types/Viewbox.ts","../src/services/MinimapController.ts","../src/api/ViewApi.ts","../src/components/AlertToast.vue","../src/components/ColorFragment.vue","../src/components/CoordinateFragment.vue","../src/components/LinkFragment.vue","../src/components/AttributeItem.vue","../src/components/AttributeGroup.vue","../src/components/AttributePanel.vue","../src/assets/piero_logo.png","../src/components/LoadingScreen.vue","../src/components/MainView.vue","../src/components/MinimapView.vue","../src/components/SwitchToggle.vue","../src/components/NavigationButtons.vue","../src/assets/sponsors/bpi_france.png","../src/assets/sponsors/france_2030.png","../src/assets/sponsors/france_relance.png","../src/assets/sponsors/oslandia.png","../src/assets/sponsors/ue_next_generation.png","../src/stores/modules.ts","../src/components/panels/AboutPanel.vue","../src/components/panels/analysis/ClippingBox.vue","../src/components/panels/analysis/CrossSection.vue","../src/components/panels/analysis/FloodingPlane.vue","../src/components/charts/BarChart.vue","../src/components/charts/DoughnutChart.vue","../src/components/DropdownView.vue","../src/components/panels/LoadingIndicator.vue","../src/stores/statistics.ts","../src/components/panels/analysis/Statistics.vue","../src/components/panels/analysis/ToolWrapper.vue","../src/components/panels/AnalysisPanel.vue","../src/components/atoms/ButtonArea.vue","../src/components/atoms/ImportButton.vue","../src/components/VisibilityControl.vue","../src/components/panels/EmptyIndicator.vue","../src/components/panels/AnnotationItem.vue","../src/types/AnnotationMode.ts","../src/components/panels/AnnotationPanel.vue","../src/components/ModalOverlay.vue","../src/components/panels/BookmarkItem.vue","../src/components/panels/ShareBookmarkModal.vue","../src/types/Bookmark.ts","../src/stores/bookmarks.ts","../src/components/panels/BookmarkPanel.vue","../src/components/atoms/CompactList.vue","../src/components/atoms/SectionCollapsible.vue","../src/components/atoms/ListLabel.vue","../src/components/OpacitySlider.vue","../src/components/panels/BasemapItem.vue","../src/components/SpinnerControl.vue","../src/components/panels/DatagroupItem.vue","../src/components/panels/DatasetItem.vue","../src/components/panels/DatasetOrGroupItem.vue","../src/components/panels/OverlayItem.vue","../src/components/panels/DatasetPanel.vue","../src/components/panels/MeasurementItem.vue","../src/types/MeasurementMode.ts","../src/components/panels/MeasurementPanel.vue","../src/components/PanelContainer.vue","../src/components/ProgressBar.vue","../src/providers/BanProvider.ts","../src/components/SearchOverlay.vue","../src/components/StatusBar.vue","../src/assets/piero_logo_compact.png","../src/components/toolbar/ToolbarButton.vue","../src/components/toolbar/ToolBar.vue","../src/App.vue","../src/createPieroApp.ts"],"sourcesContent":["import type { BookmarkStore } from '@/stores/bookmarks';\nimport type Bookmark from '@/types/Bookmark';\n\n/** @internal */\nexport class BookmarkApiImpl implements BookmarkApi {\n private readonly _store: BookmarkStore;\n\n public constructor(store: BookmarkStore) {\n this._store = store;\n }\n\n public clearBookmarks(): void {\n this._store.clear();\n }\n\n public getBookmarks(): Bookmark[] {\n return this._store.getBookmarks();\n }\n\n public setBookmarks(bookmarks: Bookmark[]): void {\n this._store.clear();\n for (const bookmark of bookmarks) {\n this._store.add(bookmark);\n }\n }\n}\n\nexport default interface BookmarkApi {\n clearBookmarks(): void;\n getBookmarks(): Bookmark[];\n setBookmarks(bookmarks: Bookmark[]): void;\n}\n","import type { Component } from 'vue';\n\nimport { hasExperimentalFeature } from '@/utils/Configuration';\n\ntype PanelDef = {\n enabled: boolean;\n icon: string;\n key: PanelType;\n title: string;\n};\n\nexport type PanelType =\n | 'about'\n | 'analysis'\n | 'annotations'\n | 'bookmarks'\n | 'datasets'\n | 'measures';\n\nlet panels: PanelDef[] | null = null;\n\ntype DatasetType = string;\n\nexport default function getPanels(): ReadonlyArray<PanelDef> {\n if (!panels) {\n panels = [\n { enabled: true, icon: 'bi-database', key: 'datasets', title: 'Datasets' },\n { enabled: true, icon: 'bi-vector-pen', key: 'annotations', title: 'Annotations' },\n {\n enabled: hasExperimentalFeature('measurements'),\n icon: 'bi-rulers',\n key: 'measures',\n title: 'Measurements',\n },\n { enabled: true, icon: 'bi-graph-up', key: 'analysis', title: 'Analysis' },\n { enabled: true, icon: 'bi-bookmarks', key: 'bookmarks', title: 'Bookmarks' },\n { enabled: true, icon: 'bi-info-circle', key: 'about', title: 'About Piero' },\n ] as const;\n }\n return panels;\n}\n\nexport const propertyViews: Map<DatasetType, Component> = new Map();\n\nexport const datasetIcons: Record<DatasetType, string> = {\n colorLayer: 'fg-landcover-map',\n elevationLayer: 'fg-contour-map',\n featureCollection: 'bi-buildings',\n maskLayer: 'fg-hex-map',\n pointcloud: 'fg-multipoint',\n tiledIfc: 'bi-building',\n vector: 'fg-polygon-pt',\n};\n\nexport const datasetTitles: Record<DatasetType, string> = {\n colorLayer: 'Color Layer',\n elevationLayer: 'Elevation layer',\n featureCollection: 'Feature Collection',\n maskLayer: 'Mask Layer',\n pointcloud: 'Point Cloud',\n tiledIfc: 'IFC',\n vector: 'Vector',\n};\n","import type {\n FeatureElevationCallback,\n FeatureExtrusionOffsetCallback,\n FeatureStyle,\n FeatureStyleCallback,\n FillStyle,\n} from '@giro3d/giro3d/core/FeatureTypes';\nimport type Feature from 'ol/Feature';\n\nimport Extent from '@giro3d/giro3d/core/geographic/Extent';\nimport FeatureCollection from '@giro3d/giro3d/entities/FeatureCollection';\nimport { GeoJSON } from 'ol/format';\nimport { tile } from 'ol/loadingstrategy.js';\nimport VectorSource from 'ol/source/Vector';\nimport { createXYZ } from 'ol/tilegrid.js';\nimport { Color } from 'three';\n\nimport type { FeatureCollectionDatasetConfig } from '@/types/configuration/datasets/featureCollection';\n\nimport { fillObject3DUserData } from '@/loaders/userData';\n\nimport type { EntityBuilder } from '../EntityBuilder';\nimport type { FeatureProjectionMixin } from '../sources/mixins';\n\n/** Options for the Giro3D FeatureCollection */\ntype FeatureCollectionConstructorOptions = ConstructorParameters<typeof FeatureCollection>[0];\n\n/** Options for {@link FeatureCollectionEntity} */\nexport interface FeatureCollectionEntityOptions\n extends Partial<\n Pick<\n FeatureCollectionConstructorOptions,\n 'extent' | 'ignoreZ' | 'maxLevel' | 'minLevel'\n >\n >,\n Required<FeatureProjectionMixin> {\n /**\n * Set the elevation of the features received from the source.\n * It can be a constant for every feature, or a callback.\n * The callback version is particularly useful to derive the elevation\n * from the properties of the feature.\n * Requires {@link _ignoreZ} to be `false`.\n */\n elevation?: FeatureElevationCallback | number;\n /**\n * If set, this will cause 2D features to be extruded of the corresponding amount.\n * If a single value is given, it will be used for all the vertices of every feature.\n * If an array is given, each extruded vertex will use the corresponding value.\n * If a callback is given, it allows to extrude each feature individually.\n */\n extrusionOffset?: FeatureExtrusionOffsetCallback | number;\n /** Source to use */\n source: 'bdtopo';\n /**\n * An style or a callback returning a style to style the individual features.\n * If an object is used, the informations it contains will be used to style every\n * feature the same way. If a function is provided, it will be called with the feature.\n * This allows to individually style each feature.\n */\n style?: FeatureStyle | FeatureStyleCallback;\n}\n\n/**\n * Entity for displaying 3D buildings\n */\nexport class FeatureCollectionEntity extends FeatureCollection {\n public constructor(options: FeatureCollectionEntityOptions) {\n const crs = options.featureProjection;\n\n let filename: string;\n switch (options.source) {\n case 'bdtopo':\n filename = 'BDTOPO_V3:batiment';\n break;\n default: {\n // Exhaustiveness checking\n const _exhaustiveCheck: never = options.source;\n return _exhaustiveCheck;\n }\n }\n\n const vectorSource = new VectorSource({\n format: new GeoJSON(),\n strategy: tile(createXYZ({ tileSize: 512 })),\n url: function url(bbox): string {\n return `${\n 'https://data.geopf.fr/wfs/ows' +\n '?SERVICE=WFS' +\n '&VERSION=2.0.0' +\n '&request=GetFeature' +\n '&typename=BDTOPO_V3:batiment' +\n '&outputFormat=application/json' +\n `&SRSNAME=${crs}` +\n '&startIndex=0' +\n '&bbox='\n }${bbox.join(',')},${crs}`;\n },\n });\n const extent =\n options.extent ??\n new Extent('EPSG:2154', -111629.52, 1275028.84, 5976033.79, 7230161.64); // Cover France by default\n const extrusionOffset =\n options.extrusionOffset ??\n ((feature: Feature): number => {\n const properties = feature.getProperties();\n const buildingHeight = properties['hauteur'];\n const extrusionOffset = -buildingHeight;\n\n if (Number.isNaN(extrusionOffset)) {\n return 0;\n }\n return extrusionOffset;\n });\n const style =\n options.style ??\n ((feature: Feature): FeatureStyle => {\n const properties = feature.getProperties();\n let fillColor = '#FFFFFF';\n\n switch (properties.usage_1) {\n case 'Agricole':\n fillColor = '#96ff0d';\n break;\n case 'Commercial et services':\n fillColor = '#d8ffd4';\n break;\n case 'Industriel':\n fillColor = '#f0bb41';\n break;\n case 'Religieux':\n fillColor = '#41b5f0';\n break;\n case 'Résidentiel':\n fillColor = '#cec8be';\n break;\n case 'Sportif':\n fillColor = '#ff0d45';\n break;\n }\n\n const fill: FillStyle = {\n color: new Color(fillColor),\n shading: true,\n };\n\n return {\n fill: fill,\n stroke: {\n color: 'black',\n lineWidth: undefined,\n },\n };\n });\n\n const parentOptions: ConstructorParameters<typeof FeatureCollection>[0] = {\n extent,\n extrusionOffset,\n maxLevel: options.maxLevel ?? 11,\n minLevel: options.minLevel ?? 11,\n source: vectorSource,\n style,\n };\n\n super(parentOptions);\n this.name = options.source;\n fillObject3DUserData(this, { filename });\n }\n}\n\nexport const build: EntityBuilder = context => {\n const cfg = context.dataset.config as FeatureCollectionDatasetConfig;\n const entity = new FeatureCollectionEntity({\n ...cfg,\n featureProjection: context.instance.referenceCrs,\n });\n\n return Promise.resolve(entity);\n};\n","import type { GetMemoryUsageContext } from '@giro3d/giro3d/core/MemoryUsage';\nimport type { EntityPreprocessOptions } from '@giro3d/giro3d/entities/Entity';\nimport type { PointCloudOptions } from '@giro3d/giro3d/entities/PointCloud';\nimport type {\n GetNodeDataOptions,\n PointCloudMetadata,\n PointCloudNode,\n PointCloudNodeData,\n} from '@giro3d/giro3d/sources/PointCloudSource';\nimport type { BufferAttribute } from 'three';\n\nimport OperationCounter from '@giro3d/giro3d/core/OperationCounter';\nimport PointCloud from '@giro3d/giro3d/entities/PointCloud';\nimport { PointCloudSourceBase } from '@giro3d/giro3d/sources/PointCloudSource';\nimport { load } from '@loaders.gl/core';\nimport { CSVLoader } from '@loaders.gl/csv';\nimport { type ArrayRowTable } from '@loaders.gl/schema';\nimport { Box3, Float32BufferAttribute, Vector3 } from 'three';\n\nimport type { UrlOrData } from '@/utils/Fetcher';\n\nimport { getConfig } from '@/config-loader';\nimport { fillObject3DUserData } from '@/loaders/userData';\nimport { getColorMap } from '@/utils/Configuration';\nimport Fetcher from '@/utils/Fetcher';\n\nimport type { DataProjectionMixin, UrlOrDataMixin } from '../sources/mixins';\n\nexport type CSVPointCloudSourceOptions = DataProjectionMixin & UrlOrDataMixin;\n\n/** Parameters for {@link PointCloudSource} for creating {@link PointCloudEntity} */\nexport interface PointCloudSourceOptions extends DataProjectionMixin, UrlOrDataMixin {}\n\n/**\n * Source for loading CSV (as X, Y, Z) point clouds.\n *\n * @see https://loaders.gl/docs/modules/csv/api-reference/csv-loader\n */\nexport class CSVPointCloudSource extends PointCloudSourceBase {\n public readonly dataProjection?: string;\n public readonly isCSVPointCloudSource = true as const;\n public readonly type = 'CSVPointCloudSource';\n public readonly url: UrlOrData;\n\n public get loading(): boolean {\n return this._opCounter.loading;\n }\n public get progress(): number {\n return this._opCounter.progress;\n }\n private _localVolume: Box3 | null = null;\n private _metadata: PointCloudMetadata | null = null;\n private readonly _opCounter = new OperationCounter();\n private _origin: Vector3 | null = null;\n private _points: Float32Array | null = null;\n\n private _root: PointCloudNode | null = null;\n\n private _zArray: Float32Array | null = null;\n\n public constructor(options: CSVPointCloudSourceOptions) {\n super();\n this.url = options.url;\n this.dataProjection = options.dataProjection;\n }\n\n public dispose(): void {\n // Nothing to dispose\n }\n\n public getHierarchy(): Promise<PointCloudNode> {\n if (this._root == null) {\n throw new Error('not initialized');\n }\n\n return Promise.resolve(this._root);\n }\n\n public getMemoryUsage(context: GetMemoryUsageContext): void {\n if (this._points != null) {\n context.objects.set(this.id, {\n cpuMemory: this._points.byteLength,\n gpuMemory: this._points.byteLength,\n });\n }\n }\n\n public getMetadata(): Promise<PointCloudMetadata> {\n if (this._metadata == null) {\n throw new Error('not initialized');\n }\n\n return Promise.resolve(this._metadata);\n }\n\n public getNodeData(params: GetNodeDataOptions): Promise<PointCloudNodeData> {\n if (\n this._points == null ||\n this._origin == null ||\n this._zArray == null ||\n this._metadata == null ||\n this._localVolume == null\n ) {\n throw new Error('not initialized');\n }\n\n let attribute: BufferAttribute | undefined = undefined;\n if (params.attribute != null && params.attribute.name === 'Z') {\n const zAttribute = new Float32BufferAttribute(this._zArray, 1);\n\n attribute = zAttribute;\n }\n\n return Promise.resolve({\n attribute,\n localBoundingBox: this._localVolume,\n origin: this._origin,\n pointCount: this._points.length / 3,\n position: params.position\n ? new Float32BufferAttribute(this._points, 3, false)\n : undefined,\n });\n }\n\n protected async initializeOnce(): Promise<this> {\n this._opCounter.increment();\n\n const raw = (await load(this.url, CSVLoader, {\n csv: { shape: 'array-row-table' },\n fetch: Fetcher.fetch,\n })) as ArrayRowTable;\n\n const posArray = new Float32Array(raw.data.length * 3);\n const zArray = new Float32Array(raw.data.length);\n\n const volume = new Box3().makeEmpty();\n const localVolume = new Box3().makeEmpty();\n\n const point = new Vector3();\n\n const origin = new Vector3(raw.data[0][0], raw.data[0][1], raw.data[0][2]);\n\n for (let i = 0; i < raw.data.length; i += 1) {\n const x = raw.data[i][0];\n const y = raw.data[i][1];\n const z = raw.data[i][2];\n\n const localX = x - origin.x;\n const localY = y - origin.y;\n const localZ = z - origin.z;\n\n volume.expandByPoint(point.set(x, y, z));\n localVolume.expandByPoint(point.set(localX, localY, localZ));\n\n posArray[i * 3 + 0] = localX;\n posArray[i * 3 + 1] = localY;\n posArray[i * 3 + 2] = localZ;\n\n zArray[i] = z;\n }\n\n this._points = posArray;\n this._zArray = zArray;\n this._origin = origin;\n this._localVolume = localVolume;\n\n const pointCount = posArray.length / 3;\n\n const node: PointCloudNode = {\n center: volume.getCenter(new Vector3()),\n depth: 0,\n geometricError: 0,\n hasData: true,\n id: 'root',\n pointCount,\n sourceId: this.id,\n volume,\n };\n\n this._root = node;\n\n this._metadata = {\n attributes: [\n {\n dimension: 1,\n interpretation: 'unknown',\n max: volume.max.z,\n min: volume.min.z,\n name: 'Z',\n size: 4,\n type: 'float',\n },\n ],\n crs: this.dataProjection != null ? { name: this.dataProjection } : undefined,\n pointCount,\n volume,\n };\n\n this._opCounter.decrement();\n\n return this;\n }\n}\n\n/**\n * Point cloud entity\n */\nexport default class PointCloudEntity extends PointCloud {\n public readonly isPointCloudEntity = true;\n\n public constructor(options: PointCloudOptions) {\n super(options);\n\n const config = getConfig();\n\n this.colorMap = getColorMap(config.pointcloud);\n\n if ('url' in options.source) {\n const context = Fetcher.getContext(options.source.url as string);\n fillObject3DUserData(this, { filename: context.filename });\n }\n }\n\n public override async initialize(opts: EntityPreprocessOptions): Promise<void> {\n await super.initialize(opts);\n\n this.setActiveAttribute('Z');\n }\n}\n","import type { PointCloudSource } from '@giro3d/giro3d/sources/PointCloudSource';\n\nimport COPCSource from '@giro3d/giro3d/sources/COPCSource';\nimport LASSource from '@giro3d/giro3d/sources/LASSource';\n\nimport type { PointCloudDatasetConfig } from '@/types/configuration/datasets/pointCloud';\n\nimport { getPublicFolderUrl } from '@/utils/Configuration';\nimport Fetcher from '@/utils/Fetcher';\n\nimport type { EntityBuilder } from '../EntityBuilder';\n\nimport PointCloudEntity, { CSVPointCloudSource } from './PointCloudEntity';\n\nexport const build: EntityBuilder = context => {\n const { dataset } = context;\n const cfg = dataset.config as PointCloudDatasetConfig;\n let source: PointCloudSource;\n\n switch (cfg.source.type) {\n case 'copc':\n source = new COPCSource({\n url:\n typeof cfg.source.url === 'string'\n ? getPublicFolderUrl(cfg.source.url)\n : async (begin: number, end: number): Promise<Uint8Array> => {\n const blob = cfg.source.url as Blob;\n const slice = blob.slice(begin, end);\n const buf = await slice.arrayBuffer();\n return new Uint8Array(buf);\n },\n });\n break;\n case 'csv':\n source = new CSVPointCloudSource({\n ...cfg.source,\n });\n break;\n case 'las':\n source = new LASSource({\n url:\n typeof cfg.source.url === 'string'\n ? getPublicFolderUrl(cfg.source.url)\n : async (): Promise<Uint8Array> => {\n const d = await Fetcher.fetchArrayBuffer(cfg.source.url);\n return new Uint8Array(d.slice(0));\n },\n });\n break;\n default: {\n // Exhaustiveness checking\n const _exhaustiveCheck: never = cfg.source;\n return _exhaustiveCheck;\n }\n }\n\n const entity = new PointCloudEntity({ source });\n\n return Promise.resolve(entity);\n};\n","import type { Tiles3DOptions } from '@giro3d/giro3d/entities/Tiles3D';\n\nimport Tiles3D from '@giro3d/giro3d/entities/Tiles3D';\n\nimport { fillObject3DUserData } from '@/loaders/userData';\n\nimport type { UrlMixin } from '../sources/mixins';\n\n/** Parameters for creating {@link Tiles3dEntity} */\nexport interface Tiles3dSource extends UrlMixin {}\n\n/**\n * Entity for displaying 3D-Tiles files\n */\nexport default class Tiles3dEntity extends Tiles3D {\n public constructor(parameters: Tiles3dSource, options?: Tiles3DOptions) {\n super({ ...parameters, ...options });\n fillObject3DUserData(this, { filename: parameters.url });\n }\n}\n","import type { TiledIfcDatasetConfig } from '@/types/configuration/datasets/tiledIfc';\n\nimport { getPublicFolderUrl } from '@/utils/Configuration';\n\nimport type { EntityBuilder } from '../EntityBuilder';\n\nimport Tiles3dEntity from './Tiles3dEntity';\n\nexport const build: EntityBuilder = context => {\n const cfg = context.dataset.config as TiledIfcDatasetConfig;\n const entity = new Tiles3dEntity({\n ...cfg.source,\n url: getPublicFolderUrl(cfg.source.url),\n });\n\n return Promise.resolve(entity);\n};\n","import { MODE } from '@giro3d/giro3d/renderer/PointCloudMaterial';\n\nimport type { TiledPointCloudDatasetConfig } from '@/types/configuration/datasets/tiledPointCloud';\n\nimport { getConfig } from '@/config-loader';\nimport { getColorMap, getPublicFolderUrl } from '@/utils/Configuration';\n\nimport type { EntityBuilder } from '../EntityBuilder';\nimport type { Tiles3dSource } from './Tiles3dEntity';\n\nimport Tiles3dEntity from './Tiles3dEntity';\n\n/** Parameters for creating {@link TiledPointCloudEntity} */\nexport interface TiledPointCloudSource extends Tiles3dSource {\n name: string;\n}\n\n/**\n * Entity for displaying 3D-Tiles point clouds\n */\nexport default class TiledPointCloudEntity extends Tiles3dEntity {\n public constructor(parameters: TiledPointCloudSource) {\n const config = getConfig();\n super(parameters, {\n colorMap: getColorMap(config.pointcloud),\n pointCloudMode: MODE.ELEVATION,\n });\n this.name = `pointcloud-${parameters.name}`;\n }\n}\n\nexport const build: EntityBuilder = context => {\n const { dataset } = context;\n\n const cfg = dataset.config as TiledPointCloudDatasetConfig;\n const entity = new TiledPointCloudEntity({\n ...cfg.source,\n name: cfg.name,\n url: getPublicFolderUrl(cfg.source.url),\n });\n\n return Promise.resolve(entity);\n};\n","import Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\n\nimport Fetcher from '@/utils/Fetcher';\n\nconst tmpCoords = new Coordinates('EPSG:4326', 0, 0, 0);\n\ntype AltitudeResponse = {\n elevations: number[];\n};\n\nasync function alticode(lngs: number[], lats: number[]): Promise<number[]> {\n const chunkSize = 200;\n const promises = [];\n for (let i = 0; i < lngs.length; i += chunkSize) {\n const chunkLng = lngs.slice(i, i + chunkSize);\n const chunkLat = lats.slice(i, i + chunkSize);\n promises.push(alticodeBatch(chunkLng, chunkLat));\n }\n\n const res = await Promise.all(promises);\n return res.flat();\n}\n\nasync function alticodeBatch(lngs: number[], lats: number[]): Promise<number[]> {\n const altitude = await Fetcher.fetchJson<AltitudeResponse>(\n `https://data.geopf.fr/altimetrie/1.0/calcul/alti/rest/elevation.json?lon=${lngs.join(\n '|',\n )}&lat=${lats.join('|')}&zonly=true&resource=ign_rge_alti_wld&delimiter=|&indent=false`,\n );\n return altitude.elevations;\n}\n\nexport default {\n /**\n * Fetches altitudes from IGN Alti service.\n * Will fill the `altitude` component of each coordinates.\n *\n * @param coordinates - Coordinates to fetch altitudes for\n */\n async alticode(coordinates: Coordinates[]): Promise<void> {\n const lng: number[] = [];\n const lat: number[] = [];\n\n coordinates.forEach(c => {\n c.as('EPSG:4326', tmpCoords);\n lng.push(tmpCoords.longitude);\n lat.push(tmpCoords.latitude);\n });\n\n const altitude = await alticode(lng, lat);\n altitude.forEach((value: number, i: number) => {\n // @ts-expect-error Bypass isGeographic test as we don't care\n coordinates[i]._values[2] = value;\n });\n },\n};\n","import type Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport type Instance from '@giro3d/giro3d/core/Instance';\nimport type Map from '@giro3d/giro3d/entities/Map';\n\nimport IgnProvider from './IgnProvider';\n\n/**\n * Alticoder method\n */\nexport type Alticoder = (coordinates: Coordinates[]) => Promise<void>;\n\n/**\n * Alticoder using {@link IgnProvider}.\n */\nexport const IgnAlticoder = (coordinates: Coordinates[]): Promise<void> =>\n IgnProvider.alticode(coordinates);\n\n/**\n * Alticoder generator using (only) the map\n *\n * @param instance - Giro3D instance\n * @returns Alticoder\n */\nexport const mapAlticoderGenerator = (instance: Instance): Alticoder => {\n const map = instance.getEntities(o => (o as Map).isMap).at(0) as Map | undefined;\n if (map == null) {\n throw new Error('No map attached to the instance');\n }\n\n const alticoder = async (coordinates: Coordinates[]): Promise<void> => {\n coordinates.forEach(coords => {\n const res = map\n .getElevation({ coordinates: coords })\n .samples.sort((a, b) => a.resolution - b.resolution)\n .at(0);\n if (res != null) {\n // @ts-expect-error Bypass isGeographic test as we don't care\n coords._values[2] = res.elevation;\n }\n });\n return Promise.resolve();\n };\n return alticoder;\n};\n\n/**\n * Alticoder generator using multiple ones\n * @param alticoders - List of alticoders to use\n * @param noDataValue - No data value\n * @returns\n */\nexport const alticoders = (alticoders: Alticoder[], noDataValue = 0): Alticoder => {\n const alticoder = async (coordinates: Coordinates[]): Promise<void> => {\n // @ts-expect-error Bypass isGeographic test as we don't care\n let missingCoordinates = coordinates.filter(c => c._values[2] === noDataValue);\n for (const coder of alticoders) {\n await coder(missingCoordinates);\n // @ts-expect-error Bypass isGeographic test as we don't care\n missingCoordinates = missingCoordinates.filter(c => c._values[2] === noDataValue);\n if (missingCoordinates.length === 0) {\n // All done, exit early\n break;\n }\n }\n };\n return alticoder;\n};\n\n/**\n * Alticoder generator using the map if fast\n *\n * @param instance - Giro3D instance\n * @param fast - Fast alticoding\n * @returns Alticoder\n */\nexport const alticoderGenerator = (\n instance: Instance,\n fast: boolean,\n noDataValue = 0,\n): Alticoder => {\n return fast\n ? alticoders([mapAlticoderGenerator(instance), IgnAlticoder], noDataValue)\n : IgnAlticoder;\n};\n","import Instance from '@giro3d/giro3d/core/Instance';\nimport proj4 from 'proj4';\n\nimport Fetcher from '@/utils/Fetcher';\n\n/**\n * Loads a Projection info and registers it in Giro3D if needed\n * @param projection - Projection code\n * @returns EPSG string (e.g. `EPSG:2154`)\n */\nasync function loadProjCrsIfNeeded(projection: string): Promise<string> {\n let epsgCode: string | null = null;\n\n const regexes = [\n /EPSG:+(\\d+)/,\n /http:\\/\\/www.opengis.net\\/def\\/crs\\/EPSG\\/0\\/(\\d+)/,\n /https:\\/\\/www.opengis.net\\/def\\/crs\\/EPSG\\/0\\/(\\d+)/,\n ];\n for (const regex of regexes) {\n const search = projection.match(regex);\n if (search !== null) {\n epsgCode = search[1];\n break;\n }\n }\n\n if (epsgCode != null) {\n const epsgString = `EPSG:${epsgCode}`;\n if (proj4.defs(epsgString) === undefined) {\n const text = await Fetcher.fetchText(`https://epsg.io/${epsgCode}.proj4`);\n Instance.registerCRS(epsgString, text);\n }\n return epsgString;\n }\n throw new Error(`Could not find projection for ${projection}`);\n}\n\nexport default { loadProjCrsIfNeeded };\n","import type { PolygonOptions } from '@giro3d/giro3d/renderer/geometries/GeometryConverter';\nimport type Feature from 'ol/Feature';\nimport type FeatureFormat from 'ol/format/Feature';\nimport type { LineString } from 'ol/geom';\n\nimport Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport GeometryConverter from '@giro3d/giro3d/renderer/geometries/GeometryConverter';\nimport { type FeatureLike } from 'ol/Feature';\nimport {\n type MultiLineString,\n type MultiPoint,\n type MultiPolygon,\n type Point,\n type Polygon,\n} from 'ol/geom';\nimport { Clock, Group } from 'three';\n\nimport type { Alticoder } from '@/providers/Alticoding';\n\nimport Projections from './Projections';\n\nasync function fetchZCoordinates(\n features: SimpleFeature[],\n featureProjection: string,\n alticoder: Alticoder,\n offset: number,\n noDataValue: number,\n): Promise<void> {\n const clock = new Clock();\n clock.start();\n\n const giroCoordinates: Coordinates[] = [];\n const giroCoordinatesByFeature = new Map<number, Coordinates[]>();\n\n for (const feature of features) {\n const geom = feature.getGeometry();\n const geomType = geom?.getType();\n if (geom == null || geomType == null) {\n continue;\n }\n\n const featureCoordinates: Coordinates[] = [];\n const coordinates = geom.getFlatCoordinates();\n const stride = geom.getStride();\n if (stride >= 3 && coordinates[2] != null && coordinates[2] !== noDataValue) {\n // Feature already has altitude, skip\n continue;\n }\n\n for (let i = 0; i < coordinates.length; i += stride) {\n const c = new Coordinates(\n featureProjection,\n coordinates[i + 0],\n coordinates[i + 1],\n stride >= 3 ? coordinates[i + 2] : noDataValue,\n );\n featureCoordinates.push(c);\n giroCoordinates.push(c);\n }\n // @ts-expect-error ol_uid is hidden\n giroCoordinatesByFeature.set(feature.ol_uid, featureCoordinates);\n }\n\n console.debug(\n `Fetching altitudes for ${giroCoordinates.length} coordinates from ${features.length} features...`,\n );\n\n await alticoder(giroCoordinates);\n\n for (const feature of features) {\n // @ts-expect-error ol_uid is hidden\n const featureCoordinates = giroCoordinatesByFeature.get(feature.ol_uid);\n const geom = feature.getGeometry();\n if (geom == null || featureCoordinates == null) {\n continue;\n }\n\n switch (geom.getType()) {\n case 'LineString':\n case 'MultiPoint': {\n const g = geom as LineString | MultiPoint;\n const c = g.getCoordinates();\n for (let i = 0; i < c.length; i += 1) {\n c[i][2] = featureCoordinates[i].values[2] + offset;\n }\n g.setCoordinates(c);\n break;\n }\n case 'MultiLineString':\n case 'Polygon': {\n const g = geom as MultiLineString | Polygon;\n const c = g.getCoordinates();\n let k = 0;\n for (let i = 0; i < c.length; i += 1) {\n for (let j = 0; j < c[i].length; j += 1) {\n c[i][j][2] = featureCoordinates[k].values[2] + offset;\n k += 1;\n }\n }\n g.setCoordinates(c);\n break;\n }\n case 'MultiPolygon': {\n const g = geom as MultiPolygon;\n const c = g.getCoordinates();\n let k = 0;\n for (let i = 0; i < c.length; i += 1) {\n for (let j = 0; j < c[i].length; j += 1) {\n for (let m = 0; m < c[i][j].length; m += 1) {\n c[i][j][m][2] = featureCoordinates[k].values[2] + offset;\n k += 1;\n }\n }\n }\n g.setCoordinates(c);\n break;\n }\n case 'Point': {\n const g = geom as Point;\n const c = g.getCoordinates();\n c[2] = featureCoordinates[0].values[2] + offset;\n g.setCoordinates(c);\n break;\n }\n default:\n // do nothing\n }\n }\n\n console.debug(`Fetched all missing altitudes in ${clock.getElapsedTime()}s`);\n clock.stop();\n}\n\nfunction fillZCoordinates(features: SimpleFeature[], altitude: number, noDataValue: number): void {\n for (const feature of features) {\n const geom = feature.getGeometry();\n if (geom == null) {\n continue;\n }\n\n const stride = geom.getStride();\n const coordinates = geom.getFlatCoordinates();\n if (stride >= 3 && coordinates[2] != null && coordinates[2] !== noDataValue) {\n // Feature already has altitude, skip\n continue;\n }\n\n switch (geom.getType()) {\n case 'LineString':\n case 'MultiPoint': {\n const g = geom as LineString | MultiPoint;\n const c = g.getCoordinates();\n for (let i = 0; i < c.length; i += 1) {\n c[i][2] = altitude;\n }\n g.setCoordinates(c);\n break;\n }\n case 'MultiLineString':\n case 'Polygon': {\n const g = geom as MultiLineString | Polygon;\n const c = g.getCoordinates();\n for (let i = 0; i < c.length; i += 1) {\n for (let j = 0; j < c[i].length; j += 1) {\n c[i][j][2] = altitude;\n }\n }\n g.setCoordinates(c);\n break;\n }\n case 'MultiPolygon': {\n const g = geom as MultiPolygon;\n const c = g.getCoordinates();\n for (let i = 0; i < c.length; i += 1) {\n for (let j = 0; j < c[i].length; j += 1) {\n for (let m = 0; m < c[i][j].length; m += 1) {\n c[i][j][m][2] = altitude;\n }\n }\n }\n g.setCoordinates(c);\n break;\n }\n case 'Point': {\n const g = geom as Point;\n const c = g.getCoordinates();\n c[2] = altitude;\n g.setCoordinates(c);\n break;\n }\n default:\n // do nothing\n }\n }\n}\n\n/**\n * Converts data into OpenLayers features\n *\n * @param data - Data\n * @param format - OpenLayers format\n * @param dataProjection - Projection used in the data (by default EPSG:4326)\n * @param featureProjection - Output projection (typically the one used by Giro3D instance)\n * @returns Features\n */\nasync function readFeatures(\n data: string,\n format: FeatureFormat,\n dataProjection: string | undefined,\n featureProjection: string,\n): Promise<FeatureLike[]> {\n const projIn = await Projections.loadProjCrsIfNeeded(dataProjection ?? 'EPSG:4326');\n\n return format.readFeatures(data, {\n dataProjection: projIn,\n featureProjection,\n });\n}\n\n/**\n * Converts data into OpenLayers features\n *\n * @param data - Data\n * @param format - OpenLayers format\n * @param dataProjection - Projection used in the data (by default EPSG:4326)\n * @param featureProjection - Output projection (typically the one used by Giro3D instance)\n * @returns Features\n */\nfunction readSimpleFeatures(\n data: string,\n format: FeatureFormat,\n dataProjection: string,\n featureProjection: string,\n): SimpleFeature[] {\n return toSimpleFeatures(\n format.readFeatures(data, {\n dataProjection,\n featureProjection,\n }),\n );\n}\n\n/**\n * Converts a list of features into Threejs meshes.\n * Meshes are automatically translated around their center to avoid weird side-effects.\n *\n * @param olFeatures - Features to convert\n * @param polygonOptions - Options to pass to the geometry converter.\n * @returns Group of meshes\n */\nfunction toMeshes(olFeatures: SimpleFeature[], polygonOptions?: PolygonOptions): Group {\n const root = new Group();\n\n const converter = new GeometryConverter();\n\n const meshes = olFeatures.map(f => {\n const geometry = f.getGeometry();\n\n if (geometry != null) {\n const type = geometry.getType() as SimpleGeometryType;\n let mesh;\n\n switch (type) {\n case 'LineString':\n mesh = converter.build(geometry as LineString);\n break;\n case 'MultiLineString':\n mesh = converter.build(geometry as MultiLineString);\n break;\n case 'MultiPoint':\n mesh = converter.build(geometry as MultiPoint);\n break;\n case 'MultiPolygon':\n mesh = converter.build(geometry as MultiPolygon, polygonOptions);\n break;\n case 'Point':\n mesh = converter.build(geometry as Point);\n break;\n case 'Polygon':\n mesh = converter.build(geometry as Polygon, polygonOptions);\n break;\n default:\n console.warn(`Unsupported type ${type}`);\n mesh = null;\n }\n\n if (mesh) {\n for (const [name, value] of Object.entries(f.getProperties())) {\n if (name !== 'geometry') {\n mesh.userData[name] = value;\n }\n }\n }\n return mesh;\n }\n });\n\n for (const mesh of meshes) {\n if (mesh != null) {\n root.add(mesh);\n }\n }\n\n return root;\n}\n\n/**\n * Filters features read by {@link readFeatures} into {@link SimpleFeature} usable by `OlFeature2Mesh`.\n * Unsupported features are simply ignored and filtered-out.\n *\n * @param features - Features\n * @returns Simple features\n */\nfunction toSimpleFeatures(features: FeatureLike[]): SimpleFeature[] {\n return features.filter(feature => {\n if ('getType' in feature) {\n // Render feature, ignore\n return false;\n }\n const geomType = feature.getGeometry()?.getType();\n if (\n geomType == null ||\n ![\n 'LineString',\n 'MultiLineString',\n 'MultiPoint',\n 'MultiPolygon',\n 'Point',\n 'Polygon',\n ].includes(geomType)\n ) {\n return false;\n }\n\n return true;\n }) as SimpleFeature[];\n}\n\nexport type SimpleFeature = Feature<SimpleGeometry>;\n\nexport type SimpleGeometry =\n | LineString\n | MultiLineString\n | MultiPoint\n | MultiPolygon\n | Point\n | Polygon;\n\nexport type SimpleGeometryType =\n | 'LineString'\n | 'MultiLineString'\n | 'MultiPoint'\n | 'MultiPolygon'\n | 'Point'\n | 'Polygon';\n\nexport default {\n fetchZCoordinates,\n fillZCoordinates,\n readFeatures,\n readSimpleFeatures,\n toMeshes,\n toSimpleFeatures,\n};\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type { PolygonOptions } from '@giro3d/giro3d/renderer/geometries/GeometryConverter';\nimport type FeatureFormat from 'ol/format/Feature';\n\nimport { DEFAULT_LINE_COLOR, DEFAULT_SURFACE_COLOR } from '@giro3d/giro3d/core/FeatureTypes';\nimport Entity3D from '@giro3d/giro3d/entities/Entity3D';\nimport GeoJSONFormat from 'ol/format/GeoJSON';\nimport GPXFormat from 'ol/format/GPX';\nimport KMLFormat from 'ol/format/KML';\nimport { Group } from 'three';\n\nimport type { ExtractOptional } from '@/types/utilities';\n\nimport { fillObject3DUserData } from '@/loaders/userData';\nimport { alticoderGenerator } from '@/providers/Alticoding';\nimport Fetcher, { type FetchContext } from '@/utils/Fetcher';\nimport OLFeatures, { type SimpleFeature } from '@/utils/OLFeatures';\nimport Projections from '@/utils/Projections';\n\nimport type {\n DataProjectionMixin,\n ElevationMixin,\n FeatureProjectionMixin,\n UrlOrDataMixin,\n} from '../sources/mixins';\n\n/** Source for {@link VectorMeshEntity} */\nexport interface VectorMeshSourceOptions\n extends DataProjectionMixin,\n ElevationMixin,\n Required<FeatureProjectionMixin>,\n UrlOrDataMixin {}\n\nconst geojsonFormat = new GeoJSONFormat();\nconst gpxFormat = new GPXFormat();\nconst kmlFormat = new KMLFormat();\n\nexport const defaultParameters: Required<ExtractOptional<VectorMeshSourceOptions>> = {\n dataProjection: 'EPSG:4326',\n elevation: 0,\n fetchElevation: false,\n fetchElevationFast: false,\n fetchElevationOffset: 0.1,\n noDataValue: 0,\n};\n\n/** Interface to implement for a new source for {@link VectorMeshEntity} */\nexport interface VectorMeshSource {\n /** Elevation of the features */\n elevation?: number;\n /** No data value for elevation */\n noDataValue?: number;\n /** Context of the data */\n context(): FetchContext;\n /** Loads the features. Will be called only once */\n load(instance: Instance): Promise<SimpleFeature[]>;\n}\n\n/** GeoJSON source */\nexport class GeoJsonMeshSource implements VectorMeshSource {\n public elevation?: number;\n public readonly options: VectorMeshSourceOptions;\n\n public constructor(options: VectorMeshSourceOptions) {\n this.options = options;\n this.elevation = options.elevation;\n }\n\n public context(): FetchContext {\n return Fetcher.getContext(this.options.url);\n }\n\n public async load(instance: Instance): Promise<SimpleFeature[]> {\n // TODO: For some historical (?) reason we are not using bare OL\n // parsing, and we are using toGeoJSONFeatures instead. Not sure\n // why we were doing this in the first place, maybe we can remove\n // this now.\n\n // First, get the data as GeoJSON\n const json = await Fetcher.fetchJson<GeoJSON.GeoJSON>(this.options.url);\n\n // Convert them into a list of GeoJSON features\n const features = toGeoJSONFeatures(json);\n\n // Convert them into OpenLayers features\n const olFeatures = await geojsonToOlFeatures(instance, features, this.options);\n return olFeatures;\n }\n}\n\n/** OpenLayers-based source */\nexport class OlMeshSource implements VectorMeshSource {\n public elevation?: number;\n /** OL Feature format */\n public readonly format: FeatureFormat;\n public noDataValue?: number;\n public readonly options: VectorMeshSourceOptions;\n\n public constructor(format: FeatureFormat, options: VectorMeshSourceOptions) {\n this.format = format;\n this.options = options;\n this.elevation = options.elevation;\n this.noDataValue = options.noDataValue;\n }\n\n public context(): FetchContext {\n return Fetcher.getContext(this.options.url);\n }\n\n public async load(instance: Instance): Promise<SimpleFeature[]> {\n const text = await Fetcher.fetchText(this.options.url);\n const features = await toOlFeatures(instance, text, this.format, this.options);\n return features;\n }\n}\n\n/** GPX source */\nexport class GpxMeshSource extends OlMeshSource {\n public constructor(options: VectorMeshSourceOptions) {\n super(gpxFormat, options);\n }\n}\n\n/** KML source */\nexport class KmlMeshSource extends OlMeshSource {\n public constructor(options: VectorMeshSourceOptions) {\n super(kmlFormat, options);\n }\n}\n\n/**\n * Converts GeoJSON features into OpenLayers features.\n * Will handle reprojection if needed.\n * Will fetch elevation if `parameters.fetchElevation` is `true`.\n *\n * @param features - Array of GeoJSON features\n * @param parameters - Loader parameters\n * @returns Array of simple features, where unsupported features are discarded\n */\nexport async function geojsonToOlFeatures(\n instance: Instance,\n features: GeoJSON.Feature[],\n parameters: VectorMeshSourceOptions,\n): Promise<SimpleFeature[]> {\n const dataProjection = await Projections.loadProjCrsIfNeeded(\n parameters.dataProjection ?? defaultParameters.dataProjection,\n );\n\n const olFeatures = features.flatMap(f =>\n geojsonFormat.readFeatures(f, {\n dataProjection,\n featureProjection: parameters.featureProjection,\n }),\n );\n const simpleFeatures = OLFeatures.toSimpleFeatures(olFeatures);\n\n const fetchElevation = parameters.fetchElevation ?? defaultParameters.fetchElevation;\n if (fetchElevation) {\n const fetchElevationFast =\n parameters.fetchElevationFast ?? defaultParameters.fetchElevationFast;\n const fetchElevationOffset =\n parameters.fetchElevationOffset ?? defaultParameters.fetchElevationOffset;\n const noDataValue = parameters.noDataValue ?? defaultParameters.noDataValue;\n\n await OLFeatures.fetchZCoordinates(\n simpleFeatures,\n parameters.featureProjection,\n alticoderGenerator(instance, fetchElevationFast, noDataValue),\n fetchElevationOffset,\n noDataValue,\n );\n }\n return simpleFeatures;\n}\n\n/**\n * Converts {@link SimpleFeature}s into a Three.js `Group`.\n * Assumes features are already in the correct CRS.\n * If Z-coordinates are missing in the features (`null` or equal to `noDataValue`),\n * they are filled at `options?.elevation` or at `defaultElevation`.\n *\n * @param features - Features to convert\n * @param options - GeometryConverter options\n * @param defaultElevation - Default elevation if not provided via options\n * @param noDataValue - Value considered as no data for filling Z.\n * @returns Group containing all meshes for all features\n */\nexport function olFeaturestoGroup(\n features: SimpleFeature[],\n options?: PolygonOptions,\n defaultElevation = defaultParameters.elevation,\n noDataValue = defaultParameters.noDataValue,\n): Group {\n const elevation =\n (Array.isArray(options?.elevation) ? options.elevation[0] : options?.elevation) ??\n defaultElevation;\n OLFeatures.fillZCoordinates(features, elevation, noDataValue);\n return OLFeatures.toMeshes(features, options);\n}\n\n/**\n * Converts a GeoJSON object into a list of GeoJSON features\n * @param json - GeoJSON object\n * @returns Array of GeoJSON features\n */\nexport function toGeoJSONFeatures(json: GeoJSON.GeoJSON): GeoJSON.Feature[] {\n switch (json.type) {\n case 'Feature':\n return [json];\n case 'FeatureCollection':\n return json.features;\n case 'GeometryCollection': {\n const features: GeoJSON.Feature[] = json.geometries.map(geometry => ({\n geometry,\n properties: {},\n type: 'Feature',\n }));\n return features;\n }\n default: {\n const feature: GeoJSON.Feature = {\n geometry: json,\n properties: {},\n type: 'Feature',\n };\n return [feature];\n }\n }\n}\n\n/**\n * Converts loaded data into OpenLayers {@link SimpleFeature}s.\n * Will handle reprojection if needed.\n * Will fetch elevation if `parameters.fetchElevation` is `true`.\n *\n * @param data - Loaded data\n * @param format - OpenLayers format used for decoding `data`\n * @param parameters - Loader parameters\n * @returns Array of simple features, where unsupported features are discarded\n */\nexport async function toOlFeatures(\n instance: Instance,\n data: string,\n format: FeatureFormat,\n parameters: VectorMeshSourceOptions,\n): Promise<SimpleFeature[]> {\n const olFeatures = OLFeatures.readSimpleFeatures(\n data,\n format,\n parameters.dataProjection ?? defaultParameters.dataProjection,\n parameters.featureProjection,\n );\n\n const fetchElevation = parameters.fetchElevation ?? defaultParameters.fetchElevation;\n if (fetchElevation) {\n const fetchElevationFast =\n parameters.fetchElevationFast ?? defaultParameters.fetchElevationFast;\n const fetchElevationOffset =\n parameters.fetchElevationOffset ?? defaultParameters.fetchElevationOffset;\n const noDataValue = parameters.noDataValue ?? defaultParameters.noDataValue;\n\n await OLFeatures.fetchZCoordinates(\n olFeatures,\n parameters.featureProjection,\n alticoderGenerator(instance, fetchElevationFast, noDataValue),\n fetchElevationOffset,\n noDataValue,\n );\n }\n return olFeatures;\n}\n\n/** Entity for displaying vector data as meshes */\nexport default class VectorMeshEntity extends Entity3D {\n public readonly sources: VectorMeshSource[];\n\n public constructor(sources: VectorMeshSource | VectorMeshSource[]) {\n super(new Group());\n this.sources = Array.isArray(sources) ? sources : [sources];\n }\n\n protected override async preprocess(): Promise<void> {\n for (const source of this.sources) {\n // TODO: avoid await in the loop\n const olFeatures = await source.load(this.instance);\n const group = olFeaturestoGroup(\n olFeatures,\n {\n elevation: source.elevation,\n fill: { color: DEFAULT_SURFACE_COLOR },\n stroke: { color: DEFAULT_LINE_COLOR },\n },\n source.elevation,\n source.noDataValue,\n );\n\n this.object3d.add(group);\n this.onObjectCreated(group);\n\n const context = source.context();\n fillObject3DUserData(group, { filename: context.filename });\n }\n this.notifyChange(this.object3d);\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\n\nimport { load } from '@loaders.gl/core';\nimport { GeoPackageLoader as GeoPackageGLLoader } from '@loaders.gl/geopackage';\nimport { type GeoJSONTable, type Tables } from '@loaders.gl/schema';\n\nimport type { SimpleFeature } from '@/utils/OLFeatures';\n\nimport Fetcher, { type FetchContext, type UrlOrData } from '@/utils/Fetcher';\n\nimport type {\n DataProjectionMixin,\n ElevationMixin,\n FeatureProjectionMixin,\n UrlOrDataMixin,\n} from './mixins';\n\nimport { geojsonToOlFeatures, type VectorMeshSource } from '../entities/VectorMeshEntity';\n\n/**\n * Fetches data via loaders.gl loader.\n * @param url - URL to load or Blob\n * @param parameters - Parameters\n * @returns Array of GeoJSON features\n */\nasync function fetchGeopackage(\n url: UrlOrData,\n featureProjection: string,\n): Promise<GeoJSON.Feature[]> {\n const raw = (await load(url, GeoPackageGLLoader, {\n fetch: Fetcher.fetch,\n gis: {\n _targetCrs: featureProjection,\n format: 'geojson',\n reproject: true,\n },\n })) as Tables<GeoJSONTable>;\n\n const features: GeoJSON.Feature[] = [];\n for (const [table, array] of Object.entries(raw.tables)) {\n for (const feature of array.table.features) {\n if (!feature.properties) {\n feature.properties = {};\n }\n feature.properties['table'] = table;\n features.push(feature);\n }\n }\n return features;\n}\n\n/**\n * Options for loading Geopackage files into a {@link VectorMeshEntity}\n */\nexport interface GeopackageSourceParameters\n extends DataProjectionMixin,\n ElevationMixin,\n Required<FeatureProjectionMixin>,\n UrlOrDataMixin {}\n\n/**\n * Source for loading a Geopackage file into a {@link VectorMeshEntity}\n */\nexport default class GeopackageSource implements VectorMeshSource {\n public elevation?: number;\n public readonly options: GeopackageSourceParameters;\n\n public constructor(options: GeopackageSourceParameters) {\n this.options = options;\n this.elevation = options.elevation;\n }\n\n public context(): FetchContext {\n return Fetcher.getContext(this.options.url);\n }\n\n public async load(instance: Instance): Promise<SimpleFeature[]> {\n // First, get the data as a list of GeoJSON features\n const features = await fetchGeopackage(this.options.url, this.options.featureProjection);\n // Convert them into OpenLayers features\n const olFeatures = await geojsonToOlFeatures(instance, features, {\n ...this.options,\n dataProjection: this.options.featureProjection, // Already re-projected\n });\n return olFeatures;\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\n\nimport { load } from '@loaders.gl/core';\nimport { ShapefileLoader as ShapefileGLLoader } from '@loaders.gl/shapefile';\n\nimport type { FetchContext, UrlOrData } from '@/utils/Fetcher';\nimport type { SimpleFeature } from '@/utils/OLFeatures';\n\nimport Fetcher from '@/utils/Fetcher';\n\nimport type { VectorMeshSource } from '../entities/VectorMeshEntity';\nimport type {\n DataProjectionMixin,\n ElevationMixin,\n FeatureProjectionMixin,\n UrlOrDataMixin,\n} from './mixins';\n\nimport { geojsonToOlFeatures } from '../entities/VectorMeshEntity';\n\n/**\n * Fetches data via loaders.gl loader.\n * @param url - URL to load or Blob\n * @param parameters - Parameters\n * @returns Array of GeoJSON features\n */\nasync function fetchShapefile(\n url: UrlOrData,\n featureProjection: string,\n): Promise<GeoJSON.Feature[]> {\n const raw = await load(url, ShapefileGLLoader, {\n fetch: Fetcher.fetch,\n gis: {\n _targetCrs: featureProjection,\n format: 'geojson',\n reproject: true,\n },\n shapefile: {\n shape: 'geojson-table',\n },\n });\n\n // @ts-expect-error raw is unknown\n return raw.features;\n}\n\n/**\n * Options for loading Shapefile files into a {@link VectorMeshEntity}\n */\nexport interface ShapefileSourceParameters\n extends DataProjectionMixin,\n ElevationMixin,\n Required<FeatureProjectionMixin>,\n UrlOrDataMixin {}\n\n/**\n * Source for loading a Shapefile file into a {@link VectorMeshEntity}\n */\nexport default class ShapefileSource implements VectorMeshSource {\n public elevation?: number;\n public readonly options: ShapefileSourceParameters;\n\n public constructor(options: ShapefileSourceParameters) {\n this.options = options;\n this.elevation = options.elevation;\n }\n\n public context(): FetchContext {\n return Fetcher.getContext(this.options.url);\n }\n\n public async load(instance: Instance): Promise<SimpleFeature[]> {\n // First, get the data as a list of GeoJSON features\n const features = await fetchShapefile(this.options.url, this.options.featureProjection);\n // Convert them into OpenLayers features\n const olFeatures = await geojsonToOlFeatures(instance, features, {\n ...this.options,\n dataProjection: this.options.featureProjection, // Already re-projected\n });\n return olFeatures;\n }\n}\n","import { type ColorRepresentation } from 'three';\n\n// TODO centralize somewhere ?\nexport const DEFAULT_SHAPE_COLOR: ColorRepresentation = '#377c5f'; // Piero green\nexport const HIGHLIGHT_SHAPE_COLOR: ColorRepresentation = '#50bf91'; // Brighter Piero green\nexport const DEFAULT_MEASURE_COLOR: ColorRepresentation = 'yellow';\nexport const HIGHLIGHT_MEASURE_COLOR: ColorRepresentation = '#ffd500'; // orange\nexport const EDIT_SHAPE_COLOR: ColorRepresentation = '#73d1bd'; // Cyan\nexport const SHAPE_POINT_RADIUS = 5;\n","import type PickOptions from '@giro3d/giro3d/core/picking/PickOptions';\nimport type PickResult from '@giro3d/giro3d/core/picking/PickResult';\nimport type { Coordinate } from 'ol/coordinate';\nimport type { Intersection } from 'three';\n\nimport Entity3D from '@giro3d/giro3d/entities/Entity3D';\nimport { getContrastColor } from '@giro3d/giro3d/utils/ColorUtils';\nimport { Box3, Color, Group, MathUtils, Raycaster, Vector2, Vector3 } from 'three';\nimport { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js';\n\nimport type { SimpleFeature, SimpleGeometryType } from '@/utils/OLFeatures';\n\nimport { DEFAULT_SHAPE_COLOR } from '@/constants';\nimport { fillObject3DUserData } from '@/loaders/userData';\n\nimport type { VectorMeshSource } from './VectorMeshEntity';\n\nconst tmpNDC = new Vector2();\nconst thisColor = new Color(DEFAULT_SHAPE_COLOR);\nconst sRGB = new Color();\nconst sRgb = sRGB.copyLinearToSRGB(thisColor);\nconst contrastColor = `#${new Color(getContrastColor(thisColor)).getHexString()}`;\nconst DEFAULT_FONT_SIZE = 12; // pixels\nconst DEFAULT_FONT_WEIGHT = 'bold';\nconst tmpIntersectList: Intersection[] = [];\n\n/**\n * Pick result on {@link VectorLabelsEntity}\n */\nexport type LabelPickResult = PickResult & {\n entity: VectorLabelsEntity;\n isLabelPickResult: true;\n};\n\nexport interface VectorLabelOptions {\n /**\n * Callback for styling the label\n * @param span - Label\n * @param feature - Feature corresponding to the label\n * @returns Nothing\n */\n style?: (span: HTMLSpanElement, feature: SimpleFeature) => void;\n /**\n * Callback for generating the text of labels\n * @param feature - Feature corresponding to the label\n * @param at - 3D position\n * @returns Content of the label to create\n */\n text?: (feature: SimpleFeature, at: Vector3) => string;\n}\n\n/**\n * Entity for displaying vector data as labels\n */\nexport default class VectorLabelsEntity extends Entity3D {\n public readonly sources: VectorMeshSource[];\n private _labels: CSS2DObject[];\n private _styleCallback?: (span: HTMLSpanElement, feature: SimpleFeature) => void;\n private _textCallback: (feature: SimpleFeature, at: Vector3) => string;\n\n public constructor(\n sources: VectorMeshSource | VectorMeshSource[],\n options?: VectorLabelOptions,\n ) {\n super(new Group());\n this.sources = Array.isArray(sources) ? sources : [sources];\n this._labels = [];\n this._textCallback = options?.text || ((): string => 'P');\n this._styleCallback = options?.style;\n }\n\n public override getBoundingBox(): Box3 | null {\n // For some reason (because of nested groups?), Three.js does not\n // compute correctly the bounding box of this.object3d\n const pts = this._labels.map(l => l.position);\n const box = new Box3().setFromPoints(pts);\n return box;\n }\n\n public override pick(coordinates: Vector2, _options?: PickOptions): LabelPickResult[] {\n const normalized = this.instance.canvasToNormalizedCoords(coordinates, tmpNDC);\n const raycaster = new Raycaster();\n raycaster.setFromCamera(normalized, this.instance.view.camera);\n\n // TODO: pickLabels should honor _options.filter\n const pickedLabel = this.pickLabels(raycaster);\n if (pickedLabel) {\n const pickResult: LabelPickResult = {\n distance: pickedLabel.position.distanceTo(raycaster.ray.origin),\n entity: this,\n isLabelPickResult: true,\n object: pickedLabel,\n point: pickedLabel.position,\n };\n\n return [pickResult];\n }\n\n return [];\n }\n\n public override updateOpacity(): void {\n // Opacity is driven by CSS, not by Threejs rendering\n const cssOpacity = `${this.opacity * 100}%`;\n this._labels.forEach(label => (label.element.style.opacity = cssOpacity));\n }\n\n public override updateVisibility(): void {\n // Setting the root object's visibility is not enough\n // to set the visibility of CSS2DObjects (labels).\n this.object3d.traverse(o => {\n o.visible = this.visible;\n });\n }\n\n protected override async preprocess(): Promise<void> {\n for (const source of this.sources) {\n // TODO: avoid await in the loop\n const olFeatures = await source.load(this.instance);\n const root = new Group();\n\n const defaultElevation = source.elevation ?? 0;\n const getPoint = (c: Coordinate): Vector3 => {\n return new Vector3(c[0], c[1], c[2] ?? defaultElevation);\n };\n\n for (const olFeature of olFeatures) {\n const geometry = olFeature.getGeometry();\n\n if (geometry != null) {\n const type = geometry.getType() as SimpleGeometryType;\n const coordinates: Coordinate[] = [];\n\n switch (type) {\n case 'LineString':\n case 'MultiPoint':\n coordinates.push(...(geometry.getCoordinates() as Coordinate[]));\n break;\n case 'MultiLineString':\n case 'Polygon':\n coordinates.push(...(geometry.getCoordinates() as Coordinate[][])[0]);\n break;\n case 'MultiPolygon':\n coordinates.push(\n ...(geometry.getCoordinates() as Coordinate[][][])[0][0],\n );\n break;\n case 'Point':\n coordinates.push(geometry.getCoordinates() as Coordinate);\n break;\n default:\n // do nothing\n }\n\n if (coordinates.length > 0) {\n const labels = coordinates.map(c =>\n this.createLabel(getPoint(c), olFeature),\n );\n const group = new Group();\n labels.forEach(l => {\n group.add(l);\n this._labels.push(l);\n });\n\n for (const [name, value] of Object.entries(olFeature.getProperties())) {\n if (name !== 'geometry') {\n group.userData[name] = value;\n }\n }\n root.add(group);\n }\n }\n }\n\n this.object3d.add(root);\n this.onObjectCreated(root);\n\n const context = source.context();\n fillObject3DUserData(root, { filename: context.filename });\n }\n this.notifyChange(this.object3d);\n }\n\n private createLabel(at: Vector3, feature: SimpleFeature): CSS2DObject {\n // Taken from Giro3D's Shape entity\n const container = document.createElement('div');\n const span = document.createElement('span');\n\n this.updateStyle(span, feature);\n\n span.innerText = this._textCallback(feature, at);\n\n const innerContainer = document.createElement('div');\n\n container.appendChild(innerContainer);\n innerContainer.appendChild(span);\n\n const object = new CSS2DObject(container);\n object.position.copy(at);\n object.updateMatrix();\n object.updateMatrixWorld(true);\n\n container.addEventListener('mouseover', () => (object.userData.hover = true));\n container.addEventListener('mouseleave', () => (object.userData.hover = false));\n\n return object;\n }\n\n private pickLabels(raycaster: Raycaster): CSS2DObject | null {\n let pickedLabel: CSS2DObject | null = null;\n\n this._labels.forEach(label => {\n if (pickedLabel == null) {\n tmpIntersectList.length = 0;\n this.raycastLabel(label, raycaster, tmpIntersectList);\n if (tmpIntersectList.length > 0) {\n pickedLabel = label;\n }\n }\n });\n\n return pickedLabel;\n }\n\n private raycastLabel(\n label: CSS2DObject,\n raycaster: Raycaster,\n intersects: Intersection[],\n ): void {\n if (label.userData.hover === true) {\n intersects.push({\n distance: label.position.distanceTo(raycaster.ray.origin),\n object: label,\n point: label.position,\n });\n }\n }\n\n private updateStyle(span: HTMLSpanElement, feature: SimpleFeature): void {\n // Taken from Giro3D's Shape entity\n span.style.backgroundColor = `rgb(${sRgb.r * 255} ${sRgb.g * 255} ${sRgb.b * 255})`;\n span.style.borderWidth = '1px';\n span.style.borderStyle = 'solid';\n span.style.borderColor = contrastColor;\n span.style.borderRadius = `${MathUtils.clamp(DEFAULT_FONT_SIZE - 4, 5, 10)}px`;\n span.style.color = contrastColor;\n const padding = MathUtils.clamp(Math.round(DEFAULT_FONT_SIZE / 4), 2, 10);\n span.style.padding = `${padding}px ${padding}px ${padding}px ${padding}px`;\n span.style.fontSize = `${DEFAULT_FONT_SIZE}px`;\n span.style.fontWeight = DEFAULT_FONT_WEIGHT;\n span.style.pointerEvents = 'auto';\n\n if (this._styleCallback) {\n this._styleCallback(span, feature);\n }\n }\n}\n","import type { Coordinate } from 'ol/coordinate';\n\nimport Shape from '@giro3d/giro3d/entities/Shape';\nimport { Vector3 } from 'three';\n\nimport type { SimpleGeometryType } from '@/utils/OLFeatures';\n\nimport { DEFAULT_SHAPE_COLOR, SHAPE_POINT_RADIUS } from '@/constants';\nimport { fillObject3DUserData } from '@/loaders/userData';\n\nimport type { VectorMeshSource } from './VectorMeshEntity';\n\n/** Entity for displaying vector data as meshes */\nexport default class VectorShapeEntity extends Shape {\n public readonly source: VectorMeshSource;\n\n public constructor(source: VectorMeshSource) {\n super({\n color: DEFAULT_SHAPE_COLOR,\n showLine: true,\n showVertexLabels: true,\n showVertices: true,\n vertexRadius: SHAPE_POINT_RADIUS,\n });\n this.source = source;\n }\n\n protected override async preprocess(): Promise<void> {\n const olFeatures = await this.source.load(this.instance);\n const feature = olFeatures.at(0);\n const geometry = feature?.getGeometry();\n\n if (feature != null && geometry != null) {\n const defaultElevation = this.source.elevation ?? 0;\n const getPoint = (c: Coordinate): Vector3 => {\n return new Vector3(c[0], c[1], c[2] ?? defaultElevation);\n };\n const type = geometry.getType() as SimpleGeometryType;\n\n switch (type) {\n case 'LineString':\n this.showVertexLabels = false;\n this.showLine = true;\n this.showVertices = true;\n this.showSegmentLabels = true;\n this.showSurface = false;\n this.showSurfaceLabel = false;\n this.setPoints((geometry.getCoordinates() as Coordinate[]).map(getPoint));\n break;\n case 'MultiLineString':\n this.showVertexLabels = false;\n this.showLine = true;\n this.showVertices = true;\n this.showSegmentLabels = true;\n this.showSurface = false;\n this.showSurfaceLabel = false;\n this.setPoints((geometry.getCoordinates() as Coordinate[][])[0].map(getPoint));\n break;\n case 'MultiPoint':\n this.showVertexLabels = true;\n this.showLine = false;\n this.showVertices = true;\n this.showSegmentLabels = false;\n this.showSurface = false;\n this.showSurfaceLabel = false;\n this.setPoints((geometry.getCoordinates() as Coordinate[]).map(getPoint));\n break;\n case 'MultiPolygon':\n this.showVertexLabels = false;\n this.showLine = true;\n this.showVertices = true;\n this.showSegmentLabels = false;\n this.showSurface = true;\n this.showSurfaceLabel = true;\n this.setPoints(\n (geometry.getCoordinates() as Coordinate[][][])[0][0].map(getPoint),\n );\n break;\n case 'Point':\n this.showVertexLabels = true;\n this.showLine = false;\n this.showVertices = true;\n this.showSegmentLabels = false;\n this.showSurface = false;\n this.showSurfaceLabel = false;\n this.setPoints([getPoint(geometry.getCoordinates() as Coordinate)]);\n break;\n case 'Polygon':\n this.showVertexLabels = false;\n this.showLine = true;\n this.showVertices = true;\n this.showSegmentLabels = false;\n this.showSurface = true;\n this.showSurfaceLabel = true;\n this.setPoints((geometry.getCoordinates() as Coordinate[][])[0].map(getPoint));\n break;\n default:\n throw new Error(\n 'could not import shape from given geometry: ' + geometry.getType(),\n );\n }\n\n const context = this.source.context();\n fillObject3DUserData(this, { filename: context.filename });\n\n for (const [name, value] of Object.entries(feature.getProperties())) {\n if (name !== 'geometry') {\n this.userData[name] = value;\n }\n }\n }\n this.notifyChange(this.object3d);\n }\n}\n","import type Entity3D from '@giro3d/giro3d/entities/Entity3D';\n\nimport type {\n VectorDatasetConfig,\n VectorLabelsDatasetConfig,\n} from '@/types/configuration/datasets/vector';\n\nimport type { EntityBuilder } from '../EntityBuilder';\nimport type { VectorMeshSource, VectorMeshSourceOptions } from './VectorMeshEntity';\n\nimport GeopackageSource from '../sources/GeopackageSource';\nimport ShapefileSource from '../sources/ShapefileSource';\nimport VectorLabelsEntity from './VectorLabelsEntity';\nimport VectorMeshEntity, {\n GeoJsonMeshSource,\n GpxMeshSource,\n KmlMeshSource,\n OlMeshSource,\n} from './VectorMeshEntity';\nimport VectorShapeEntity from './VectorShapeEntity';\n\nexport const build: EntityBuilder = context => {\n const { dataset, instance } = context;\n\n const cfg = dataset.config as VectorDatasetConfig;\n const sourcesConfig = Array.isArray(cfg.source) ? cfg.source : [cfg.source];\n const sources: VectorMeshSource[] = [];\n const rendering = cfg.rendering ?? 'mesh';\n\n let entity: Entity3D;\n\n for (const sourceConfig of sourcesConfig) {\n const commonOptions: VectorMeshSourceOptions = {\n dataProjection: sourceConfig.dataProjection ?? dataset.get('dataProjection'),\n elevation: sourceConfig.elevation ?? dataset.get('elevation'),\n featureProjection: instance.referenceCrs,\n fetchElevation: sourceConfig.fetchElevation ?? dataset.get('fetchElevation'),\n fetchElevationFast:\n sourceConfig.fetchElevationFast ?? dataset.get('fetchElevationFast'),\n fetchElevationOffset:\n sourceConfig.fetchElevationOffset ?? dataset.get('fetchElevationOffset'),\n noDataValue: sourceConfig.noDataValue ?? dataset.get('noDataValue'),\n url: sourceConfig.url,\n };\n\n switch (sourceConfig.type) {\n case 'geojson':\n sources.push(\n new GeoJsonMeshSource({\n ...commonOptions,\n }),\n );\n break;\n case 'geopackage':\n sources.push(\n new GeopackageSource({\n ...commonOptions,\n }),\n );\n break;\n case 'gpx':\n sources.push(\n new GpxMeshSource({\n ...commonOptions,\n }),\n );\n break;\n case 'kml':\n sources.push(\n new KmlMeshSource({\n ...commonOptions,\n }),\n );\n break;\n case 'ol':\n sources.push(\n new OlMeshSource(sourceConfig.format, {\n ...commonOptions,\n }),\n );\n break;\n case 'shapefile':\n sources.push(\n new ShapefileSource({\n ...commonOptions,\n }),\n );\n break;\n default: {\n // Exhaustiveness checking\n const _exhaustiveCheck: never = sourceConfig;\n return _exhaustiveCheck;\n }\n }\n }\n\n switch (rendering) {\n case 'label':\n entity = new VectorLabelsEntity(sources, cfg as VectorLabelsDatasetConfig);\n break;\n case 'mesh':\n entity = new VectorMeshEntity(sources);\n break;\n case 'shape':\n entity = new VectorShapeEntity(sources[0]);\n break;\n default: {\n // Exhaustiveness checking\n const _exhaustiveCheck: never = rendering;\n return _exhaustiveCheck;\n }\n }\n\n return Promise.resolve(entity);\n};\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type Entity3D from '@giro3d/giro3d/entities/Entity3D';\n\nimport type { DatasetAsMeshConfig } from '@/types/configuration/datasets';\nimport type { Dataset, DatasetBase } from '@/types/Dataset';\n\n// Note that some builders have a one to one mapping to an entity, whereas other builders\n// have a N to one mapping (N dataset types map to a single entity type)\nimport * as featureCollection from './entities/FeatureCollectionEntity';\nimport * as flatPointCloud from './entities/flatPointCloud';\nimport * as tiledIfc from './entities/tiledIfc';\nimport * as tiledPointCloud from './entities/TiledPointCloudEntity';\nimport * as vector from './entities/vector';\n\nexport type BuilderContext = { dataset: Dataset; instance: Instance };\nexport type EntityBuilder = (context: BuilderContext) => Promise<Entity3D>;\n\nconst builders: Record<string, EntityBuilder> = {\n featureCollection: featureCollection.build,\n flatPointcloud: flatPointCloud.build,\n pointcloud: tiledPointCloud.build,\n tiledIfc: tiledIfc.build,\n vector: vector.build,\n};\n\n/**\n * Gets the Giro3D entity for a dataset\n * @param instance - Giro3D main instance\n * @param dataset - Dataset\n * @returns Entity\n */\nasync function getEntity(\n instance: Instance,\n dataset: Dataset & DatasetBase<DatasetAsMeshConfig>,\n): Promise<Entity3D> {\n const context: BuilderContext = {\n dataset,\n instance,\n };\n\n const builder = builders[dataset.type];\n\n if (builder == null) {\n throw new Error(`no entity builder found for dataset type '${dataset.type}'`);\n }\n\n const entity = await builder(context);\n\n if (!('dataset' in entity.object3d.userData)) {\n entity.object3d.userData.dataset = {};\n }\n\n entity.object3d.userData.dataset.name = dataset.name;\n\n return entity;\n}\n\nexport function registerEntityBuilder(datasetType: string, builder: EntityBuilder): void {\n if (builders[datasetType] != null) {\n console.warn(`replacing entity builder for dataset type '${datasetType}'`);\n }\n\n builders[datasetType] = builder;\n}\n\nexport default {\n getEntity,\n};\n","import type { PointCloudDatasetConfig } from '@/types/configuration/datasets/pointCloud';\n\nimport type { LoadDatasetFromFile } from './loader';\n\nexport const load: LoadDatasetFromFile<PointCloudDatasetConfig> = context => {\n return {\n name: context.filename,\n source: {\n type: 'csv',\n url: context.file,\n },\n type: 'flatPointcloud',\n visible: true,\n } as PointCloudDatasetConfig;\n};\n","import type { PointCloudDatasetConfig } from '@/types/configuration/datasets/pointCloud';\n\nimport type { LoadDatasetFromFile } from './loader';\n\nexport const load: LoadDatasetFromFile<PointCloudDatasetConfig> = context => {\n return {\n name: context.filename,\n source: {\n // Note that COPC files do not have a specified extension.\n // `.copc.laz` is just a convention.\n type: context.filename.endsWith('.copc.laz') ? 'copc' : 'las',\n url: context.file,\n },\n type: 'flatPointcloud',\n visible: true,\n } as PointCloudDatasetConfig;\n};\n","import type { ColorLayerDatasetConfig } from '@/types/configuration/datasets/layer';\nimport type {\n VectorDatasetRendering,\n VectorLabelsDatasetConfig,\n VectorMeshDatasetConfig,\n VectorMeshDatasetSourceConfig,\n VectorShapeDatasetConfig,\n} from '@/types/configuration/datasets/vector';\nimport type { LayerSourceConfig } from '@/types/configuration/layers';\n\nimport type { LoadDatasetFromFile } from './loader';\n\nconst loadOverlay: LoadDatasetFromFile<ColorLayerDatasetConfig> = context => {\n let fileType: LayerSourceConfig['type'];\n switch (context.extension) {\n case 'geojson':\n case 'json':\n fileType = 'geojson';\n break;\n case 'gpx':\n fileType = 'gpx';\n break;\n case 'kml':\n fileType = 'kml';\n break;\n default:\n throw new Error(`File extension '${context.extension}' not supported`);\n }\n\n return {\n name: context.filename,\n source: {\n style: 'default',\n type: fileType,\n url: context.file,\n },\n type: 'colorLayer',\n visible: true,\n } satisfies ColorLayerDatasetConfig;\n};\n\nconst loadMesh: LoadDatasetFromFile<\n VectorLabelsDatasetConfig | VectorMeshDatasetConfig | VectorShapeDatasetConfig\n> = context => {\n let fileType: VectorMeshDatasetSourceConfig['type'];\n switch (context.extension) {\n case 'geojson':\n case 'json':\n fileType = 'geojson';\n break;\n case 'gpkg':\n fileType = 'geopackage';\n break;\n case 'gpx':\n fileType = 'gpx';\n break;\n case 'kml':\n fileType = 'kml';\n break;\n default:\n throw new Error(`File extension '${context.extension}' not supported`);\n }\n\n return {\n name: context.filename,\n rendering: context.configuration.importedVectorDatasetRendering as VectorDatasetRendering,\n source: {\n fetchElevation: context.configuration.importedMeshDatasetFetchElevation ?? true,\n fetchElevationFast:\n context.configuration.importedMeshDatasetFetchElevationFast ?? false,\n type: fileType,\n url: context.file,\n },\n type: 'vector',\n visible: true,\n } satisfies VectorLabelsDatasetConfig | VectorMeshDatasetConfig | VectorShapeDatasetConfig;\n};\n\nexport const load: LoadDatasetFromFile<\n | ColorLayerDatasetConfig\n | VectorLabelsDatasetConfig\n | VectorMeshDatasetConfig\n | VectorShapeDatasetConfig\n> = context => {\n if (context.configuration.importedVectorDatasetRendering === 'overlay') {\n return loadOverlay(context);\n }\n\n return loadMesh(context);\n};\n","import type { Configuration } from '@/types/Configuration';\nimport type { DatasetConfigImportable } from '@/types/configuration/datasets';\n\nimport { Dataset } from '@/types/Dataset';\nimport { getPublicFolderUrl } from '@/utils/Configuration';\n\nimport * as csv from './csv';\nimport * as las from './las';\nimport * as vector from './vector';\n\nexport type LoadDatasetFromFile<O extends DatasetConfigImportable = DatasetConfigImportable> = (\n context: LoaderContext,\n) => O;\n\nexport type LoaderContext = {\n configuration: Configuration;\n extension: string;\n file: File | string;\n filename: string;\n};\n\nconst loaders: Record<string, LoadDatasetFromFile> = {\n csv: csv.load,\n dsv: csv.load,\n 'geo.json': vector.load,\n\n geojson: vector.load,\n gpkg: vector.load,\n gpx: vector.load,\n kml: vector.load,\n las: las.load,\n\n laz: las.load,\n tsv: csv.load,\n};\n\n/**\n * Gets the filename and extension from a File or URL\n *\n * @param fileOrUrl - File or URL\n * @returns File name and extension\n */\nfunction getLoaderContext(fileOrUrl: File | string, config: Configuration): LoaderContext {\n if (typeof fileOrUrl === 'string') {\n const absoluteUrl = getPublicFolderUrl(fileOrUrl);\n const url = new URL(absoluteUrl);\n const baseUrl = `${url.origin}${url.pathname}`;\n const parts = baseUrl.split('/');\n const filename = parts.pop();\n\n if (filename == null) {\n throw new Error('Could not determine filename');\n }\n\n const extension = filename.split('.').at(-1);\n\n if (extension == null) {\n throw new Error(`File has no extension: ${filename}`);\n }\n\n return {\n configuration: config,\n extension,\n file: fileOrUrl,\n filename,\n };\n }\n\n if (fileOrUrl.name == null) {\n throw new Error('Could not determine filename');\n }\n\n const extension = fileOrUrl.name.split('.').at(-1);\n\n if (extension == null) {\n throw new Error(`File has no extension: ${fileOrUrl.name}`);\n }\n\n return {\n configuration: config,\n extension,\n file: fileOrUrl,\n filename: fileOrUrl.name,\n };\n}\n\n/**\n * Loads a file and creates its Dataset.\n *\n * @param fileOrUrl - File to load\n * @returns Created objects\n * @throws `Error` if file cannot be imported (unsupported, etc.)\n */\nasync function importFile(\n fileOrUrl: File | string,\n config: Readonly<Configuration>,\n): Promise<Dataset> {\n const context = getLoaderContext(fileOrUrl, config);\n\n const loader = selectLoader(context.filename);\n\n if (loader == null) {\n throw new Error(`File format ${context.extension} not supported`);\n }\n\n const datasetConfig: DatasetConfigImportable = loader(context);\n\n // Reserve promise usage for future (e.g. autodetecting format based on content, etc.)\n return Promise.resolve(new Dataset(datasetConfig));\n}\n\nfunction selectLoader(filename: string): LoadDatasetFromFile | null {\n const keys = Object.keys(loaders);\n\n for (const key of keys) {\n // Note that we use suffix-based checking rather than pure file extensions because\n // some files have \"double\" extensions, such as \".geo.json\", or \".copc.laz\",\n // where technically the extension is just \".json\" or \".laz\".\n if (filename.endsWith(key)) {\n return loaders[key];\n }\n }\n\n return null;\n}\n\n/**\n * Registers a custom loader for a specific file extension.\n * If a loader for the same extension exists, it is replaced by the new one.\n * @param fileExtension - The file extension, without the dot.\n * @param loader - The loader to use.\n */\nexport function registerLoader(fileExtension: string, loader: LoadDatasetFromFile): void {\n if (loaders[fileExtension] != null) {\n console.warn(`replacing loader for file extension '.${fileExtension}'`);\n }\n\n loaders[fileExtension] = loader;\n}\n\nexport default {\n importFile,\n};\n","import type PickResult from '@giro3d/giro3d/core/picking/PickResult';\nimport type Shape from '@giro3d/giro3d/entities/Shape';\nimport type { ShapePickResult } from '@giro3d/giro3d/entities/Shape';\n\nimport { isShapePickResult } from '@giro3d/giro3d/entities/Shape';\nimport { Color } from 'three';\n\nimport type { MeasureUserData } from '@/giro3d/Measure3D';\nimport type { PieroShapeUserData } from '@/types/Annotation';\n\nexport type ClearHighlightFn = () => void;\nexport type HighlightFn = (obj: PickResult) => ClearHighlightFn | null;\n\nexport const customHighlighters: HighlightFn[] = [];\n\nexport default class Highlighter {\n private _clearHighlight: (() => void) | null = null;\n\n public clear(): void {\n if (this._clearHighlight) {\n this._clearHighlight();\n this._clearHighlight = null;\n }\n }\n\n public dispose(): void {\n this.clear();\n }\n\n public highlightFromPick(pick: PickResult): void {\n this.clear();\n\n if (!pick.entity) {\n return;\n }\n\n if (isShapePickResult(pick)) {\n this.highlightShape(pick);\n }\n\n for (const highlighter of customHighlighters) {\n const clearHighlight = highlighter(pick);\n if (clearHighlight) {\n this._clearHighlight = clearHighlight;\n }\n }\n }\n\n private highlightShape(pick: ShapePickResult): void {\n const shape = pick.entity as Shape<MeasureUserData | PieroShapeUserData>;\n\n if (shape.userData.highlightable) {\n const previousColor = new Color(shape.color);\n shape.color = shape.userData.highlightColor;\n shape.instance.notifyChange();\n\n this._clearHighlight = (): void => {\n shape.color = previousColor;\n shape.instance.notifyChange();\n };\n }\n }\n}\n","import type { LineLabelFormatter } from '@giro3d/giro3d/entities/Shape';\nimport type { Vector3 } from 'three';\n\nimport Shape from '@giro3d/giro3d/entities/Shape';\n\nimport type Measure from '@/types/Measure';\n\nimport { DEFAULT_MEASURE_COLOR, HIGHLIGHT_MEASURE_COLOR } from '@/constants';\nimport { isObject } from '@/utils/Types';\n\nconst lengthFormat = new Intl.NumberFormat(undefined, {\n maximumFractionDigits: 2,\n style: 'unit',\n unit: 'meter',\n unitDisplay: 'short',\n});\n\nconst formatLength: LineLabelFormatter = values => {\n return `${lengthFormat.format(values.length)}`;\n};\n\nclass Measure3D extends Shape<MeasureUserData> {\n public readonly isMeasure3D = true as const;\n\n public get from(): Vector3 {\n return this.points[0];\n }\n public get length(): number {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.getLength()!;\n }\n public get to(): Vector3 {\n return this.points[1];\n }\n\n public constructor() {\n super({\n color: DEFAULT_MEASURE_COLOR,\n lineLabelFormatter: formatLength,\n showLineLabel: true,\n });\n\n this.userData.highlightable = true;\n this.userData.highlightColor = HIGHLIGHT_MEASURE_COLOR;\n\n this.depthTest = true;\n }\n\n public static isMeasure3D = (obj: unknown): obj is Measure3D =>\n isObject(obj) && (obj as Measure3D).isMeasure3D;\n\n public clone(): Measure3D {\n return new Measure3D().copy(this);\n }\n\n public copy(source: this): this {\n this.setPoints([source.from, source.to]);\n return this;\n }\n}\n\nexport type MeasureUserData = {\n highlightable: true;\n highlightColor: typeof HIGHLIGHT_MEASURE_COLOR;\n measure: Measure;\n};\n\nexport default Measure3D;\n","import type { Vector3 } from 'three';\n\nexport interface Attribute {\n key: string;\n value: unknown;\n}\nexport type AttributesGroups = Map<string, Attribute[]>;\n\nexport default class Feature {\n public readonly attributes: AttributesGroups;\n public readonly name: string;\n public readonly parent: string;\n public readonly point: Vector3;\n\n public constructor(name: string, parent: string, attributes: AttributesGroups, point: Vector3) {\n this.name = name;\n this.parent = parent;\n this.attributes = attributes;\n this.point = point.clone();\n }\n}\n","import type Extent from '@giro3d/giro3d/core/geographic/Extent';\nimport type Instance from '@giro3d/giro3d/core/Instance';\nimport type { Material } from 'three';\n\nimport { GridHelper, Vector3 } from 'three';\n\nclass Grid {\n public get visible(): boolean {\n return this._grid.visible;\n }\n public set visible(v: boolean) {\n this._grid.visible = v;\n this._instance.notifyChange(this._grid);\n }\n\n private readonly _grid: GridHelper;\n\n private readonly _instance: Instance;\n\n public constructor(instance: Instance, extent: Extent, name: string) {\n this._instance = instance;\n const dims = extent.dimensions();\n const center = extent.center();\n\n this._grid = new GridHelper(1, 100);\n this._grid.name = name;\n this._grid.scale.set(dims.x, 1, dims.y);\n this._grid.visible = true;\n this._grid.position.set(center.x, center.y, -100);\n this._grid.rotateOnAxis(new Vector3(1, 0, 0), Math.PI / 2);\n const gridMat = this._grid.material as Material;\n gridMat.opacity = 0.5;\n gridMat.transparent = true;\n\n this._grid.updateMatrixWorld();\n void this._instance.add(this._grid);\n }\n public dispose(): void {\n this._instance.remove(this._grid);\n this._grid.geometry.dispose();\n (this._grid.material as Material).dispose();\n }\n}\n\nexport default Grid;\n","import type Extent from '@giro3d/giro3d/core/geographic/Extent';\nimport type Instance from '@giro3d/giro3d/core/Instance';\nimport type ImageFormat from '@giro3d/giro3d/formats/ImageFormat';\nimport type ImageSource from '@giro3d/giro3d/sources/ImageSource';\nimport type { ImageSourceOptions } from '@giro3d/giro3d/sources/ImageSource';\nimport type { TiledImageSourceOptions } from '@giro3d/giro3d/sources/TiledImageSource';\nimport type { VectorSourceOptions } from '@giro3d/giro3d/sources/VectorSource';\nimport type { VectorTileSourceOptions } from '@giro3d/giro3d/sources/VectorTileSource';\nimport type { FeatureLike } from 'ol/Feature';\nimport type { UrlTile } from 'ol/source';\nimport type ImageStyle from 'ol/style/Image';\nimport type { StyleFunction } from 'ol/style/Style';\nimport type { MagnificationTextureFilter, MinificationTextureFilter } from 'three';\n\nimport ColorLayer from '@giro3d/giro3d/core/layer/ColorLayer';\nimport ElevationLayer from '@giro3d/giro3d/core/layer/ElevationLayer';\nimport Interpretation from '@giro3d/giro3d/core/layer/Interpretation';\nimport MaskLayer from '@giro3d/giro3d/core/layer/MaskLayer';\nimport BilFormat from '@giro3d/giro3d/formats/BilFormat';\nimport GeoTIFFFormat from '@giro3d/giro3d/formats/GeoTIFFFormat';\nimport MapboxTerrainFormat from '@giro3d/giro3d/formats/MapboxTerrainFormat';\nimport GeoTIFFSource from '@giro3d/giro3d/sources/GeoTIFFSource';\nimport TiledImageSource from '@giro3d/giro3d/sources/TiledImageSource';\nimport VectorSource from '@giro3d/giro3d/sources/VectorSource';\nimport VectorTileSource from '@giro3d/giro3d/sources/VectorTileSource';\nimport { GeoJSON, GPX, KML, MVT, WMTSCapabilities } from 'ol/format';\nimport { BingMaps, OSM, StadiaMaps, TileWMS, WMTS, XYZ } from 'ol/source';\nimport { optionsFromCapabilities } from 'ol/source/WMTS';\nimport { Circle, Fill, Stroke, Style } from 'ol/style';\n\nimport type { BaseLayer, BaseLayerOptions, BasemapLayer } from '@/types/BaseLayer';\nimport type { DatasetAsLayerConfig } from '@/types/configuration/datasets';\nimport type {\n ColorLayerDatasetConfig,\n ElevationLayerDatasetConfig,\n MaskLayerDatasetConfig,\n} from '@/types/configuration/datasets/layer';\nimport type { FeatureFormat, LayerOptions } from '@/types/configuration/externals';\nimport type { LayerSourceConfig } from '@/types/configuration/layers';\nimport type {\n ColorLayerConfig,\n ElevationLayerConfig,\n MaskLayerConfig,\n} from '@/types/configuration/layers/core';\nimport type {\n ImageSourceConfigMixin,\n SourceConfigProjectionMixin,\n SourceConfigUrlMixin,\n SourceConfigUrlOrDataMixin,\n} from '@/types/configuration/sources/core/baseConfig';\nimport type { TiledImageSourceConfigMixin } from '@/types/configuration/sources/core/tiled';\nimport type { VectorAsLayerSourceConfigMixin } from '@/types/configuration/sources/core/vector';\nimport type { VectorTileSourceConfigMixin } from '@/types/configuration/sources/core/vectorTile';\nimport type { Dataset, DatasetBase } from '@/types/Dataset';\nimport type { OLGeometry } from '@/types/OLGeometry';\nimport type { Overlay } from '@/types/Overlay';\nimport type {\n FillStyle,\n PointStyle,\n StaticVectorStyle,\n StrokeStyle,\n VectorStyle,\n} from '@/types/VectorStyle';\n\nimport { getConfig, getDynamicStyles } from '@/config-loader';\nimport { getColorMap, getExtent, getPublicFolderUrl } from '@/utils/Configuration';\nimport Fetcher from '@/utils/Fetcher';\n\n/**\n * Creates a WMTS source for Giro3D based on the GetCapabilities response\n * @param layer - Name of layer(s) to display\n * @param url - URL and parameters for the GetCapabilities request\n * @param format - Format\n * @param matrixSet - Matrix set\n * @returns WMTS source\n */\nasync function createWMTSSource(\n layer: string | string[],\n url: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n format?: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n matrixSet?: string,\n): Promise<WMTS> {\n const parser = new WMTSCapabilities();\n\n const text = await Fetcher.fetchText(url);\n\n const result = parser.read(text);\n const options = optionsFromCapabilities(result, {\n layer,\n });\n if (options === null) {\n throw new Error('Cannot resolve WMTS source from capabilities');\n }\n return new WMTS(options);\n}\n\nasync function getDatasetLayer(\n instance: Instance,\n dataset: Dataset & DatasetBase<DatasetAsLayerConfig>,\n): Promise<ColorLayer | ElevationLayer | MaskLayer> {\n const commonOptions = await getLayerOptions(dataset.config);\n switch (dataset.type) {\n case 'colorLayer': {\n const cfg = dataset.config as ColorLayerDatasetConfig;\n return new ColorLayer({\n ...commonOptions,\n elevationRange: cfg.elevationRange,\n magFilter: cfg.magFilter,\n minFilter: cfg.minFilter,\n });\n }\n case 'elevationLayer': {\n const cfg = dataset.config as ElevationLayerDatasetConfig;\n return new ElevationLayer({\n ...commonOptions,\n minmax: cfg.minmax,\n });\n }\n case 'maskLayer': {\n const cfg = dataset.config as MaskLayerDatasetConfig;\n return new MaskLayer({\n ...commonOptions,\n maskMode: cfg.maskMode,\n });\n }\n default: {\n // Exhaustiveness checking\n const _exhaustiveCheck: never = dataset.type;\n return _exhaustiveCheck;\n }\n }\n}\n\nfunction getDefaultStyle(geometry?: OLGeometry): Style {\n if (geometry == null) {\n return new Style();\n }\n\n switch (geometry) {\n case 'LineString':\n case 'MultiLineString':\n return new Style({\n stroke: new Stroke({\n color: 'yellow',\n width: 1,\n }),\n });\n case 'MultiPoint':\n case 'Point':\n return new Style({\n image: new Circle({\n fill: new Fill({\n color: 'yellow',\n }),\n radius: 3,\n stroke: new Stroke({\n color: 'black',\n }),\n }),\n });\n case 'MultiPolygon':\n case 'Polygon':\n return new Style({\n fill: new Fill({\n color: 'rgba(50, 50, 200, 0.4)',\n }),\n stroke: new Stroke({\n color: 'black',\n width: 1,\n }),\n });\n default:\n console.warn(`Geometry ${geometry} not supported`);\n return new Style();\n }\n}\n\n/**\n * Determines the Giro3D's image decoder format, based on the source configuration.\n *\n * @param imageSourceConfig - Source configuration\n * @returns Image decoder format, or undefined if unknown\n */\nfunction getImageFormat(imageSourceConfig: TiledImageSourceConfigMixin): ImageFormat | undefined {\n if (imageSourceConfig.imageFormat) {\n switch (imageSourceConfig.imageFormat) {\n case 'Bil':\n return new BilFormat();\n case 'GeoTIFF':\n return new GeoTIFFFormat();\n case 'MapboxTerrain':\n return new MapboxTerrainFormat();\n default: {\n const _exhaustiveCheck: never = imageSourceConfig.imageFormat;\n return _exhaustiveCheck;\n }\n }\n }\n\n switch (imageSourceConfig.format) {\n case 'image/x-bil;bits=32':\n return new BilFormat();\n default:\n return undefined;\n }\n}\n\n/**\n * Gets the options for building Giro3D {@link ImageSource}s.\n * @param config - Source configuration\n * @returns Options that should be passed to source constructor\n */\nfunction getImageSourceOptions(config: ImageSourceConfigMixin): ImageSourceOptions {\n return {\n colorSpace: config.colorSpace,\n flipY: config.flipY,\n is8bit: config.is8bit,\n };\n}\n\n/**\n * Gets the Giro3D layer for a layer\n * @param basemap - Basemap layer configuration\n * @returns Layer\n */\nasync function getLayer(basemap: BaseLayer): Promise<BasemapLayer> {\n const commonOptions = await getLayerOptions(basemap);\n switch (basemap.type) {\n case 'color': {\n const opts = basemap.options as BaseLayerOptions<ColorLayerConfig>;\n return new ColorLayer({\n ...commonOptions,\n elevationRange: opts.elevationRange,\n });\n }\n case 'elevation': {\n const opts = basemap.options as BaseLayerOptions<ElevationLayerConfig>;\n return new ElevationLayer({\n ...commonOptions,\n magFilter: opts.magFilter,\n minFilter: opts.minFilter,\n minmax: opts.minmax ?? { max: 5000, min: 0 },\n noDataOptions: {\n replaceNoData: false,\n },\n });\n }\n case 'mask': {\n const opts = basemap.options as BaseLayerOptions<MaskLayerConfig>;\n return new MaskLayer({\n ...commonOptions,\n maskMode: opts.maskMode,\n });\n }\n default: {\n // Exhaustiveness checking\n const _exhaustiveCheck: never = basemap.type;\n return _exhaustiveCheck;\n }\n }\n}\n\n/**\n * Gets the options for building Giro3D {@link Layer}s.\n * @param layer - Layer configuration\n * @returns Options that should be passed to layer constructor\n */\nasync function getLayerOptions(\n layer: BaseLayer | DatasetAsLayerConfig | Overlay,\n): Promise<LayerOptions> {\n const config = getConfig();\n const source = await getSource(layer.source);\n\n const options = 'options' in layer ? layer.options : layer;\n\n const extent = getExtent(options.extent);\n const interpretation = options.interpretation\n ? new Interpretation(options.interpretation.mode, options.interpretation)\n : undefined;\n const colorMapConfig =\n options.colorMap ??\n ('type' in layer && layer.type === 'elevation' ? config.basemap.colormap : undefined);\n const colorMap = colorMapConfig ? getColorMap(colorMapConfig) : undefined;\n const resolution = 'resolution' in layer.source ? layer.source.resolution : undefined;\n\n let minFilter: MinificationTextureFilter | undefined = undefined;\n let magFilter: MagnificationTextureFilter | undefined = undefined;\n if ('type' in layer && layer.type === 'color') {\n minFilter = layer.options.minFilter;\n magFilter = layer.options.magFilter;\n }\n\n return {\n backgroundColor: options.backgroundColor,\n colorMap,\n extent,\n interpretation,\n magFilter,\n minFilter,\n name: layer.name,\n noDataOptions: options.noDataOptions,\n preloadImages: options.preloadImages,\n resolutionFactor: resolution,\n showEmptyTextures: options.showEmptyTextures,\n showTileBorders: options.showTileBorders,\n source,\n };\n}\n/**\n * Gets the Giro3D layer for an overlay\n * @param overlay - Overlay configuration\n * @param extent - Extent of the overlay\n * @returns Layer\n */\nasync function getOverlay(overlay: Overlay, extent: Extent): Promise<ColorLayer> {\n const commonOptions = await getLayerOptions(overlay);\n const opts = overlay.options;\n return new ColorLayer({\n extent,\n ...commonOptions,\n elevationRange: opts.elevationRange,\n magFilter: opts.magFilter,\n minFilter: opts.minFilter,\n });\n}\n/**\n * Generates a Giro3D source from a configuration\n * @param config - Source configuration\n * @returns Source\n */\nasync function getSource(config: LayerSourceConfig): Promise<ImageSource> {\n const commonOptions = getImageSourceOptions(config);\n switch (config.type) {\n case 'bingmaps': {\n return new TiledImageSource({\n ...commonOptions,\n source: new BingMaps(config),\n });\n }\n case 'cog': {\n return new GeoTIFFSource({\n ...commonOptions,\n crs: getSourceProjection(config, config.projection),\n url: getPublicFolderUrl(config.url),\n });\n }\n case 'geojson': {\n return new VectorSource({\n ...commonOptions,\n ...(await getVectorSourceOptions(config, new GeoJSON())),\n });\n }\n case 'gpx': {\n return new VectorSource({\n ...commonOptions,\n ...(await getVectorSourceOptions(config, new GPX())),\n });\n }\n case 'kml': {\n return new VectorSource({\n ...commonOptions,\n ...(await getVectorSourceOptions(config, new KML())),\n });\n }\n case 'mvt': {\n return new VectorTileSource({\n ...commonOptions,\n ...getVectorTileSourceOptions(config),\n format: new MVT(),\n });\n }\n case 'osm': {\n return new TiledImageSource({\n ...commonOptions,\n source: new OSM(config),\n });\n }\n case 'stadiamaps': {\n return new TiledImageSource({\n ...commonOptions,\n source: new StadiaMaps(config),\n });\n }\n case 'vector': {\n return new VectorSource({\n ...commonOptions,\n ...(await getVectorSourceOptions(config, config.format)),\n });\n }\n case 'vector-tile': {\n return new VectorTileSource({\n ...commonOptions,\n ...getVectorTileSourceOptions(config),\n format: config.format,\n });\n }\n case 'wms': {\n const source = new TileWMS({\n crossOrigin: 'anonymous',\n params: {\n FORMAT: config.format,\n LAYERS: Array.isArray(config.layer) ? config.layer : [config.layer],\n },\n projection: getSourceProjection(config),\n url: config.url,\n });\n return new TiledImageSource({\n ...commonOptions,\n ...getTiledImageSourceOptions(config, source),\n });\n }\n case 'wmts': {\n const source = await createWMTSSource(\n config.layer,\n config.url,\n config.format,\n getSourceProjection(config),\n );\n return new TiledImageSource({\n ...commonOptions,\n ...getTiledImageSourceOptions(config, source),\n });\n }\n case 'xyz': {\n return new TiledImageSource({\n ...commonOptions,\n ...getTiledImageSourceOptions(config, new XYZ(config)),\n });\n }\n default: {\n // Exhaustiveness checking\n const _exhaustiveCheck: never = config;\n return _exhaustiveCheck;\n }\n }\n}\n\n/**\n * Gets the URL for a source\n * Notes:\n * - if the URL is a Blob, it will be converted to a [Data-URL](https://developer.mozilla.org/en-US/docs/web/http/basics_of_http/data_urls),\n * - if the URL is a string and does not start with http(s), it will be relative to the app\n * @param config - Source configuration\n * @returns URL\n */\nasync function getSourceDataUrl(\n config: SourceConfigUrlMixin | SourceConfigUrlOrDataMixin,\n): Promise<string> {\n if (config.url instanceof Blob) {\n return Fetcher.toDataURL(config.url);\n } else {\n return getPublicFolderUrl(config.url);\n }\n}\n\n/**\n * Gets the projection from the configuration\n *\n * @param config - Configuration\n * @returns Projection, or undefined if none provided\n */\nfunction getSourceProjection(input: SourceConfigProjectionMixin): string | undefined;\n\n/**\n * Gets the projection from the configuration\n *\n * @param config - Configuration\n * @param defaultProjection - Default projection to use, if the configuration does not provide any\n * @returns Projection\n */\nfunction getSourceProjection(input: SourceConfigProjectionMixin, defaultProjection: string): string;\n\n/**\n * Gets the projection from the configuration\n *\n * @param config - Source configuration\n * @param defaultProjection - Default projection to use, if the configuration does not provide any\n * @returns Projection, or undefined if none provided\n */\nfunction getSourceProjection(\n config: SourceConfigProjectionMixin,\n defaultProjection?: string,\n): string | undefined {\n return (\n config.dataProjection ??\n // Some configurations may still have a deprecated 'projection' field\n ('projection' in config ? (config.projection as string) : undefined) ??\n defaultProjection\n );\n}\n\nfunction getStyle(style: VectorStyle): Style | StyleFunction {\n if (typeof style === 'string') {\n if (style === 'default') {\n return (feature: FeatureLike) => getDefaultStyle(feature.getGeometry()?.getType());\n }\n const dynamicStyles = getDynamicStyles();\n if (dynamicStyles[style] == null) {\n // As config is not checked against TS, we can't know if during build :(\n console.warn(`Could not find style ${style} in configuration`);\n return new Style({});\n }\n return dynamicStyles[style];\n }\n\n return parseStaticStyle(style);\n}\n\n/**\n * Gets the options for building Giro3D {@link TiledImageSource}s.\n * @param config - Source configuration\n * @param source - Giro3D Source\n * @returns Options that should be passed to source constructor\n */\nfunction getTiledImageSourceOptions(\n config: TiledImageSourceConfigMixin,\n source: UrlTile,\n): TiledImageSourceOptions {\n return {\n extent: getExtent(config.extent),\n format: getImageFormat(config),\n httpTimeout: config.httpTimeout,\n noDataValue: config.noDataValue ?? config.nodata,\n retries: config.retries,\n source,\n };\n}\n\n/**\n * Gets the options for building Giro3D {@link VectorSource}s.\n * Notes:\n * - if the URL is a Blob, it will be converted to a [Data-URL](https://developer.mozilla.org/en-US/docs/web/http/basics_of_http/data_urls),\n * - if the URL is a string and does not start with http(s), it will be relative to the app\n *\n * @param config - Source configuration\n * @returns Options that should be passed to source constructor\n */\nasync function getVectorSourceOptions(\n config: VectorAsLayerSourceConfigMixin,\n format: FeatureFormat,\n): Promise<VectorSourceOptions> {\n const url = await getSourceDataUrl(config);\n return {\n data: { format, url },\n dataProjection: getSourceProjection(config, 'EPSG:4326'),\n style: getStyle(config.style),\n };\n}\n\n/**\n * Gets the options for building Giro3D {@link VectorTileSource}s.\n * Notes:\n * - if the URL is a string and does not start with http(s), it will be relative to the app\n *\n * @param config - Source configuration\n * @returns Options that should be passed to source constructor\n */\nfunction getVectorTileSourceOptions(config: VectorTileSourceConfigMixin): VectorTileSourceOptions {\n return {\n backgroundColor: config.backgroundColor,\n style: getStyle(config.style),\n url: getPublicFolderUrl(config.url),\n };\n}\n\nfunction parseStaticStyle(style: StaticVectorStyle): Style {\n function parseStroke(stroke?: StrokeStyle): Stroke | undefined {\n if (stroke) {\n return new Stroke({\n color: stroke.color,\n width: stroke.width,\n });\n }\n return undefined;\n }\n function parseFill(fill?: FillStyle): Fill | undefined {\n if (fill) {\n return new Fill({\n color: fill.color,\n });\n }\n return undefined;\n }\n function parsePoint(point?: PointStyle): ImageStyle | undefined {\n if (point) {\n return new Circle({\n fill: parseFill(point.fill),\n radius: point.radius,\n stroke: parseStroke(point.stroke),\n });\n }\n return undefined;\n }\n\n return new Style({\n fill: parseFill(style.fill),\n image: parsePoint(style.point),\n stroke: parseStroke(style.stroke),\n });\n}\n\nexport default {\n getDatasetLayer,\n getLayer,\n getLayerOptions,\n getOverlay,\n getSource,\n};\n","import type Extent from '@giro3d/giro3d/core/geographic/Extent';\nimport type Instance from '@giro3d/giro3d/core/Instance';\n\nimport { Mesh, MeshBasicMaterial, PlaneGeometry } from 'three';\n\nclass Plane {\n public get visible(): boolean {\n return this._plane.visible;\n }\n public set visible(v: boolean) {\n this._plane.visible = v;\n this._instance.notifyChange(this._plane);\n }\n\n private readonly _instance: Instance;\n\n private readonly _plane: Mesh<PlaneGeometry, MeshBasicMaterial>;\n\n public constructor(instance: Instance, extent: Extent, name: string) {\n this._instance = instance;\n const dims = extent.dimensions();\n const center = extent.center();\n\n this._plane = new Mesh(\n new PlaneGeometry(dims.x, dims.y, 1, 1),\n new MeshBasicMaterial({ color: 'black' }),\n );\n this._plane.name = name;\n this._plane.position.set(center.x, center.y, -101);\n\n this._plane.updateMatrixWorld();\n void this._instance.add(this._plane);\n }\n public dispose(): void {\n this._instance.remove(this._plane);\n this._plane.geometry.dispose();\n this._plane.material.dispose();\n }\n}\n\nexport default Plane;\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type { MapConstructorOptions } from '@giro3d/giro3d/entities/Map';\nimport type Inspector from '@giro3d/giro3d/gui/Inspector';\n\nimport Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport Extent from '@giro3d/giro3d/core/geographic/Extent';\nimport { defineStore } from 'pinia';\nimport { FrontSide } from 'three';\nimport { shallowRef } from 'vue';\n\nimport type { CameraConfigDeprecated } from '@/types/configuration/camera';\n\nimport { getConfig } from '@/config-loader';\nimport { getExtent } from '@/utils/Configuration';\n\nexport const useGiro3dStore = defineStore('giro3d', () => {\n const mainView = shallowRef<Instance | null>(null);\n const minimapView = shallowRef<Instance | null>(null);\n const inspector = shallowRef<Inspector | null>(null);\n\n function getMainView(): Instance | null {\n return mainView.value;\n }\n\n function setMainView(instance: Instance | null): void {\n mainView.value = instance;\n }\n\n function getMinimapView(): Instance | null {\n return minimapView.value;\n }\n\n function setMinimapView(instance: Instance | null): void {\n minimapView.value = instance;\n }\n\n function getInspector(): Inspector | null {\n return inspector.value;\n }\n\n function setInspector(i: Inspector | null): void {\n inspector.value = i;\n }\n\n function getDefaultCameraPosition(): Coordinates {\n const config = getConfig();\n const conf = config.camera;\n if (Array.isArray(conf.position)) {\n console.warn(\n 'Configuration is using an array for camera.position, you should switch to an object; see https://gitlab.com/giro3d/piero/-/issues/24 for more information. This will be removed in release v24.7.',\n );\n return new Coordinates(\n 'EPSG:4326',\n conf.position[0],\n conf.position[1],\n (conf as CameraConfigDeprecated).altitude,\n ).as(config.default_crs);\n }\n\n if (!('z' in conf.position)) {\n console.warn(\n 'Configuration is using a 2D object for camera.position, you should switch to a 3D object; see https://gitlab.com/giro3d/piero/-/issues/38 for more information. This will be removed in release v24.7.',\n );\n }\n\n return new Coordinates(\n conf.position.crs ?? config.default_crs,\n conf.position.x,\n conf.position.y,\n 'z' in conf.position ? conf.position.z : (conf as CameraConfigDeprecated).altitude,\n ).as(config.default_crs);\n }\n\n function getDefaultCameraLookAt(): Coordinates {\n const config = getConfig();\n if ('lookAt' in config.camera && config.camera.lookAt) {\n return new Coordinates(\n config.camera.lookAt.crs ?? config.default_crs,\n config.camera.lookAt.x,\n config.camera.lookAt.y,\n config.camera.lookAt.z,\n ).as(config.default_crs);\n }\n\n const mapExtent = getDefaultBasemapExtent();\n return mapExtent.center();\n }\n\n function getDefaultBasemapOptions(): Omit<MapConstructorOptions, 'extent'> {\n const config = getConfig();\n const opts: Omit<MapConstructorOptions, 'extent'> = {\n backgroundColor: config.basemap.backgroundColor ?? 'white',\n backgroundOpacity: config.basemap.backgroundOpacity,\n colorimetry: config.basemap.colorimetry,\n contourLines: config.basemap.contourLines,\n elevationRange: config.basemap.elevationRange,\n graticule: config.basemap.graticule,\n lighting: config.basemap.lighting ?? {\n elevationLayersOnly: true,\n enabled: true,\n },\n showOutline: config.basemap.showOutline,\n side: config.basemap.side ?? FrontSide,\n terrain: config.basemap.terrain,\n };\n return opts;\n }\n\n function getDefaultBasemapExtent(): Extent {\n const config = getConfig();\n if (config.basemap.extent) {\n return getExtent(config.basemap.extent);\n }\n\n console.warn(\n 'Configuration is using basemap.center/basemap.size, you should switch to extent. This will be removed in release v24.10.',\n );\n\n const size = config.basemap.size;\n const center = config.basemap.center;\n if (size == null || center == null) {\n throw new Error('basemap.center and basemap.size need to be defined');\n }\n\n let centerLocal: Coordinates;\n if (Array.isArray(center)) {\n console.warn(\n 'Configuration is using an array for basemap.center, you should switch to an object; see https://gitlab.com/giro3d/piero/-/issues/24 for more information. This will be removed in release v24.7.',\n );\n centerLocal = new Coordinates('EPSG:4326', center[0], center[1], 0);\n } else {\n centerLocal = new Coordinates(center.crs ?? config.default_crs, center.x, center.y, 0);\n }\n centerLocal = centerLocal.as(config.default_crs);\n\n return Extent.fromCenterAndSize(\n config.default_crs,\n { x: centerLocal.x, y: centerLocal.y },\n size[0],\n size[1],\n );\n }\n\n function getCRS(): string {\n const config = getConfig();\n return config.default_crs;\n }\n\n function notifyChange(): void {\n mainView.value?.notifyChange();\n }\n\n return {\n getCRS,\n getDefaultBasemapExtent,\n getDefaultBasemapOptions,\n getDefaultCameraLookAt,\n getDefaultCameraPosition,\n getInspector,\n getMainView,\n getMinimapView,\n notifyChange,\n setInspector,\n setMainView,\n setMinimapView,\n };\n});\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type Map from '@giro3d/giro3d/entities/Map';\n\nimport { EventDispatcher } from 'three';\n\nexport class GraticuleLayer extends EventDispatcher {\n public readonly canSetOpacity = false;\n public readonly name = 'Graticule' as const;\n public readonly uuid = 'graticule' as const;\n public get displayed(): boolean {\n return this.enabled && this.visible;\n }\n public get enabled(): boolean {\n return this._enabled;\n }\n public set enabled(v: boolean) {\n this._enabled = v;\n this._updateVisible();\n }\n public set instance(v: Instance) {\n this._instance = v;\n }\n\n public set map(v: Map) {\n this._map = v;\n }\n\n public get visible(): boolean {\n return this._visible;\n }\n\n public set visible(v: boolean) {\n this._visible = v;\n this._updateVisible();\n }\n private _enabled: boolean = false;\n\n private _instance?: Instance;\n private _map?: Map;\n\n private _visible: boolean = false;\n\n private _updateVisible(): void {\n if (this._map && this._instance) {\n this._map.graticule.enabled = this.displayed;\n this._instance.notifyChange(this._map);\n }\n }\n}\n","import { EventDispatcher, MathUtils } from 'three';\n\ntype LayerObjectEventMap = {\n delete: {\n /** empty */\n };\n isLoading: {\n /** empty */\n };\n opacity: {\n /** empty */\n };\n visible: {\n /** empty */\n };\n};\n\nexport default abstract class LayerObject extends EventDispatcher<LayerObjectEventMap> {\n public readonly name: string;\n public readonly uuid: string;\n public get opacity(): number {\n return this._opacity;\n }\n public set opacity(v: number) {\n this._opacity = v;\n this.dispatchEvent({ type: 'opacity' });\n }\n\n public get visible(): boolean {\n return this._visible;\n }\n\n public set visible(v: boolean) {\n this._visible = v;\n this.dispatchEvent({ type: 'visible' });\n }\n\n private _opacity: number = 1;\n\n private _visible: boolean = false;\n\n public constructor(name: string) {\n super();\n this.name = name;\n this.uuid = MathUtils.generateUUID();\n }\n\n public delete(): void {\n this.dispatchEvent({ type: 'delete' });\n }\n}\n","import type ColorLayer from '@giro3d/giro3d/core/layer/ColorLayer';\nimport type ElevationLayer from '@giro3d/giro3d/core/layer/ElevationLayer';\nimport type MaskLayer from '@giro3d/giro3d/core/layer/MaskLayer';\nimport type { EventDispatcher } from 'three';\n\nimport type {\n BasemapLayerSourceConfig,\n LayerConfig,\n LayerType,\n} from '@/types/configuration/layers';\n\nimport LayerObject from '@/types/LayerObject';\n\nexport interface BaseLayer extends EventDispatcher {\n name: string;\n options: BaseLayerOptions<LayerConfig>;\n source: BasemapLayerSourceConfig;\n type: LayerType;\n uuid: string;\n\n get isLoading(): boolean;\n set isLoading(v: boolean);\n get opacity(): number;\n set opacity(v: number);\n get visible(): boolean;\n set visible(v: boolean);\n}\n\nexport type BaseLayerOptions<TLayerType extends LayerConfig> = Omit<\n TLayerType,\n 'name' | 'source' | 'type'\n>;\n\nexport type BasemapLayer = ColorLayer | ElevationLayer | MaskLayer;\n\nexport class BaseLayerObject extends LayerObject implements BaseLayer {\n public readonly options: BaseLayerOptions<LayerConfig>;\n public readonly source: BasemapLayerSourceConfig;\n public readonly type: LayerType;\n public get isLoading(): boolean {\n return this._loading;\n }\n\n public set isLoading(v: boolean) {\n this._loading = v;\n }\n\n private _loading: boolean;\n\n public constructor({ name, source, type, ...options }: LayerConfig) {\n super(name);\n this._loading = false;\n this.type = type;\n this.source = source;\n this.options = options;\n }\n}\n","import { type EventDispatcher } from 'three';\n\nimport type { OverlayConfig, OverlaySourceConfig } from '@/types/configuration/layers';\n\nimport LayerObject from '@/types/LayerObject';\n\nexport interface Overlay extends EventDispatcher {\n name: string;\n options: OverlayOptions;\n source: OverlaySourceConfig;\n uuid: string;\n\n get isLoading(): boolean;\n set isLoading(v: boolean);\n get opacity(): number;\n set opacity(v: number);\n get visible(): boolean;\n set visible(v: boolean);\n}\n\nexport type OverlayOptions = Omit<OverlayConfig, 'name' | 'source'>;\n\nexport class OverlayObject extends LayerObject implements Overlay {\n public readonly options: OverlayOptions;\n public readonly source: OverlaySourceConfig;\n public get isLoading(): boolean {\n return this._loading;\n }\n\n public set isLoading(v: boolean) {\n this._loading = v;\n }\n\n private _loading: boolean;\n\n public constructor({ name, source, ...options }: OverlayConfig) {\n super(name);\n this._loading = false;\n this.source = source;\n this.options = options;\n }\n}\n","import { defineStore } from 'pinia';\nimport { computed, shallowReactive } from 'vue';\n\nimport type { OverlayConfig } from '@/types/configuration/layers';\n\nimport { getConfig } from '@/config-loader';\nimport { GraticuleLayer } from '@/giro3d/Graticule';\nimport { type BaseLayer, BaseLayerObject } from '@/types/BaseLayer';\nimport { type Overlay, OverlayObject } from '@/types/Overlay';\n\nfunction buildBaseLayers(): BaseLayer[] {\n const config = getConfig();\n const result: BaseLayer[] = [];\n\n const conf = config.basemap.layers;\n for (const item of conf) {\n const layer = new BaseLayerObject(item);\n layer.visible = item.visible;\n result.push(layer);\n }\n\n return result;\n}\n\nfunction buildGraticuleLayer(): GraticuleLayer | undefined {\n const config = getConfig();\n if ('graticule' in config.basemap && config.basemap.graticule !== undefined) {\n // Build only if needed\n const layer = new GraticuleLayer();\n if (typeof config.basemap.graticule === 'boolean') {\n layer.visible = config.basemap.graticule;\n } else {\n layer.visible = config.basemap.graticule.enabled ?? true;\n }\n return shallowReactive(layer);\n }\n return undefined;\n}\n\nfunction buildOverlays(): Overlay[] {\n const config = getConfig();\n const result: Overlay[] = [];\n for (const item of config.overlays) {\n let conf: OverlayConfig;\n if (!('source' in item)) {\n console.warn(\n `Configuration for ${item.name} is deprecated. This will be removed in release v24.7.`,\n );\n conf = {\n name: item.name,\n source: {\n ...item,\n },\n visible: item.visible,\n };\n } else {\n conf = item;\n }\n const overlay = new OverlayObject(conf);\n overlay.visible = item.visible;\n result.push(overlay);\n }\n\n return result;\n}\n\nexport const useLayerStore = defineStore('layers', () => {\n // We have 2 layers of shallowReactive-ness because we want to react to:\n // 1. the ordering of the layers,\n // 2. changes of the root properties (only)\n const basemaps = shallowReactive(buildBaseLayers().map(layer => shallowReactive(layer)));\n const basemapCount = computed(() => basemaps.length);\n\n const overlays = shallowReactive(buildOverlays().map(layer => shallowReactive(layer)));\n const overlayCount = computed(() => overlays.length);\n\n const graticuleLayer = buildGraticuleLayer();\n\n function getBasemaps(): BaseLayer[] {\n return basemaps;\n }\n\n function getGraticuleLayer(): GraticuleLayer | undefined {\n return graticuleLayer;\n }\n\n function setBasemapVisibility(layer: BaseLayer, visible: boolean): void {\n layer.visible = visible;\n }\n\n function setBasemapOpacity(layer: BaseLayer, opacity: number): void {\n layer.opacity = opacity;\n }\n\n function getOverlays(): Overlay[] {\n return overlays;\n }\n\n function setOverlayVisibility(layer: Overlay, visible: boolean): void {\n layer.visible = visible;\n }\n\n function setOverlayOpacity(layer: Overlay, opacity: number): void {\n layer.opacity = opacity;\n }\n\n function moveOverlayUp(layer: Overlay): void {\n const index = overlays.indexOf(layer);\n if (index > 0) {\n const current = overlays[index - 1];\n overlays[index - 1] = layer;\n overlays[index] = current;\n }\n }\n\n function moveOverlayDown(layer: Overlay): void {\n const index = overlays.indexOf(layer);\n\n if (index < overlays.length - 1) {\n const current = overlays[index + 1];\n overlays[index + 1] = layer;\n overlays[index] = current;\n }\n }\n\n return {\n basemapCount,\n getBasemaps,\n getGraticuleLayer,\n getOverlays,\n moveOverlayDown,\n moveOverlayUp,\n overlayCount,\n setBasemapOpacity,\n setBasemapVisibility,\n setOverlayOpacity,\n setOverlayVisibility,\n };\n});\n","import type Extent from '@giro3d/giro3d/core/geographic/Extent';\nimport type Instance from '@giro3d/giro3d/core/Instance';\nimport type ColorLayer from '@giro3d/giro3d/core/layer/ColorLayer';\nimport type Layer from '@giro3d/giro3d/core/layer/Layer';\n\nimport { isColorLayer } from '@giro3d/giro3d/core/layer/ColorLayer';\nimport { isElevationLayer } from '@giro3d/giro3d/core/layer/ElevationLayer';\nimport Giro3dMap from '@giro3d/giro3d/entities/Map';\nimport { EventDispatcher } from 'three';\n\nimport type { BaseLayer, BasemapLayer } from '@/types/BaseLayer';\nimport type { Overlay } from '@/types/Overlay';\n\nimport Grid from '@/giro3d/Grid';\nimport LayerBuilder from '@/giro3d/LayerBuilder';\nimport Plane from '@/giro3d/Plane';\nimport { useCameraStore } from '@/stores/camera';\nimport { useGiro3dStore } from '@/stores/giro3d';\nimport { useLayerStore } from '@/stores/layers';\n\n// Hide the grid when above this altitude threshold\nconst GRID_ALTITUDE_THRESHOLD = 3000;\nexport const GRID_NAME = 'grid';\nexport const PLANE_NAME = 'plane';\n\n// Hide the graticule when above this altitude threshold\nconst GRATICULE_ALTITUDE_THRESHOLD = 5000;\n\nexport default class LayerManager extends EventDispatcher {\n public get extent(): Extent {\n return this._basemap.extent;\n }\n private readonly _baseLayers: Map<string, BasemapLayer>;\n private readonly _basemap: Giro3dMap;\n private readonly _boundOnAfterCameraUpdate: () => void;\n private readonly _cameraStore = useCameraStore();\n private readonly _datasetLayers: Set<string>;\n private readonly _giro3dStore = useGiro3dStore();\n\n private readonly _grid: Grid;\n private readonly _instance: Instance;\n private readonly _layerStore = useLayerStore();\n\n private readonly _overlays: Map<string, ColorLayer>;\n\n private readonly _plane: Plane;\n\n public constructor(instance: Instance) {\n super();\n\n this._instance = instance;\n this._baseLayers = new Map();\n this._overlays = new Map();\n this._datasetLayers = new Set();\n\n const extent = this._giro3dStore.getDefaultBasemapExtent();\n const mapOptions = this._giro3dStore.getDefaultBasemapOptions();\n\n this._basemap = new Giro3dMap({\n extent,\n ...mapOptions,\n });\n this._basemap.terrain.segments = 32;\n this._basemap.name = 'basemaps';\n void this._instance.add(this._basemap);\n\n this._grid = new Grid(this._instance, extent, GRID_NAME);\n this._plane = new Plane(this._instance, extent, PLANE_NAME);\n\n this._boundOnAfterCameraUpdate = this.onAfterCameraUpdate.bind(this);\n this._instance.addEventListener('after-camera-update', this._boundOnAfterCameraUpdate);\n\n for (const overlay of this._layerStore.getOverlays()) {\n if (overlay.visible) {\n void this.loadOverlay(overlay);\n }\n }\n\n for (const basemap of this._layerStore.getBasemaps()) {\n if (basemap.visible) {\n void this.loadBasemap(basemap);\n }\n }\n\n const graticuleLayer = this._layerStore.getGraticuleLayer();\n if (graticuleLayer) {\n graticuleLayer.instance = this._instance;\n graticuleLayer.map = this._basemap;\n }\n\n this._layerStore.$onAction(({ after, args, name }) => {\n after(() => {\n switch (name) {\n case 'moveOverlayDown':\n case 'moveOverlayUp':\n this.onOverlayReordered(args[0]);\n break;\n case 'setBasemapOpacity':\n void this.onLayerOpacityChanged(args[0], args[1]);\n break;\n case 'setBasemapVisibility':\n void this.onLayerVisibilityChanged(args[0], args[1]);\n break;\n case 'setOverlayOpacity':\n void this.onOverlayOpacityChanged(args[0], args[1]);\n break;\n case 'setOverlayVisibility':\n void this.onOverlayVisibilityChanged(args[0], args[1]);\n break;\n }\n });\n });\n }\n\n public async addDatasetLayer(layer: BasemapLayer): Promise<void> {\n this._datasetLayers.add(layer.id);\n await this._basemap.addLayer(layer);\n this.updateLayerOrdering();\n }\n\n public dispose(): void {\n this._instance.removeEventListener('after-camera-update', this._boundOnAfterCameraUpdate);\n\n this._instance.remove(this._basemap);\n this._plane.dispose();\n this._grid.dispose();\n this._basemap.dispose({ disposeLayers: true });\n }\n\n public notify(layer: BasemapLayer): void {\n this._instance.notifyChange(layer);\n }\n\n public removeBasemapLayer(layer: BasemapLayer): void {\n this._datasetLayers.delete(layer.id);\n this._basemap.removeLayer(layer, { disposeLayer: true });\n this._instance.notifyChange(this._basemap);\n }\n\n public setMapOpacity(opacity: number): void {\n this._basemap.opacity = opacity;\n this._instance.notifyChange(this._basemap);\n }\n\n private async getLayer(\n basemap: BaseLayer,\n load: boolean = true,\n ): Promise<BasemapLayer | undefined> {\n const layer = this._baseLayers.get(basemap.uuid);\n if (!layer && load) {\n return this.loadBasemap(basemap);\n }\n return layer;\n }\n\n private async getOverlay(\n overlay: Overlay,\n load: boolean = true,\n ): Promise<ColorLayer | undefined> {\n const layer = this._overlays.get(overlay.uuid);\n if (!layer && load) {\n return this.loadOverlay(overlay);\n }\n return layer;\n }\n\n private async loadBasemap(basemap: BaseLayer): Promise<BasemapLayer> {\n const layer = await LayerBuilder.getLayer(basemap);\n\n this._baseLayers.set(basemap.uuid, layer);\n await this._basemap.addLayer(layer);\n this.updateLayerOrdering();\n\n layer.visible = basemap.visible;\n\n if (isColorLayer(layer)) {\n layer.opacity = basemap.opacity;\n }\n if (isElevationLayer(layer)) {\n layer.addEventListener('visible-property-changed', () => {\n this._basemap.visible = layer.visible;\n this._instance.notifyChange(this._basemap);\n });\n this._basemap.visible = layer.visible;\n }\n\n this._instance.notifyChange(this._basemap);\n\n return layer;\n }\n\n private async loadOverlay(overlay: Overlay): Promise<ColorLayer> {\n const layer = await LayerBuilder.getOverlay(overlay, this.extent);\n\n this._overlays.set(overlay.uuid, layer);\n await this._basemap.addLayer(layer);\n this.updateLayerOrdering();\n\n layer.visible = overlay.visible;\n layer.opacity = overlay.opacity;\n\n this._instance.notifyChange(this._basemap);\n\n return layer;\n }\n\n private onAfterCameraUpdate(): void {\n const pos = this._cameraStore.getCamera3dPosition();\n const oldGridVisible = this._grid.visible;\n const newGridVisible = pos.z < GRID_ALTITUDE_THRESHOLD;\n\n if (oldGridVisible !== newGridVisible) {\n this._grid.visible = newGridVisible;\n this._plane.visible = newGridVisible;\n }\n\n const graticule = this._layerStore.getGraticuleLayer();\n if (graticule) {\n const oldGraticuleVisible = graticule.enabled;\n const newGraticuleVisible = pos.z < GRATICULE_ALTITUDE_THRESHOLD;\n\n if (oldGraticuleVisible !== newGraticuleVisible) {\n graticule.enabled = newGraticuleVisible;\n }\n }\n }\n\n private async onLayerOpacityChanged(basemap: BaseLayer, newOpacity: number): Promise<void> {\n const layer = await this.getLayer(basemap);\n if (layer && isColorLayer(layer)) {\n layer.opacity = newOpacity;\n this.notify(layer);\n }\n if (layer && isElevationLayer(layer)) {\n this.setMapOpacity(basemap.opacity);\n }\n }\n\n private async onLayerVisibilityChanged(\n basemap: BaseLayer,\n newVisibility: boolean,\n ): Promise<void> {\n if (basemap.type === 'elevation' && newVisibility) {\n // First make sure we don't have any other elevation layer enabled\n const keys = [...this._baseLayers.keys()];\n keys.forEach(uuid => {\n if (uuid === basemap.uuid) {\n return;\n }\n\n const elevationLayer = this._baseLayers.get(uuid);\n if (elevationLayer && isElevationLayer(elevationLayer)) {\n // Remove from here\n this._baseLayers.delete(uuid);\n this.removeBasemapLayer(elevationLayer);\n\n // And update the store\n const storeLayer = this._layerStore.getBasemaps().find(l => l.uuid === uuid);\n if (storeLayer) {\n this._layerStore.setBasemapVisibility(storeLayer, false);\n }\n }\n });\n }\n\n const layer = await this.getLayer(basemap, newVisibility);\n if (layer) {\n layer.visible = newVisibility;\n if (!newVisibility) {\n this._baseLayers.delete(basemap.uuid);\n this.removeBasemapLayer(layer);\n }\n this.notify(layer);\n }\n }\n\n private async onOverlayOpacityChanged(overlay: Overlay, newOpacity: number): Promise<void> {\n const layer = await this.getOverlay(overlay);\n if (layer) {\n layer.opacity = newOpacity;\n this.notify(layer);\n }\n }\n\n private onOverlayReordered(overlay: Overlay): void {\n if (overlay.visible) {\n this.updateLayerOrdering();\n }\n }\n\n private async onOverlayVisibilityChanged(\n overlay: Overlay,\n newVisibility: boolean,\n ): Promise<void> {\n const layer = await this.getOverlay(overlay, newVisibility);\n if (layer) {\n layer.visible = newVisibility;\n if (!newVisibility) {\n this._overlays.delete(overlay.uuid);\n this.removeBasemapLayer(layer);\n }\n this.notify(layer);\n }\n }\n\n private updateLayerOrdering(): void {\n // We'll sort layers in the counter-intuitive way:\n // - first one will be the bottom one\n // - last one will be the top one\n // In other words, reverse order from what you'd expect in the UI\n const order = [\n // Put basemap layers first, in the reverse order of the config\n // So that the last basemap layer in the config is the first one in the list\n ...this._layerStore\n .getBasemaps()\n .map(layer => this._baseLayers.get(layer.uuid)?.id)\n .reverse(),\n // And then overlays, still in the reverse order,\n // So that the first overlay in the config is the last one in the list\n ...this._layerStore\n .getOverlays()\n .map(layer => this._overlays.get(layer.uuid)?.id)\n .reverse(),\n // And finally add layers coming from datasets\n ...[...this._datasetLayers.values()].reverse(),\n ];\n\n this._basemap.sortColorLayers((a: Layer, b: Layer) => {\n const orderA = order.indexOf(a.id);\n const orderB = order.indexOf(b.id);\n if (orderA >= 0 && orderB >= 0) {\n return orderA - orderB;\n }\n return 0;\n });\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type { PointsPickResult } from '@giro3d/giro3d/core/picking/PickPointsAt';\nimport type PickResult from '@giro3d/giro3d/core/picking/PickResult';\nimport type { VectorPickFeature } from '@giro3d/giro3d/core/picking/PickResult';\nimport type Entity from '@giro3d/giro3d/entities/Entity';\nimport type FeatureCollection from '@giro3d/giro3d/entities/FeatureCollection';\nimport type Giro3DMap from '@giro3d/giro3d/entities/Map';\nimport type { ShapePickResult } from '@giro3d/giro3d/entities/Shape';\nimport type { Vector2 } from 'three';\n\nimport { isPointsPickResult } from '@giro3d/giro3d/core/picking/PickPointsAt';\nimport { isMapPickResult } from '@giro3d/giro3d/core/picking/PickTilesAt';\nimport { isMap } from '@giro3d/giro3d/entities/Map';\nimport { isShapePickResult } from '@giro3d/giro3d/entities/Shape';\nimport { type Feature as OLFeature } from 'ol';\nimport { Box3, type Object3D, Vector3 } from 'three';\n\nimport type Annotation from '@/types/Annotation';\nimport type { PieroShapeUserData } from '@/types/Annotation';\nimport type { Attribute, AttributesGroups } from '@/types/Feature';\n\nimport Measure3D from '@/giro3d/Measure3D';\nimport { useAnalysisStore } from '@/stores/analysis';\nimport Feature from '@/types/Feature';\n\nimport { GRID_NAME, PLANE_NAME } from './LayerManager';\n\nexport type AttributeExtractorFn<T extends PickResult = PickResult> = (\n pickResult: T,\n attributesGroups: AttributesGroups,\n) => void;\n\nexport const customAttributeExtractors: AttributeExtractorFn[] = [];\n\nfunction comparePickResults(a: PickResult, b: PickResult): number {\n if (isShapePickResult(a)) {\n return -1;\n }\n if (isShapePickResult(b)) {\n return 1;\n }\n\n return a.distance - b.distance;\n}\n\nexport default class Picker {\n private readonly _analysisStore = useAnalysisStore();\n\n public getFeatureFromPickedObject(pickedObject: PickResult): Feature | null {\n const { entity, features, object } = pickedObject;\n\n const object3d = entity?.object3d ?? object;\n let name = object3d.userData?.dataset?.name;\n const parent = entity?.id ?? object3d.uuid;\n\n const datasetAttributes: Array<Attribute> = [];\n const attributesGroups = new Map<string, Array<Attribute>>();\n attributesGroups.set('Dataset', datasetAttributes);\n\n if (entity) {\n if (isMapPickResult(pickedObject)) {\n if (features == null || features.length === 0) {\n // Nothing picked, early exit\n return null;\n }\n\n const feature = features.at(0) as VectorPickFeature;\n const featureName = this.getNameFromOLFeature(feature.feature);\n name = featureName ?? name;\n this.getAttributesFromOLFeature(feature.feature, attributesGroups);\n datasetAttributes.push({ key: 'Layer', value: feature.layer.name });\n } else if (isPointsPickResult(pickedObject)) {\n this.getAttributesFromPointCloud(pickedObject, attributesGroups);\n } else if ((entity as FeatureCollection).isFeatureCollection) {\n // do nothing, already covered by object?.userData\n } else if (isShapePickResult(pickedObject)) {\n const entity = pickedObject.entity;\n\n if (Measure3D.isMeasure3D(entity)) {\n const measure = entity.userData.measure;\n name = measure?.title ?? name;\n this.getAttributesFromMeasure(pickedObject, attributesGroups);\n } else {\n const annotation = entity.userData.annotation as Annotation;\n name = annotation?.title ?? name;\n this.getAttributesFromAnnotation(pickedObject, attributesGroups);\n }\n }\n\n for (const customExtractor of customAttributeExtractors) {\n customExtractor(pickedObject, attributesGroups);\n }\n }\n\n if (entity?.userData) {\n this.getAttributesFromEntity(entity, attributesGroups);\n }\n if (object?.userData != null) {\n this.getAttributesFromPickedObject3D(pickedObject, attributesGroups);\n }\n\n if (object != null) {\n this.getDatasetAttributes(object, datasetAttributes);\n }\n\n return new Feature(name, parent, attributesGroups, pickedObject.point);\n }\n\n public getFirstFeatureAt(\n instance: Instance,\n e: MouseEvent,\n radius = 1,\n filterOnObjects?: (obj: Entity | Object3D) => boolean,\n ): PickResult[] | null {\n const picked = this.getObjectsAt(instance, e, radius, filterOnObjects);\n if (picked != null && picked.length > 0) {\n return picked;\n }\n\n const pickedOnMap = this.getMapAt(instance, e, radius);\n if (pickedOnMap) {\n return [pickedOnMap];\n }\n\n return null;\n }\n\n public getGeometryAttributes(object: Object3D, attributes: Array<Attribute>): void {\n const bbox = new Box3();\n const size = new Vector3();\n const center = new Vector3();\n bbox.setFromObject(object);\n bbox.getCenter(center);\n bbox.getSize(size);\n\n attributes.push({\n key: 'Center',\n value: [center.x.toFixed(2), center.y.toFixed(2), center.z.toFixed(2)],\n });\n const unit = 'm';\n attributes.push({\n key: 'Size',\n value: [\n `${size.x.toFixed(2)}${unit}`,\n `${size.y.toFixed(2)}${unit}`,\n `${size.z.toFixed(2)}${unit}`,\n ],\n });\n }\n\n /**\n * Gets the point on map or grid where the user clicked.\n *\n * @param e - Mouse event\n * @param radius - Radius - the smaller, the faster and more precise (but\n * may return nothing)\n * @returns Result or null if nothing found\n */\n public getMapAt(instance: Instance, e: MouseEvent, radius = 1): PickResult | null {\n const where = instance.getObjects(o => (o as Giro3DMap).isMap);\n const picked = instance\n .pickObjectsAt(e, {\n limit: 1,\n pickFeatures: true,\n radius,\n sortByDistance: true,\n where,\n })\n .at(0);\n return picked ?? null;\n }\n\n public getMouseCoordinate(instance: Instance, mouse: Vector2): Vector3 | null {\n const where = instance.getObjects(o => (o as Giro3DMap).isMap);\n\n const picked = instance\n .pickObjectsAt(mouse, {\n limit: 1,\n radius: 0,\n where,\n })\n .at(0);\n return picked?.point ?? null;\n }\n\n /**\n * Gets the closest dataset object from where the user clicked.\n * Does **NOT** pick on the base map!\n *\n * @param e - Mouse event\n * @param radius - Radius - the smaller, the faster and more precise (but\n * may return nothing)\n * @returns Result or null if notthing found\n */\n public getObjectsAt(\n instance: Instance,\n e: MouseEvent | Vector2,\n radius = 1,\n filterOnObjects?: (obj: Entity | Object3D) => boolean,\n ): PickResult[] | null {\n let where = instance.getObjects(\n o =>\n isMap(o) !== true &&\n (o as Object3D).name !== PLANE_NAME &&\n (o as Object3D).name !== GRID_NAME,\n );\n if (filterOnObjects) {\n where = where.filter(filterOnObjects);\n }\n\n const picked = instance.pickObjectsAt(e, {\n filter: res => this.filterPick(instance, res),\n pickFeatures: true,\n radius,\n where,\n });\n\n picked.sort(comparePickResults);\n\n return picked ?? null;\n }\n\n public hasFeature(instance: Instance, mouse: Vector2): boolean {\n const where = instance.getObjects(\n o =>\n (o as Giro3DMap).isMap !== true &&\n (o as Object3D).name !== PLANE_NAME &&\n (o as Object3D).name !== GRID_NAME,\n );\n\n const picked = instance\n .pickObjectsAt(mouse, {\n limit: 1,\n radius: 0,\n where,\n })\n .at(0);\n return picked != null;\n }\n\n public pick(\n instance: Instance,\n event: MouseEvent,\n ): { feature: Feature | null; pickResult: PickResult; point: Vector3 } | null {\n const picked = this.getFirstFeatureAt(instance, event)?.at(0);\n if (picked) {\n const feature = this.getFeatureFromPickedObject(picked);\n if (feature) {\n return { feature, pickResult: picked, point: picked.point };\n }\n }\n return null;\n }\n\n protected filterPick(instance: Instance, result: PickResult): boolean {\n if (this._analysisStore.isClippingBoxEnabled()) {\n const containsPoint = this._analysisStore.getClippingBox().containsPoint(result.point);\n if (this._analysisStore.isClippingBoxInverted()) {\n if (containsPoint) {\n return false;\n }\n } else {\n if (!containsPoint) {\n return false;\n }\n }\n }\n if (\n result.distance < instance.view.camera.near ||\n result.distance > instance.view.camera.far\n ) {\n return false;\n }\n\n return true;\n }\n\n protected getAttributesFromAnnotation(\n pickResult: ShapePickResult,\n attributesGroups: AttributesGroups,\n ): void {\n if (!attributesGroups.has('GeoJSON')) {\n attributesGroups.set('GeoJSON', []);\n }\n\n const attributesGeoJSON = attributesGroups.get('GeoJSON') as Attribute[];\n\n const shape = pickResult.entity;\n const userData = shape.userData as PieroShapeUserData;\n const { annotation, measurements, type } = userData;\n\n if (annotation != null) {\n for (const [key, value] of Object.entries(annotation.properties)) {\n if (\n key === 'geometry' ||\n key === 'geometryProperty' ||\n key === 'metadata' ||\n key === 'entity'\n ) {\n continue;\n }\n attributesGeoJSON.push({ key, value });\n }\n }\n\n if (!attributesGroups.has('Measurement')) {\n attributesGroups.set('Measurement', []);\n }\n const attributes = attributesGroups.get('Measurement') as Attribute[];\n\n if (type === 'MultiPoint') {\n attributes.push({ key: 'Number of points', value: shape.points.length });\n }\n\n const unit = 'm';\n if (measurements.area != null) {\n attributes.push({ key: 'Area', value: `${measurements.area.toFixed(2)}${unit}²` });\n }\n if (measurements.perimeter != null) {\n attributes.push({\n key: type === 'Polygon' ? 'Perimeter' : 'Length',\n value: `${measurements.perimeter.toFixed(2)}${unit}`,\n });\n }\n if (measurements.minmax != null) {\n attributes.push({\n key: 'Min altitude',\n value: `${measurements.minmax[0].toFixed(2)}${unit}`,\n });\n attributes.push({\n key: 'Max altitude',\n value: `${measurements.minmax[1].toFixed(2)}${unit}`,\n });\n }\n }\n\n protected getAttributesFromEntity(entity: Entity, attributesGroups: AttributesGroups): void {\n if (!attributesGroups.has('Feature')) {\n attributesGroups.set('Feature', []);\n }\n const attributes = attributesGroups.get('Feature') as Attribute[];\n\n if (entity?.userData != null) {\n this.getAttributesFromUserData(entity.userData, attributes);\n }\n }\n\n protected getAttributesFromMeasure(\n pickResult: PickResult,\n attributesGroups: AttributesGroups,\n ): void {\n if (!attributesGroups.has('GeoJSON')) {\n attributesGroups.set('GeoJSON', []);\n }\n const attributesGeoJSON = attributesGroups.get('GeoJSON') as Attribute[];\n\n const parent = pickResult.entity as Measure3D;\n\n for (const [key, value] of Object.entries(parent.userData.measure.properties)) {\n if (\n key === 'geometry' ||\n key === 'geometryProperty' ||\n key === 'metadata' ||\n key === 'entity'\n ) {\n continue;\n }\n attributesGeoJSON.push({ key, value });\n }\n\n if (!attributesGroups.has('Measurement')) {\n attributesGroups.set('Measurement', []);\n }\n const attributes = attributesGroups.get('Measurement') as Attribute[];\n attributes.push({ key: 'From', value: parent.from });\n attributes.push({ key: 'To', value: parent.to });\n attributes.push({ key: 'Length', value: `${parent.length.toFixed(2)}m` });\n }\n\n protected getAttributesFromObject3D(object: Object3D, attributes: Attribute[]): void {\n if (object?.userData != null) {\n this.getAttributesFromUserData(object.userData, attributes);\n }\n\n if (object?.parent) {\n if ('isFeatureTile' in object.parent && object.parent.isFeatureTile === true) {\n // Don't go too far with FeatureCollections\n return;\n }\n this.getAttributesFromObject3D(object.parent, attributes);\n }\n }\n\n protected getAttributesFromOLFeature(\n feature: OLFeature,\n attributesGroups: AttributesGroups,\n ): void {\n if (!attributesGroups.has('Feature')) {\n attributesGroups.set('Feature', []);\n }\n const attributes = attributesGroups.get('Feature') as Attribute[];\n\n if (feature.getId() !== undefined) {\n attributes.push({ key: 'fid', value: feature.getId() });\n }\n for (const [key, value] of Object.entries(feature.getProperties())) {\n if (key === 'geometry' || key === 'geometryProperty') {\n continue;\n }\n attributes.push({ key, value });\n }\n }\n\n protected getAttributesFromPickedObject3D(\n pickResult: PickResult,\n attributesGroups: AttributesGroups,\n ): void {\n if (!attributesGroups.has('Feature')) {\n attributesGroups.set('Feature', []);\n }\n const attributes = attributesGroups.get('Feature') as Attribute[];\n\n this.getAttributesFromObject3D(pickResult.object, attributes);\n }\n\n protected getAttributesFromPointCloud(\n pickResult: PointsPickResult,\n attributesGroups: AttributesGroups,\n ): void {\n attributesGroups.get('Dataset')?.push({ key: 'Tile', value: pickResult.object.name });\n }\n\n protected getAttributesFromUserData(userData: object, attributes: Attribute[]): void {\n for (const [key, value] of Object.entries(userData)) {\n if (\n key === 'geometry' ||\n key === 'geometryProperty' ||\n key === 'metadata' ||\n key === 'entity' ||\n key === 'dataset' ||\n key === 'bbox' ||\n key === 'hover'\n ) {\n continue;\n }\n\n if (key === 'feature' && typeof value === 'object' && 'ol_uid' in value) {\n // OpenLayers feature\n this.getAttributesFromUserData(value.getProperties(), attributes);\n continue;\n }\n\n if (key === 'properties') {\n this.getAttributesFromUserData(value, attributes);\n continue;\n }\n if (typeof value === 'object') {\n continue;\n }\n\n if (key === 'id') {\n attributes.push({ key: 'fid', value });\n continue;\n }\n attributes.push({ key, value });\n }\n }\n\n protected getDatasetAttributes(object: Object3D, datasetAttributes: Attribute[]): void {\n if (object?.userData?.dataset?.name != null) {\n datasetAttributes.push({ key: 'Dataset', value: object.userData.dataset.name });\n }\n if (object?.userData?.dataset?.filename != null) {\n datasetAttributes.push({ key: 'File', value: object.userData.dataset.filename });\n }\n if (object.parent) {\n this.getDatasetAttributes(object.parent, datasetAttributes);\n }\n }\n\n protected getNameFromOLFeature(feature: OLFeature): string {\n return feature.get('nom') ?? feature.get('name') ?? feature.getId();\n }\n}\n","import { type Component } from 'vue';\n\nimport type { HighlightFn } from '@/services/Highlighter';\nimport type { AttributeExtractorFn } from '@/services/Picker';\n\nimport { datasetIcons, datasetTitles, propertyViews } from '@/components/Configuration';\nimport { type EntityBuilder, registerEntityBuilder } from '@/giro3d/EntityBuilder';\nimport { type LoadDatasetFromFile, registerLoader } from '@/loaders/loader';\nimport { customHighlighters } from '@/services/Highlighter';\nimport { customAttributeExtractors } from '@/services/Picker';\n\n/**\n * Parameters to register a new Dataset type.\n */\nexport type DatasetRegistrationParams = {\n /**\n * Custom function to extract attribute from a picked object.\n */\n attributeExtractor?: AttributeExtractorFn;\n /**\n * The function to build an entity from a dataset.\n */\n entityBuilder: EntityBuilder;\n /**\n * The list of supported extensions (without the leading dot). When a file with a supported extension is imported,\n * the appropriate loader will be used. If undefined, this dataset cannot be imported\n * from a local file (for example by drag and drop).\n * @example ['csv', 'dsv', 'tsv']\n */\n fileExtensions?: string[];\n /**\n * Custom highlighter for this dataset.\n */\n highlight?: HighlightFn;\n /**\n * The optional icon to use\n * @example 'bi-building'\n */\n icon?: string;\n /**\n * The function to load a dataset from a file, if supported.\n */\n loader?: LoadDatasetFromFile;\n /**\n * The dataset display name.\n * @example 'IFC\n */\n name?: string;\n /**\n * An optional custom property view.\n */\n propertyView?: Component;\n};\n\n/** @internal */\nexport class DatasetApiImpl implements DatasetApi {\n public registerDatasetType(datasetType: string, params: DatasetRegistrationParams): void {\n if (params.icon != null) {\n datasetIcons[datasetType] = params.icon;\n }\n if (params.name != null) {\n datasetTitles[datasetType] = params.name;\n }\n if (params.highlight) {\n customHighlighters.push(params.highlight);\n }\n\n registerEntityBuilder(datasetType, params.entityBuilder);\n\n if (params.fileExtensions) {\n if (params.loader == null) {\n console.warn(\n `File extensions have been specified for dataset ${datasetType}, but no loader function has been provided.`,\n );\n } else {\n for (const extension of params.fileExtensions) {\n registerLoader(extension, params.loader);\n }\n }\n }\n\n if (params.propertyView) {\n propertyViews.set(datasetType, params.propertyView);\n }\n\n if (params.attributeExtractor) {\n customAttributeExtractors.push(params.attributeExtractor);\n }\n }\n}\n\n/**\n * APIs to manipulate datasets.\n */\nexport default interface DatasetApi {\n /**\n * Register a new dataset type.\n */\n registerDatasetType(\n /**\n * The unique key to identify this dataset type.\n * @example 'ifc'\n */\n key: string,\n params: DatasetRegistrationParams,\n ): void;\n}\n","import { Mesh, MeshBasicMaterial, PlaneGeometry } from 'three';\n\nconst DEFAULT_HEIGHT = 170;\n\nexport default class FloodingPlane {\n public geometry: PlaneGeometry;\n public material: MeshBasicMaterial;\n public object3D: Mesh<PlaneGeometry, MeshBasicMaterial>;\n public set height(z: number) {\n this._height = z;\n }\n\n public get height(): number {\n return this._height;\n }\n\n public set visible(v: boolean) {\n this.object3D.visible = v;\n }\n\n public get visible(): boolean {\n return this.object3D.visible;\n }\n\n private _height: number;\n\n public constructor() {\n this.geometry = new PlaneGeometry(1, 1, 1, 1);\n this.material = new MeshBasicMaterial({ color: 0x00aaaa, opacity: 0.5, transparent: true });\n this.object3D = new Mesh(this.geometry, this.material);\n this.object3D.renderOrder = 2;\n this.visible = false;\n this._height = DEFAULT_HEIGHT;\n }\n\n public dispose(): void {\n this.object3D.removeFromParent();\n this.geometry.dispose();\n this.material.dispose();\n }\n\n public setPosition(x: number, y: number, z: number, width: number, height: number): void {\n this.object3D.scale.set(width, height, 1);\n this.object3D.position.set(x, y, z);\n this.object3D.updateMatrixWorld();\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\n\nimport type LayerManager from '@/services/LayerManager';\n\nimport { useAnalysisStore } from '@/stores/analysis';\nimport FloodingPlane from '@/types/FloodingPlane';\n\nexport default class FloodingPlaneManager {\n private readonly _instance: Instance;\n private readonly _layerManager: LayerManager;\n private _plane: FloodingPlane | null;\n private readonly _store = useAnalysisStore();\n\n public constructor(instance: Instance, layerManager: LayerManager) {\n this._instance = instance;\n this._layerManager = layerManager;\n this._plane = null;\n\n this._store.$onAction(({ after, name }) => {\n after(() => {\n switch (name) {\n case 'enableFloodingPlane':\n void this.updatePlane();\n break;\n case 'setFloodingPlaneHeight':\n void this.updatePlane();\n break;\n }\n });\n });\n }\n\n public dispose(): void {\n if (this._plane) {\n this._instance.remove(this._plane.object3D);\n this._plane.dispose();\n }\n }\n\n private async updatePlane(): Promise<void> {\n if (!this._plane) {\n this._plane = new FloodingPlane();\n await this._instance.add(this._plane.object3D);\n }\n const extent = this._layerManager.extent;\n const center = extent.centerAsVector2();\n const dims = extent.dimensions();\n\n this._plane.visible = this._store.isFloodingPlaneEnabled();\n this._plane.setPosition(\n center.x,\n center.y,\n this._store.floodingPlaneHeight,\n dims.x,\n dims.y,\n );\n this._instance.notifyChange();\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\n\nimport {\n Box3,\n Box3Helper,\n BoxGeometry,\n Color,\n Group,\n Mesh,\n MeshBasicMaterial,\n Plane,\n Vector3,\n} from 'three';\nimport { TransformControls } from 'three/examples/jsm/controls/TransformControls.js';\n\nimport type NavigationMode from '@/types/NavigationMode';\n\nimport { useAnalysisStore } from '@/stores/analysis';\nimport { useCameraStore } from '@/stores/camera';\nimport { useDatasetStore } from '@/stores/datasets';\n\nconst helperMaterial = new MeshBasicMaterial({ color: 'yellow', opacity: 0.1, transparent: true });\n\nexport default class ClippingBoxManager {\n private readonly _cameraStore = useCameraStore();\n private _clippingBox: Box3 | null;\n private _clippingBoxHelper: Box3Helper | null;\n private _clippingBoxMesh: Mesh | null;\n private readonly _datasetStore = useDatasetStore();\n private readonly _instance: Instance;\n private _previousTransformControls: NavigationMode;\n\n private readonly _store = useAnalysisStore();\n private _transformControls: TransformControls | null;\n private readonly _volumeHelpers: Group;\n\n public constructor(instance: Instance) {\n this._instance = instance;\n this._volumeHelpers = new Group();\n instance.scene.add(this._volumeHelpers);\n\n this._clippingBox = null;\n this._clippingBoxHelper = null;\n this._clippingBoxMesh = null;\n this._transformControls = null;\n this._previousTransformControls = this._cameraStore.getNavigationMode();\n\n this._store.$onAction(({ after, name }) => {\n after(() => {\n switch (name) {\n case 'displayClippingBoxHelper':\n case 'enableClippingBox':\n case 'setClippingBox':\n case 'setClippingBoxSize':\n // Need to recreate the whole box\n this.updateClippingBox();\n break;\n case 'setClippingBoxCenter':\n // We can simply move the existing box\n this.moveClippingBox();\n break;\n case 'setClippingBoxInverted':\n this.applyClippingPlanes();\n break;\n }\n });\n });\n\n this._datasetStore.$onAction(({ after, name }) => {\n after(() => {\n switch (name) {\n case 'attachEntity':\n this.applyClippingPlanes();\n break;\n }\n });\n });\n }\n\n public dispose(): void {\n this._instance.scene.remove(this._volumeHelpers);\n this.disposeClippingBox();\n }\n\n /**\n * Applies defined clipping planes to all entities.\n * This is required after:\n * - changing the clipping box\n * - loading a new entity\n */\n private applyClippingPlanes(): void {\n const planes = this._store.isClippingBoxEnabled() ? this.getPlanesFromBoxSides() : [];\n for (const o of this._datasetStore.getDatasets()) {\n const entity = this._datasetStore.getEntity(o);\n if (entity) {\n entity.clippingPlanes = planes;\n entity.traverseMaterials(mat => {\n mat.clipIntersection = this._store.isClippingBoxInverted();\n });\n this._instance.notifyChange(entity);\n }\n }\n }\n\n /**\n * Creates the whole clipping box and helpers if displayed\n * @param center - Center of the clipping box\n * @param size - Size of the clipping box\n */\n private createClippingBox(center: Vector3, size: Vector3): void {\n this._clippingBox = new Box3();\n this._clippingBox.setFromCenterAndSize(center, size);\n\n if (this._store.isClippingBoxHelperDisplayed()) {\n // First, let's create the helpers for the box itself\n const boxGeometry = new BoxGeometry(size.x, size.y, size.z);\n this._clippingBoxMesh = new Mesh(boxGeometry, helperMaterial);\n this._clippingBoxHelper = new Box3Helper(this._clippingBox, new Color('yellow'));\n this._clippingBoxMesh.renderOrder = 2;\n this._clippingBoxMesh.position.copy(center);\n this._clippingBoxMesh.updateMatrixWorld();\n this._clippingBoxHelper.updateMatrixWorld();\n\n // Now let's add some controls to move the box\n this._transformControls = new TransformControls(\n this._instance.view.camera,\n this._instance.domElement,\n );\n this._transformControls.addEventListener('change', () => {\n if (\n this._cameraStore.getNavigationMode() !== 'disabled' ||\n this._clippingBoxMesh === null\n ) {\n return;\n }\n // If the change came from the control, let's move the box\n this._store.clippingBoxCenter.copy(this._clippingBoxMesh.position);\n this.moveClippingBox();\n });\n this._transformControls.addEventListener('dragging-changed', event => {\n if (event.value != null) {\n // Disable controls while we are playing with the transform controls\n this._previousTransformControls = this._cameraStore.getNavigationMode();\n this._cameraStore.setNavigationMode('disabled');\n this._cameraStore.setIsUserInteracting(true);\n } else {\n this._cameraStore.setNavigationMode(this._previousTransformControls);\n setTimeout(() => this._cameraStore.setIsUserInteracting(false), 0);\n }\n });\n\n // And let's add everything in the scene\n this._volumeHelpers.add(this._clippingBoxHelper);\n this._volumeHelpers.add(this._clippingBoxMesh);\n this._transformControls.attach(this._clippingBoxMesh);\n this._transformControls.getHelper().updateMatrixWorld();\n this._instance.scene.add(this._transformControls.getHelper());\n this._instance.notifyChange();\n }\n }\n\n /**\n * Disposes of the clipping box and all helpers\n */\n private disposeClippingBox(): void {\n this._transformControls?.detach();\n this._transformControls?.getHelper().removeFromParent();\n this._transformControls?.dispose();\n\n this._clippingBoxMesh?.geometry?.dispose();\n this._clippingBoxMesh?.removeFromParent();\n this._clippingBoxHelper?.removeFromParent();\n this._clippingBoxHelper?.dispose();\n\n this._instance.notifyChange();\n }\n\n private getPlanesFromBoxSides(): Plane[] {\n if (this._clippingBox === null) {\n throw new Error('No clippingBox defined');\n }\n\n const result: Plane[] = [];\n\n // Notice that when the plane has a positive normal, the distance to the box must be negated\n result.push(new Plane(new Vector3(0, 0, +1), -this._clippingBox.min.z));\n result.push(new Plane(new Vector3(0, 0, -1), +this._clippingBox.max.z));\n result.push(new Plane(new Vector3(+1, 0, 0), -this._clippingBox.min.x));\n result.push(new Plane(new Vector3(-1, 0, 0), +this._clippingBox.max.x));\n result.push(new Plane(new Vector3(0, +1, 0), -this._clippingBox.min.y));\n result.push(new Plane(new Vector3(0, -1, 0), +this._clippingBox.max.y));\n\n if (this._store.isClippingBoxInverted()) {\n result.forEach(plane => plane.negate());\n }\n\n return result;\n }\n\n /**\n * Moves an existing clipping box, while keeping its size\n */\n private moveClippingBox(): void {\n if (this._store.isClippingBoxEnabled()) {\n if (this._clippingBox === null) {\n this.createClippingBox(this._store.clippingBoxCenter, this._store.clippingBoxSize);\n }\n\n this._clippingBox?.setFromCenterAndSize(\n this._store.clippingBoxCenter,\n this._store.clippingBoxSize,\n );\n\n if (this._store.isClippingBoxHelperDisplayed()) {\n this._clippingBoxMesh?.position.copy(this._store.clippingBoxCenter);\n this._clippingBoxMesh?.updateMatrixWorld();\n this._clippingBoxHelper?.updateMatrixWorld();\n this._transformControls?.getHelper().updateMatrixWorld();\n this._instance.notifyChange(this._volumeHelpers);\n this._instance.notifyChange(this._transformControls);\n }\n }\n this.applyClippingPlanes();\n }\n\n /**\n * Updates the clipping box; required when changing its size\n */\n private updateClippingBox(): void {\n this.disposeClippingBox();\n if (this._store.isClippingBoxEnabled()) {\n this.createClippingBox(this._store.clippingBoxCenter, this._store.clippingBoxSize);\n }\n this.applyClippingPlanes();\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\n\nimport { MathUtils, Plane, Vector3 } from 'three';\n\nimport { useAnalysisStore } from '@/stores/analysis';\nimport { useDatasetStore } from '@/stores/datasets';\n\nexport default class CrossSectionManager {\n private readonly _datasetStore = useDatasetStore();\n private readonly _instance: Instance;\n private readonly _store = useAnalysisStore();\n\n public constructor(instance: Instance) {\n this._instance = instance;\n this._store.$onAction(({ after, name }) => {\n after(() => {\n switch (name) {\n case 'enableCrossSection':\n case 'setCrossSectionCenter':\n case 'setCrossSectionOrientation':\n this.updateCrossSection();\n break;\n }\n });\n });\n\n this.updateCrossSection();\n }\n\n public dispose(): void {\n // Nothing to do\n }\n\n private updateCrossSection(): void {\n const clippingPlanes = [];\n\n if (this._store.isCrossSectionEnabled()) {\n const radians = MathUtils.DEG2RAD * this._store.crossSectionOrientation;\n const cos = Math.cos(radians);\n const sin = Math.sin(radians);\n\n const normal = new Vector3(cos, sin, 0);\n\n const distance = new Plane(normal, 0).distanceToPoint(this._store.crossSectionCenter);\n const plane = new Plane(normal, -distance);\n clippingPlanes.push(plane);\n }\n\n this._instance.renderer.clippingPlanes = clippingPlanes;\n for (const o of this._datasetStore.getDatasets()) {\n const entity = this._datasetStore.getEntity(o);\n if (entity) {\n // Make sure entities know clipping planes are updated so\n // they can optimize their rendering\n // See https://gitlab.com/giro3d/piero/-/merge_requests/82\n entity.dispatchEvent({\n clippingPlanes: clippingPlanes,\n type: 'clippingPlanes-property-changed',\n });\n }\n }\n\n this._instance.notifyChange();\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\n\nimport FloodingPlaneManager from '@/services/analysis/FloodingPlaneManager';\n\nimport type LayerManager from './LayerManager';\n\nimport ClippingBoxManager from './analysis/ClippingBoxManager';\nimport CrossSectionManager from './analysis/CrossSectionManager';\n\nexport default class AnalysisManager {\n private readonly _clippingBoxManager: ClippingBoxManager;\n private readonly _crossSectionManager: CrossSectionManager;\n private readonly _floodingPlaneManager: FloodingPlaneManager;\n private readonly _instance: Instance;\n\n public constructor(instance: Instance, layerManager: LayerManager) {\n this._instance = instance;\n this._floodingPlaneManager = new FloodingPlaneManager(instance, layerManager);\n this._crossSectionManager = new CrossSectionManager(instance);\n this._clippingBoxManager = new ClippingBoxManager(instance);\n }\n\n public dispose(): void {\n this._clippingBoxManager.dispose();\n this._crossSectionManager.dispose();\n this._floodingPlaneManager.dispose();\n }\n}\n","import { defineStore } from 'pinia';\nimport { computed, reactive, ref } from 'vue';\n\nimport type Annotation from '@/types/Annotation';\nimport type AnnotationMode from '@/types/AnnotationMode';\n\nexport const useAnnotationStore = defineStore('annotations', () => {\n const annotations = reactive<Annotation[]>([]) as Annotation[];\n const annotationMode = ref<AnnotationMode>('normal');\n const count = computed(() => annotations.length);\n const _isUserDrawing = ref<boolean>(false);\n const _showLabels = ref<boolean>(true);\n\n function isUserDrawing(): boolean {\n return _isUserDrawing.value;\n }\n\n function showLabels(): boolean {\n return _showLabels.value;\n }\n\n function setShowLabels(v: boolean): void {\n _showLabels.value = v;\n }\n\n function setIsUserDrawing(value: boolean): void {\n _isUserDrawing.value = value;\n }\n\n function getAnnotationMode(): AnnotationMode {\n return annotationMode.value;\n }\n\n function setAnnotationMode(mode: AnnotationMode): void {\n annotationMode.value = mode;\n }\n\n function getAnnotations(): Annotation[] {\n return annotations;\n }\n\n function remove(annotation: Annotation): void {\n annotations.splice(annotations.indexOf(annotation), 1);\n }\n\n function createPoint(): void {\n // Nothing to do.\n }\n\n function createLine(): void {\n // Nothing to do.\n }\n\n function createPolygon(): void {\n // Nothing to do.\n }\n\n function add(annotation: Annotation): void {\n annotations.push(annotation);\n }\n\n function hasAnnotation(name: string): boolean {\n return annotations.some(m => m.title === name);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function edit(annotation: Annotation): void {\n // Nothing to do.\n }\n\n function stopEdition(): void {\n // Nothing to do.\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function importAnnotationFile(file: Blob): void {\n // Nothing to do\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function importAnnotationsFiles(files: File[]): void {\n // Nothing to do\n }\n\n return {\n add,\n count,\n createLine,\n createPoint,\n createPolygon,\n edit,\n getAnnotationMode,\n getAnnotations,\n hasAnnotation,\n importAnnotationFile,\n importAnnotationsFiles,\n isUserDrawing,\n remove,\n setAnnotationMode,\n setIsUserDrawing,\n setShowLabels,\n showLabels,\n stopEdition,\n };\n});\n","import { defineStore } from 'pinia';\n\nimport type Notification from '@/types/Notification';\n\nexport const useNotificationStore = defineStore('notifications', () => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function push(notification: Notification): void {\n // Nothing to store.\n // We rely on automatic event by Pinia to notify listener about the notification.\n }\n\n return { push };\n});\n","import type Shape from '@giro3d/giro3d/entities/Shape';\nimport type { ColorRepresentation } from 'three';\n\nimport { EventDispatcher, MathUtils } from 'three';\n\nimport Download from '@/utils/Download';\n\ntype AnnotationEventMap = {\n isEditing: EmptyEvent;\n visible: EmptyEvent;\n};\n\ntype EmptyEvent = {\n /** empty */\n};\n\nexport type PieroShapeUserData = {\n annotation?: Annotation;\n highlightable: boolean;\n highlightColor: ColorRepresentation;\n measurements: {\n area?: number | null;\n minmax: [number, number];\n perimeter?: number | null;\n };\n type: 'LineString' | 'MultiPoint' | 'Point' | 'Polygon';\n};\n\nexport default class Annotation extends EventDispatcher<AnnotationEventMap> {\n public properties: object;\n public readonly title: string;\n public readonly uuid: string;\n public get isEditing(): boolean {\n return this._isEditing;\n }\n public set isEditing(v: boolean) {\n this._isEditing = v;\n this.dispatchEvent({ type: 'isEditing' });\n }\n public get object(): Shape<PieroShapeUserData> {\n return this._object();\n }\n\n public get visible(): boolean {\n return this._visible;\n }\n\n public set visible(v: boolean) {\n this._visible = v;\n this.dispatchEvent({ type: 'visible' });\n }\n\n private _isEditing: boolean;\n\n private _object: () => Shape<PieroShapeUserData>;\n\n private _visible: boolean;\n\n public constructor(\n title: string,\n object: () => Shape<PieroShapeUserData>,\n properties: object = {},\n ) {\n super();\n\n this.title = title;\n this._visible = true;\n this._isEditing = false;\n this._object = object;\n this.properties = properties;\n this.uuid = MathUtils.generateUUID();\n }\n\n public static toCollection(annotations: Annotation[]): GeoJSON.FeatureCollection {\n const features = annotations.map(annotation => annotation.toGeoJSON());\n\n return {\n features,\n type: 'FeatureCollection',\n // @ts-expect-error GeoJSON spec does not allow properties on FeatureCollection\n // But OWC requires it Oo\n id: `${Download.getBaseUrl()}#${MathUtils.generateUUID()}`,\n properties: {\n creator: 'Giro3D',\n generator: {\n title: 'Giro3D',\n uri: Download.getBaseUrl(),\n },\n lang: 'en',\n links: [\n {\n href: 'http://www.opengis.net/spec/owc-atom/1.0/req/core',\n rel: 'profile',\n title: 'This file is compliant with version 1.0 of OGC Context',\n },\n ],\n title: 'Giro3D annotations',\n updated: new Date().toISOString(),\n },\n };\n }\n\n public toGeoJSON(): GeoJSON.Feature {\n const geojson = this.object.toGeoJSON({\n includeAltitudes: true,\n });\n\n geojson.id = `${Download.getBaseUrl()}#${this.uuid}`;\n geojson.properties = {\n ...geojson.properties,\n title: this.title,\n updated: new Date().toISOString(),\n };\n\n return geojson;\n }\n}\n","export type NotificationLevel = 'error' | 'info' | 'success' | 'warning';\n\nexport default class Notification {\n public readonly level: NotificationLevel;\n public readonly text: string;\n public readonly title: string;\n\n public constructor(title: string, text: string, level: NotificationLevel = 'info') {\n this.title = title;\n this.text = text;\n this.level = level;\n }\n\n public static empty(): Notification {\n return new Notification('', '', 'info');\n }\n}\n","import type Shape from '@giro3d/giro3d/entities/Shape';\nimport type { Vector3 } from 'three';\n\nfunction getMinMaxAltitudes(coordsOrDrawing: Shape | Vector3[]): [number, number] {\n let min = +Infinity;\n let max = -Infinity;\n\n let points: Readonly<Vector3[]>;\n\n if (Array.isArray(coordsOrDrawing)) {\n points = coordsOrDrawing;\n } else {\n points = coordsOrDrawing.points;\n }\n\n for (let i = 0; i < points.length; i += 1) {\n min = Math.min(min, points[i].z);\n max = Math.max(max, points[i].z);\n }\n\n return [min, max];\n}\n\nexport default {\n getMinMaxAltitudes,\n};\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type PickResult from '@giro3d/giro3d/core/picking/PickResult';\nimport type {\n SegmentLabelFormatter,\n SurfaceLabelFormatter,\n VertexLabelFormatter,\n} from '@giro3d/giro3d/entities/Shape';\nimport type { CreationOptions } from '@giro3d/giro3d/interactions/DrawTool';\nimport type View from '@giro3d/giro3d/renderer/View';\nimport type { Position } from 'geojson';\nimport type { Vector2 } from 'three';\n\nimport Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport { isMapPickResult } from '@giro3d/giro3d/core/picking/PickTilesAt';\nimport Shape, { isShapePickResult } from '@giro3d/giro3d/entities/Shape';\nimport DrawTool, {\n afterRemovePointOfRing,\n afterUpdatePointOfRing,\n inhibitHook,\n limitRemovePointHook,\n} from '@giro3d/giro3d/interactions/DrawTool';\nimport { MathUtils, Vector3 } from 'three';\n\nimport type CameraController from '@/services/CameraController';\nimport type Picker from '@/services/Picker';\nimport type { PieroShapeUserData } from '@/types/Annotation';\n\nimport { DEFAULT_SHAPE_COLOR, EDIT_SHAPE_COLOR, SHAPE_POINT_RADIUS } from '@/constants';\nimport { useAnnotationStore } from '@/stores/annotations';\nimport { useNotificationStore } from '@/stores/notifications';\nimport Annotation from '@/types/Annotation';\nimport Notification from '@/types/Notification';\nimport Measure from '@/utils/Measure';\n\nfunction promptTitle(defaultValue: string): string | null {\n return window.prompt('Annotation name', defaultValue);\n}\n\nconst numberFormat = new Intl.NumberFormat(undefined, {\n maximumFractionDigits: 1,\n});\n\nconst areaFormatter: SurfaceLabelFormatter = values => {\n let area = values.area;\n\n let unit = 'm²';\n if (area > 1_000_000) {\n area = area / 1_000_000;\n unit = 'km²';\n }\n\n return `${numberFormat.format(area)} ${unit}`;\n};\n\nconst tmpStart = new Vector3();\nconst tmpEnd = new Vector3();\n\nconst lengthFormatter: (view: View) => SegmentLabelFormatter = (view: View) => values => {\n const { camera } = view;\n const { end, start } = values;\n\n const ndcStart = tmpStart.copy(start).project(camera);\n const ndcEnd = tmpEnd.copy(end).project(camera);\n\n const sqLimit = Math.pow(100 / view.width, 2); // pixels\n\n const distanceOnScreen = ndcStart.distanceToSquared(ndcEnd);\n\n // Don't display the label if the segment is too short on the screen\n if (distanceOnScreen < sqLimit) {\n return null;\n }\n\n let length = values.length;\n\n if (length == null || length <= 0) {\n return null;\n }\n\n let unit = 'm';\n if (length > 1_000) {\n length = length / 1_000;\n unit = 'km';\n }\n\n return `${numberFormat.format(length)} ${unit}`;\n};\n\nconst pointFormatter: VertexLabelFormatter = values => {\n const shape = values.shape as Shape<PieroShapeUserData>;\n if (shape.userData.annotation) {\n return shape.userData.annotation.title;\n }\n\n return null;\n};\n\nexport default class AnnotationManager {\n private readonly _boundExitEdition: (e: MouseEvent) => void;\n private readonly _boundOnEndDrag: () => void;\n private readonly _boundOnKeyDown: (e: KeyboardEvent) => void;\n private readonly _boundOnStartDrag: () => void;\n private readonly _boundUpdateLabels: () => void;\n private readonly _drawTool: DrawTool;\n private _editedShape: Shape<PieroShapeUserData> | null = null;\n private _editedShapePreviousPoints: Vector3[] | null = null;\n private readonly _instance: Instance;\n private _isEditing = false;\n private readonly _notificationStore = useNotificationStore();\n\n private readonly _picker: Picker;\n private readonly _shapes: Map<string, Shape<PieroShapeUserData>> = new Map();\n private readonly _store = useAnnotationStore();\n\n public constructor(instance: Instance, camera: CameraController, picker: Picker) {\n this._instance = instance;\n this._picker = picker;\n this._drawTool = new DrawTool({ instance });\n\n // FIXME this would override whatever setting is currently\n // present (depending on navigation modes)\n this._boundOnEndDrag = (): void => {\n camera.enabled = true;\n };\n this._boundOnStartDrag = (): void => {\n camera.enabled = false;\n };\n\n this._boundUpdateLabels = this.updateLabels.bind(this);\n this._boundExitEdition = (): void => {\n this._instance.domElement.removeEventListener('contextmenu', this._boundExitEdition);\n this.stopEdition(false);\n };\n\n // We want to prevent moving the camera while dragging a point\n this._drawTool.addEventListener('start-drag', this._boundOnStartDrag);\n this._drawTool.addEventListener('end-drag', this._boundOnEndDrag);\n\n this._boundOnKeyDown = this.onKeyDown.bind(this);\n document.addEventListener('keydown', this._boundOnKeyDown);\n\n this._instance.addEventListener('after-camera-update', this._boundUpdateLabels);\n\n this._store.$onAction(({ after, args, name }) => {\n after(() => {\n switch (name) {\n case 'createLine':\n this.drawLine();\n break;\n case 'createPoint':\n this.drawPoint();\n break;\n case 'createPolygon':\n this.drawPolygon();\n break;\n case 'edit':\n this.editAnnotation(args[0]);\n break;\n case 'importAnnotationFile':\n void this.importAnnotationFile(args[0]);\n break;\n case 'importAnnotationsFiles':\n void this.importAnnotationFiles(args[0]);\n break;\n case 'remove':\n this.deleteAnnotation(args[0]);\n break;\n case 'setShowLabels':\n this.udpateLabelVisibility(args[0]);\n break;\n case 'stopEdition':\n this.stopEdition(false);\n break;\n }\n });\n });\n }\n\n public dispose(): void {\n document.removeEventListener('keydown', this._boundOnKeyDown);\n\n this._drawTool.removeEventListener('start-drag', this._boundOnStartDrag);\n this._drawTool.removeEventListener('end-drag', this._boundOnEndDrag);\n\n this._instance.removeEventListener('after-camera-update', this._boundUpdateLabels);\n\n this._shapes.forEach(shape => this._instance.remove(shape));\n this._drawTool.dispose();\n }\n\n public pushNewAnnotation(\n title: string,\n shape: Shape<PieroShapeUserData>,\n properties: object = {},\n ): Annotation {\n const annotation = new Annotation(title, () => shape, properties);\n shape.userData.annotation = annotation;\n annotation.addEventListener('visible', () => this.updateDrawing(annotation));\n this._store.add(annotation);\n this._shapes.set(annotation.uuid, shape);\n return annotation;\n }\n\n private addShape(\n shape: Shape<PieroShapeUserData> | null,\n type: PieroShapeUserData['type'],\n defaultName: string,\n ): void {\n if (shape && !this._shapes.has(shape.id)) {\n const userData = shape.userData;\n userData.type = type;\n userData.highlightable = true;\n\n let title = defaultName;\n if (this._store.hasAnnotation(title)) {\n for (let i = 1; i < 1000; i += 1) {\n title = `${defaultName} (${i})`;\n if (!this._store.hasAnnotation(title)) {\n break;\n }\n }\n if (this._store.hasAnnotation(title)) {\n title = 'Achievement unlocked: 1000 annotations with default name';\n }\n }\n const name = promptTitle(title);\n if (name != null) {\n this.computeMeasurements(shape);\n const annotation = this.pushNewAnnotation(name, shape);\n\n this._shapes.set(annotation.uuid, shape);\n } else {\n this._instance.remove(shape);\n }\n }\n }\n\n private computeMeasurements(shape: Shape<PieroShapeUserData>): void {\n shape.userData.measurements = {\n minmax: Measure.getMinMaxAltitudes(shape),\n };\n\n if (shape.userData.type === 'Polygon' || shape.userData.type === 'LineString') {\n shape.userData.measurements.perimeter = shape.getLength();\n }\n if (shape.userData.type === 'Polygon') {\n shape.userData.measurements.area = shape.getArea();\n }\n }\n\n private deleteAnnotation(annotation: Annotation): void {\n if (this._shapes.has(annotation.uuid)) {\n const shape = annotation.object;\n this._instance.remove(shape);\n this._shapes.delete(annotation.uuid);\n }\n }\n\n private draw(\n drawFn: 'createLineString' | 'createPoint' | 'createPolygon',\n type: PieroShapeUserData['type'],\n defaultName: string,\n opts: Partial<CreationOptions>,\n ): void {\n this._store.setIsUserDrawing(true);\n\n void this._drawTool[drawFn]({\n ...this.getCreationOptions(),\n ...opts,\n })\n .then(shape => {\n this.addShape(shape as Shape<PieroShapeUserData>, type, defaultName);\n })\n .finally(() => this._store.setIsUserDrawing(false));\n }\n\n private drawLine(): void {\n this.draw('createLineString', 'LineString', 'New line annotation', {\n segmentLabelFormatter: lengthFormatter(this._instance.view),\n showSegmentLabels: this._store.showLabels(),\n });\n }\n\n private drawPoint(): void {\n this.draw('createPoint', 'Point', 'New point annotation', {\n borderWidth: 3,\n showVertexLabels: this._store.showLabels(),\n vertexLabelFormatter: pointFormatter,\n vertexRadius: SHAPE_POINT_RADIUS,\n });\n }\n\n private drawPolygon(): void {\n this.draw('createPolygon', 'Polygon', 'New polygon annotation', {\n showSurfaceLabel: this._store.showLabels(),\n surfaceLabelFormatter: areaFormatter,\n });\n }\n\n private editAnnotation(annotation: Annotation): void {\n const shape = this._shapes.get(annotation.uuid);\n\n if (!shape) {\n console.warn(`no shape found for annotation ${annotation.uuid}`);\n return;\n }\n\n this._editedShape = shape;\n this._editedShapePreviousPoints = [...shape.points];\n\n annotation.isEditing = true;\n\n shape.color = EDIT_SHAPE_COLOR;\n shape.userData.highlightable = false;\n\n this._instance.notifyChange(shape);\n\n this._store.setIsUserDrawing(true);\n\n this._instance.domElement.addEventListener('contextmenu', this._boundExitEdition);\n\n this._isEditing = true;\n this._drawTool.enterEditMode({\n pick: this.pick.bind(this),\n shapesToEdit: [shape],\n });\n }\n\n private filterPickResults(results: PickResult[], edition: boolean): PickResult[] {\n if (!edition) {\n // Avoid picking shapes in creation mode\n return results.filter(res => !isShapePickResult(res));\n }\n\n return results;\n }\n\n private getCreationOptions(): CreationOptions {\n return {\n color: DEFAULT_SHAPE_COLOR,\n pick: this.pick.bind(this),\n };\n }\n\n private async importAnnotation(\n feature: GeoJSON.Feature,\n skipNames: Set<string>,\n ): Promise<boolean> {\n if (feature.properties == null || typeof feature.properties !== 'object') {\n feature.properties = {};\n }\n if (feature.properties.title == null) {\n feature.properties.title = MathUtils.generateUUID();\n }\n\n if (skipNames.has(feature.properties.title)) {\n return false;\n }\n\n const shape = await this.importShapeFromGeoJSON(feature);\n this.pushNewAnnotation(feature.properties.title, shape, feature.properties);\n return true;\n }\n\n private async importAnnotationFile(file: Blob): Promise<void> {\n const existingAnnotations = new Set(this._store.getAnnotations().map(m => m.title));\n try {\n const { nbImported, nbSkipped } = await this.importBlob(file, existingAnnotations);\n this._notificationStore.push(\n new Notification(\n 'Annotations',\n `${nbImported} annotations imported (${nbSkipped} skipped)`,\n 'success',\n ),\n );\n } catch (e: unknown) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n new Notification('Annotations', `Could not import file: ${e}`, 'warning');\n }\n }\n\n private async importAnnotationFiles(files: File[]): Promise<void> {\n const promises = [];\n let nbTotalImported = 0;\n let nbTotalSkipped = 0;\n const errors: string[] = [];\n\n const existingAnnotations = new Set(this._store.getAnnotations().map(m => m.title));\n\n for (const file of files) {\n promises.push(\n this.importBlob(file, existingAnnotations)\n .then(({ nbImported, nbSkipped }) => {\n nbTotalImported += nbImported;\n nbTotalSkipped += nbSkipped;\n })\n .catch(reason => {\n errors.push((reason as Error).message);\n }),\n );\n }\n await Promise.allSettled(promises);\n\n if (errors.length > 0) {\n this._notificationStore.push(\n new Notification(\n 'Annotations',\n `${nbTotalImported} annotations imported (${nbTotalSkipped} skipped); ${errors.length} errors: ${errors}`,\n 'warning',\n ),\n );\n } else {\n this._notificationStore.push(\n new Notification(\n 'Annotations',\n `${nbTotalImported} annotations imported (${nbTotalSkipped} skipped)`,\n 'success',\n ),\n );\n }\n }\n\n private async importBlob(\n file: Blob,\n skipNames: Set<string>,\n ): Promise<{ nbImported: number; nbSkipped: number }> {\n const str = await file.text();\n const geojson = JSON.parse(str) as GeoJSON.Feature | GeoJSON.FeatureCollection;\n\n const features = geojson.type === 'FeatureCollection' ? geojson.features : [geojson];\n\n let nbImported = 0;\n let nbSkipped = 0;\n\n for (const feature of features) {\n const imported = await this.importAnnotation(feature, skipNames);\n if (imported) {\n nbImported++;\n } else {\n nbSkipped++;\n }\n }\n return { nbImported, nbSkipped };\n }\n\n // Note this was directly imported from the drawtool example\n // We might want to make it part of the Shape API, but we have to think\n // about potential pitfalls as there is not a single mapping between GeoJSON and Shapes.\n private async importShapeFromGeoJSON(\n feature: GeoJSON.Feature,\n ): Promise<Shape<PieroShapeUserData>> {\n if (feature.type !== 'Feature') {\n throw new Error('not a valid GeoJSON feature');\n }\n\n const crs = 'EPSG:4326';\n\n const getPoint = (c: Position): Vector3 => {\n const coord = new Coordinates(crs, c[0], c[1], c[2] ?? 0);\n return coord.as(this._instance.referenceCrs, coord).toVector3();\n };\n\n let result: Shape<PieroShapeUserData>;\n\n switch (feature.geometry.type) {\n case 'LineString':\n result = new Shape<PieroShapeUserData>({\n beforeRemovePoint: limitRemovePointHook(2),\n color: DEFAULT_SHAPE_COLOR,\n segmentLabelFormatter: lengthFormatter(this._instance.view),\n showLine: true,\n showSegmentLabels: true,\n showVertexLabels: false,\n showVertices: true,\n });\n result.setPoints(feature.geometry.coordinates.map(getPoint));\n break;\n case 'MultiPoint':\n result = new Shape<PieroShapeUserData>({\n beforeRemovePoint: limitRemovePointHook(1),\n color: DEFAULT_SHAPE_COLOR,\n showLine: false,\n showVertexLabels: true,\n showVertices: true,\n vertexLabelFormatter: pointFormatter,\n vertexRadius: SHAPE_POINT_RADIUS,\n });\n result.setPoints(feature.geometry.coordinates.map(getPoint));\n break;\n case 'Point':\n result = new Shape<PieroShapeUserData>({\n beforeRemovePoint: inhibitHook,\n color: DEFAULT_SHAPE_COLOR,\n showLine: false,\n showVertexLabels: true,\n showVertices: true,\n vertexLabelFormatter: pointFormatter,\n vertexRadius: SHAPE_POINT_RADIUS,\n });\n result.setPoints([getPoint(feature.geometry.coordinates)]);\n break;\n case 'Polygon':\n result = new Shape<PieroShapeUserData>({\n afterRemovePoint: afterRemovePointOfRing,\n afterUpdatePoint: afterUpdatePointOfRing,\n beforeRemovePoint: limitRemovePointHook(4), // We take into account the doubled first/last point\n color: DEFAULT_SHAPE_COLOR,\n showLine: true,\n showSurface: true,\n showSurfaceLabel: true,\n showVertexLabels: false,\n showVertices: true,\n surfaceLabelFormatter: areaFormatter,\n });\n result.setPoints(feature.geometry.coordinates[0].map(getPoint));\n break;\n default:\n throw new Error(\n 'could not import shape from given GeoJSON geometry: ' + feature.geometry.type,\n );\n }\n\n this.computeMeasurements(result);\n\n await this._instance.add(result);\n\n return result;\n }\n\n private onKeyDown(e: KeyboardEvent): void {\n if (e.code === 'Escape') {\n this.stopEdition(true);\n }\n }\n\n private pick(event: MouseEvent | Vector2): PickResult[] {\n let results: PickResult[];\n\n switch (this._store.getAnnotationMode()) {\n case 'mapOnly':\n results = this.pickMap(event);\n break;\n case 'normal':\n results = this.pickDefault(event);\n break;\n case 'objectsOnly':\n results = this.pickFeatures(event);\n break;\n }\n\n return results;\n }\n\n private pickDefault(event: MouseEvent | Vector2): PickResult[] {\n const results = this._instance.pickObjectsAt(event, { sortByDistance: true });\n\n return this.filterPickResults(results, this._isEditing);\n }\n\n private pickFeatures(event: MouseEvent | Vector2): PickResult[] {\n const results = this._picker.getObjectsAt(this._instance, event, 0) ?? [];\n\n return this.filterPickResults(results, this._isEditing);\n }\n\n private pickMap(event: MouseEvent | Vector2): PickResult[] {\n const results = this._instance.pickObjectsAt(event, {\n filter: res => isShapePickResult(res) || isMapPickResult(res),\n sortByDistance: true,\n });\n\n return this.filterPickResults(results, this._isEditing);\n }\n\n private stopEdition(restoreShape: boolean): void {\n this._drawTool.exitEditMode();\n this._isEditing = false;\n this._store.setIsUserDrawing(false);\n\n if (this._editedShape) {\n if (restoreShape && this._editedShapePreviousPoints) {\n this._editedShape.setPoints(this._editedShapePreviousPoints);\n this._editedShapePreviousPoints = null;\n }\n if (this._editedShape.userData.annotation != null) {\n this._editedShape.userData.annotation.isEditing = false;\n }\n this._editedShape.color = DEFAULT_SHAPE_COLOR;\n this._editedShape.userData.highlightable = true;\n this._editedShape = null;\n }\n }\n\n private udpateLabelVisibility(show: boolean): void {\n this._shapes.forEach(shape => {\n switch (shape.userData.type) {\n case 'LineString':\n shape.showSegmentLabels = show;\n break;\n case 'MultiPoint':\n case 'Point':\n shape.showVertexLabels = show;\n break;\n case 'Polygon':\n shape.showSurfaceLabel = show;\n break;\n }\n });\n }\n\n private updateDrawing(annotation: Annotation): void {\n annotation.object.visible = annotation.visible;\n annotation.object.traverse(o => (o.visible = annotation.visible));\n this._instance.notifyChange();\n }\n\n private updateLabels(): void {\n this._shapes.forEach(shape => {\n if (shape.visible) {\n shape.rebuildLabels();\n }\n });\n }\n}\n","import type { Vector3 } from 'three';\n\nexport default class CameraPosition {\n public readonly camera: Vector3;\n public readonly focalOffset: Vector3;\n public readonly target: Vector3;\n\n public constructor(camera: Vector3, target: Vector3, focalOffset: Vector3) {\n this.camera = camera;\n this.target = target;\n this.focalOffset = focalOffset;\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type GUI from 'lil-gui';\n\nimport Panel from '@giro3d/giro3d/gui/Panel';\nimport { Vector3 } from 'three';\n\nimport type CameraController from '@/services/CameraController';\n\nimport CameraPosition from '@/types/CameraPosition';\n\nclass CameraControlsInspector extends Panel {\n public camera: CameraController;\n private _boundOnAfterCameraUpdate: () => void;\n private _cameraPosition: CameraPosition;\n\n /**\n * @param gui - The GUI.\n * @param instance - The Giro3D instance.\n */\n public constructor(gui: GUI, cameraController: CameraController, instance: Instance) {\n super(gui, instance, 'Camera Controls');\n\n this.camera = cameraController;\n this._cameraPosition = new CameraPosition(new Vector3(), new Vector3(), new Vector3());\n\n this._boundOnAfterCameraUpdate = this.onAfterCameraUpdate.bind(this);\n this.instance.addEventListener('after-camera-update', this._boundOnAfterCameraUpdate);\n\n const position = this.gui.addFolder('Position');\n position.close();\n this._controllers.push(position.add(this._cameraPosition.camera, 'x'));\n this._controllers.push(position.add(this._cameraPosition.camera, 'y'));\n this._controllers.push(position.add(this._cameraPosition.camera, 'z'));\n\n const target = this.gui.addFolder('Target');\n target.close();\n this._controllers.push(target.add(this._cameraPosition.target, 'x'));\n this._controllers.push(target.add(this._cameraPosition.target, 'y'));\n this._controllers.push(target.add(this._cameraPosition.target, 'z'));\n\n const focalOffset = this.gui.addFolder('Focal offset');\n focalOffset.close();\n this._controllers.push(focalOffset.add(this._cameraPosition.focalOffset, 'x'));\n this._controllers.push(focalOffset.add(this._cameraPosition.focalOffset, 'y'));\n this._controllers.push(focalOffset.add(this._cameraPosition.focalOffset, 'z'));\n }\n\n public override dispose(): void {\n this.instance.removeEventListener('after-camera-update', this._boundOnAfterCameraUpdate);\n super.dispose();\n }\n\n private onAfterCameraUpdate(): void {\n this.camera.getCameraPosition(this._cameraPosition);\n }\n}\n\nexport default CameraControlsInspector;\n","import type Extent from '@giro3d/giro3d/core/geographic/Extent';\nimport type Instance from '@giro3d/giro3d/core/Instance';\nimport type PickResult from '@giro3d/giro3d/core/picking/PickResult';\nimport type Entity3D from '@giro3d/giro3d/entities/Entity3D';\nimport type Inspector from '@giro3d/giro3d/gui/Inspector';\nimport type { Object3D } from 'three';\n\nimport Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport CameraControls from 'camera-controls';\nimport {\n Box3,\n Clock,\n EventDispatcher,\n MathUtils,\n Matrix4,\n Quaternion,\n Raycaster,\n Sphere,\n Spherical,\n Vector2,\n Vector3,\n Vector4,\n} from 'three';\nimport { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js';\n\nimport type NavigationMode from '@/types/NavigationMode';\n\nimport CameraControlsInspector from '@/giro3d/CameraControlsInspector';\nimport { useCameraStore } from '@/stores/camera';\nimport { useGiro3dStore } from '@/stores/giro3d';\nimport CameraPosition from '@/types/CameraPosition';\n\nimport type Picker from './Picker';\n\nCameraControls.install({\n THREE: {\n Box3,\n MathUtils,\n Matrix4,\n Quaternion,\n Raycaster,\n Sphere,\n Spherical,\n Vector2,\n Vector3,\n Vector4,\n },\n});\n\ntype CameraControllerEventMap = {\n 'interaction-end': {\n /** empty */\n };\n 'interaction-start': {\n /** empty */\n };\n};\n\n/**\n * Wraps Camera-controls into Giro3D\n */\nclass CameraController extends EventDispatcher<CameraControllerEventMap> {\n public get enabled(): boolean {\n return this._orbitControls.enabled;\n }\n public set enabled(v: boolean) {\n this._orbitControls.enabled = v;\n }\n private readonly _boundOnAfterCameraUpdate: () => void;\n private readonly _boundOnBeforeCameraUpdate: () => void;\n private _boundOrbitControlsOnContextMenu!: (e: MouseEvent) => void;\n private _boundOrbitControlsOnKey!: (e: KeyboardEvent) => void;\n private _boundOrbitControlsOnMouseUp!: (e: MouseEvent) => void;\n private _boundOrbitControlsOnWheel!: (e: MouseEvent) => void;\n private _boundPositionOnMapOnClick: ((e: MouseEvent) => void) | null;\n private _boundPositionOnMapOnContextMenu: ((e: MouseEvent) => void) | null;\n private _boundPositionOnMapOnMouseMove: ((e: MouseEvent) => void) | null;\n private _cameraControlsInspector: CameraControlsInspector | null;\n private readonly _clock: Clock;\n private readonly _giro3dStore = useGiro3dStore();\n private readonly _instance: Instance;\n private readonly _orbitControls: CameraControls;\n private readonly _orbitHelper: CSS2DObject;\n private readonly _picker: Picker;\n private readonly _pickObjectsAt: (e: MouseEvent) => PickResult | null;\n\n private readonly _positionOnMapHelper: CSS2DObject;\n\n private readonly _store = useCameraStore();\n\n /**\n * Creates new Camera-controls and bind them to Giro3D.\n *\n * @param instance - Giro3D instance\n * @param picker - Picker\n */\n public constructor(instance: Instance, picker: Picker) {\n super();\n this._instance = instance;\n this._picker = picker;\n this._orbitControls = new CameraControls(\n this._instance.view.camera,\n this._instance.domElement,\n );\n\n const orbitHelperElement = document.createElement('div');\n orbitHelperElement.className = 'helper';\n orbitHelperElement.id = 'orbit-helper';\n const orbitHelperElementIcon = document.createElement('i');\n orbitHelperElementIcon.className = 'bi bi-mouse2-fill text-dark shadow';\n orbitHelperElement.append(orbitHelperElementIcon);\n\n this._orbitHelper = new CSS2DObject(orbitHelperElement);\n void this._instance.add(this._orbitHelper);\n\n const positionOnMapElement = document.createElement('div');\n positionOnMapElement.className = 'helper';\n positionOnMapElement.id = 'position-on-map-helper';\n const positionOnMapElementIcon = document.createElement('i');\n positionOnMapElementIcon.className = 'fg-position-man text-dark shadow';\n positionOnMapElement.append(positionOnMapElementIcon);\n\n this._positionOnMapHelper = new CSS2DObject(positionOnMapElement);\n void this._instance.add(this._positionOnMapHelper);\n\n this._cameraControlsInspector = null;\n\n this.initializeOrbitControls();\n\n this._pickObjectsAt = (event: MouseEvent): PickResult | null =>\n this._picker.getFirstFeatureAt(this._instance, event, 1)?.at(0) ?? null;\n\n this._clock = new Clock();\n\n // Update controls from event loop - this replaces the requestAnimationFrame logic from\n // camera-controls sample code\n this._boundOnBeforeCameraUpdate = this.onBeforeCameraUpdate.bind(this);\n this._boundOnAfterCameraUpdate = this.onAfterCameraUpdate.bind(this);\n this._instance.addEventListener('before-camera-update', this._boundOnBeforeCameraUpdate);\n this._instance.addEventListener('after-camera-update', this._boundOnAfterCameraUpdate);\n\n this._boundPositionOnMapOnClick = null;\n this._boundPositionOnMapOnMouseMove = null;\n this._boundPositionOnMapOnContextMenu = null;\n\n this._store.$onAction(({ args, name }) => {\n switch (name) {\n case 'lookTopDownAt':\n void this.lookTopDownAt(args[0]);\n break;\n case 'setCameraPosition':\n this.setCamera(args[0]);\n break;\n case 'setNavigationMode':\n this.setNavigationMode(args[0]);\n break;\n }\n });\n\n const inspector = this._giro3dStore.getInspector();\n if (inspector != null) {\n this.initializeInspector(inspector);\n }\n this._giro3dStore.$onAction(({ after, args, name }) => {\n after(() => {\n switch (name) {\n case 'setInspector':\n this.initializeInspector(args[0]);\n break;\n }\n });\n });\n }\n\n public dispose(): void {\n this._instance.removeEventListener('before-camera-update', this._boundOnBeforeCameraUpdate);\n this._instance.removeEventListener('after-camera-update', this._boundOnAfterCameraUpdate);\n\n this._disablePositionOnMap();\n this.disposeOrbitControls();\n\n this._instance.remove(this._positionOnMapHelper);\n this._instance.remove(this._orbitHelper);\n }\n\n /**\n * Executes an interaction with animation.\n *\n * Required to call this instead of calling directly camera-controls because\n * of how Giro3D mainloop works.\n *\n * @param callback - Interaction to execute\n * @returns Resolves when interaction is done\n */\n public executeInteraction<T = void>(callback: () => Promise<T>): Promise<T> {\n this._orbitControls.update(this._clock.getDelta());\n\n // Execute the interaction\n const res = callback();\n\n // As mainloop can pause, before_camera_update can be triggered irregularly\n // Make sure to \"reset\" the clock to enable smooth transitions with camera-controls\n this._orbitControls.update(this._clock.getDelta());\n // Dispatch events so giro3d and giro3dservice gets notified\n this._orbitControls.dispatchEvent({ type: 'update' });\n return res;\n }\n\n public getCameraPosition(target?: CameraPosition): CameraPosition {\n const controls = this._orbitControls;\n const cameraPosition =\n target ?? new CameraPosition(new Vector3(), new Vector3(), new Vector3());\n\n controls.getPosition(cameraPosition.camera);\n controls.getTarget(cameraPosition.target);\n controls.getFocalOffset(cameraPosition.focalOffset);\n\n return cameraPosition;\n }\n /**\n * Looks to a bounding box or Object3D.\n *\n * @param obj - Bounding box or Object to look at\n * @param enableTransition - Enables transition\n * @param options - Camera-controls' fitToBox options\n * @returns Resolves when interaction is done\n */\n public goToBox(\n obj: Box3 | Entity3D | Object3D,\n enableTransition: boolean = true,\n options: object = {\n paddingBottom: 10,\n paddingLeft: 10,\n paddingRight: 10,\n paddingTop: 10,\n },\n ): Promise<void[]> {\n const bbox = this.getBox(obj);\n return this.executeInteraction(() => {\n void this._orbitControls.setFocalOffset(0, 0, 0);\n return this._orbitControls.fitToBox(bbox, enableTransition, options);\n });\n }\n /**\n * Sets the camera to look at a position.\n *\n * @param position - Position of the camera\n * @param lookAt - Posiiton to look at\n * @param enableTransition - Enables transition\n * @returns Resolves when interaction is done\n */\n public async lookAt(\n position: Vector3,\n lookAt: Vector3,\n enableTransition: boolean = false,\n ): Promise<void> {\n await this.executeInteraction(async () => {\n // Need to reset focal offset because of orbit point\n // https://github.com/yomotsu/camera-controls/issues/303\n void this._orbitControls.setFocalOffset(0, 0, 0, false);\n return this._orbitControls.setLookAt(\n position.x,\n position.y,\n position.z,\n lookAt.x,\n lookAt.y,\n lookAt.z,\n enableTransition,\n );\n });\n this._orbitControls.setOrbitPoint(lookAt.x, lookAt.y, lookAt.z);\n }\n public lookTopDownAt(obj: Box3 | Entity3D | Object3D, enableTransition = true): Promise<void> {\n const center = new Vector3();\n const size = new Vector3();\n const newCameraPosition = new Vector3(0, 0, 1);\n\n const bbox = this.getBox(obj);\n bbox.min.z = bbox.max.z;\n bbox.getCenter(center);\n bbox.getSize(size);\n\n const distance = this._orbitControls.getDistanceToFitBox(size.x, size.y, 0);\n const cameraPosition = newCameraPosition.multiplyScalar(distance).add(center);\n\n // Slightly offset camera to avoid gimbal lock\n cameraPosition.x += size.x / 10;\n cameraPosition.y -= size.y / 10;\n\n return this.lookAt(cameraPosition, center, enableTransition);\n }\n\n public setCamera(pos: CameraPosition): void {\n void this.executeInteraction(async () => {\n this._orbitControls.setOrbitPoint(0, 0, 0);\n void this._orbitControls.setLookAt(\n pos.camera.x,\n pos.camera.y,\n pos.camera.z,\n pos.target.x,\n pos.target.y,\n pos.target.z,\n false,\n );\n void this._orbitControls.setFocalOffset(\n pos.focalOffset.z,\n pos.focalOffset.y,\n pos.focalOffset.z,\n false,\n );\n this._orbitControls.update(0);\n return Promise.resolve();\n });\n }\n\n /**\n * Sets initial position of camera to view an extent.\n *\n * @param extent - Extent to look at\n * @param altitude - Altitude of camera\n */\n public setInitialPosition(extent: Extent, altitude = 4000): void {\n const cameraPosition = new Coordinates(\n extent.crs,\n extent.west,\n extent.south,\n altitude,\n ).toVector3();\n const center = extent.centerAsVector3();\n void this.lookAt(cameraPosition, center, false);\n }\n\n protected getBox(obj: Box3 | Entity3D | Object3D): Box3 {\n // We produce broken CityJSON (bbox.max.z being 10e38), workaround that!\n let bbox = new Box3();\n if ((obj as Box3).isBox3) {\n bbox = (obj as Box3).clone();\n } else if ((obj as Entity3D).isEntity3D) {\n const entity3d = obj as Entity3D;\n const entityBbox = entity3d.getBoundingBox();\n if (entityBbox && !entityBbox.isEmpty()) {\n bbox = entityBbox.clone();\n } else if ('extent' in entity3d) {\n // In case object is hidden\n bbox = (entity3d.extent as Extent).toBox3(0, 200);\n }\n } else if ((obj as Object3D).isObject3D) {\n bbox.setFromObject(obj as Object3D);\n } else {\n throw new Error('obj should be instanceof Box3, Object3D or Entity3D');\n }\n if (bbox.isEmpty()) {\n throw new Error('Could not find bounding box of object');\n }\n\n bbox.min.z = Math.max(bbox.min.z, 0);\n bbox.max.z = Math.min(bbox.max.z, 2000);\n\n return bbox;\n }\n\n private _disablePositionOnMap(): void {\n if (\n this._boundPositionOnMapOnClick ||\n this._boundPositionOnMapOnMouseMove ||\n this._boundPositionOnMapOnContextMenu\n ) {\n if (this._boundPositionOnMapOnClick) {\n this._instance.domElement.removeEventListener(\n 'click',\n this._boundPositionOnMapOnClick,\n );\n }\n this._boundPositionOnMapOnClick = null;\n\n if (this._boundPositionOnMapOnMouseMove) {\n this._instance.domElement.removeEventListener(\n 'mousemove',\n this._boundPositionOnMapOnMouseMove,\n );\n }\n this._boundPositionOnMapOnMouseMove = null;\n\n if (this._boundPositionOnMapOnContextMenu) {\n this._instance.domElement.removeEventListener(\n 'contextmenu',\n this._boundPositionOnMapOnContextMenu,\n );\n }\n this._boundPositionOnMapOnContextMenu = null;\n\n this._positionOnMapHelper.visible = false;\n this._instance.domElement.style.cursor = 'auto';\n this._instance.notifyChange();\n }\n }\n\n private _enablePositionOnMap(): void {\n this._boundPositionOnMapOnClick = this.onPositionOnMapClick.bind(this);\n this._boundPositionOnMapOnMouseMove = this.onPositionOnMapMouseMove.bind(this);\n this._boundPositionOnMapOnContextMenu = this.onPositionOnMapContextMenu.bind(this);\n\n this._instance.domElement.addEventListener(\n 'mousemove',\n this._boundPositionOnMapOnMouseMove,\n );\n this._instance.domElement.addEventListener('click', this._boundPositionOnMapOnClick);\n this._instance.domElement.addEventListener(\n 'contextmenu',\n this._boundPositionOnMapOnContextMenu,\n );\n }\n\n private disposeOrbitControls(): void {\n this._instance.domElement.removeEventListener('keydown', this._boundOrbitControlsOnKey);\n\n this._instance.domElement.removeEventListener('wheel', this._boundOrbitControlsOnWheel);\n\n this._instance.domElement.removeEventListener(\n 'contextmenu',\n this._boundOrbitControlsOnContextMenu,\n );\n this._instance.domElement.removeEventListener('mouseup', this._boundOrbitControlsOnMouseUp);\n\n this._orbitControls.disconnect();\n }\n\n private initializeInspector(inspector: Inspector | null): void {\n if (this._cameraControlsInspector) {\n this._cameraControlsInspector.dispose();\n }\n\n if (inspector) {\n this._cameraControlsInspector = new CameraControlsInspector(\n inspector.gui,\n this,\n this._instance,\n );\n inspector.addPanel(this._cameraControlsInspector);\n }\n }\n\n private initializeOrbitControls(): void {\n this._orbitControls.infinityDolly = true; // Prevents being stuck when hitting the target\n\n this.setNavigationMode(this._store.getNavigationMode());\n\n // Make rotation around where the user clicked when Orbit\n this._boundOrbitControlsOnContextMenu = this.orbitControlsOnContextMenu.bind(this);\n this._boundOrbitControlsOnMouseUp = this.orbitControlsOnMouseUp.bind(this);\n this._instance.domElement.addEventListener(\n 'contextmenu',\n this._boundOrbitControlsOnContextMenu,\n );\n this._instance.domElement.addEventListener('mouseup', this._boundOrbitControlsOnMouseUp);\n\n // \"Patch\" camera-controls for nicer event handlers\n this._boundOrbitControlsOnWheel = this.orbitControlsOnWheel.bind(this);\n this._instance.domElement.addEventListener('wheel', this._boundOrbitControlsOnWheel);\n\n // As Giro3d runs the event loop only when needed, we need to notify Giro3d when\n // the controls update the view.\n // We need both events to make sure the view is updated from user interactions and from\n // animations\n this._orbitControls.addEventListener('update', () =>\n this._instance.notifyChange(this._instance.view.camera),\n );\n this._orbitControls.addEventListener('control', () =>\n this._instance.notifyChange(this._instance.view.camera),\n );\n\n // Dispatch our events\n this._orbitControls.addEventListener('control', () => {\n if (this._orbitControls.active || this._orbitControls.currentAction !== 0) {\n this.dispatchEvent({ type: 'interaction-start' });\n this._store.setIsUserInteracting(true);\n }\n });\n this._orbitControls.addEventListener('controlend', () =>\n setTimeout(() => {\n this._store.setIsUserInteracting(false);\n this.dispatchEvent({ type: 'interaction-end' });\n }),\n );\n\n this._boundOrbitControlsOnKey = this.orbitControlsOnKey.bind(this);\n this._instance.domElement.addEventListener('keydown', this._boundOrbitControlsOnKey);\n }\n\n private onAfterCameraUpdate(): void {\n // this.instance.view.camera.position is *not always* the same as orbitControls.getPosition()\n this._store.setCurrentPosition(\n this.getCameraPosition(),\n this._instance.view.camera.position,\n );\n }\n\n private onBeforeCameraUpdate(): void {\n // Called from giro3d\n const delta = this._clock.getDelta();\n const hasControlsUpdated = this._orbitControls.update(delta);\n if (hasControlsUpdated) {\n this._instance.notifyChange(this._instance.view.camera);\n }\n }\n\n private onPositionOnMapClick(e: MouseEvent): void {\n const picked = this._picker.getMapAt(this._instance, e);\n if (picked) {\n this._disablePositionOnMap();\n\n const direction = new Vector3();\n this._instance.view.camera.getWorldDirection(direction);\n direction.normalize().setLength(3);\n\n const newPosition = picked.point.clone();\n newPosition.z += 1.7;\n\n const newTarget = newPosition.clone();\n newTarget.add(direction);\n newTarget.z = newPosition.z;\n\n void this.lookAt(newPosition, newTarget, true).finally(() =>\n this._store.setNavigationMode('first-person'),\n );\n }\n }\n\n private onPositionOnMapContextMenu(e: MouseEvent): void {\n this._disablePositionOnMap();\n this._store.setNavigationMode('orbit');\n e.preventDefault();\n }\n\n private onPositionOnMapMouseMove(e: MouseEvent): void {\n const picked = this._picker.getMapAt(this._instance, e);\n this._instance.domElement.style.cursor = picked ? 'none' : 'auto';\n this._positionOnMapHelper.visible = picked != null;\n if (picked) {\n this._positionOnMapHelper.position.copy(picked.point);\n this._positionOnMapHelper.updateMatrixWorld();\n }\n this._instance.notifyChange();\n }\n\n private orbitControlsOnContextMenu(e: MouseEvent): void {\n if (this._store.getNavigationMode() !== 'orbit') {\n return;\n }\n\n const picked = this._pickObjectsAt(e);\n if (picked) {\n this._orbitHelper.visible = true;\n this._orbitHelper.position.copy(picked.point);\n this._orbitHelper.updateMatrixWorld();\n this._orbitControls.setOrbitPoint(picked.point.x, picked.point.y, picked.point.z);\n } else {\n // We didn't pick anything, we'll orbit around the target\n this._orbitHelper.visible = true;\n this._orbitControls.getTarget(this._orbitHelper.position);\n this._orbitHelper.updateMatrixWorld();\n }\n }\n\n private orbitControlsOnKey(e: KeyboardEvent): void {\n const navigationMode = this._store.getNavigationMode();\n\n if (navigationMode === 'position-on-map') {\n if (e.code === 'Escape') {\n this._store.setNavigationMode('orbit');\n }\n return;\n }\n\n if (navigationMode !== 'orbit' && navigationMode !== 'first-person') {\n return;\n }\n\n const keys = {\n ARROW_BOTTOM: 'ArrowDown',\n ARROW_LEFT: 'ArrowLeft',\n ARROW_RIGHT: 'ArrowRight',\n ARROW_UP: 'ArrowUp',\n KEY_DOWN: 'KeyS',\n KEY_LEFT: 'KeyA',\n KEY_RIGHT: 'KeyD',\n KEY_UP: 'KeyW',\n };\n\n let forwardDirection = 0;\n let dollyDirection = 0;\n let truckDirectionX = 0;\n let truckDirectionY = 0;\n let factor = e.ctrlKey || e.metaKey || e.shiftKey ? 200 : 20;\n\n // Reduce the factor in FPV as we should be close to our data\n if (navigationMode === 'first-person') {\n factor /= 10;\n }\n\n switch (e.code) {\n case keys.ARROW_BOTTOM:\n if (navigationMode === 'first-person') {\n dollyDirection = -1;\n } else {\n forwardDirection = -1;\n }\n break;\n\n case keys.ARROW_LEFT:\n\n case keys.KEY_LEFT:\n truckDirectionX = -1;\n break;\n\n case keys.ARROW_RIGHT:\n\n case keys.KEY_RIGHT:\n truckDirectionX = 1;\n break;\n case keys.ARROW_UP:\n if (navigationMode === 'first-person') {\n dollyDirection = 1;\n } else {\n forwardDirection = 1;\n }\n break;\n\n case keys.KEY_DOWN:\n truckDirectionY = 1;\n break;\n case keys.KEY_UP:\n truckDirectionY = -1;\n break;\n\n default:\n // do nothing\n }\n if (forwardDirection) {\n void this.executeInteraction(() =>\n this._orbitControls.forward(\n forwardDirection * this._orbitControls.truckSpeed * factor,\n true,\n ),\n );\n }\n if (dollyDirection) {\n void this.executeInteraction(() =>\n this._orbitControls.dollyInFixed(\n dollyDirection * this._orbitControls.truckSpeed * factor,\n true,\n ),\n );\n }\n if (truckDirectionX) {\n void this.executeInteraction(() =>\n this._orbitControls.truck(\n truckDirectionX * this._orbitControls.truckSpeed * factor,\n 0,\n true,\n ),\n );\n }\n if (truckDirectionY) {\n void this.executeInteraction(() =>\n this._orbitControls.truck(\n 0,\n truckDirectionY * this._orbitControls.truckSpeed * factor,\n true,\n ),\n );\n }\n }\n\n private orbitControlsOnMouseUp(): void {\n if (this._store.getNavigationMode() !== 'orbit') {\n return;\n }\n\n this._orbitHelper.visible = false;\n this._instance.notifyChange();\n }\n\n private orbitControlsOnWheel(): void {\n // As camera-controls doesn't dispatch controlstart/controlend events, we need\n // to take care of them for proper events\n this._orbitControls.dispatchEvent({ type: 'controlstart' });\n setTimeout(() => this._orbitControls.dispatchEvent({ type: 'controlend' }), 0);\n }\n\n private setNavigationMode(mode: NavigationMode): void {\n this._disablePositionOnMap();\n\n switch (mode) {\n case 'disabled':\n this._orbitControls.enabled = false;\n break;\n case 'first-person':\n {\n this._orbitControls.dollyToCursor = false;\n // Set small min/max distance so rotating is always close to the camera position\n this._orbitControls.minDistance = 2;\n this._orbitControls.maxDistance = 2;\n // That requires a large dolly speed for scrolling not to be \"stuck\"\n this._orbitControls.dollySpeed = 20;\n\n this._orbitControls.azimuthRotateSpeed = 0.3;\n this._orbitControls.polarRotateSpeed = 0.3;\n\n this._orbitControls.mouseButtons.left = CameraControls.ACTION.ROTATE;\n this._orbitControls.mouseButtons.right = CameraControls.ACTION.TRUCK;\n this._orbitControls.mouseButtons.wheel = CameraControls.ACTION.DOLLY;\n this._orbitControls.mouseButtons.middle = CameraControls.ACTION.DOLLY;\n\n this._orbitControls.enabled = true;\n\n // Set new target close to the camera position so it feels like we're rotating around the camera position\n const direction = new Vector3();\n const position = this._instance.view.camera.position.clone();\n const newTarget = new Vector3();\n this._instance.view.camera.getWorldDirection(direction);\n\n direction.normalize().setLength(3);\n newTarget.copy(position).add(direction);\n void this.lookAt(position, newTarget, false);\n }\n break;\n case 'orbit':\n {\n this._orbitControls.dollyToCursor = true;\n this._orbitControls.minDistance = 2;\n this._orbitControls.maxDistance = Infinity;\n this._orbitControls.dollySpeed = 1;\n\n this._orbitControls.azimuthRotateSpeed = 1.0;\n this._orbitControls.polarRotateSpeed = 1.0;\n\n this._orbitControls.mouseButtons.left = CameraControls.ACTION.TRUCK;\n this._orbitControls.mouseButtons.right = CameraControls.ACTION.ROTATE;\n this._orbitControls.mouseButtons.wheel = CameraControls.ACTION.DOLLY;\n this._orbitControls.mouseButtons.middle = CameraControls.ACTION.DOLLY;\n\n this._orbitControls.enabled = true;\n\n // Try to restore a proper target so it doesn't require a right-click to properly truck/dolly\n const direction = new Vector3();\n const position = this._instance.view.camera.position.clone();\n this._instance.view.camera.getWorldDirection(direction);\n\n const raycaster = new Raycaster();\n raycaster.camera = this._instance.view.camera;\n raycaster.set(position, direction);\n const intersects = raycaster.intersectObject(this._instance.scene).at(0);\n\n if (intersects) {\n void this.lookAt(position, intersects.point, false);\n }\n }\n break;\n case 'position-on-map':\n this._orbitControls.enabled = false;\n this._enablePositionOnMap();\n break;\n default: {\n // Exhaustiveness checking\n const _exhaustiveCheck: never = mode;\n return _exhaustiveCheck;\n }\n }\n this._instance.domElement.focus();\n }\n}\n\nexport default CameraController;\n","import { EventDispatcher } from 'three';\n\nimport type Bookmark from './types/Bookmark';\nimport type { DatasetOrGroup } from './types/Dataset';\n\nexport interface BookmarkEvents {\n 'bookmark-added': PayloadEvent<Bookmark>;\n 'bookmark-removed': PayloadEvent<Bookmark>;\n}\n\nexport interface DatasetEvents {\n 'dataset-added': PayloadEvent<DatasetOrGroup>;\n 'dataset-removed': PayloadEvent<DatasetOrGroup>;\n 'dataset-visibility-changed': PayloadEvent<DatasetOrGroup>;\n}\n\n/**\n * An event with a payload.\n */\nexport type PayloadEvent<T> = { value: T };\n\n/**\n * An event with no argument.\n */\nexport type PieroEmptyEvent = unknown;\n\nexport type PieroEvents = BookmarkEvents & DatasetEvents & PieroGlobalEvents;\n\nexport interface PieroGlobalEvents {\n /**\n * Raised when the application has finished loading.\n */\n ready: PieroEmptyEvent;\n}\n\nexport const GLOBAL_EVENT_DISPATCHER = new EventDispatcher<PieroEvents>();\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type Entity3D from '@giro3d/giro3d/entities/Entity3D';\nimport type Giro3DMap from '@giro3d/giro3d/entities/Map';\n\nimport Extent from '@giro3d/giro3d/core/geographic/Extent';\nimport MaskLayer, { MaskMode } from '@giro3d/giro3d/core/layer/MaskLayer';\nimport AxisGrid from '@giro3d/giro3d/entities/AxisGrid';\nimport { isMap } from '@giro3d/giro3d/entities/Map';\nimport Giro3dVectorSource from '@giro3d/giro3d/sources/VectorSource';\nimport Feature from 'ol/Feature';\nimport Polygon from 'ol/geom/Polygon';\nimport { Fill, Style } from 'ol/style';\nimport { Color, Vector3 } from 'three';\n\nimport type { DatasetAsLayerConfig, DatasetAsMeshConfig } from '@/types/configuration/datasets';\nimport type { Dataset, DatasetBase } from '@/types/Dataset';\n\nimport { getConfig } from '@/config-loader';\nimport { GLOBAL_EVENT_DISPATCHER } from '@/events';\nimport EntityBuilder from '@/giro3d/EntityBuilder';\nimport LayerBuilder from '@/giro3d/LayerBuilder';\nimport loader from '@/loaders/loader';\nimport { useDatasetStore } from '@/stores/datasets';\nimport { useNotificationStore } from '@/stores/notifications';\nimport { Datagroup, type DatasetLayer, type DatasetOrGroup } from '@/types/Dataset';\nimport Notification from '@/types/Notification';\nimport { isObject } from '@/utils/Types';\n\nimport type LayerManager from './LayerManager';\n\nconst datasetSupportsOverlay = (obj: Dataset): obj is Dataset & DatasetBase<DatasetAsLayerConfig> =>\n isObject(obj) &&\n (obj.type === 'colorLayer' || obj.type === 'maskLayer' || obj.type === 'elevationLayer');\n\nconst datasetSupportsMeshes = (obj: Dataset): obj is Dataset & DatasetBase<DatasetAsMeshConfig> =>\n isObject(obj) && !datasetSupportsOverlay(obj);\n\nexport default class DatasetManager {\n private readonly _axisGrids: Map<string, AxisGrid> = new Map();\n private readonly _entities: Map<string, Entity3D> = new Map();\n private readonly _instance: Instance;\n private readonly _layerManager: LayerManager;\n private readonly _masks: Map<string, MaskLayer> = new Map();\n private readonly _notifications = useNotificationStore();\n private readonly _overlays: Map<string, DatasetLayer> = new Map();\n private readonly _store = useDatasetStore();\n\n public constructor(instance: Instance, layerManager: LayerManager) {\n this._instance = instance;\n this._layerManager = layerManager;\n\n this._store.$onAction(({ after, args, name }) => {\n after(() => {\n switch (name) {\n case 'importFromFile':\n void this.importFromFile(args[0]);\n break;\n case 'remove':\n this.deleteDataset(args[0]);\n break;\n case 'setVisible':\n void this.onVisibilityChanged(args[0], args[1]);\n break;\n case 'toggleGrid':\n void this.onToggleGrid(args[0]);\n break;\n case 'toggleMask':\n void this.onToggleMask(args[0]);\n break;\n }\n });\n });\n\n for (const dataset of this._store.getDatasets()) {\n if (dataset.visible) {\n void this.preloadDataset(dataset);\n }\n }\n }\n\n public dispose(): void {\n // Nothing to do (?)\n }\n\n private async createGrid(dataset: DatasetOrGroup): Promise<void> {\n const box = this._store.getBoundingBox(dataset);\n if (box == null || box.isEmpty()) {\n return;\n }\n\n const grid = new AxisGrid({\n style: {\n color: new Color('orange'),\n fontSize: 12,\n numberFormat: Intl.NumberFormat('fr'),\n },\n ticks: {\n x: 50,\n y: 50,\n z: 50,\n },\n volume: {\n ceiling: box.max.z + 10,\n extent: Extent.fromBox3(this._instance.referenceCrs, box).withMargin(20, 20),\n floor: box.min.z - 10,\n },\n });\n grid.name = `AxisGrid-${dataset.uuid}`;\n await this._instance.add(grid);\n this._axisGrids.set(dataset.uuid, grid);\n }\n\n private async createMask(dataset: DatasetOrGroup): Promise<void> {\n // TODO: this assumes the dataset covers the whole bounding box\n // (in particular, that it is oriented the same way)\n // which will most likely not be the case...\n const box = this._store.getBoundingBox(dataset);\n if (box == null || box.isEmpty()) {\n return;\n }\n\n // Contract bounding box so it makes stitching a bit nicer\n box.expandByVector(new Vector3(-5, -5, 0));\n\n const feature = new Feature({\n geometry: new Polygon([\n [\n [box.min.x, box.min.y],\n [box.min.x, box.max.y],\n [box.max.x, box.max.y],\n [box.max.x, box.min.y],\n [box.min.x, box.min.y],\n ],\n ]),\n name: 'Mask polygon',\n });\n\n const mask = new MaskLayer({\n name: `mask-${dataset.uuid}`,\n source: new Giro3dVectorSource({\n data: [feature],\n style: new Style({\n fill: new Fill({ color: 'white' }),\n }),\n }),\n });\n mask.maskMode = MaskMode.Inverted;\n\n // Apply the mask to the map\n const maps = this._instance.getObjects(obj => isMap(obj)) as Giro3DMap[];\n for (const map of maps) {\n await map.addLayer(mask);\n this._instance.notifyChange(map);\n }\n this._masks.set(dataset.uuid, mask);\n }\n\n private deleteDataset(dataset: DatasetOrGroup): void {\n this.deleteGrid(dataset);\n this.deleteMask(dataset);\n\n const entity = this._entities.get(dataset.uuid);\n if (entity) {\n this._instance.remove(entity);\n this._instance.notifyChange();\n }\n\n const layer = this._overlays.get(dataset.uuid);\n if (layer) {\n this._layerManager.removeBasemapLayer(layer);\n }\n\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({ type: 'dataset-removed', value: dataset });\n }\n\n private deleteGrid(dataset: DatasetOrGroup): void {\n const grid = this._axisGrids.get(dataset.uuid);\n if (grid) {\n this._instance.remove(grid);\n }\n this._axisGrids.delete(dataset.uuid);\n }\n\n private deleteMask(dataset: DatasetOrGroup): void {\n const mask = this._masks.get(dataset.uuid);\n if (mask) {\n const maps = this._instance.getObjects(obj => isMap(obj)) as Giro3DMap[];\n maps.forEach(map => {\n map.removeLayer(mask);\n this._instance.notifyChange(map);\n });\n }\n this._masks.delete(dataset.uuid);\n }\n\n private async importFromFile(file: File | string): Promise<void> {\n let dataset: DatasetOrGroup;\n const name = file instanceof File ? file.name : file;\n try {\n this._notifications.push(new Notification(name, 'Importing file...'));\n const _dataset = await loader.importFile(file, getConfig());\n dataset = this._store.add(_dataset); // We need to keep track of the reactive dataset!\n this._notifications.push(\n new Notification(dataset.name, 'Import done, parsing data...', 'success'),\n );\n } catch (e) {\n console.error(e);\n this._notifications.push(new Notification(name, (e as Error).message, 'error'));\n return;\n }\n\n try {\n dataset.isPreloading = true;\n await this.preloadDataset(dataset);\n this._notifications.push(\n new Notification(dataset.name, 'Import successful.', 'success'),\n );\n } catch (_e) {\n // Already logged, ignore\n }\n\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({ type: 'dataset-added', value: dataset });\n }\n\n private onDatasetPreloaded(dataset: DatasetOrGroup, entity: Entity3D): void {\n dataset.isPreloaded = true;\n dataset.isPreloading = false;\n\n if (dataset.onObjectPreloaded) {\n dataset.onObjectPreloaded(dataset, entity);\n }\n\n this._store.attachEntity(dataset, entity);\n }\n\n private onDatasetPreloadedAsLayer(dataset: DatasetOrGroup, layer: DatasetLayer): void {\n dataset.isPreloaded = true;\n dataset.isPreloading = false;\n\n this._store.attachLayer(dataset, layer);\n }\n\n private async onToggleGrid(dataset: DatasetOrGroup): Promise<void> {\n if (this._axisGrids.has(dataset.uuid)) {\n this.deleteGrid(dataset);\n } else {\n await this.createGrid(dataset);\n }\n }\n\n private async onToggleMask(dataset: DatasetOrGroup): Promise<void> {\n if (this._masks.has(dataset.uuid)) {\n this.deleteMask(dataset);\n } else {\n await this.createMask(dataset);\n }\n }\n\n private async onVisibilityChanged(\n dataset: DatasetOrGroup,\n newVisibility: boolean,\n ): Promise<void> {\n try {\n dataset.visible = newVisibility;\n if (!dataset.isPreloaded && newVisibility) {\n await this.preloadDataset(dataset);\n }\n await this.updateDataset(dataset);\n if (Datagroup.isGroup(dataset)) {\n dataset.children.forEach(ds => void this.onVisibilityChanged(ds, newVisibility));\n }\n } catch (_e) {\n dataset.visible = false;\n }\n\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({\n type: 'dataset-visibility-changed',\n value: dataset,\n });\n }\n\n private async preloadDataset(dataset: DatasetOrGroup): Promise<DatasetOrGroup> {\n if (dataset.isPreloaded) {\n return Promise.resolve(dataset);\n }\n\n if (Datagroup.isGroup(dataset)) {\n dataset.isPreloaded = true;\n return Promise.resolve(dataset);\n }\n\n dataset.isPreloading = true;\n\n try {\n if (datasetSupportsOverlay(dataset)) {\n const layer = await LayerBuilder.getDatasetLayer(this._instance, dataset);\n\n layer.visible = dataset.visible;\n this._overlays.set(dataset.uuid, layer);\n\n await this._layerManager.addDatasetLayer(layer);\n this.onDatasetPreloadedAsLayer(dataset, layer);\n } else if (datasetSupportsMeshes(dataset)) {\n const entity = await EntityBuilder.getEntity(this._instance, dataset);\n\n entity.visible = dataset.visible;\n this._entities.set(dataset.uuid, entity);\n\n await this._instance.add(entity);\n this.onDatasetPreloaded(dataset, entity);\n } else {\n throw new Error('Dataset is neither an overlay or 3d mesh');\n }\n } catch (e) {\n console.error('Could not load dataset', dataset, e);\n dataset.isPreloading = false;\n this._notifications.push(\n new Notification(\n dataset.name,\n `Could not load dataset : ${(e as Error).message}`,\n 'error',\n ),\n );\n throw e;\n }\n\n return dataset;\n }\n\n private async updateDataset(dataset: DatasetOrGroup): Promise<void> {\n const entity = this._entities.get(dataset.uuid);\n if (entity) {\n entity.visible = dataset.visible;\n if (\n dataset.visible &&\n 'isMaskingBasemap' in dataset.config &&\n dataset.config.isMaskingBasemap === true\n ) {\n await this.createMask(dataset);\n } else if (!dataset.visible && this._masks.has(dataset.uuid)) {\n this.deleteMask(dataset);\n }\n this._instance.notifyChange(entity);\n }\n\n const layer = this._overlays.get(dataset.uuid);\n if (layer) {\n layer.visible = dataset.visible;\n this._layerManager.notify(layer);\n }\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\n\nimport { isShape } from '@giro3d/giro3d/entities/Shape';\nimport { Raycaster } from 'three';\n\nimport type Picker from '@/services/Picker';\n\nimport Measure3D from '@/giro3d/Measure3D';\n\nexport default class MeasureTool {\n private _hoverMeasurement: Measure3D | null;\n private readonly _picker: Picker;\n private readonly _raycaster: Raycaster;\n\n public constructor(picker: Picker) {\n this._picker = picker;\n\n this._raycaster = new Raycaster();\n this._hoverMeasurement = null;\n }\n\n public clean(): void {\n if (this._hoverMeasurement) {\n this._hoverMeasurement.instance.remove(this._hoverMeasurement);\n this._hoverMeasurement = null;\n }\n }\n\n public dispose(): void {\n this.clean();\n }\n\n public getLastMeasurement(): Measure3D | undefined {\n return this._hoverMeasurement?.clone();\n }\n\n public measure(instance: Instance, event: MouseEvent): void {\n const picked = this._picker.getFirstFeatureAt(instance, event, 0, o => !isShape(o))?.at(0);\n\n if (picked && picked.normal) {\n const n = picked.normal.clone();\n n.transformDirection(picked.object.matrixWorld);\n n.normalize();\n\n this._raycaster.camera = instance.view.camera;\n this._raycaster.set(picked.point, n);\n\n const intersects = this._raycaster\n .intersectObject(instance.scene, true)\n .filter(\n i =>\n i.distance > 1e-5 &&\n i.object.userData.parentEntity !== this._hoverMeasurement,\n )\n .at(0);\n\n if (intersects) {\n if (!this._hoverMeasurement) {\n this._hoverMeasurement = new Measure3D();\n void instance.add(this._hoverMeasurement);\n }\n this._hoverMeasurement.visible = true;\n this._hoverMeasurement.setPoints([picked.point, intersects.point]);\n instance.notifyChange(this._hoverMeasurement);\n }\n }\n }\n}\n","import { defineStore } from 'pinia';\nimport { computed, reactive, ref } from 'vue';\n\nimport type Measure from '@/types/Measure';\nimport type MeasurementMode from '@/types/MeasurementMode';\n\nexport const useMeasurementStore = defineStore('measurement', () => {\n const measurements = reactive<Measure[]>([]) as Measure[];\n const measurementMode = ref<MeasurementMode>('laser');\n const count = computed(() => measurements.length);\n const _isUserMeasuring = ref<boolean>(false);\n\n function isUserMeasuring(): boolean {\n return _isUserMeasuring.value;\n }\n\n function setIsUserMeasuring(value: boolean): void {\n _isUserMeasuring.value = value;\n }\n\n function getMeasurementMode(): MeasurementMode {\n return measurementMode.value;\n }\n\n function setMeasurementMode(mode: MeasurementMode): void {\n measurementMode.value = mode;\n }\n\n function getMeasures(): Measure[] {\n return measurements;\n }\n\n function remove(measure: Measure): void {\n measurements.splice(measurements.indexOf(measure), 1);\n }\n\n function add(measure: Measure): void {\n measurements.push(measure);\n }\n\n function hasMeasure(name: string): boolean {\n return measurements.some(m => m.title === name);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function importMeasureFile(file: Blob): void {\n // Nothing to do\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n function importMeasureFiles(files: File[]): void {\n // Nothing to do\n }\n\n function start(): void {}\n\n function end(): void {}\n\n return {\n add,\n count,\n end,\n getMeasurementMode,\n getMeasures,\n hasMeasure,\n importMeasureFile,\n importMeasureFiles,\n isUserMeasuring,\n remove,\n setIsUserMeasuring,\n setMeasurementMode,\n start,\n };\n});\n","import { EventDispatcher, MathUtils } from 'three';\n\nimport type Measure3D from '@/giro3d/Measure3D';\n\nimport Download from '@/utils/Download';\n\ntype MeasureEventMap = {\n visible: {\n /** empty */\n };\n};\n\nexport default class Measure extends EventDispatcher<MeasureEventMap> {\n public properties: object;\n public readonly title: string;\n public readonly uuid: string;\n public get object(): Measure3D {\n return this._object;\n }\n public set object(obj: Measure3D) {\n this._object = obj;\n }\n\n public get visible(): boolean {\n return this._visible;\n }\n\n public set visible(v: boolean) {\n this._visible = v;\n this.dispatchEvent({ type: 'visible' });\n }\n\n private _object: Measure3D;\n\n private _visible: boolean;\n\n public constructor(title: string, object: Measure3D, properties: object = {}) {\n super();\n\n this.title = title;\n this._visible = true;\n this._object = object;\n this.properties = properties;\n this.uuid = MathUtils.generateUUID();\n }\n\n public static toCollection(measures: Measure[]): GeoJSON.FeatureCollection {\n const features = measures.map(measure => measure.toGeoJSON());\n\n return {\n features,\n type: 'FeatureCollection',\n // @ts-expect-error GeoJSON spec does not allow properties on FeatureCollection\n // But OWC requires it Oo\n id: `${Download.getBaseUrl()}#${MathUtils.generateUUID()}`,\n properties: {\n creator: 'Giro3D',\n generator: {\n title: 'Giro3D',\n uri: Download.getBaseUrl(),\n },\n lang: 'en',\n links: [\n {\n href: 'http://www.opengis.net/spec/owc-atom/1.0/req/core',\n rel: 'profile',\n title: 'This file is compliant with version 1.0 of OGC Context',\n },\n ],\n title: 'Giro3D measures',\n updated: new Date().toISOString(),\n },\n };\n }\n\n public toGeoJSON(): GeoJSON.Feature {\n const geojson = {\n geometry: {\n coordinates: [this.object.from.toArray(), this.object.to.toArray()],\n type: 'LineString',\n },\n id: `${Download.getBaseUrl()}#${this.uuid}`,\n properties: {\n ...this.properties,\n title: this.title,\n updated: new Date().toISOString(),\n },\n type: 'Feature',\n } as GeoJSON.Feature;\n\n return geojson;\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\n\nimport { MathUtils, Vector3 } from 'three';\n\nimport type CameraController from '@/services/CameraController';\nimport type Picker from '@/services/Picker';\n\nimport Measure3D from '@/giro3d/Measure3D';\nimport MeasureTool from '@/services/MeasureTool';\nimport { useMeasurementStore } from '@/stores/measurement';\nimport { useNotificationStore } from '@/stores/notifications';\nimport Measure from '@/types/Measure';\nimport Notification from '@/types/Notification';\n\nfunction promptTitle(defaultValue: string): string | null {\n return window.prompt('Measure name', defaultValue);\n}\n\nexport default class MeasurementManager {\n private readonly _boundMeasure: (e: MouseEvent) => void;\n private readonly _boundOnEscape: (e: KeyboardEvent) => void;\n private readonly _boundPause: () => void;\n private readonly _boundRestart: () => void;\n private readonly _boundSaveMeasure: (e: MouseEvent) => void;\n private readonly _camera: CameraController;\n private readonly _instance: Instance;\n private readonly _measureTool: MeasureTool;\n private readonly _notificationStore = useNotificationStore();\n private _paused = false;\n private readonly _store = useMeasurementStore();\n\n public constructor(instance: Instance, camera: CameraController, picker: Picker) {\n this._instance = instance;\n this._measureTool = new MeasureTool(picker);\n this._camera = camera;\n\n this._boundPause = (): void => {\n this._paused = true;\n };\n this._boundRestart = (): void => {\n this._paused = false;\n };\n this._camera.addEventListener('interaction-start', this._boundPause);\n this._camera.addEventListener('interaction-end', this._boundRestart);\n\n this._boundOnEscape = this.onEscape.bind(this);\n document.addEventListener('keydown', this._boundOnEscape);\n\n this._store.$onAction(({ after, args, name }) => {\n after(() => {\n switch (name) {\n case 'end':\n this.stopMeasuring();\n break;\n case 'importMeasureFile':\n void this.importMeasureFile(args[0]);\n break;\n case 'importMeasureFiles':\n void this.importMeasureFiles(args[0]);\n break;\n case 'remove':\n this.deleteMeasure(args[0]);\n break;\n case 'start':\n this.startMeasuring();\n break;\n }\n });\n });\n\n this._boundMeasure = this.measure.bind(this);\n this._boundSaveMeasure = this.saveMeasure.bind(this);\n this._instance.domElement.addEventListener('mousemove', this._boundMeasure);\n this._instance.domElement.addEventListener('click', this._boundSaveMeasure);\n }\n\n public dispose(): void {\n this._instance.domElement.removeEventListener('mousemove', this._boundMeasure);\n this._instance.domElement.removeEventListener('click', this._boundSaveMeasure);\n\n this._camera.removeEventListener('interaction-start', this._boundPause);\n this._camera.removeEventListener('interaction-end', this._boundRestart);\n\n document.removeEventListener('keydown', this._boundOnEscape);\n\n this._measureTool.dispose();\n }\n\n public startMeasuring(): void {\n this._store.setIsUserMeasuring(true);\n }\n\n public stopMeasuring(): void {\n this._store.setIsUserMeasuring(false);\n this._measureTool.clean();\n this._instance.notifyChange();\n }\n\n public updateMeasure(measure: Measure): void {\n measure.object.visible = measure.visible;\n measure.object.traverse(o => (o.visible = measure.visible));\n this._instance.notifyChange();\n }\n\n private deleteMeasure(measure: Measure): void {\n this._instance.remove(measure.object);\n this._instance.notifyChange();\n }\n\n private async importBlob(\n file: Blob,\n skipNames: Set<string>,\n ): Promise<{ nbImported: number; nbSkipped: number }> {\n const str = await file.text();\n const geojson = JSON.parse(str) as GeoJSON.Feature | GeoJSON.FeatureCollection;\n\n const features = geojson.type === 'FeatureCollection' ? geojson.features : [geojson];\n\n let nbImported = 0;\n let nbSkipped = 0;\n\n for (const feature of features) {\n const imported = await this.importMeasure(feature, skipNames);\n if (imported) {\n nbImported++;\n } else {\n nbSkipped++;\n }\n }\n return { nbImported, nbSkipped };\n }\n\n private async importMeasure(\n feature: GeoJSON.Feature,\n skipNames: Set<string>,\n ): Promise<boolean> {\n if (feature.geometry.type !== 'LineString') {\n throw new Error(`Cannot import geometry type ${feature.geometry.type}`);\n }\n\n if (feature.properties == null || typeof feature.properties !== 'object') {\n feature.properties = {};\n }\n if (feature.properties.title == null) {\n feature.properties.title = MathUtils.generateUUID();\n }\n\n if (skipNames.has(feature.properties.title)) {\n return false;\n }\n\n const from = new Vector3(...feature.geometry.coordinates[0]);\n const to = new Vector3(...feature.geometry.coordinates[1]);\n\n const o = new Measure3D();\n o.setPoints([from, to]);\n await this.pushNewMeasure(feature.properties?.title, o, feature.properties);\n\n return true;\n }\n\n private async importMeasureFile(file: Blob): Promise<void> {\n const existingMeasures = new Set(this._store.getMeasures().map(m => m.title));\n try {\n const { nbImported, nbSkipped } = await this.importBlob(file, existingMeasures);\n this._notificationStore.push(\n new Notification(\n 'Measures',\n `${nbImported} measures imported (${nbSkipped} skipped)`,\n 'success',\n ),\n );\n } catch (e: unknown) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n new Notification('Measures', `Could not import file: ${e}`, 'warning');\n }\n }\n\n private async importMeasureFiles(files: File[]): Promise<void> {\n const promises = [];\n let nbTotalImported = 0;\n let nbTotalSkipped = 0;\n const errors: string[] = [];\n\n const existingMeasures = new Set(this._store.getMeasures().map(m => m.title));\n\n for (const file of files) {\n promises.push(\n this.importBlob(file, existingMeasures)\n .then(({ nbImported, nbSkipped }) => {\n nbTotalImported += nbImported;\n nbTotalSkipped += nbSkipped;\n })\n .catch(reason => {\n errors.push((reason as Error).message);\n }),\n );\n }\n await Promise.allSettled(promises);\n\n if (errors.length > 0) {\n this._notificationStore.push(\n new Notification(\n 'Measures',\n `${nbTotalImported} measures imported (${nbTotalSkipped} skipped); ${errors.length} errors: ${errors}`,\n 'warning',\n ),\n );\n } else {\n this._notificationStore.push(\n new Notification(\n 'Measures',\n `${nbTotalImported} measures imported (${nbTotalSkipped} skipped)`,\n 'success',\n ),\n );\n }\n }\n\n private measure(event: MouseEvent): void {\n if (!this._paused && this._store.isUserMeasuring()) {\n void this._measureTool.measure(this._instance, event);\n }\n }\n\n private onEscape(e: KeyboardEvent): void {\n if (e.code === 'Escape' && this._store.isUserMeasuring()) {\n this.stopMeasuring();\n }\n }\n\n private async pushNewMeasure(\n title: string,\n measurement: Measure3D,\n properties: object = {},\n ): Promise<void> {\n await this._instance.add(measurement);\n const measure = new Measure(title, measurement, properties);\n measurement.userData.measure = measure;\n measure.addEventListener('visible', () => this.updateMeasure(measure));\n this._store.add(measure);\n this._instance.notifyChange(measurement);\n }\n\n private saveMeasure(): void {\n if (!this._paused && this._store.isUserMeasuring()) {\n const measurement = this._measureTool.getLastMeasurement();\n if (measurement && !Number.isNaN(measurement.length)) {\n let title = 'New measurement';\n if (this._store.hasMeasure(title)) {\n for (let i = 1; i < 1000; i += 1) {\n title = `New measurement (${i})`;\n if (!this._store.hasMeasure(title)) {\n break;\n }\n }\n if (this._store.hasMeasure(title)) {\n title = 'Achieved unlocked: 1000 measurements with default name';\n }\n }\n const name = promptTitle(title);\n if (name != null) {\n void this.pushNewMeasure(name, measurement);\n }\n }\n }\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type { Object3D } from 'three';\n\nimport HttpConfiguration from '@giro3d/giro3d/utils/HttpConfiguration';\nimport { AmbientLight, Box3, DirectionalLight, EventDispatcher } from 'three';\n\nimport AnalysisManager from '@/services/AnalysisManager';\nimport AnnotationManager from '@/services/AnnotationManager';\nimport CameraController from '@/services/CameraController';\nimport DatasetManager from '@/services/DatasetManager';\nimport Highlighter from '@/services/Highlighter';\nimport LayerManager from '@/services/LayerManager';\nimport MeasurementManager from '@/services/MeasurementManager';\nimport Picker from '@/services/Picker';\nimport { useGiro3dStore } from '@/stores/giro3d';\nimport Fetcher from '@/utils/Fetcher';\n\nif (import.meta.env.VITE_HEADERS) {\n for (const [host, header] of Object.entries(import.meta.env.VITE_HEADERS)) {\n if (!Fetcher.checkAbsoluteHost(host)) {\n console.warn(`Invalid host in VITE_HEADERS: ${host}`);\n continue;\n }\n\n for (const [name, value] of Object.entries(header)) {\n HttpConfiguration.setHeader(host, name, value);\n }\n }\n}\n\nif (\n import.meta.env.VITE_AUTHORIZATION_DOMAIN != null &&\n import.meta.env.VITE_AUTHORIZATION_VALUE != null\n) {\n if (!Fetcher.checkAbsoluteHost(import.meta.env.VITE_AUTHORIZATION_DOMAIN)) {\n console.warn(\n `Invalid host in VITE_AUTHORIZATION_DOMAIN: ${import.meta.env.VITE_AUTHORIZATION_DOMAIN}`,\n );\n } else {\n HttpConfiguration.setAuth(\n import.meta.env.VITE_AUTHORIZATION_DOMAIN,\n import.meta.env.VITE_AUTHORIZATION_VALUE,\n );\n }\n}\n\nif (import.meta.env.VITE_AUTHORIZATIONS) {\n for (const [host, value] of Object.entries(import.meta.env.VITE_AUTHORIZATIONS)) {\n if (!Fetcher.checkAbsoluteHost(host)) {\n console.warn(`Invalid host in VITE_AUTHORIZATIONS: ${host}`);\n continue;\n }\n HttpConfiguration.setAuth(host, value);\n }\n}\n\ntype Giro3DManagerEventMap = {\n update: {\n /** empty */\n };\n};\n\nexport default class Giro3DManager extends EventDispatcher<Giro3DManagerEventMap> {\n public readonly ambientLight: AmbientLight;\n\n public readonly analysisManager: AnalysisManager;\n public readonly annotationManager: AnnotationManager;\n public readonly camera: CameraController;\n public readonly datasetManager: DatasetManager;\n public readonly dirLight: DirectionalLight;\n public readonly highlighter: Highlighter;\n public readonly layerManager: LayerManager;\n public readonly mainInstance: Instance;\n public readonly measurementManager: MeasurementManager;\n public readonly picker: Picker;\n private readonly _boundOnFrameEnd: () => void;\n\n private readonly _store = useGiro3dStore();\n\n public constructor(instance: Instance) {\n super();\n\n this.mainInstance = instance;\n\n this.picker = new Picker();\n this.camera = new CameraController(this.mainInstance, this.picker);\n\n const position = this._store.getDefaultCameraPosition();\n const lookAt = this._store.getDefaultCameraLookAt();\n void this.camera.lookAt(position.toVector3(), lookAt.toVector3());\n\n this.layerManager = new LayerManager(this.mainInstance);\n this.datasetManager = new DatasetManager(this.mainInstance, this.layerManager);\n this.annotationManager = new AnnotationManager(this.mainInstance, this.camera, this.picker);\n this.analysisManager = new AnalysisManager(this.mainInstance, this.layerManager);\n this.highlighter = new Highlighter();\n this.picker = new Picker();\n this.measurementManager = new MeasurementManager(\n this.mainInstance,\n this.camera,\n this.picker,\n );\n\n this._boundOnFrameEnd = this.onFrameEnd.bind(this);\n this.mainInstance.addEventListener('update-end', this._boundOnFrameEnd);\n\n this.mainInstance.renderingOptions.enableEDL = true;\n this.mainInstance.renderingOptions.enableInpainting = false;\n this.mainInstance.renderingOptions.enablePointCloudOcclusion = false;\n\n const lightColor = 0xffffff;\n\n this.ambientLight = new AmbientLight(lightColor, 0.6);\n this.mainInstance.scene.add(this.ambientLight);\n\n this.dirLight = new DirectionalLight(lightColor, 2);\n this.dirLight.position.set(lookAt.x - 10000, lookAt.y - 10000, 10000);\n this.dirLight.target.position.set(lookAt.x, lookAt.y, 0);\n this.mainInstance.scene.add(this.dirLight);\n this.mainInstance.scene.add(this.dirLight.target);\n this.dirLight.updateMatrixWorld();\n this.mainInstance.scene.updateMatrixWorld();\n\n // We disable the skybox for now as it breaks the rendering of point cloud with effects.\n // Skybox.addSkybox(this.mainInstance);\n\n this.mainInstance.notifyChange();\n }\n\n public dispose(): void {\n this.mainInstance.removeEventListener('update-end', this._boundOnFrameEnd);\n this.mainInstance.scene.remove(this.dirLight.target);\n this.mainInstance.scene.remove(this.dirLight);\n this.mainInstance.scene.remove(this.ambientLight);\n this.measurementManager.dispose();\n this.highlighter.dispose();\n this.analysisManager.dispose();\n this.annotationManager.dispose();\n this.layerManager.dispose();\n this.camera.dispose();\n }\n\n /**\n * Gets bounding box of all datasets & annotations.\n *\n * @returns Bounding box of all datasets.\n */\n public getBoundingBox(): Box3 {\n const bbox = new Box3();\n const bbox2 = new Box3();\n this.mainInstance.scene.traverse(obj => {\n bbox2.setFromObject(obj);\n bbox.union(bbox2);\n });\n return bbox;\n }\n\n /**\n * Gets the datasets & annotations as Object3D.\n */\n public getObjects3d(): Object3D[] {\n const result: Object3D[] = [];\n this.mainInstance.scene.traverse(o => {\n result.push(o);\n });\n return result;\n }\n\n private onFrameEnd(): void {\n // Temporary solution to avoid annoying horizontal line artifacts\n // on point cloud due to constantly shifting near clipping plane.\n const camera = this.mainInstance.view.camera;\n camera.near = 2;\n\n this.dispatchEvent({ type: 'update' });\n }\n}\n","import type { Vector3 } from 'three';\n\nimport { BufferGeometry, LineBasicMaterial, LineSegments } from 'three';\n\nexport default class Viewbox {\n public geometry: BufferGeometry;\n public object3D: LineSegments<BufferGeometry, LineBasicMaterial>;\n public constructor() {\n this.geometry = new BufferGeometry();\n this.object3D = new LineSegments(this.geometry, new LineBasicMaterial({ color: 0xff0000 }));\n this.object3D.position.set(0, 0, 1);\n this.object3D.updateMatrixWorld();\n }\n\n public setCorners(ul: Vector3, ur: Vector3, lr: Vector3, ll: Vector3): void {\n this.geometry.setFromPoints([ul, ur, ur, lr, lr, ll, ll, ul]);\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type Map from '@giro3d/giro3d/entities/Map.js';\n\nimport Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport Extent from '@giro3d/giro3d/core/geographic/Extent.js';\nimport ColorLayer from '@giro3d/giro3d/core/layer/ColorLayer';\nimport GiroMap from '@giro3d/giro3d/entities/Map.js';\nimport TiledImageSource from '@giro3d/giro3d/sources/TiledImageSource.js';\nimport OSM from 'ol/source/OSM';\nimport { Vector2, Vector3 } from 'three';\n\nimport Viewbox from '@/types/Viewbox';\n\nconst DEFAULT_EXTENT = new Extent(\n 'EPSG:3857',\n -20037508.342789244,\n 20037508.342789244,\n -20037508.342789244,\n 20037508.342789244,\n);\n\nfunction loadOSMLayer(map: Map): Promise<ColorLayer> {\n const layer = new ColorLayer({\n name: 'osm',\n source: new TiledImageSource({ source: new OSM() }),\n });\n\n layer.visible = true;\n\n return map.addLayer(layer);\n}\n\nexport default class MinimapController {\n private readonly _basemap: Map;\n private _boundUpdateViewbox: () => void;\n private _mainInstance: Instance | null;\n private readonly _minimapInstance: Instance;\n private readonly _viewbox: Viewbox;\n\n public constructor(instance: Instance) {\n this._mainInstance = null;\n this._minimapInstance = instance;\n\n this._viewbox = new Viewbox();\n\n this._minimapInstance.scene.add(this._viewbox.object3D);\n\n this._viewbox.object3D.updateMatrixWorld();\n\n this._minimapInstance.notifyChange();\n\n this._basemap = new GiroMap({\n extent: DEFAULT_EXTENT,\n });\n this._basemap.name = 'minimap';\n\n void this._minimapInstance.add(this._basemap);\n\n void loadOSMLayer(this._basemap);\n\n const center = new Coordinates('EPSG:4326', 4.84, 45.76).as(\n this._minimapInstance.referenceCrs,\n );\n\n const xyz = new Vector3(center.x, center.y, 0);\n const camera = this._minimapInstance.view.camera;\n camera.position.set(xyz.x, xyz.y, 20000);\n camera.lookAt(xyz.x, xyz.y + 1, 0);\n\n this._minimapInstance.notifyChange();\n this._boundUpdateViewbox = this.updateViewbox.bind(this);\n }\n\n public dispose(): void {\n if (this._mainInstance) {\n this._mainInstance.removeEventListener('after-camera-update', this._boundUpdateViewbox);\n }\n\n this._minimapInstance.remove(this._basemap);\n this._minimapInstance.scene.remove(this._viewbox.object3D);\n\n this._basemap.dispose();\n this._viewbox.geometry.dispose();\n this._viewbox.object3D.geometry.dispose();\n this._viewbox.object3D.material.dispose();\n }\n\n public getCorners(): { ll: Vector3; lr: Vector3; ul: Vector3; ur: Vector3 } | undefined {\n const instance = this._mainInstance;\n const minimapInstance = this._minimapInstance;\n\n if (instance === null) {\n throw new Error('Must call setMainInstance before getCorners');\n }\n\n const canvasSize = instance.engine.getWindowSize();\n\n const raycast = (x: number, y: number): Vector3 | undefined => {\n const results = instance.pickObjectsAt(new Vector2(x, y), { limit: 1, radius: 0 });\n const point = results.at(0)?.point;\n if (point) {\n const result = new Coordinates(instance.referenceCrs, point.x, point.y, 1)\n .as(minimapInstance.referenceCrs)\n .toVector3();\n\n result.z = 1;\n\n return result;\n }\n return undefined;\n };\n\n const ul = raycast(0, 0);\n const ur = raycast(canvasSize.x - 1, 0);\n const ll = raycast(0, canvasSize.y - 1);\n const lr = raycast(canvasSize.x - 1, canvasSize.y - 1);\n\n if (!ul || !ur || !ll || !lr) {\n return undefined;\n }\n\n return { ll, lr, ul, ur };\n }\n\n public setMainInstance(instance: Instance | null): void {\n if (this._mainInstance) {\n this._mainInstance.removeEventListener('after-camera-update', this._boundUpdateViewbox);\n }\n this._mainInstance = instance;\n if (instance) {\n instance.addEventListener('after-camera-update', this._boundUpdateViewbox);\n }\n }\n\n public updateViewbox(): void {\n // Disabled as it consumes too much CPU\n // let corners = this.getCorners();\n if (this._mainInstance === null) {\n throw new Error('Must call setMainInstance before updateViewbox');\n }\n\n // const corners = null;\n const mainCamera = this._mainInstance.view.camera;\n const minimapCamera = this._minimapInstance.view.camera;\n\n // if (corners) {\n // this._viewbox.object3D.visible = true;\n // const { ul, ur, ll, lr } = corners;\n // this._viewbox.setCorners(ul, ur, lr, ll);\n // const box = new Box3();\n // box.setFromPoints([ul, ur, ll, lr]);\n // const xyz = box.getCenter(new Vector3());\n // const altitude = mainCamera.position.z + 2000;\n // minimapCamera.position.set(xyz.x, xyz.y, MathUtils.clamp(altitude, 1000, 50000));\n // minimapCamera.lookAt(xyz.x, xyz.y + 1, 0);\n // } else {\n this._viewbox.object3D.visible = false;\n\n const xyz = mainCamera.position;\n const coordinate = new Coordinates(this._mainInstance.referenceCrs, xyz.x, xyz.y, 0).as(\n this._minimapInstance.referenceCrs,\n );\n\n const { x, y } = coordinate;\n minimapCamera.position.set(x, y, minimapCamera.position.z);\n minimapCamera.lookAt(x, y + 1, 0);\n // }\n\n this._minimapInstance.notifyChange(this._basemap);\n }\n}\n","import type CameraController from '@/services/CameraController';\n\n/** @internal */\nexport class ViewApiImpl implements ViewApi {\n private readonly _cameraController: CameraController;\n\n public constructor(params: { camera: CameraController }) {\n this._cameraController = params.camera;\n }\n\n public getCameraController(): CameraController {\n return this._cameraController;\n }\n}\n\nexport default interface ViewApi {\n getCameraController(): CameraController;\n}\n","<script setup lang=\"ts\">\n import * as bootstrap from 'bootstrap';\n import { ref } from 'vue';\n\n import Notification from '@/types/Notification';\n\n import { useNotificationStore } from '../stores/notifications';\n\n const alertToast = ref<HTMLDivElement | null>(null);\n const notification = ref<Notification>(Notification.empty());\n\n function showNotification(notif: Notification): void {\n notification.value = notif;\n\n const toast = bootstrap.Toast.getOrCreateInstance(alertToast.value as HTMLDivElement);\n toast.show();\n }\n\n const notificationStore = useNotificationStore();\n\n notificationStore.$onAction(({ args, name }) => {\n switch (name) {\n case 'push':\n showNotification(args[0]);\n break;\n }\n });\n\n function getIcon(): string {\n if (notification.value == null) {\n return 'text-bg-success';\n }\n\n switch (notification.value.level) {\n case 'error':\n return 'bi-exclamation-circle-fill';\n case 'info':\n return 'bi-check-circle-fill';\n case 'success':\n return 'bi-check-lg';\n case 'warning':\n return 'bi-exclamation-triangle-fill';\n default:\n return 'text-bg-success';\n }\n }\n\n function getStyle(): string {\n if (notification.value == null) {\n return 'text-bg-success';\n }\n\n switch (notification.value.level) {\n case 'error':\n return 'text-bg-danger';\n case 'info':\n return 'text-bg-secondary';\n case 'success':\n return 'text-bg-success';\n case 'warning':\n return 'text-bg-warning';\n default:\n return 'text-bg-success';\n }\n }\n\n // For testing purposes\n // onMounted(() => {\n // showNotification(new Notification('Test', 'this is a test', 'info'));\n // })\n</script>\n\n<template>\n <div class=\"toast-container\">\n <div ref=\"alertToast\" class=\"toast\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n <div :class=\"['toast-header', getStyle()]\">\n <i :v-if=\"notification.level === 'info'\" :class=\"['bi', getIcon()]\"></i>\n <strong class=\"me-auto mx-2\">{{ notification.title }}</strong>\n <!-- <small>11 mins ago</small> -->\n <button\n type=\"button\"\n class=\"btn-close\"\n data-bs-dismiss=\"toast\"\n aria-label=\"Close\"\n ></button>\n </div>\n <div class=\"toast-body\" v-html=\"notification.text\"></div>\n </div>\n </div>\n</template>\n\n<style scoped>\n .toast-container {\n bottom: 5rem;\n right: 1rem;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { Color } from 'three';\n\n const props = defineProps<{\n color: Color;\n }>();\n\n const hexString = `#${props.color.getHexString()}`;\n</script>\n\n<template>\n <span class=\"color\">\n <span class=\"d-none\">{{ hexString }}</span>\n </span>\n {{ hexString }}\n</template>\n\n<style scoped>\n .color {\n height: 15px;\n width: 15px;\n\n padding: 0px 4px;\n display: inline-block;\n min-width: 13px;\n min-height: 13px;\n border-radius: 3px;\n box-sizing: border-box;\n position: relative;\n vertical-align: middle;\n margin-left: 2px;\n margin-bottom: 2px;\n position: relative;\n top: 1px;\n\n background-color: v-bind('hexString');\n border: 1px solid black;\n color: black;\n opacity: 1;\n }\n</style>\n","<script setup lang=\"ts\">\n defineProps({\n prefix: String,\n suffix: String,\n value: String,\n });\n</script>\n\n<template>\n <div class=\"text-secondary\">\n <span\n ><b>{{ prefix }}</b> {{ value }}{{ suffix }}</span\n >\n </div>\n</template>\n\n<style scoped>\n div {\n width: 5rem;\n text-align: start;\n font-size: small;\n }\n</style>\n","<script setup lang=\"ts\">\n const props = defineProps<{\n /** url */\n href: string;\n /** title */\n title: string;\n /** mime-type */\n type?: string;\n }>();\n</script>\n\n<template>\n <template v-if=\"props.type?.startsWith('image/')\">\n <a :href=\"props.href\" target=\"_blank\">\n <img :src=\"props.href\" :alt=\"props.title\" style=\"max-width: 200px\" />\n </a>\n </template>\n <template v-else-if=\"props.type?.startsWith('video/')\">\n <video controls style=\"max-width: 200px\">\n <source :src=\"props.href\" :type=\"props.type\" />\n Download the <a :href=\"props.href\">video</a>.</video\n ><br />\n Download the <a :href=\"props.href\" target=\"_blank\">video</a>.\n </template>\n <template v-else-if=\"props.type === 'application/pdf'\">\n <iframe\n :title=\"props.title\"\n width=\"200\"\n height=\"300\"\n :src=\"props.href\"\n frameborder=\"1\"\n sandbox=\"allow-same-origin allow-scripts\"\n ></iframe\n ><br />\n Download the <a :href=\"props.href\" target=\"_blank\">file</a>.\n </template>\n <template v-else\n ><a :href=\"props.href\" target=\"_blank\">{{ props.title }}</a></template\n >\n</template>\n","<script setup lang=\"ts\">\n import { isColor, isLink, isVector3 } from '@/utils/Types';\n\n import ColorFragment from './ColorFragment.vue';\n import CoordinateFragment from './CoordinateFragment.vue';\n import LinkFragment from './LinkFragment.vue';\n\n const props = defineProps<{\n attrName: string;\n attrValue: unknown;\n }>();\n\n let styles: string[];\n\n switch (props.attrName) {\n // TODO move into module\n case 'IFCType':\n styles = ['badge', 'bg-secondary', 'text-light', 'text-truncate'];\n break;\n default:\n styles = ['text-truncate'];\n }\n</script>\n\n<template>\n <tr>\n <th :title=\"attrName\" class=\"align-top text-truncate\">{{ attrName }}</th>\n <td :class=\"styles\">\n <template v-if=\"props.attrValue === undefined\"\n ><span class=\"text-secondary\">undefined</span></template\n >\n <template v-else-if=\"props.attrValue === null\"\n ><span class=\"text-secondary\">null</span></template\n >\n <template v-else-if=\"typeof props.attrValue === 'object'\">\n <template v-if=\"Array.isArray(props.attrValue)\">\n <table>\n <AttributeItem\n v-for=\"(subitem, index) in props.attrValue\"\n :key=\"index\"\n :attr-name=\"`[${index}]`\"\n :attr-value=\"subitem\"\n />\n </table>\n </template>\n <template v-else-if=\"isLink(props.attrValue)\">\n <LinkFragment\n :href=\"props.attrValue.href\"\n :title=\"props.attrValue.title\"\n :type=\"props.attrValue.type\"\n />\n </template>\n <template v-else-if=\"isColor(props.attrValue)\">\n <ColorFragment :key=\"props.attrValue.getHexString()\" :color=\"props.attrValue\" />\n </template>\n <template v-else-if=\"isVector3(props.attrValue)\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <CoordinateFragment :value=\"props.attrValue.x.toFixed(0)\" prefix=\"X:\" />\n <CoordinateFragment :value=\"props.attrValue.y.toFixed(0)\" prefix=\"Y:\" />\n <CoordinateFragment\n :value=\"props.attrValue.z.toFixed(0)\"\n prefix=\"Alt.:\"\n suffix=\"m\"\n />\n </div>\n </template>\n <template v-else><span class=\"text-secondary\">Object</span></template>\n </template>\n <template v-else\n ><span :title=\"props.attrValue as string\">{{ props.attrValue }}</span></template\n >\n </td>\n </tr>\n</template>\n\n<style scoped>\n th {\n max-width: 150px;\n }\n td {\n word-wrap: break-word;\n max-width: 200px;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { Attribute } from '@/types/Feature';\n\n import AttributeItem from './AttributeItem.vue';\n\n defineProps<{\n children: Array<Attribute>;\n title: string;\n }>();\n</script>\n\n<template>\n <div v-if=\"children.length > 0\">\n <h6 class=\"badge bg-info-subtle text-dark mb-0\">{{ title }}</h6>\n <table class=\"table table-striped table-sm w-100\">\n <tbody>\n <AttributeItem\n v-for=\"(list, index) in children\"\n :key=\"index\"\n :attr-name=\"list.key\"\n :attr-value=\"list.value\"\n />\n </tbody>\n </table>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import type { Vector3 } from 'three';\n\n import { ref } from 'vue';\n\n import type { AttributesGroups } from '@/types/Feature';\n\n import AttributeGroup from './AttributeGroup.vue';\n import CoordinateFragment from './CoordinateFragment.vue';\n\n const props = defineProps<{\n attributes: AttributesGroups;\n name?: string;\n parent: string;\n point: Vector3;\n }>();\n\n const copied = ref(false);\n\n function copyText(): void {\n const value = `${props.point.x};${props.point.y};${props.point.z}`;\n navigator.clipboard\n .writeText(value)\n .then(() => {\n copied.value = true;\n setTimeout(() => (copied.value = false), 2000);\n })\n .catch(e => {\n console.log('failed', e);\n });\n }\n\n defineEmits(['close']);\n</script>\n\n<template>\n <div class=\"card\">\n <div class=\"card-header d-flex align-items-center justify-content-between\">\n <i class=\"bi bi-card-checklist\"></i>\n <span class=\"text-truncate mx-2\">{{ name ?? parent }}</span>\n <button\n @click=\"$emit('close')\"\n type=\"button\"\n class=\"btn-close\"\n aria-label=\"Close\"\n ></button>\n </div>\n <div class=\"card-body content py-2 px-1\">\n <AttributeGroup\n v-for=\"(item, index) in attributes.entries()\"\n :key=\"index\"\n :title=\"item[0]\"\n :children=\"item[1]\"\n />\n </div>\n <div class=\"card-footer py-0\">\n <div class=\"d-flex align-items-center column-gap-3\">\n <CoordinateFragment :value=\"point.x.toFixed(0)\" prefix=\"X:\" />\n <CoordinateFragment :value=\"point.y.toFixed(0)\" prefix=\"Y:\" />\n <CoordinateFragment :value=\"point.z.toFixed(0)\" prefix=\"Alt.:\" suffix=\"m\" />\n <button @click=\"copyText\" type=\"button\" class=\"btn btn-link\">\n <i\n class=\"bi\"\n :class=\"copied ? ['bi-clipboard-check', 'test-success'] : ['bi-clipboard']\"\n ></i>\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n .content {\n overflow-y: auto;\n }\n</style>\n","export default \"data:image/png;base64,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\"","<script setup lang=\"ts\">\n import logo from '@/assets/piero_logo.png';\n</script>\n\n<template>\n <div id=\"loading-screen\" class=\"container\">\n <h1>Loading...</h1>\n <h2>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"48\"\n height=\"48\"\n fill=\"currentColor\"\n class=\"bi bi-geo-alt-fill pulse\"\n viewBox=\"0 0 16 16\"\n style=\"vertical-align: middle\"\n >\n <path\n d=\"M8 16s6-5.686 6-10A6 6 0 0 0 2 6c0 4.314 6 10 6 10m0-7a3 3 0 1 1 0-6 3 3 0 0 1 0 6\"\n />\n </svg>\n </h2>\n <div class=\"logo\">\n <img :src=\"logo\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n @keyframes col {\n 0% {\n transform: scale(0.8);\n }\n 50% {\n transform: scale(1.2);\n }\n 100% {\n transform: scale(0.8);\n }\n }\n\n .logo {\n margin-top: 10pt;\n }\n\n .pulse {\n animation: col 3s ease infinite;\n }\n\n h1 {\n color: #377c5f;\n font-size: 2.5rem;\n font-weight: 500;\n line-height: 1.2;\n margin-top: 0;\n margin-bottom: 0.5rem;\n font-family:\n system-ui,\n -apple-system,\n 'Segoe UI',\n Roboto,\n 'Helvetica Neue',\n 'Noto Sans',\n 'Liberation Sans',\n Arial,\n sans-serif;\n }\n\n h2 {\n color: #377c5f;\n font-size: 2rem;\n font-weight: 500;\n line-height: 1.2;\n margin-top: 0;\n margin-bottom: 0.5rem;\n }\n\n .container {\n max-width: 100% !important;\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n /* left: 0; */\n width: 100vw;\n height: 100vh;\n right: 0;\n display: flex;\n z-index: 999;\n flex-direction: column;\n justify-content: center;\n text-align: center;\n background-color: white;\n }\n</style>\n","<script setup lang=\"ts\">\n import Instance from '@giro3d/giro3d/core/Instance';\n import Inspector from '@giro3d/giro3d/gui/Inspector';\n import { onMounted, onUnmounted, ref, shallowRef } from 'vue';\n\n import { useGiro3dStore } from '@/stores/giro3d';\n\n const mainView = ref<HTMLDivElement | null>(null);\n const inspectorView = ref<HTMLDivElement | null>(null);\n const instance = shallowRef<Instance | null>(null);\n\n const store = useGiro3dStore();\n\n onMounted(() => {\n instance.value = new Instance({\n backgroundColor: null,\n crs: store.getCRS(),\n target: mainView.value as HTMLDivElement,\n });\n store.setMainView(instance.value);\n\n if (!import.meta.env.PROD) {\n const inspector = Inspector.attach(\n inspectorView.value as HTMLDivElement,\n instance.value,\n {\n title: 'Main view',\n width: 300,\n },\n );\n store.setInspector(inspector);\n }\n });\n\n onUnmounted(() => {\n if (!import.meta.env.PROD) {\n store.getInspector()?.detach();\n store.setInspector(null);\n }\n store.setMainView(null);\n if (instance.value) {\n instance.value.view.setControls(null);\n instance.value.dispose();\n }\n });\n</script>\n\n<template>\n <div class=\"main\">\n <div ref=\"mainView\" class=\"main\" id=\"main-view\"></div>\n <div\n ref=\"inspectorView\"\n id=\"inspector\"\n class=\"position-absolute top-0 start-0 mh-100 overflow-auto\"\n ></div>\n </div>\n</template>\n\n<style scoped>\n .main {\n width: 100%;\n height: 100%;\n }\n</style>\n","<script setup lang=\"ts\">\n import Instance from '@giro3d/giro3d/core/Instance';\n import { DirectionalLight } from 'three';\n import { onMounted, onUnmounted, ref, shallowRef } from 'vue';\n\n import { useGiro3dStore } from '@/stores/giro3d';\n\n const target = ref<HTMLDivElement | null>(null);\n const instance = shallowRef<Instance>();\n const store = useGiro3dStore();\n\n onMounted(() => {\n instance.value = new Instance({\n backgroundColor: 0xcccccc,\n crs: 'EPSG:3857',\n target: target.value as HTMLDivElement,\n });\n // Workaround for a bug that would trigger a three.js error\n // when it attempts to set the uniform value for directional lights\n // when there are no lights in the scene (although there is one in the main view).\n // Possibly some caching issue in shaders in three.js ?\n instance.value.scene.add(new DirectionalLight());\n store.setMinimapView(instance.value);\n });\n\n onUnmounted(() => {\n store.setMinimapView(null);\n instance.value?.dispose();\n });\n</script>\n\n<template>\n <div ref=\"target\" class=\"main\" />\n</template>\n\n<style scoped>\n .main {\n border-color: var(--color-border);\n border-width: 2px;\n border-style: solid;\n }\n</style>\n","<script setup lang=\"ts\">\n defineProps(['modelValue']);\n defineEmits(['update:modelValue']);\n</script>\n\n<template>\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n type=\"checkbox\"\n role=\"switch\"\n :checked=\"modelValue\"\n @input=\"$emit('update:modelValue', ($event.target as HTMLInputElement).checked)\"\n />\n <slot></slot>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import type { Ref } from 'vue';\n\n import { ref, watch } from 'vue';\n\n import type NavigationMode from '@/types/NavigationMode';\n\n import { useCameraStore } from '@/stores/camera';\n import { useNotificationStore } from '@/stores/notifications';\n import Notification from '@/types/Notification';\n\n import SwitchToggle from './SwitchToggle.vue';\n\n const camera = useCameraStore();\n const notificationStore = useNotificationStore();\n\n const navigationMode = ref<Ref<NavigationMode>>(camera.getNavigationModeRef());\n watch(navigationMode, newMode => {\n camera.setNavigationMode(newMode);\n\n let name: string;\n let description: string;\n\n switch (newMode) {\n case 'disabled': {\n name = 'Disabled';\n description = 'Camera is disabled';\n break;\n }\n case 'first-person': {\n name = 'First person';\n description = `<i class=\"bi bi-hand-index-thumb\"></i> Left-click to rotate; Right-click to pan<br>\n <i class=\"bi bi-mouse2\"></i> Scroll to zoom<br>\n <i class=\"bi bi-keyboard\"></i> Up/Down/Left/Right: move forward/backward/left/right<br>\n <i class=\"bi bi-keyboard\"></i> W/D/A/S: move up/down/left/right`;\n break;\n }\n case 'orbit': {\n name = 'Free navigation';\n description = `<i class=\"bi bi-hand-index-thumb\"></i> Left-click to pan; Right-click to orbit<br>\n <i class=\"bi bi-mouse2\"></i> Scroll to zoom to cursor<br>\n <i class=\"bi bi-keyboard\"></i> Up/Down/Left/Right: move forward/backward/left/right`;\n break;\n }\n case 'position-on-map': {\n name = 'Position on map';\n description = `<i class=\"bi bi-hand-index-thumb\"></i> Left-click on the map to move to First Person view on the ground.<br>\n Cancel with right-click or Escape`;\n break;\n }\n default: {\n // Exhaustiveness checking\n const _exhaustiveCheck: never = newMode;\n return _exhaustiveCheck;\n }\n }\n\n notificationStore.push(\n new Notification(\n 'Navigation',\n `Navigation mode set to <strong>${name}</strong>.<br>${description}`,\n 'success',\n ),\n );\n });\n\n function onPositionOnMapToggle(): void {\n if (navigationMode.value !== 'position-on-map') {\n navigationMode.value = 'position-on-map';\n } else {\n navigationMode.value = 'orbit';\n }\n }\n</script>\n\n<template>\n <div class=\"card root\">\n <div class=\"d-flex align-items-center\">\n <i title=\"Free navigation\" class=\"mx-2 bi bi-camera-reels-fill\"></i>\n <SwitchToggle\n :model-value=\"navigationMode === 'first-person'\"\n @update:model-value=\"v => (navigationMode = v ? 'first-person' : 'orbit')\"\n />\n <i title=\"First person view\" class=\"bi bi-universal-access\"></i>\n <div class=\"vr mx-2\"></div>\n <button\n class=\"btn btn-sm btn-outline-secondary\"\n :class=\"navigationMode === 'position-on-map' ? 'active' : null\"\n :aria-pressed=\"navigationMode === 'position-on-map'\"\n data-bs-toggle=\"button\"\n title=\"Position on map\"\n @click=\"onPositionOnMapToggle\"\n >\n <i class=\"fg-position-man\"></i>\n </button>\n </div>\n </div>\n</template>\n\n<style scoped>\n .root {\n padding: 0.3rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n margin: 1rem;\n }\n</style>\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAABXCAYAAAC+73jDAAAAyHpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjabVDbDcMgDPxnio7gBw97HPKo1A06fo/gSEnUkzgftjkMaf9+3uk1IJxTLs2q10pA9uzSIYwm+sFM+eADsobiez6VFocEKUXUubU6I5/5OHBG7lDlYmRrFJZ7wXP428MoLtIxkUBsYeRhpDILHAZ9PouqW7s+YdnpDpsrDVqIDjv2aH7sc8PvbQX3qMiurARWtTmAjlWSdggHI4FGRsPQDczaYhJ8yL9/OpF+mhJaGNqk9l0AAAGDaUNDUElDQyBwcm9maWxlAAB4nH2RO0jDQBzGv6ZKfVQczCDFIUN1souKdKxVKEKFUCu06mAefUGThiTFxVFwLTj4WKw6uDjr6uAqCIIPEHfBSdFFSvxfUmgR48FxP7677+PuO4BrVhXN6kkAmm6bmVRSyOVXhdAr+sFjEBHEJcUy5kQxDd/xdY8AW+9iLMv/3J9jSC1YChAQiBOKYdrEG8Szm7bBeJ+YV8qSSnxOPGnSBYkfmS57/Ma45DLHMnkzm5kn5omFUhfLXayUTY14hjiqajrlczmPVcZbjLVqXWnfk70wXNBXlplOcwwpLGIJIgTIqKOCKmzEaNVJsZCh/aSPP+L6RXLJ5KpAIccCatAguX6wP/jdrVWcnvKSwkmg98VxPsaB0C7QajjO97HjtE6A4DNwpXf8tSYQ/yS90dGiR8DwNnBx3dHkPeByBxh9MiRTcqUgTa5YBN7P6JvywMgtMLDm9dbex+kDkKWu0jfAwSEwUaLsdZ9393X39u+Zdn8/0ORyzDea69EAAA5daVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOjM5NTZmNTIxLWU2YjAtNGRiNi1hMTk2LWM3ZjkwZjE1YzYwZiIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozMTVlNTExOS1lZDExLTRjY2YtOGEzYi1lN2QyZDJkZjBkNzUiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4NjYzMjQ3ZS1mMmVjLTQwZmQtYjE3OC03NzFhNjEwMTRmYWMiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJNYWMgT1MiCiAgIEdJTVA6VGltZVN0YW1wPSIxNzU4MzY3NjM3MjAyNDAyIgogICBHSU1QOlZlcnNpb249IjIuMTAuMzgiCiAgIHRpZmY6T3JpZW50YXRpb249IjEiCiAgIHhtcDpDcmVhdG9yVG9vbD0iR0lNUCAyLjEwIgogICB4bXA6TWV0YWRhdGFEYXRlPSIyMDI1OjA5OjIwVDEzOjI3OjE3KzAyOjAwIgogICB4bXA6TW9kaWZ5RGF0ZT0iMjAyNTowOToyMFQxMzoyNzoxNyswMjowMCI+CiAgIDx4bXBNTTpIaXN0b3J5PgogICAgPHJkZjpTZXE+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjFiYjlmOWJiLWYyYzAtNGM4Yi1iYjgxLTU1ODE4NjY0NmQ2YiIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iR2ltcCAyLjEwIChMaW51eCkiCiAgICAgIHN0RXZ0OndoZW49IjIwMjQtMDMtMTlUMTQ6NDc6MjYrMDE6MDAiLz4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NTUwOTQ2YzYtODBkMy00MmI4LTgwOTUtZDcwYTE3MjNlNDM1IgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wIDIuMTAgKE1hYyBPUykiCiAgICAgIHN0RXZ0OndoZW49IjIwMjUtMDktMjBUMTM6Mjc6MTcrMDI6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+wSyPngAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAywAAAMsABKGRa2wAAAAd0SU1FB+kJFAsbEeAnRtoAACAASURBVHja7Z15mBXVnfc/p6ru0vf2vi/0ytqsoiIgKiogxp1EMkFnjJqocTIzmSWTmUzezCRxljca500m+6hjYsYlibtRcV/iBiqICMjaNND0vnfftarO+0dVX7qhl6ru24hwf8/TDw/Q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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACTCAYAAABszOBRAAAAxXpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjabVBBEsMgCLz7ij5BBBWeYxo70x/0+QUhnSTTnXGzsmRF0/y8X+lhKECJaucmrWUFCUkZKjg7xmLItHhBWnhwrSfBMIqWTMee4wc46vAL8M9QVU9B/AxjuxpCkc+3oDgIbaKiYj8miiAsbkAEDL9WbsL9fIVt5ivYVzJiWbNYmHu3PXV9vb3qOVjKRMCsjMjeg7ZqwqFClLWgjaANpruyt4I/yL93OpC+DARZTFnCKNgAAAGDaUNDUElDQyBwcm9maWxlAAB4nH2RO0jDQBzGv6ZKfVQczCDFIUN1souKdKxVKEKFUCu06mAefUGThiTFxVFwLTj4WKw6uDjr6uAqCIIPEHfBSdFFSvxfUmgR48FxP7677+PuO4BrVhXN6kkAmm6bmVRSyOVXhdAr+sFjEBHEJcUy5kQxDd/xdY8AW+9iLMv/3J9jSC1YChAQiBOKYdrEG8Szm7bBeJ+YV8qSSnxOPGnSBYkfmS57/Ma45DLHMnkzm5kn5omFUhfLXayUTY14hjiqajrlczmPVcZbjLVqXWnfk70wXNBXlplOcwwpLGIJIgTIqKOCKmzEaNVJsZCh/aSPP+L6RXLJ5KpAIccCatAguX6wP/jdrVWcnvKSwkmg98VxPsaB0C7QajjO97HjtE6A4DNwpXf8tSYQ/yS90dGiR8DwNnBx3dHkPeByBxh9MiRTcqUgTa5YBN7P6JvywMgtMLDm9dbex+kDkKWu0jfAwSEwUaLsdZ9393X39u+Zdn8/0ORyzDea69EAAA16aVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOmM0N2M4ZTNiLTg2ZjUtNDM3NC04Mzg2LTBjMGQwNGE1YTQxNSIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyNDVjNDdmMC1mODVmLTQ3NzAtYjVlNy1hMmU0ZDFmNWUwNzkiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozMDVhMDI1NS05NzY5LTRhZGQtYjQ3Yy1iOGU4MjlkZDdlNDciCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJNYWMgT1MiCiAgIEdJTVA6VGltZVN0YW1wPSIxNzU4MzY3NjU4NjgwODMzIgogICBHSU1QOlZlcnNpb249IjIuMTAuMzgiCiAgIHRpZmY6T3JpZW50YXRpb249IjEiCiAgIHhtcDpDcmVhdG9yVG9vbD0iR0lNUCAyLjEwIgogICB4bXA6TWV0YWRhdGFEYXRlPSIyMDI1OjA5OjIwVDEzOjI3OjM4KzAyOjAwIgogICB4bXA6TW9kaWZ5RGF0ZT0iMjAyNTowOToyMFQxMzoyNzozOCswMjowMCI+CiAgIDx4bXBNTTpIaXN0b3J5PgogICAgPHJkZjpTZXE+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmYwMzU4MmQ4LWUxMTgtNGY1Yi1hNDdiLTlkYjM4ZjIxNTk2ZiIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iR2ltcCAyLjEwIChNYWMgT1MpIgogICAgICBzdEV2dDp3aGVuPSIyMDI1LTA5LTIwVDEzOjI3OjM4KzAyOjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/Ptv0Ik4AAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfpCRQLGyZYmuPVAAAgAElEQVR42u2dd3gc5bX/P2dmd1Use9eybIMNXorp/VJCCZAAAUy4kOQmJEAS4ELosPSA6WB6y8iEml9CAjcJhB4IJgQIhBAw3XSDgTFuuMhaWX135vz+eF/Z69VIVrMsGZ3nmcfyzpaZd77v6UX4GpLrerEwpASIqzISWA9YFxgNjAFKgCqgvOijCiwGmoA6+/dXwDxgrgj1QGtpqbQ0NZ2ufI1J1vYbjMU8NwhIqjIW2BHYBtgE2BiYACR7uR5tAAotyHzgE+BD4G3gAxGWqmaWDQFrsN+UeFWqTAS+CewFbAlsCDir+GjOcqJllis1AYuARgugLwuAVAUMs3+vZ7lcOVABjCjgds3Ax8C7wD+B/4jwhWqmcQhYg4K89YA9gUOBnboApAXAXGAm8J59+F8CNUBWhHrVTFM3OWOFKikgBYwFJlpQbwuMAzayYP0E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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAAx3pUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjabVDbDcQwCPvPFDdCAnnAOOlLug1u/HMKrdqqlmIIRg4hrL/vFj4DlHLIpUnVWiOQNSt1JBINfecU88475kNL93o4BUKJEdmuUr3/qKfTwEJHVi5GMrsw3QXN7i8PI3+Ix0SEZHEjdSMmE5IbdPtWrCrt+oVpjXeInTBom0lHrUymPe+5YXtLwTtMtHLiCGYWG4DHKYE7EgWjgMaEhpE3cGHySbCQtz0dCH8eW1rDzUi1YAAAAYNpQ0NQSUNDIHByb2ZpbGUAAHicfZE7SMNAHMa/pkp9VBzMIMUhQ3Wyi4p0rFUoQoVQK7TqYB59QZOGJMXFUXAtOPhYrDq4OOvq4CoIgg8Qd8FJ0UVK/F9SaBHjwXE/vrvv4+47gGtWFc3qSQCabpuZVFLI5VeF0Cv6wWMQEcQlxTLmRDEN3/F1jwBb72Isy//cn2NILVgKEBCIE4ph2sQbxLObtsF4n5hXypJKfE48adIFiR+ZLnv8xrjkMscyeTObmSfmiYVSF8tdrJRNjXiGOKpqOuVzOY9VxluMtWpdad+TvTBc0FeWmU5zDCksYgkiBMioo4IqbMRo1UmxkKH9pI8/4vpFcsnkqkAhxwJq0CC5frA/+N2tVZye8pLCSaD3xXE+xoHQLtBqOM73seO0ToDgM3Cld/y1JhD/JL3R0aJHwPA2cHHd0eQ94HIHGH0yJFNypSBNrlgE3s/om/LAyC0wsOb11t7H6QOQpa7SN8DBITBRoux1n3f3dff275l2fz/Q5HLMN5rr0QAADXppVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+Cjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDQuNC4wLUV4aXYyIj4KIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgIHhtbG5zOkdJTVA9Imh0dHA6Ly93d3cuZ2ltcC5vcmcveG1wLyIKICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICB4bXBNTTpEb2N1bWVudElEPSJnaW1wOmRvY2lkOmdpbXA6NGVjMGMxNzUtNmE3NS00OGJlLTllZGYtOGNlNDQyM2ZmMmU0IgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjU1YmZlYWVjLWNhZDAtNGZlNi1iMGJkLTM2ODEyMWNmYWFmMSIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjliODczYjYyLTY4ZDUtNDU3ZS1iNzVkLWFmN2Y3MGU5YTkzMyIKICAgZGM6Rm9ybWF0PSJpbWFnZS9wbmciCiAgIEdJTVA6QVBJPSIyLjAiCiAgIEdJTVA6UGxhdGZvcm09Ik1hYyBPUyIKICAgR0lNUDpUaW1lU3RhbXA9IjE3NTgzNjc2NzMwNDY0MTMiCiAgIEdJTVA6VmVyc2lvbj0iMi4xMC4zOCIKICAgdGlmZjpPcmllbnRhdGlvbj0iMSIKICAgeG1wOkNyZWF0b3JUb29sPSJHSU1QIDIuMTAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjU6MDk6MjBUMTM6Mjc6NTIrMDI6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDI1OjA5OjIwVDEzOjI3OjUyKzAyOjAwIj4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OGJhNTc0MjgtZDMyOS00MzUzLWI2YjMtYzk1YjRmYzg1MzQ0IgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wIDIuMTAgKE1hYyBPUykiCiAgICAgIHN0RXZ0OndoZW49IjIwMjUtMDktMjBUMTM6Mjc6NTMrMDI6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+fJLSCgAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kJFAsbNdwkogsAACAASURBVHja7J13eBRV98c/syVt03shvRA6KbQkdGkCERAQEMuLxgoWFAs2FLF3BQuCgoqIiPTeew+EXkIICek92ZRt8/sj+QHJbpJNsiHhfTnPw6PMDHfn3rnfe/o5Anep2ch1/hQrwA/wBtwAZ8AesK36r7TqDzX+Xwdoqv5fW/X3AqAYyKv6kwmkAElZcQuVd1e7eUi4uwQmAYIP0B4IAYKr/j8UcL9ljZtjrcWqP1nAeeAMkAhcBM5kxS28evfr3AXI7QaDAxAGhAM9gRjAqer0b03rqaniOnuBw8BR4FhW3MK8u1/xLkBMLSZFAP2BYUBXwPwOXDsRUAGngLXAHuBIVtzC4rtf+S5AGgoKD6AvcD8wELADJP9l0xSBImAX8DewMytuYerdr38XILWBwhUYCjwERAFWphpbi0iFKFIO+Mkt8JRb4SyzwlIi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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAAtCAYAAADr0SSvAAAAyHpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjabVBRDsMgCP3nFDuCgFo4jm1tshvs+EOhS9vsJT6QR54I9M/7gNcAYYZcFqlaazJkzUrNEkmONhlTnjyxnRre60B7CGQltsh+lRr9Zx1/Bh6aZeViJFsI613QHP7yMIqHeExElsQgoGHE5AKGQfNvpaqyXL+w9nSH+IFBx0Y6amV17XnPi21vL/YOE3VGTsbM4gPwOAW4WaLGVrBGtIaRizHOVvSF/NvTCfgCF5hawfSmwyAAAAGDaUNDUElDQyBwcm9maWxlAAB4nH2RO0jDQBzGv6ZKfVQczCDFIUN1souKdKxVKEKFUCu06mAefUGThiTFxVFwLTj4WKw6uDjr6uAqCIIPEHfBSdFFSvxfUmgR48FxP7677+PuO4BrVhXN6kkAmm6bmVRSyOVXhdAr+sFjEBHEJcUy5kQxDd/xdY8AW+9iLMv/3J9jSC1YChAQiBOKYdrEG8Szm7bBeJ+YV8qSSnxOPGnSBYkfmS57/Ma45DLHMnkzm5kn5omFUhfLXayUTY14hjiqajrlczmPVcZbjLVqXWnfk70wXNBXlplOcwwpLGIJIgTIqKOCKmzEaNVJsZCh/aSPP+L6RXLJ5KpAIccCatAguX6wP/jdrVWcnvKSwkmg98VxPsaB0C7QajjO97HjtE6A4DNwpXf8tSYQ/yS90dGiR8DwNnBx3dHkPeByBxh9MiRTcqUgTa5YBN7P6JvywMgtMLDm9dbex+kDkKWu0jfAwSEwUaLsdZ9393X39u+Zdn8/0ORyzDea69EAAA16aVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOmM4NjdiYjcyLWU1NWEtNGZkZS1hYTlmLTdiYzZhNTJhNGIzZSIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0NWE1ZGEyYy01YjhmLTQ1ZTQtOGJkYy01N2Q0ZmJkZGQ1NWUiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplN2YyOWQyZS1kMDg1LTQ4ZWYtODYyZS0wZDM1NTRjOGVlYWQiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJNYWMgT1MiCiAgIEdJTVA6VGltZVN0YW1wPSIxNzU4MzY3Njk4OTQxNjMxIgogICBHSU1QOlZlcnNpb249IjIuMTAuMzgiCiAgIHRpZmY6T3JpZW50YXRpb249IjEiCiAgIHhtcDpDcmVhdG9yVG9vbD0iR0lNUCAyLjEwIgogICB4bXA6TWV0YWRhdGFEYXRlPSIyMDI1OjA5OjIwVDEzOjI4OjE4KzAyOjAwIgogICB4bXA6TW9kaWZ5RGF0ZT0iMjAyNTowOToyMFQxMzoyODoxOCswMjowMCI+CiAgIDx4bXBNTTpIaXN0b3J5PgogICAgPHJkZjpTZXE+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmZlNDAxNmZmLWZkZDItNDA4MS05YjU2LWY2ODYzYjk1Y2E1ZCIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iR2ltcCAyLjEwIChNYWMgT1MpIgogICAgICBzdEV2dDp3aGVuPSIyMDI1LTA5LTIwVDEzOjI4OjE4KzAyOjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/Pl6bkfoAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfpCRQLHBI2b4GnAAAU8UlEQVR42u2deXwV1dnHv/feDCQkyCpQFtkXZS0KAi8UpSqgqCMuMB3FQa0bBV+LS1GLSNVirdoWS221dWy9jlIsA1YQRBZFVFbZ14Y1IEsgELKQIbnvH+eZZnLfBIkmrPf5fPKZ3Jk55zxz5jznWc7vOROKxWJfTJ21uu1T0dUa5zHdfFmDwvGj+uUBLUKhUF78dU23uwPTyij+IvB7YANwHOjkuZZ3JjyXptvNgU+BecBdnmsdJ0EnTUlA3VgsVmtztnded0Th8UKAGkCorLEGNAAOyoALUoYc1wOFQOwMerQbgFXAiIRwfDcBSVD5aKPnWjeVMlOHgL+KcBRpul0DuBpIB/KB64Fc4F3PtfZLGQ0YBHQQzfM1MMtzrSJNtxsDPYCVwIXAlcAe4D3PtXICbfYA+gobn3qutSjAUwPAA74Aemm6/bHnWkWl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\"","import { defineStore } from 'pinia';\nimport { ref } from 'vue';\n\nimport type { Module } from '@/module';\n\nexport const useModuleStore = defineStore('modules', () => {\n const loadedModules = ref<Module[]>([]);\n\n function setLoadedModules(modules: Module[]): void {\n loadedModules.value = modules;\n }\n\n function getLoadedModules(): Module[] {\n return loadedModules.value;\n }\n\n return { getLoadedModules, setLoadedModules };\n});\n","<script setup lang=\"ts\">\n const dependencies = import.meta.env.VITE_DEPENDENCIES;\n import bpi from '@/assets/sponsors/bpi_france.png';\n import france2030 from '@/assets/sponsors/france_2030.png';\n import franceRelance from '@/assets/sponsors/france_relance.png';\n import oslandia from '@/assets/sponsors/oslandia.png';\n import ueNext from '@/assets/sponsors/ue_next_generation.png';\n import { useModuleStore } from '@/stores/modules';\n\n const modules = useModuleStore().getLoadedModules();\n</script>\n\n<template>\n <div>\n <p>\n <a href=\"https://gitlab.com/giro3d/piero\" target=\"_blank\">Piero</a>\n is a fully-configurable open-source web application for 3D visualization. It is powered\n by\n <a href=\"https://giro3d.org\" target=\"_blank\">Giro3D</a>, a versatile framework to\n visualize geospatial data in the browser.\n </p>\n <h5 class=\"mt-3\">Going further</h5>\n <p>\n If you wish to run your own instance of Piero, or if you wish to contribute to this\n application, head up to\n <a href=\"https://gitlab.com/giro3d/piero\" target=\"_blank\">our GitLab project</a>\n for more info.\n </p>\n <h5>Contributors</h5>\n <p>\n <a target=\"_blank\" href=\"https://gitlab.com/giro3d/piero/-/blob/main/CONTRIBUTORS.md\"\n >Brought to you by the Giro3D contributors.</a\n >\n </p>\n <h5>Sponsors</h5>\n <div class=\"list-group my-3\">\n <a href=\"https://oslandia.com\" target=\"_blank\" class=\"list-group-item\">\n <div class=\"d-flex w-100 justify-content-between\">\n <span>Oslandia</span>\n <img :src=\"oslandia\" class=\"logo\" alt=\"Oslandia\" />\n </div>\n </a>\n <a href=\"https://www.bpifrance.com/\" target=\"_blank\" class=\"list-group-item\">\n <div class=\"d-flex w-100 justify-content-between\">\n <span>BPI France</span>\n <img :src=\"bpi\" class=\"logo\" alt=\"BPI France\" />\n </div>\n </a>\n <span class=\"list-group-item\">\n <div class=\"d-flex w-100 justify-content-between\">\n <span>Funded by the French government as part of France 2030</span>\n <img :src=\"france2030\" class=\"logo\" alt=\"France 2030\" />\n </div>\n </span>\n <span class=\"list-group-item\">\n <div class=\"d-flex w-100 justify-content-between\">\n <span\n >Funded by the European Union - Next Generation EU as part of the France\n Relance plan</span\n >\n <div class=\"text-end\">\n <img :src=\"franceRelance\" class=\"logo\" alt=\"France Relance\" />\n <img :src=\"ueNext\" class=\"logo\" alt=\"European Union - Next Generation EU\" />\n </div>\n </div>\n </span>\n </div>\n <p>\n If you wish to sponsor Giro3D and Piero, you can contact us at\n <a href=\"mailto:infos+3d@oslandia.com\">infos+3d@oslandia.com</a>.\n </p>\n <h5>License</h5>\n <p>\n <a target=\"_blank\" href=\"https://gitlab.com/giro3d/piero/-/blob/main/LICENSE\"\n >MIT License</a\n >\n </p>\n <h5>Credits</h5>\n <p>Data and services used from:</p>\n <ul>\n <li>\n <a target=\"_blank\" href=\"https://ign.fr/\">IGN</a> (Imagery, Elevation model, LIDAR\n data, Elevation API)\n </li>\n <li>\n <a target=\"_blank\" href=\"https://www.grandlyon.com/\">Métropole Grand Lyon</a>\n (Imagery, Elevation model, overlay layers)\n </li>\n <li>\n <a target=\"_blank\" href=\"https://www.openstreetmap.org\">OpenStreetMap</a> (Imagery)\n </li>\n <li>\n <a target=\"_blank\" href=\"https://adresse.data.gouv.fr/\">adresse.data.gouv.fr</a>\n (Geocoding API)\n </li>\n <li>\n <a target=\"_blank\" href=\"https://cadastre.data.gouv.fr\"\n >Données cadastrales ouvertes</a\n >\n (Cadastre)\n </li>\n <li>\n <a target=\"_blank\" href=\"https://oslandia.com\">Oslandia</a> (CityJSON\n reconstructions, overlay layers)\n </li>\n <li><a target=\"_blank\" href=\"https://bimdata.io/\">BIMData</a> (IFC model)</li>\n </ul>\n <p>Third-parties:</p>\n <ul>\n <li v-for=\"[name, info] of Object.entries(dependencies)\" :key=\"name\">\n <a target=\"_blank\" :href=\"info.homepage\">{{ name }} ({{ info.license }})</a>\n <blockquote v-if=\"info.description\" class=\"blockquote fw-light\">\n {{ info.description }}\n </blockquote>\n </li>\n </ul>\n <p>Loaded modules:</p>\n <ul>\n <li v-for=\"module in modules\" :key=\"module.name\">\n {{ module.name }}\n </li>\n </ul>\n <hr />\n </div>\n</template>\n\n<style scoped>\n blockquote {\n font-size: 0.7rem !important;\n margin-bottom: 0;\n }\n .logo {\n max-width: 200px;\n height: auto;\n max-height: 80px;\n }\n</style>\n","<script setup lang=\"ts\">\n import { Vector3 } from 'three';\n import { ref } from 'vue';\n\n import { getConfig } from '@/config-loader';\n import { useAnalysisStore } from '@/stores/analysis';\n import { useCameraStore } from '@/stores/camera';\n\n const config = getConfig();\n\n const analysis = useAnalysisStore();\n const camera = useCameraStore();\n\n const floatValue = (event: Event): number =>\n Number.parseFloat((event.target as HTMLInputElement).value);\n\n function setFromCamera(): void {\n const { target } = camera.getCameraPosition();\n analysis.setClippingBoxCenter(target.clone());\n }\n\n function setSizeX(x: number): void {\n const size = analysis.clippingBoxSize.clone();\n size.setX(x);\n analysis.setClippingBoxSize(size);\n }\n\n function setSizeY(y: number): void {\n const size = analysis.clippingBoxSize.clone();\n size.setY(y);\n analysis.setClippingBoxSize(size);\n }\n\n function setSizeZ(z: number): void {\n const size = analysis.clippingBoxSize.clone();\n size.setZ(z);\n analysis.setClippingBoxSize(size);\n }\n\n function setX(x: number): void {\n const center = analysis.clippingBoxCenter.clone();\n center.setX(x);\n analysis.setClippingBoxCenter(center);\n }\n\n function setY(y: number): void {\n const center = analysis.clippingBoxCenter.clone();\n center.setY(y);\n analysis.setClippingBoxCenter(center);\n }\n\n function setZ(z: number): void {\n const center = analysis.clippingBoxCenter.clone();\n center.setZ(z);\n analysis.setClippingBoxCenter(center);\n }\n\n const floorReferenceAltitude = ref(config.analysis.clipping_box.floor_preset.altitude);\n const floorSize = ref(config.analysis.clipping_box.floor_preset.size);\n const floorNumber = ref(config.analysis.clipping_box.floor_preset.floor);\n\n function floorDown(): void {\n floorNumber.value -= 1;\n const center = analysis.clippingBoxCenter.clone();\n center.setZ(getFloorAltitude());\n analysis.setClippingBoxCenter(center);\n }\n\n function floorUp(): void {\n floorNumber.value += 1;\n const center = analysis.clippingBoxCenter.clone();\n center.setZ(getFloorAltitude());\n analysis.setClippingBoxCenter(center);\n }\n\n function getFloorAltitude(): number {\n // Adjust Z so it's at the center of the floor (thus the +0.5)\n return floorReferenceAltitude.value + (floorNumber.value + 0.5) * floorSize.value;\n }\n\n function presetFromFloor(): void {\n const { target } = camera.getCameraPosition();\n\n const boxCenter = target.clone();\n boxCenter.z = getFloorAltitude();\n\n // Set box size around the current view\n // It's a bit nicer than using the whole extent when using the 3D helper\n const boxSize = new Vector3(1000, 1000, floorSize.value);\n\n analysis.setClippingBoxSize(boxSize);\n analysis.setClippingBoxCenter(boxCenter);\n }\n</script>\n\n<template>\n <div>\n <div class=\"input-group\">\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n :checked=\"analysis.isClippingBoxInverted()\"\n type=\"checkbox\"\n role=\"switch\"\n id=\"invert-clippingbox\"\n @input=\"analysis.setClippingBoxInverted(!analysis.isClippingBoxInverted())\"\n />\n <label class=\"form-check-label\" for=\"invert-clippingbox\">Invert clipping box</label>\n </div>\n </div>\n\n <div class=\"input-group\">\n <div class=\"form-check form-switch\">\n <input\n class=\"form-check-input\"\n :checked=\"analysis.isClippingBoxHelperDisplayed()\"\n type=\"checkbox\"\n role=\"switch\"\n id=\"enable-clippingbox-helper\"\n @input=\"\n analysis.displayClippingBoxHelper(!analysis.isClippingBoxHelperDisplayed())\n \"\n />\n <label class=\"form-check-label\" for=\"enable-clippingbox-helper\"\n >Show 3D helper</label\n >\n </div>\n </div>\n\n <div class=\"accordion mt-3\">\n <div class=\"accordion-item\">\n <h2 class=\"accordion-header\">\n <button\n class=\"accordion-button\"\n type=\"button\"\n data-bs-toggle=\"collapse\"\n data-bs-target=\"#clippingbox-size\"\n aria-expanded=\"true\"\n aria-controls=\"clippingbox-size\"\n >\n Clipping box size\n </button>\n </h2>\n <div\n id=\"clippingbox-size\"\n class=\"accordion-collapse collapse show\"\n data-bs-parent=\"#accordionExample\"\n >\n <div class=\"accordion-body\">\n <div class=\"d-flex justify-content-between align-items-end w-100\">\n <label class=\"form-label flex-grow\">Center (x, y, z)</label>\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary btn-sm\"\n @click=\"setFromCamera()\"\n >\n Set from view\n </button>\n </div>\n <div class=\"input-group mb-3\">\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"plane-center-x\"\n :value=\"analysis.clippingBoxCenter.x\"\n @input=\"event => setX(floatValue(event))\"\n />\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"plane-center-y\"\n :value=\"analysis.clippingBoxCenter.y\"\n @input=\"event => setY(floatValue(event))\"\n />\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"plane-center-z\"\n :value=\"analysis.clippingBoxCenter.z\"\n @input=\"event => setZ(floatValue(event))\"\n />\n </div>\n\n <label class=\"form-label\">Size (x, y, z)</label>\n <div class=\"input-group mb-3\">\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"plane-size-x\"\n min=\"1\"\n :value=\"analysis.clippingBoxSize.x\"\n @input=\"event => setSizeX(floatValue(event))\"\n />\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"plane-size-y\"\n min=\"1\"\n :value=\"analysis.clippingBoxSize.y\"\n @input=\"event => setSizeY(floatValue(event))\"\n />\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"plane-size-z\"\n min=\"1\"\n :value=\"analysis.clippingBoxSize.z\"\n @input=\"event => setSizeZ(floatValue(event))\"\n />\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"accordion-item\">\n <h2 class=\"accordion-header\">\n <button\n class=\"accordion-button\"\n type=\"button\"\n data-bs-toggle=\"collapse\"\n data-bs-target=\"#clippingbox-floorpreset\"\n aria-expanded=\"true\"\n aria-controls=\"clippingbox-floorpreset\"\n >\n Floor preset\n </button>\n </h2>\n <div\n id=\"clippingbox-floorpreset\"\n class=\"accordion-collapse collapse show\"\n data-bs-parent=\"#accordionExample\"\n >\n <div class=\"accordion-body\">\n <div class=\"row w-100\">\n <label\n for=\"floor-reference-altitude\"\n class=\"col-sm-6 col-form-label col-form-label-sm\"\n >Reference altitude</label\n >\n <div class=\"col-sm-6\">\n <div class=\"input-group input-group-sm\">\n <input\n type=\"number\"\n class=\"form-control form-control-sm\"\n id=\"floor-reference-altitude\"\n v-model=\"floorReferenceAltitude\"\n />\n <span class=\"input-group-text\">m</span>\n </div>\n </div>\n </div>\n\n <div class=\"row w-100\">\n <label\n for=\"floor-size\"\n class=\"col-sm-6 col-form-label col-form-label-sm\"\n >Floor size</label\n >\n <div class=\"col-sm-6\">\n <div class=\"input-group input-group-sm\">\n <input\n type=\"number\"\n class=\"form-control form-control-sm\"\n id=\"floor-size\"\n v-model=\"floorSize\"\n />\n <span class=\"input-group-text\">m</span>\n </div>\n </div>\n </div>\n\n <div class=\"row w-100\">\n <label\n for=\"floor-number\"\n class=\"col-sm-6 col-form-label col-form-label-sm\"\n >Floor number</label\n >\n <div class=\"col-sm-6\">\n <div class=\"input-group input-group-sm\">\n <input\n type=\"number\"\n class=\"form-control form-control-sm\"\n id=\"floor-number\"\n v-model=\"floorNumber\"\n />\n <button\n class=\"btn btn-outline-secondary btn-sm px-0\"\n type=\"button\"\n @click=\"floorUp\"\n >\n <i class=\"bi bi-arrow-up-short\"></i>\n </button>\n <button\n class=\"btn btn-outline-secondary btn-sm px-0\"\n type=\"button\"\n @click=\"floorDown\"\n >\n <i class=\"bi bi-arrow-down-short\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary btn-sm\"\n @click=\"presetFromFloor()\"\n >\n Set\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n .accordion-button {\n background-color: var(--bs-body-bg);\n }\n</style>\n","<script setup lang=\"ts\">\n import { useAnalysisStore } from '@/stores/analysis';\n\n const analysis = useAnalysisStore();\n\n function setOrientation(height: number): void {\n analysis.setCrossSectionOrientation(height);\n }\n\n function setX(x: number): void {\n const center = analysis.crossSectionCenter.clone();\n center.setX(x);\n analysis.setCrossSectionCenter(center);\n }\n\n function setY(y: number): void {\n const center = analysis.crossSectionCenter.clone();\n center.setY(y);\n analysis.setCrossSectionCenter(center);\n }\n</script>\n\n<template>\n <div>\n <div class=\"input-group mb-3\">\n <label for=\"plane-orientation-range\" class=\"form-label\"\n >Plane orientation (0-360°)</label\n >\n <input\n id=\"plane-orientation-range\"\n title=\"Altitude\"\n type=\"range\"\n class=\"form-range\"\n min=\"0\"\n step=\"0.1\"\n max=\"360\"\n :value=\"analysis.crossSectionOrientation\"\n @input=\"\n event =>\n setOrientation(Number.parseFloat((event.target as HTMLInputElement).value))\n \"\n />\n <div class=\"input-group mb-3\">\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"plane-orientation-number\"\n step=\"0.1\"\n :value=\"analysis.crossSectionOrientation\"\n @input=\"\n event =>\n setOrientation(\n Number.parseFloat((event.target as HTMLInputElement).value),\n )\n \"\n />\n </div>\n </div>\n <hr />\n <div class=\"input-group mb-3\">\n <label class=\"form-label\">Center (x, y)</label>\n <div class=\"input-group mb-3\">\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"plane-center-x\"\n :value=\"analysis.crossSectionCenter.x\"\n @input=\"\n event => setX(Number.parseFloat((event.target as HTMLInputElement).value))\n \"\n />\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"plane-center-y\"\n :value=\"analysis.crossSectionCenter.y\"\n @input=\"\n event => setY(Number.parseFloat((event.target as HTMLInputElement).value))\n \"\n />\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { useAnalysisStore } from '@/stores/analysis';\n\n const analysis = useAnalysisStore();\n\n function setHeight(height: number): void {\n analysis.setFloodingPlaneHeight(height);\n }\n</script>\n\n<template>\n <div class=\"input-group mb-3\">\n <label for=\"flooding-altitude-range\" class=\"form-label\">Altitude</label>\n <input\n id=\"flooding-altitude-range\"\n title=\"Altitude\"\n type=\"range\"\n class=\"form-range\"\n min=\"0\"\n step=\"0.1\"\n max=\"500\"\n :value=\"analysis.floodingPlaneHeight\"\n @input=\"event => setHeight(Number.parseFloat((event.target as HTMLInputElement).value))\"\n />\n <div class=\"input-group mb-3\">\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"flooding-altitude-number\"\n step=\"0.1\"\n :value=\"analysis.floodingPlaneHeight\"\n @input=\"\n event => setHeight(Number.parseFloat((event.target as HTMLInputElement).value))\n \"\n />\n <span class=\"input-group-text\">m</span>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { BarController, BarElement, CategoryScale, Chart, LinearScale } from 'chart.js';\n import { onMounted, ref } from 'vue';\n\n Chart.register(BarController, BarElement, CategoryScale, LinearScale);\n\n const ctx = ref<HTMLCanvasElement>();\n\n onMounted(() => {\n new Chart(ctx.value as HTMLCanvasElement, {\n data: {\n datasets: [\n {\n backgroundColor: [\n 'rgba(255, 99, 132, 0.2)',\n 'rgba(54, 162, 235, 0.2)',\n 'rgba(255, 206, 86, 0.2)',\n 'rgba(75, 192, 192, 0.2)',\n 'rgba(153, 102, 255, 0.2)',\n 'rgba(255, 159, 64, 0.2)',\n ],\n borderColor: [\n 'rgba(255, 99, 132, 1)',\n 'rgba(54, 162, 235, 1)',\n 'rgba(255, 206, 86, 1)',\n 'rgba(75, 192, 192, 1)',\n 'rgba(153, 102, 255, 1)',\n 'rgba(255, 159, 64, 1)',\n ],\n borderWidth: 1,\n data: [12, 19, 3, 5, 2, 3],\n label: '# of Votes',\n },\n ],\n labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],\n },\n type: 'bar',\n });\n });\n</script>\n\n<template>\n <div>\n <canvas ref=\"ctx\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\n import type { ChartConfiguration } from 'chart.js';\n\n import { ArcElement, Chart, DoughnutController } from 'chart.js';\n import { onMounted, ref } from 'vue';\n\n Chart.register(DoughnutController, ArcElement);\n\n const ctx = ref<HTMLCanvasElement>();\n\n onMounted(() => {\n new Chart(\n ctx.value as HTMLCanvasElement,\n {\n data: {\n datasets: [\n {\n backgroundColor: [\n 'rgb(255, 99, 132)',\n 'rgb(54, 162, 235)',\n 'rgb(255, 205, 86)',\n ],\n data: [300, 50, 100],\n hoverOffset: 4,\n label: 'My First Dataset',\n },\n ],\n labels: ['Red', 'Blue', 'Yellow'],\n },\n type: 'doughnut',\n } as unknown as ChartConfiguration,\n ); // FIXME: hoverOffset not recognized?\n });\n</script>\n\n<template>\n <div>\n <canvas ref=\"ctx\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { MathUtils } from 'three';\n import { ref } from 'vue';\n\n import type Named from '@/types/Named';\n\n const props = defineProps<{\n current: Named | null;\n descriptionPosition?: 'bottom' | 'top';\n items: Named[];\n label: string;\n }>();\n\n const emits = defineEmits<{\n (e: 'updated:current', current: Named | null): void;\n }>();\n\n const currentSelection = ref<Named | null>(props.current);\n\n function setCurrent(index: number): void {\n const item = props.items[index];\n currentSelection.value = item;\n emits('updated:current', item);\n }\n\n const id = MathUtils.generateUUID();\n</script>\n\n<template>\n <fieldset class=\"border p-2\">\n <legend class=\"float-none w-auto form-text mb-0 px-2\">{{ label }}</legend>\n <div\n v-if=\"\n descriptionPosition === 'top' &&\n currentSelection !== null &&\n currentSelection.description\n \"\n class=\"form-text mt-0 mx-2\"\n >\n {{ currentSelection.description }}\n </div>\n <select\n :id=\"id\"\n class=\"form-select\"\n :aria-label=\"label\"\n @input=\"e => setCurrent((e.target as HTMLSelectElement).selectedIndex)\"\n >\n <option v-for=\"(item, index) in items\" :key=\"index\" :value=\"index\">\n {{ item.name }}\n </option>\n </select>\n <div\n v-if=\"\n descriptionPosition !== 'top' &&\n currentSelection !== null &&\n currentSelection.description\n \"\n class=\"form-text mt-0 mx-2\"\n >\n {{ currentSelection.description }}\n </div>\n </fieldset>\n</template>\n","<script setup lang=\"ts\">\n defineProps({\n text: String,\n });\n</script>\n\n<template>\n <div class=\"root\">\n <div class=\"spinner-border text-secondary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n <div class=\"text-align-center\">\n {{ text }}\n </div>\n </div>\n</template>\n\n<style scoped>\n .root {\n opacity: 0.6;\n width: 100%;\n height: 100% !important;\n vertical-align: middle;\n font-size: large !important;\n text-align: center;\n }\n</style>\n","import { defineStore } from 'pinia';\n\nimport type { Dataset } from '@/types/Dataset';\n\nexport const useStatisticsStore = defineStore('statistics', () => {\n function getCompatibleDatasets(): Dataset[] {\n const result: Dataset[] = [];\n return result;\n }\n\n return { getCompatibleDatasets };\n});\n","<script setup lang=\"ts\">\n import PromiseUtils from '@giro3d/giro3d/utils/PromiseUtils';\n import { ref } from 'vue';\n\n import type { Dataset } from '@/types/Dataset';\n\n import ButtonWithIcon from '@/components/atoms/ButtonWithIcon.vue';\n import BarChart from '@/components/charts/BarChart.vue';\n import DoughnutChart from '@/components/charts/DoughnutChart.vue';\n import DropdownView from '@/components/DropdownView.vue';\n import LoadingIndicator from '@/components/panels/LoadingIndicator.vue';\n import { useStatisticsStore } from '@/stores/statistics';\n\n const store = useStatisticsStore();\n\n const source = ref<Dataset | null>(null);\n const isLoading = ref<boolean>(false);\n const showCharts = ref<boolean>(false);\n\n async function createStatistics(): Promise<void> {\n isLoading.value = true;\n showCharts.value = false;\n\n // Simulate async server request\n await PromiseUtils.delay(1000);\n\n isLoading.value = false;\n showCharts.value = true;\n }\n\n function setCurrentSource(src: Dataset): void {\n source.value = src;\n isLoading.value = false;\n showCharts.value = false;\n }\n</script>\n\n<template>\n <div class=\"mb-3\">\n <DropdownView\n label=\"Source\"\n :current=\"null\"\n :items=\"store.getCompatibleDatasets()\"\n @updated:current=\"src => setCurrentSource(src as Dataset)\"\n />\n </div>\n <ButtonWithIcon\n title=\"Generate stats...\"\n class=\"btn-primary\"\n @click=\"createStatistics\"\n icon=\"bi-pie-chart-fill\"\n text=\"Generate\"\n />\n\n <div class=\"row w-100 my-2\">\n <LoadingIndicator text=\"processing...\" v-if=\"isLoading\" />\n <div v-if=\"showCharts\">\n <div class=\"border m-2 p-1\">\n <BarChart />\n </div>\n <div class=\"border m-2 p-1\">\n <DoughnutChart />\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n .loading-indicator {\n width: 100%;\n height: 100% !important;\n vertical-align: middle;\n font-size: large !important;\n text-align: center;\n }\n</style>\n","<script setup lang=\"ts\">\n defineProps<{\n collapsible: boolean;\n expanded: boolean;\n icon?: string;\n id: string;\n title: string;\n }>();\n\n defineEmits(['update:expanded']);\n</script>\n\n<template>\n <div class=\"card\">\n <h5 class=\"card-header\">\n <div class=\"form-check form-switch d-flex\">\n <input\n class=\"form-check-input\"\n :checked=\"expanded\"\n :disabled=\"!collapsible\"\n type=\"checkbox\"\n role=\"switch\"\n :id=\"`enable-${id}`\"\n @input=\"$emit('update:expanded', !expanded)\"\n />\n <label class=\"form-check-label flex-fill\" :for=\"`enable-${id}`\">\n <i v-if=\"icon\" class=\"bi icon\" :class=\"icon\"></i>\n {{ title }}\n </label>\n </div>\n </h5>\n <div class=\"card-body\" v-if=\"expanded\">\n <slot></slot>\n </div>\n </div>\n</template>\n\n<style scoped>\n .icon {\n margin-left: 0.5rem;\n margin-right: 0.5rem;\n color: rgb(180, 180, 180);\n }\n</style>\n","<script setup lang=\"ts\">\n import { useAnalysisStore } from '@/stores/analysis';\n\n import ClippingBox from './analysis/ClippingBox.vue';\n import CrossSection from './analysis/CrossSection.vue';\n import FloodingPlane from './analysis/FloodingPlane.vue';\n import Statistics from './analysis/Statistics.vue';\n import ToolWrapper from './analysis/ToolWrapper.vue';\n\n const analysis = useAnalysisStore();\n</script>\n\n<template>\n <div>\n <ToolWrapper\n class=\"tool\"\n id=\"flooding-plane\"\n title=\"Flooding plane\"\n icon=\"bi-layers-half\"\n :expanded=\"analysis.isFloodingPlaneEnabled()\"\n :collapsible=\"true\"\n @update:expanded=\"analysis.enableFloodingPlane\"\n >\n <FloodingPlane />\n </ToolWrapper>\n\n <ToolWrapper\n class=\"tool\"\n id=\"cross-section\"\n title=\"Cross section\"\n icon=\"bi-circle-half\"\n :expanded=\"analysis.isCrossSectionEnabled()\"\n :collapsible=\"true\"\n @update:expanded=\"analysis.enableCrossSection\"\n >\n <CrossSection />\n </ToolWrapper>\n\n <ToolWrapper\n class=\"tool\"\n id=\"clipping-box\"\n title=\"Clipping Box\"\n icon=\"bi-bounding-box\"\n :expanded=\"analysis.isClippingBoxEnabled()\"\n :collapsible=\"true\"\n @update:expanded=\"analysis.enableClippingBox\"\n >\n <ClippingBox />\n </ToolWrapper>\n\n <ToolWrapper\n class=\"tool\"\n id=\"statistics\"\n title=\"Statistics\"\n icon=\"bi-bar-chart-line\"\n :expanded=\"analysis.isStatisticsEnabled()\"\n :collapsible=\"true\"\n @update:expanded=\"analysis.enableStatistics\"\n >\n <Statistics />\n </ToolWrapper>\n </div>\n</template>\n\n<style scoped>\n .tool {\n box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1);\n margin-top: 1rem;\n }\n</style>\n","<template>\n <fieldset class=\"vstack gap-1 flex-grow-0 flew-shrink-0\">\n <hr />\n <slot></slot>\n </fieldset>\n</template>\n","<script setup lang=\"ts\">\n import { ref } from 'vue';\n\n import ButtonWithIcon from './ButtonWithIcon.vue';\n\n defineProps<{\n icon?: string;\n text?: string;\n title: string;\n }>();\n\n const emits = defineEmits<{\n (e: 'import', files: File[]): void;\n }>();\n\n const hover = ref(false);\n const hiddenInput = ref<HTMLInputElement | null>(null);\n\n function importFiles(files: FileList | null | undefined): void {\n if (files) {\n const a = [];\n for (const file of files) {\n a.push(file);\n }\n emits('import', a);\n }\n }\n\n function importFromFile(e: Event): void {\n const files = (e.target as HTMLInputElement).files;\n importFiles(files);\n }\n\n function onDragEnter(e: DragEvent): void {\n hover.value = true;\n e.preventDefault();\n }\n\n function onDragLeave(e: DragEvent): void {\n hover.value = false;\n e.preventDefault();\n }\n\n function onDragOver(e: DragEvent): void {\n e.preventDefault();\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = 'copy';\n }\n }\n\n function onDrop(e: DragEvent): void {\n hover.value = false;\n const files = e.dataTransfer?.files;\n importFiles(files);\n e.preventDefault();\n }\n</script>\n\n<template>\n <div\n draggable=\"true\"\n @dragover=\"onDragOver\"\n @dragenter=\"onDragEnter\"\n @dragleave=\"onDragLeave\"\n @drop=\"onDrop\"\n >\n <ButtonWithIcon\n :title=\"title\"\n :text=\"text\"\n :icon=\"icon ?? `bi-box-arrow-left`\"\n @click=\"(hiddenInput as HTMLInputElement).click()\"\n class=\"w-100\"\n :class=\"hover ? 'btn-primary' : 'btn-outline-secondary'\"\n />\n <input\n ref=\"hiddenInput\"\n class=\"btn btn-outline-secondary d-none\"\n type=\"file\"\n @input=\"importFromFile\"\n multiple=\"true\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\n import SwitchToggle from './SwitchToggle.vue';\n\n defineProps<{\n visible: boolean;\n }>();\n defineEmits(['update:visible']);\n</script>\n\n<template>\n <SwitchToggle :model-value=\"visible\" @update:model-value=\"v => $emit('update:visible', v)\" />\n</template>\n\n<style scoped>\n .icon {\n width: 1rem !important;\n float: right;\n }\n\n .inactive {\n color: rgb(180, 180, 180);\n }\n\n .active {\n width: 1rem !important;\n float: right;\n }\n\n @media (hover: hover) {\n .icon:hover {\n color: rgb(75, 75, 75);\n }\n }\n</style>\n","<script setup lang=\"ts\">\n defineProps({\n text: String,\n });\n</script>\n\n<template>\n <div>\n {{ text }}\n </div>\n</template>\n\n<style scoped>\n div {\n opacity: 0.4;\n width: 100%;\n height: 100% !important;\n vertical-align: middle;\n font-size: large !important;\n text-align: center;\n }\n</style>\n","<script setup lang=\"ts\">\n import { onMounted, onUnmounted, ref } from 'vue';\n\n import type Annotation from '@/types/Annotation';\n\n import AttributeItem from '../AttributeItem.vue';\n import VisibilityControl from '../VisibilityControl.vue';\n import EmptyIndicator from './EmptyIndicator.vue';\n\n const props = defineProps<{\n annotation: Annotation;\n visible: boolean;\n }>();\n\n defineEmits(['edit', 'stop-edit', 'delete', 'download', 'update:visible', 'zoom']);\n\n const isEditing = ref(props.annotation.isEditing);\n\n const onIsEditingChanged = (): void => {\n isEditing.value = props.annotation.isEditing;\n };\n\n onMounted(() => {\n props.annotation.addEventListener('isEditing', onIsEditingChanged);\n });\n\n onUnmounted(() => {\n props.annotation.removeEventListener('isEditing', onIsEditingChanged);\n });\n</script>\n\n<template>\n <li class=\"list-group-item item\">\n <div class=\"d-flex\">\n <VisibilityControl\n :visible=\"visible\"\n v-on:update:visible=\"v => $emit('update:visible', v)\"\n />\n\n <a class=\"title\" :title=\"annotation.title\" href=\"#\" @click=\"$emit('zoom')\">{{\n annotation.title\n }}</a>\n\n <div class=\"icons\">\n <a\n href=\"#\"\n class=\"icon\"\n title=\"Attribute table\"\n data-bs-toggle=\"collapse\"\n :data-bs-target=\"`#collapse-${annotation.uuid}`\"\n aria-expanded=\"false\"\n aria-controls=\"`#collapse-${annotation.uuid}`\"\n >\n <i class=\"bi bi-card-list\"></i>\n </a>\n <a\n href=\"#\"\n class=\"icon\"\n title=\"Edit geometry (right-click to exit edition, or press Escape to cancel modifications)\"\n @click=\"isEditing ? $emit('stop-edit') : $emit('edit')\"\n >\n <i :class=\"`bi bi-pencil ${isEditing ? 'text-primary' : ''}`\"></i>\n </a>\n <a href=\"#\" class=\"icon\" title=\"Download...\" @click=\"$emit('download')\">\n <i class=\"bi bi-download\"></i>\n </a>\n <a href=\"#\" class=\"icon\" title=\"Delete\" @click=\"$emit('delete')\">\n <i class=\"bi bi-trash\"></i>\n </a>\n </div>\n </div>\n\n <div class=\"collapse m-2\" :id=\"`collapse-${annotation.uuid}`\">\n <EmptyIndicator\n text=\"No properties\"\n v-if=\"Object.entries(annotation.properties).length === 0\"\n />\n <table class=\"table table-striped table-sm table-responsive-sm\" v-else>\n <thead>\n <tr>\n <th>Key</th>\n <th>Value</th>\n </tr>\n </thead>\n <tbody>\n <AttributeItem\n v-for=\"[key, value] of Object.entries(annotation.properties)\"\n :key=\"key\"\n :attr-name=\"key\"\n :attr-value=\"value\"\n />\n </tbody>\n </table>\n </div>\n </li>\n</template>\n\n<style scoped>\n .item {\n padding: 0.1rem;\n }\n\n a {\n text-decoration: none;\n }\n\n a:hover {\n text-decoration: underline;\n }\n\n .icons {\n display: flex;\n }\n\n .title {\n white-space: nowrap;\n display: block;\n width: 100% !important;\n margin-left: 1rem;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .icon {\n padding-left: 0.4rem;\n color: rgb(180, 180, 180);\n }\n\n @media (hover: hover) {\n .icon:hover {\n color: rgb(75, 75, 75);\n }\n }\n</style>\n","import type Named from './Named';\n\ntype AnnotationMode = 'mapOnly' | 'normal' | 'objectsOnly';\n\ntype AnnotationNamed = Named & {\n value: AnnotationMode;\n};\n\nexport const annotationModes: AnnotationNamed[] = [\n { name: 'Default', value: 'normal' },\n {\n description: 'Will only pick points from the map and not to any 3D object',\n name: 'Map only',\n value: 'mapOnly',\n },\n {\n description: 'Will only pick points from 3D objects, and not from the map',\n name: '3D objects only',\n value: 'objectsOnly',\n },\n] as const;\n\nexport default AnnotationMode;\n","<script setup lang=\"ts\">\n import { ref, watch } from 'vue';\n\n import type AnnotationMode from '@/types/AnnotationMode';\n import type Named from '@/types/Named';\n\n import ButtonArea from '@/components/atoms/ButtonArea.vue';\n import ButtonWithIcon from '@/components/atoms/ButtonWithIcon.vue';\n import ImportButton from '@/components/atoms/ImportButton.vue';\n import DropdownView from '@/components/DropdownView.vue';\n import AnnotationItem from '@/components/panels/AnnotationItem.vue';\n import EmptyIndicator from '@/components/panels/EmptyIndicator.vue';\n import SwitchToggle from '@/components/SwitchToggle.vue';\n import { useAnnotationStore } from '@/stores/annotations';\n import { useCameraStore } from '@/stores/camera';\n import Annotation from '@/types/Annotation';\n import { annotationModes } from '@/types/AnnotationMode';\n import Download from '@/utils/Download';\n\n const annotations = useAnnotationStore();\n const cameraStore = useCameraStore();\n\n const annotationMode = ref<AnnotationMode>(annotations.getAnnotationMode());\n watch(annotationMode, newMode => {\n annotations.setAnnotationMode(newMode);\n });\n\n function downloadAnnotation(annotation: Annotation): void {\n const geojson = annotation.toGeoJSON();\n Download.downloadAsJson(geojson, `annotation-${annotation.title}.json`);\n }\n\n function exportAnnotations(): void {\n const geojson = Annotation.toCollection(annotations.getAnnotations());\n Download.downloadAsJson(geojson, 'annotations.json');\n }\n\n function goTo(annotation: Annotation): void {\n cameraStore.lookTopDownAt(annotation.object);\n }\n\n function importAnnotationFile(files: File[]): void {\n annotations.importAnnotationsFiles(files);\n }\n\n function setCurrentMode(src: Named | null): void {\n annotationMode.value = src?.value as AnnotationMode;\n }\n</script>\n\n<template>\n <div class=\"d-flex flex-column h-100\">\n <EmptyIndicator text=\"No annotations\" v-if=\"annotations.count === 0\" />\n\n <ul class=\"list-group list-group-flush flex-fill overflow-auto\">\n <AnnotationItem\n v-for=\"item in annotations.getAnnotations()\"\n :key=\"item.title\"\n :annotation=\"item\"\n :visible=\"item.visible\"\n v-on:update:visible=\"\n () => {\n item.visible = !item.visible;\n $forceUpdate();\n }\n \"\n v-on:edit=\"annotations.edit(item)\"\n v-on:stop-edit=\"annotations.stopEdition()\"\n v-on:delete=\"annotations.remove(item)\"\n v-on:download=\"downloadAnnotation(item)\"\n v-on:zoom=\"goTo(item)\"\n />\n </ul>\n\n <ButtonArea :disabled=\"annotations.isUserDrawing()\" id=\"annotations-fieldset\">\n <SwitchToggle\n v-bind:model-value=\"annotations.showLabels()\"\n v-on:update:model-value=\"v => annotations.setShowLabels(v)\"\n title=\"show labels\"\n >Show annotation labels</SwitchToggle\n >\n <DropdownView\n label=\"Picking mode\"\n description-position=\"top\"\n :current=\"annotationModes[0]\"\n :items=\"annotationModes\"\n @updated:current=\"src => setCurrentMode(src)\"\n class=\"mb-2\"\n />\n <ButtonWithIcon\n title=\"Add point annotation\"\n text=\"New points\"\n icon=\"bi-pin\"\n class=\"btn-primary\"\n @click=\"annotations.createPoint()\"\n />\n <ButtonWithIcon\n title=\"Add line annotation\"\n text=\"New line\"\n icon=\"bi-bezier2\"\n class=\"btn-primary\"\n @click=\"annotations.createLine()\"\n />\n <ButtonWithIcon\n title=\"Add polygon annotation\"\n text=\"New polygon\"\n icon=\"bi-heptagon\"\n class=\"btn-primary\"\n @click=\"annotations.createPolygon()\"\n />\n <ButtonWithIcon\n title=\"Export annotations to GeoJSON\"\n text=\"Export annotations\"\n icon=\"bi-box-arrow-right\"\n class=\"btn-outline-secondary\"\n @click=\"exportAnnotations\"\n />\n <ImportButton\n title=\"Import annotation from GeoJSON\"\n text=\"Import annotations\"\n @import=\"importAnnotationFile\"\n />\n </ButtonArea>\n </div>\n</template>\n","<script setup lang=\"ts\">\n defineProps({\n show: Boolean,\n title: String,\n });\n</script>\n\n<template>\n <div v-if=\"show\">\n <div class=\"background\"></div>\n <div\n :class=\"['modal', 'fade', 'd-block', show ? 'show' : null]\"\n id=\"exampleModal\"\n tabindex=\"-1\"\n aria-labelledby=\"exampleModalLabel\"\n aria-hidden=\"true\"\n >\n <div class=\"modal-dialog\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h1 class=\"modal-title fs-5\" id=\"exampleModalLabel\">{{ title }}</h1>\n <button\n type=\"button\"\n class=\"btn-close\"\n @click=\"$emit('close')\"\n data-bs-dismiss=\"modal\"\n aria-label=\"Close\"\n ></button>\n </div>\n <div class=\"modal-body\"><slot></slot></div>\n <div class=\"modal-footer\">\n <button\n type=\"button\"\n @click=\"$emit('close')\"\n class=\"btn btn-secondary\"\n data-bs-dismiss=\"modal\"\n >\n Close\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n .background {\n opacity: 0.5;\n position: absolute;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background-color: black;\n }\n</style>\n","<script setup lang=\"ts\">\n defineProps(['url', 'name']);\n defineEmits(['delete', 'share', 'goto']);\n</script>\n\n<template>\n <li class=\"list-group-item item d-flex d-flex-end\">\n <a class=\"bookmark\" href=\"#\" @click=\"$emit('goto')\">{{ name }}</a>\n <a href=\"#\" class=\"icon\" title=\"Share this bookmark\" @click=\"$emit('share')\">\n <i class=\"bi bi-share\"></i>\n </a>\n <a href=\"#\" class=\"icon\" title=\"Delete this bookmark\" @click=\"$emit('delete')\">\n <i class=\"bi bi-trash\"></i>\n </a>\n </li>\n</template>\n\n<style scoped>\n .item {\n padding: 0.1rem;\n }\n\n a {\n text-decoration: none;\n }\n\n a:hover {\n text-decoration: underline;\n }\n\n .bookmark {\n width: 100%;\n }\n\n .icon {\n margin-left: 0.2rem;\n width: 1rem !important;\n color: rgb(180, 180, 180);\n }\n\n @media (hover: hover) {\n .icon:hover {\n color: rgb(75, 75, 75);\n }\n }\n\n .spinner-container {\n width: 1rem;\n }\n\n .layer-name {\n width: 40%;\n margin-left: 1rem;\n }\n\n .slider {\n display: flex;\n }\n</style>\n","<script setup lang=\"ts\">\n defineProps<{\n url: string;\n }>();\n\n function copyToClipboard(url: string): void {\n void navigator.clipboard.writeText(url);\n }\n</script>\n\n<template>\n <div>\n <p>Use this link to share your bookmark</p>\n\n <div class=\"input-group mb-3\">\n <span class=\"form-control text-truncate\">{{ url }}</span>\n <span class=\"input-group-text\" id=\"basic-addon2\">\n <a\n title=\"Copy to clipboard\"\n href=\"#\"\n class=\"text-secondary\"\n @click=\"() => copyToClipboard(url)\"\n >\n <i class=\"bi bi-clipboard\"></i>\n </a>\n </span>\n </div>\n </div>\n</template>\n","import { EventDispatcher, Vector3 } from 'three';\n\nimport Download from '@/utils/Download';\n\nimport CameraPosition from './CameraPosition';\n\ntype BookmarkJson = {\n camera: [number, number, number];\n focalOffset: [number, number, number];\n target: [number, number, number];\n};\n\nexport type BookmarkEventMap = {\n delete: {\n /** empty */\n };\n goto: {\n /** empty */\n };\n};\n\nexport type SerializedBookmark = {\n title: string;\n url: string;\n};\n\nexport default class Bookmark extends EventDispatcher<BookmarkEventMap> {\n public readonly camera: CameraPosition;\n public readonly name: string;\n\n public constructor(name: string, camera: CameraPosition) {\n super();\n this.name = name;\n this.camera = camera;\n }\n\n public static new(name: string, urlString: string): Bookmark {\n const url = new URL(urlString);\n const view = url.searchParams.get('view');\n if (view === null) {\n throw new Error('Could not deserialize bookmark');\n }\n const json: BookmarkJson = JSON.parse(view);\n\n const camera = new Vector3(json.camera[0], json.camera[1], json.camera[2]);\n const target = new Vector3(json.target[0], json.target[1], json.target[2]);\n const focalOffset = new Vector3(\n json.focalOffset[0],\n json.focalOffset[1],\n json.focalOffset[2],\n );\n\n const cameraPosition = new CameraPosition(camera, target, focalOffset);\n\n return new Bookmark(name, cameraPosition);\n }\n\n public delete(): void {\n this.dispatchEvent({ type: 'delete' });\n }\n\n public getUrl(): URL {\n const base = Download.getBaseUrl() + '?';\n const cam = this.camera;\n const json: BookmarkJson = {\n camera: [cam.camera.x, cam.camera.y, cam.camera.z],\n focalOffset: [cam.focalOffset.x, cam.focalOffset.y, cam.focalOffset.z],\n target: [cam.target.x, cam.target.y, cam.target.z],\n };\n\n const url = new URL(base);\n const params = url.searchParams;\n\n params.set('tour', 'none');\n params.set('view', JSON.stringify(json));\n\n return url;\n }\n\n public goTo(): void {\n this.dispatchEvent({ type: 'goto' });\n }\n}\n","import { defineStore } from 'pinia';\nimport { Vector3 } from 'three';\nimport { computed, ref } from 'vue';\n\nimport { getConfig } from '@/config-loader';\nimport { GLOBAL_EVENT_DISPATCHER } from '@/events';\nimport Bookmark from '@/types/Bookmark';\nimport CameraPosition from '@/types/CameraPosition';\n\nfunction buildInitialList(): Bookmark[] {\n const config = getConfig();\n const result: Bookmark[] = [];\n\n for (const conf of config.bookmarks) {\n const pos = conf.position;\n const target = conf.target;\n const fo = conf.focalOffset;\n const title = conf.title;\n\n const cameraPosition = new CameraPosition(\n new Vector3(pos.x, pos.y, pos.z),\n new Vector3(target.x, target.y, target.z),\n new Vector3(fo.x, fo.y, fo.z),\n );\n\n result.push(new Bookmark(title, cameraPosition));\n }\n\n return result;\n}\n\nexport const useBookmarkStore = defineStore('bookmarks', () => {\n const bookmarks = ref<Set<Bookmark>>(new Set(buildInitialList()));\n const count = computed(() => bookmarks.value.size);\n\n function add(bookmark: Bookmark): void {\n bookmarks.value.add(bookmark);\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({ type: 'bookmark-added', value: bookmark });\n }\n\n function remove(bookmark: Bookmark): void {\n bookmarks.value.delete(bookmark);\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({ type: 'bookmark-removed', value: bookmark });\n }\n\n function clear(): void {\n bookmarks.value.clear();\n }\n\n function getBookmarks(): Bookmark[] {\n return [...bookmarks.value];\n }\n\n return { add, clear, count, getBookmarks, remove };\n});\n\nexport type BookmarkStore = ReturnType<typeof useBookmarkStore>;\n","<script setup lang=\"ts\">\n import { ref } from 'vue';\n\n import ButtonArea from '@/components/atoms/ButtonArea.vue';\n import ButtonWithIcon from '@/components/atoms/ButtonWithIcon.vue';\n import ImportButton from '@/components/atoms/ImportButton.vue';\n import ModalOverlay from '@/components/ModalOverlay.vue';\n import BookmarkItem from '@/components/panels/BookmarkItem.vue';\n import EmptyIndicator from '@/components/panels/EmptyIndicator.vue';\n import ShareBookmarkModal from '@/components/panels/ShareBookmarkModal.vue';\n import { useBookmarkStore } from '@/stores/bookmarks';\n import { useCameraStore } from '@/stores/camera';\n import { useNotificationStore } from '@/stores/notifications';\n import Bookmark, { type SerializedBookmark } from '@/types/Bookmark';\n import Notification from '@/types/Notification';\n import Download from '@/utils/Download';\n\n const showShareModal = ref(false);\n const shareUrl = ref<string | null>(null);\n const modalTitle = ref<string | null>(null);\n\n const notificationStore = useNotificationStore();\n const bookmarkStore = useBookmarkStore();\n const cameraStore = useCameraStore();\n\n function addBookmark(): void {\n const name = window.prompt('Bookmark name', 'New bookmark');\n if (name != null) {\n const bookmark = new Bookmark(name, cameraStore.getCameraPosition());\n bookmarkStore.add(bookmark);\n }\n }\n\n function exportBookmarks(): void {\n const json = [];\n for (const bookmark of bookmarkStore.getBookmarks()) {\n json.push({\n title: bookmark.name,\n url: bookmark.getUrl().toString(),\n });\n }\n Download.downloadAsJson(json, 'bookmarks.json');\n }\n\n function goTo(bookmark: Bookmark): void {\n cameraStore.setCameraPosition(bookmark.camera);\n }\n\n function importBookmarkFile(files: File[]): void {\n for (const file of files) {\n void importBookmarks(file);\n }\n }\n\n async function importBookmarks(file: Blob): Promise<void> {\n const str = await file.text();\n const serializedBookmarks: SerializedBookmark[] = JSON.parse(str);\n\n const existingBookmarks = new Set(bookmarkStore.getBookmarks().map(b => b.name));\n\n let nbImported = 0;\n let nbSkipped = 0;\n\n serializedBookmarks.forEach((bookmark: SerializedBookmark) => {\n if (!existingBookmarks.has(bookmark.title)) {\n bookmarkStore.add(Bookmark.new(bookmark.title, bookmark.url));\n nbImported++;\n } else {\n nbSkipped++;\n }\n });\n\n notificationStore.push(\n new Notification(\n 'Bookmarks',\n `${nbImported} bookmarks imported (${nbSkipped} skipped)`,\n 'success',\n ),\n );\n }\n\n function shareBookmark(bookmark: Bookmark): void {\n shareUrl.value = bookmark.getUrl().toString();\n modalTitle.value = 'Share bookmark';\n showShareModal.value = true;\n }\n\n function shareCurrentView(): void {\n const temp = new Bookmark('temp', cameraStore.getCameraPosition());\n shareUrl.value = temp.getUrl().toString();\n modalTitle.value = 'Share current view';\n showShareModal.value = true;\n }\n</script>\n\n<template>\n <div class=\"d-flex flex-column h-100\">\n <EmptyIndicator text=\"No bookmarks\" v-if=\"bookmarkStore.count === 0\" />\n\n <ul class=\"list-group list-group-flush flex-fill overflow-auto\">\n <BookmarkItem\n v-for=\"bookmark in bookmarkStore.getBookmarks()\"\n :key=\"bookmark.name\"\n :name=\"bookmark.name\"\n v-on:share=\"shareBookmark(bookmark)\"\n v-on:delete=\"bookmarkStore.remove(bookmark)\"\n v-on:goto=\"goTo(bookmark)\"\n />\n </ul>\n\n <ButtonArea>\n <ButtonWithIcon\n text=\"New bookmark\"\n icon=\"bi-plus-lg\"\n title=\"Create a new bookmark from the current view\"\n class=\"btn-primary\"\n @click=\"\n () => {\n addBookmark();\n $forceUpdate();\n }\n \"\n />\n <ButtonWithIcon\n text=\"Share view\"\n icon=\"bi-share\"\n title=\"Share current view\"\n class=\"btn-outline-secondary\"\n @click=\"shareCurrentView\"\n />\n <ButtonWithIcon\n title=\"Export bookmarks to GeoJSON\"\n class=\"btn-outline-secondary\"\n @click=\"exportBookmarks\"\n icon=\"bi-box-arrow-right\"\n text=\"Export bookmarks\"\n />\n <ImportButton\n title=\"Import bookmarks from GeoJSON\"\n text=\"Import bookmarks\"\n @import=\"importBookmarkFile\"\n />\n </ButtonArea>\n </div>\n\n <!-- FIXME the modal popup background does not take the entire screen -->\n <!-- FIXME the modal popup slightly changes the layout of the page when it appears -->\n <ModalOverlay\n :show=\"showShareModal\"\n :title=\"modalTitle as string\"\n v-on:close=\"() => (showShareModal = false)\"\n >\n <ShareBookmarkModal :url=\"shareUrl as string\" />\n </ModalOverlay>\n</template>\n","<template>\n <ul class=\"list-group list-group-flush border-start\">\n <slot></slot>\n </ul>\n</template>\n\n<style scoped>\n :slotted(li.list-group-item) {\n padding-top: 0;\n padding-bottom: 0;\n margin-left: 0.25rem;\n padding-left: 0;\n padding-right: 0;\n }\n</style>\n","<script setup lang=\"ts\">\n import { MathUtils } from 'three';\n import { onMounted, ref } from 'vue';\n\n const props = defineProps<{\n expanded?: boolean;\n iconPosition?: 'left' | 'right';\n title: string;\n }>();\n const emit = defineEmits(['update:expanded']);\n\n const id = MathUtils.generateUUID();\n const target = `#${id}`;\n\n const collapsible = ref<HTMLDivElement | null>(null);\n\n onMounted(() => {\n if (props.expanded) {\n collapsible.value?.classList.add('show');\n }\n\n collapsible.value?.addEventListener('hidden.bs.collapse', () =>\n emit('update:expanded', false),\n );\n collapsible.value?.addEventListener('shown.bs.collapse', () =>\n emit('update:expanded', true),\n );\n });\n</script>\n\n<template>\n <div>\n <h6>\n <a\n class=\"d-flex text-nowrap text-truncate overflow-hidden link-underline link-underline-opacity-0 link-underline-opacity-75-hover link-body-emphasis\"\n :href=\"target\"\n data-bs-toggle=\"collapse\"\n role=\"button\"\n :aria-expanded=\"expanded\"\n :aria-controls=\"id\"\n >\n <div v-if=\"iconPosition === 'left'\" class=\"icon me-2\">\n <i class=\"bi bi-chevron-down\"></i>\n </div>\n <span class=\"flex-fill\">{{ title }}</span>\n <div v-if=\"iconPosition !== 'left'\" class=\"icon ms-2\">\n <i class=\"bi bi-chevron-down\"></i>\n </div>\n </a>\n </h6>\n <div ref=\"collapsible\" :id=\"id\" class=\"collapse\">\n <slot></slot>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n defineProps<{\n title?: string;\n }>();\n</script>\n\n<template>\n <div\n class=\"d-inline-block flex-fill text-nowrap text-truncate overflow-hidden px-1\"\n :class=\"$attrs.class\"\n >\n {{ title }}\n </div>\n</template>\n","<script setup lang=\"ts\">\n defineProps<{\n opacity: number;\n size?: 'normal' | 'small';\n }>();\n defineEmits(['update:opacity']);\n</script>\n\n<template>\n <div class=\"slider d-flex\">\n <i v-if=\"size !== 'small'\" title=\"Transparent\" class=\"bi-x-diamond me-1\"></i>\n <i v-if=\"size === 'small'\" title=\"Opacity\" class=\"bi-x-diamond-fill opacity-75 me-1\"></i>\n <input\n title=\"Opacity\"\n type=\"range\"\n class=\"form-range\"\n min=\"0\"\n step=\"0.01\"\n max=\"1\"\n @input=\"\n $emit(\n 'update:opacity',\n Number.parseFloat(($event.target as HTMLInputElement).value),\n )\n \"\n :value=\"opacity\"\n />\n <i v-if=\"size !== 'small'\" title=\"Opaque\" class=\"bi-x-diamond-fill ms-1\"></i>\n </div>\n</template>\n\n<style scoped>\n input {\n display: flex;\n border-color: lightgray;\n border-style: solid;\n border-width: 1px;\n border-radius: 0.5rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { LayerType } from '@/types/configuration/layers';\n\n import Icon from '@/components/atoms/Icon.vue';\n import IconList from '@/components/atoms/IconList.vue';\n import ListLabel from '@/components/atoms/ListLabel.vue';\n import OpacitySlider from '@/components/OpacitySlider.vue';\n import VisibilityControl from '@/components/VisibilityControl.vue';\n\n defineProps<{\n hasOpacitySlider: boolean;\n isLoading: boolean;\n name: string;\n opacity: number;\n type: 'graticule' | LayerType;\n visible: boolean;\n }>();\n\n defineEmits(['update:opacity', 'update:visible']);\n\n const icons: Record<'graticule' | LayerType, string> = {\n color: 'fg-landcover-map',\n elevation: 'fg-profile',\n graticule: 'fg-grid',\n mask: 'bi-mask',\n };\n const iconTitles: Record<'graticule' | LayerType, string> = {\n color: 'Color layer',\n elevation: 'Elevation layer',\n graticule: 'Graticule',\n mask: 'Mask layer',\n };\n</script>\n\n<template>\n <li class=\"list-group-item\">\n <div class=\"d-flex\">\n <IconList class=\"me-1 text-body-tertiary\">\n <Icon :icon=\"icons[type]\" :title=\"iconTitles[type]\" />\n </IconList>\n <VisibilityControl\n :visible=\"visible\"\n v-on:update:visible=\"v => $emit('update:visible', v)\"\n />\n <ListLabel :title=\"name\" class=\"label\" :class=\"!visible ? 'disabled' : null\" />\n <OpacitySlider\n v-if=\"hasOpacitySlider\"\n class=\"opacity-slider\"\n :class=\"!visible ? 'disabled' : null\"\n :opacity=\"opacity\"\n @update:opacity=\"v => $emit('update:opacity', v)\"\n />\n </div>\n </li>\n</template>\n\n<style scoped>\n .label {\n min-width: 50%;\n }\n\n .opacity-slider {\n min-width: 100px;\n }\n</style>\n","<template>\n <div class=\"spinner-border spinner-border-sm text-secondary\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { MathUtils } from 'three';\n import { reactive, ref, watch } from 'vue';\n\n import type { Datagroup } from '@/types/Dataset';\n\n import CompactList from '@/components/atoms/CompactList.vue';\n import IconList from '@/components/atoms/IconList.vue';\n import IconListButton from '@/components/atoms/IconListButton.vue';\n import ListLabelButton from '@/components/atoms/ListLabelButton.vue';\n import DatasetOrGroupItem from '@/components/panels/DatasetOrGroupItem.vue';\n import SpinnerControl from '@/components/SpinnerControl.vue';\n import VisibilityControl from '@/components/VisibilityControl.vue';\n\n const props = defineProps<{\n group: Datagroup;\n }>();\n\n defineEmits(['zoom', 'clipTo', 'update:toggle-grid', 'update:toggle-mask', 'update:visible']);\n\n const leafs = reactive(props.group.leafs());\n const hasLeafPreloading = ref(false);\n const hasLeafPreloaded = ref(false);\n const isVisible = ref(props.group.visible);\n watch(leafs, newValues => {\n hasLeafPreloading.value = newValues.some(v => v.isPreloading);\n hasLeafPreloaded.value = newValues.some(v => v.isPreloaded);\n isVisible.value = newValues.some(v => v.visible);\n });\n\n const id = MathUtils.generateUUID();\n const target = `#${id}`;\n</script>\n\n<template>\n <div class=\"d-flex\">\n <IconList class=\"me-1 text-body-tertiary\">\n <i class=\"bi bi-folder2\" title=\"Group\" />\n </IconList>\n <VisibilityControl\n :visible=\"isVisible\"\n @update:visible=\"v => $emit('update:visible', group, v)\"\n />\n <IconList class=\"me-1\">\n <IconListButton\n title=\"Expand group\"\n icon=\"bi-chevron-down\"\n data-bs-toggle=\"collapse\"\n :data-bs-target=\"target\"\n :aria-controls=\"id\"\n aria-expanded=\"false\"\n />\n </IconList>\n <ListLabelButton\n class=\"label\"\n :disabled=\"!isVisible || !hasLeafPreloaded\"\n :text=\"group.name\"\n :title=\"`Zoom to ${group.name}`\"\n @click=\"$emit('zoom', group)\"\n />\n <IconList class=\"ms-1\">\n <div v-if=\"hasLeafPreloading\" class=\"icon spinner d-inline-block\">\n <SpinnerControl title=\"Loading...\" />\n </div>\n <IconListButton\n v-if=\"\n hasLeafPreloaded &&\n (group.config.canMaskBasemap || group.config.isMaskingBasemap)\n \"\n title=\"Toggle basemap masking\"\n icon=\"bi-mask\"\n @click=\"$emit('update:toggle-mask', group)\"\n />\n <IconListButton\n v-if=\"hasLeafPreloaded\"\n title=\"Clip to\"\n icon=\"bi-bounding-box\"\n @click=\"$emit('clipTo', group)\"\n />\n <IconListButton\n v-if=\"hasLeafPreloaded\"\n title=\"Toggle 3D grid\"\n icon=\"bi-box\"\n @click=\"$emit('update:toggle-grid', group)\"\n />\n </IconList>\n </div>\n\n <CompactList :id=\"id\" class=\"collapse pb-3\">\n <template v-if=\"group.children.length > 0\">\n <DatasetOrGroupItem\n v-for=\"dataset of group.children\"\n :key=\"dataset.name\"\n :dataset=\"dataset\"\n @zoom=\"ds => $emit('zoom', ds)\"\n @clip-to=\"ds => $emit('clipTo', ds)\"\n @update:toggle-grid=\"ds => $emit('update:toggle-grid', ds)\"\n @update:toggle-mask=\"ds => $emit('update:toggle-mask', ds)\"\n @update:visible=\"(ds, v) => $emit('update:visible', ds, v)\"\n />\n </template>\n <template v-else>\n <li class=\"list-group-item\">No dataset in this group</li>\n </template>\n </CompactList>\n</template>\n\n<style scoped>\n .label {\n min-width: 50%;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { Dataset } from '@/types/Dataset';\n\n import Icon from '@/components/atoms/Icon.vue';\n import IconList from '@/components/atoms/IconList.vue';\n import IconListButton from '@/components/atoms/IconListButton.vue';\n import ListLabelButton from '@/components/atoms/ListLabelButton.vue';\n import { datasetIcons, datasetTitles, propertyViews } from '@/components/Configuration';\n import SpinnerControl from '@/components/SpinnerControl.vue';\n import VisibilityControl from '@/components/VisibilityControl.vue';\n import { useDatasetStore } from '@/stores/datasets';\n import { refAndWatch } from '@/utils/Components';\n\n const store = useDatasetStore();\n\n const props = defineProps<{\n dataset: Dataset;\n }>();\n\n defineEmits(['zoom', 'clipTo', 'update:toggle-grid', 'update:toggle-mask', 'update:visible']);\n\n const isPreloading = refAndWatch(props.dataset, 'isPreloading');\n const isPreloaded = refAndWatch(props.dataset, 'isPreloaded');\n const isVisible = refAndWatch(props.dataset, 'visible');\n\n function deleteDataset(): void {\n store.remove(props.dataset);\n }\n</script>\n\n<template>\n <div class=\"d-flex\">\n <IconList class=\"me-1 text-body-tertiary\">\n <Icon\n :icon=\"datasetIcons[dataset.type] ?? 'bi-file-earmark-x'\"\n :title=\"datasetTitles[dataset.type] ?? 'Unknown'\"\n />\n </IconList>\n <VisibilityControl\n :visible=\"isVisible\"\n @update:visible=\"v => $emit('update:visible', dataset, v)\"\n />\n <ListLabelButton\n class=\"label\"\n :disabled=\"!isVisible || !isPreloaded\"\n :text=\"dataset.name\"\n :title=\"`Zoom to ${dataset.name}`\"\n @click=\"$emit('zoom', dataset)\"\n />\n <IconList class=\"ms-1\">\n <div v-if=\"isPreloading\" class=\"icon spinner d-inline-block\">\n <SpinnerControl title=\"Loading...\" />\n </div>\n <IconListButton\n v-if=\"propertyViews.has(dataset.type) && isPreloaded\"\n title=\"Show dataset properties\"\n icon=\"bi-card-list\"\n data-bs-toggle=\"collapse\"\n :data-bs-target=\"`#collapse-${dataset.uuid}`\"\n :aria-controls=\"`collapse-${dataset.uuid}`\"\n aria-expanded=\"false\"\n />\n <IconListButton\n v-if=\"\n isPreloaded &&\n (('canMaskBasemap' in dataset.config && dataset.config.canMaskBasemap) ||\n ('isMaskingBasemap' in dataset.config && dataset.config.isMaskingBasemap))\n \"\n title=\"Toggle basemap masking\"\n icon=\"bi-mask\"\n @click=\"$emit('update:toggle-mask', dataset)\"\n />\n <IconListButton\n v-if=\"isPreloaded\"\n title=\"Clip to\"\n icon=\"bi-bounding-box\"\n @click=\"$emit('clipTo', dataset)\"\n />\n <IconListButton\n v-if=\"isPreloaded\"\n title=\"Toggle 3D grid\"\n icon=\"bi-box\"\n @click=\"$emit('update:toggle-grid', dataset)\"\n />\n <IconListButton title=\"Delete this dataset\" icon=\"bi-trash\" @click=\"deleteDataset\" />\n </IconList>\n </div>\n <!-- Property view -->\n <div\n v-if=\"propertyViews.has(dataset.type)\"\n class=\"collapse m-2\"\n :id=\"`collapse-${dataset.uuid}`\"\n >\n <component :is=\"propertyViews.get(dataset.type)\" :dataset=\"dataset\"></component>\n </div>\n</template>\n\n<style scoped>\n .label {\n min-width: 50%;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { DatasetOrGroup } from '@/types/Dataset';\n\n import DatagroupItem from '@/components/panels/DatagroupItem.vue';\n import DatasetItem from '@/components/panels/DatasetItem.vue';\n import { Datagroup } from '@/types/Dataset';\n\n defineProps<{\n dataset: DatasetOrGroup;\n }>();\n\n defineEmits(['zoom', 'clipTo', 'update:toggle-grid', 'update:toggle-mask', 'update:visible']);\n</script>\n\n<template>\n <li class=\"list-group-item\">\n <DatagroupItem\n v-if=\"Datagroup.isGroup(dataset)\"\n :group=\"dataset\"\n @zoom=\"ds => $emit('zoom', ds)\"\n @clip-to=\"ds => $emit('clipTo', ds)\"\n @update:toggle-grid=\"ds => $emit('update:toggle-grid', ds)\"\n @update:toggle-mask=\"ds => $emit('update:toggle-mask', ds)\"\n @update:visible=\"(ds, v) => $emit('update:visible', ds, v)\"\n />\n <DatasetItem\n v-else\n :dataset=\"dataset\"\n @zoom=\"ds => $emit('zoom', ds)\"\n @clip-to=\"ds => $emit('clipTo', ds)\"\n @update:toggle-grid=\"ds => $emit('update:toggle-grid', ds)\"\n @update:toggle-mask=\"ds => $emit('update:toggle-mask', ds)\"\n @update:visible=\"(ds, v) => $emit('update:visible', ds, v)\"\n />\n </li>\n</template>\n","<script setup lang=\"ts\">\n import Icon from '@/components/atoms/Icon.vue';\n import IconList from '@/components/atoms/IconList.vue';\n import IconListButton from '@/components/atoms/IconListButton.vue';\n import ListLabelButton from '@/components/atoms/ListLabelButton.vue';\n import OpacitySlider from '@/components/OpacitySlider.vue';\n import VisibilityControl from '@/components/VisibilityControl.vue';\n\n defineProps<{\n name: string;\n opacity: number;\n visible: boolean;\n }>();\n defineEmits(['update:visible', 'update:opacity', 'update:move-up', 'update:move-down', 'zoom']);\n</script>\n\n<template>\n <li class=\"list-group-item d-flex\">\n <IconList class=\"me-1 text-body-tertiary\">\n <Icon icon=\"fg-contour-map\" title=\"Overlay\" />\n </IconList>\n <VisibilityControl :visible=\"visible\" @update:visible=\"v => $emit('update:visible', v)\" />\n <ListLabelButton\n class=\"label\"\n :disabled=\"!visible\"\n :title=\"`Zoom to ${name}`\"\n :text=\"name\"\n @click=\"$emit('zoom')\"\n />\n\n <OpacitySlider\n class=\"opacity-slider\"\n :class=\"!visible ? 'disabled' : null\"\n :opacity=\"opacity\"\n size=\"small\"\n @update:opacity=\"v => $emit('update:opacity', v)\"\n />\n <IconList class=\"ms-1\">\n <IconListButton title=\"Move up\" icon=\"bi-arrow-up\" @click=\"$emit('update:move-up')\" />\n <IconListButton\n title=\"Move down\"\n icon=\"bi-arrow-down\"\n @click=\"$emit('update:move-down')\"\n />\n </IconList>\n </li>\n</template>\n\n<style scoped>\n .label {\n min-width: 50%;\n }\n\n .opacity-slider {\n min-width: 100px;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { DatasetOrGroup } from '@/types/Dataset';\n\n import ButtonArea from '@/components/atoms/ButtonArea.vue';\n import CompactList from '@/components/atoms/CompactList.vue';\n import ImportButton from '@/components/atoms/ImportButton.vue';\n import SectionCollapsible from '@/components/atoms/SectionCollapsible.vue';\n import BasemapItem from '@/components/panels/BasemapItem.vue';\n import DatasetOrGroupItem from '@/components/panels/DatasetOrGroupItem.vue';\n import OverlayItem from '@/components/panels/OverlayItem.vue';\n import { useAnalysisStore } from '@/stores/analysis';\n import { useCameraStore } from '@/stores/camera';\n import { useDatasetStore } from '@/stores/datasets';\n import { useLayerStore } from '@/stores/layers';\n\n const datasets = useDatasetStore();\n const camera = useCameraStore();\n const analysis = useAnalysisStore();\n const layers = useLayerStore();\n\n function clipToDataset(dataset: DatasetOrGroup): void {\n const box = datasets.getBoundingBox(dataset);\n if (!box?.isEmpty()) {\n analysis.setClippingBox(box);\n analysis.enableClippingBox(true);\n }\n }\n\n function importDataset(files: File[]): void {\n for (const file of files) {\n datasets.importFromFile(file);\n }\n }\n\n function importDatasetFromUrl(): void {\n const url = document.getElementById('dataset-import-url') as HTMLInputElement;\n datasets.importFromFile(url.value);\n }\n\n function zoomOnDataset(dataset: DatasetOrGroup): void {\n const box = datasets.getBoundingBox(dataset);\n if (!box?.isEmpty()) {\n camera.lookTopDownAt(box);\n }\n }\n</script>\n\n<template>\n <div class=\"d-flex flex-column h-100\">\n <div class=\"flex-fill overflow-auto\">\n <SectionCollapsible\n title=\"Basemaps\"\n icon-position=\"left\"\n id=\"basemap-list\"\n class=\"border-bottom mb-3\"\n >\n <CompactList id=\"layers-list-group\">\n <BasemapItem\n v-if=\"layers.getGraticuleLayer() !== undefined\"\n type=\"graticule\"\n :opacity=\"1\"\n :name=\"layers.getGraticuleLayer()!.name\"\n :isLoading=\"false\"\n :visible=\"layers.getGraticuleLayer()!.visible\"\n :hasOpacitySlider=\"false\"\n @update:visible=\"v => (layers.getGraticuleLayer()!.visible = v)\"\n />\n\n <BasemapItem\n v-for=\"layer in layers.getBasemaps()\"\n :key=\"layer.name\"\n :type=\"layer.type\"\n :opacity=\"layer.opacity\"\n :name=\"layer.name\"\n :isLoading=\"layer.isLoading\"\n :visible=\"layer.visible\"\n :hasOpacitySlider=\"layer.type === 'color' || layer.type === 'elevation'\"\n @update:visible=\"v => layers.setBasemapVisibility(layer, v)\"\n @update:opacity=\"v => layers.setBasemapOpacity(layer, v)\"\n /> </CompactList\n ></SectionCollapsible>\n <SectionCollapsible\n v-if=\"layers.overlayCount > 0\"\n title=\"Overlays\"\n icon-position=\"left\"\n id=\"overlay-list\"\n class=\"border-bottom mb-3\"\n >\n <CompactList>\n <OverlayItem\n v-for=\"layer in layers.getOverlays()\"\n :key=\"layer.name\"\n :opacity=\"layer.opacity\"\n :name=\"layer.name\"\n :visible=\"layer.visible\"\n @update:visible=\"v => layers.setOverlayVisibility(layer, v)\"\n @update:opacity=\"v => layers.setOverlayOpacity(layer, v)\"\n @update:move-up=\"layers.moveOverlayUp(layer)\"\n @update:move-down=\"layers.moveOverlayDown(layer)\" /></CompactList\n ></SectionCollapsible>\n <SectionCollapsible\n title=\"Datasets\"\n :expanded=\"true\"\n icon-position=\"left\"\n id=\"dataset-list\"\n >\n <CompactList>\n <DatasetOrGroupItem\n v-for=\"dataset of datasets.getTree()\"\n :key=\"dataset.name\"\n :dataset=\"dataset\"\n @updated=\"$forceUpdate()\"\n @zoom=\"ds => zoomOnDataset(ds)\"\n @clip-to=\"ds => clipToDataset(ds)\"\n @update:toggle-grid=\"ds => datasets.toggleGrid(ds)\"\n @update:toggle-mask=\"ds => datasets.toggleMask(ds)\"\n @update:visible=\"(ds, v) => datasets.setVisible(ds, v)\"\n />\n </CompactList>\n </SectionCollapsible>\n </div>\n\n <ButtonArea>\n <div class=\"input-group mb-3\">\n <input\n type=\"text\"\n id=\"dataset-import-url\"\n class=\"form-control\"\n placeholder=\"https://\"\n aria-label=\"URL to import\"\n aria-describedby=\"button-dataset-import-url\"\n />\n <button\n @click=\"importDatasetFromUrl\"\n class=\"btn btn-outline-secondary\"\n type=\"button\"\n id=\"button-dataset-import-url\"\n >\n Import URL\n </button>\n </div>\n\n <ImportButton title=\"Import file\" text=\"Import file\" @import=\"importDataset\" />\n </ButtonArea>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import type Measure from '@/types/Measure';\n\n import VisibilityControl from '../VisibilityControl.vue';\n\n defineProps<{\n measure: Measure;\n visible: boolean;\n }>();\n defineEmits(['delete', 'download', 'update:visible', 'zoom']);\n</script>\n\n<template>\n <li class=\"list-group-item item\">\n <div class=\"d-flex\">\n <VisibilityControl\n :visible=\"visible\"\n v-on:update:visible=\"v => $emit('update:visible', v)\"\n />\n\n <a class=\"title\" :title=\"measure.title\" href=\"#\" @click=\"$emit('zoom')\"\n >{{ measure.title }} ({{ measure.object.length.toFixed(2) }}m)</a\n >\n\n <div class=\"icons\">\n <a href=\"#\" class=\"icon\" title=\"Delete\" @click=\"$emit('delete')\">\n <i class=\"bi bi-trash\"></i>\n </a>\n </div>\n </div>\n </li>\n</template>\n\n<style scoped>\n .item {\n padding: 0.1rem;\n }\n\n a {\n text-decoration: none;\n }\n\n a:hover {\n text-decoration: underline;\n }\n\n .icons {\n display: flex;\n }\n\n .title {\n white-space: nowrap;\n display: block;\n width: 100% !important;\n margin-left: 1rem;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .icon {\n padding-left: 0.4rem;\n color: rgb(180, 180, 180);\n }\n\n @media (hover: hover) {\n .icon:hover {\n color: rgb(75, 75, 75);\n }\n }\n</style>\n","import type Named from './Named';\n\ntype MeasurementMode = 'laser';\n\ntype MeasurementNamed = Named & {\n value: MeasurementMode;\n};\n\nexport const measurementModes: MeasurementNamed[] = [\n {\n description:\n 'Will automatically beam perpendicularly to the selected point until a geometry is hit',\n name: 'Laser',\n value: 'laser',\n },\n] as const;\n\nexport default MeasurementMode;\n","<script setup lang=\"ts\">\n import { ref, watch } from 'vue';\n\n import type MeasurementMode from '@/types/MeasurementMode';\n import type Named from '@/types/Named';\n\n import ButtonArea from '@/components/atoms/ButtonArea.vue';\n import ButtonWithIcon from '@/components/atoms/ButtonWithIcon.vue';\n import ImportButton from '@/components/atoms/ImportButton.vue';\n import DropdownView from '@/components/DropdownView.vue';\n import EmptyIndicator from '@/components/panels/EmptyIndicator.vue';\n import MeasurementItem from '@/components/panels/MeasurementItem.vue';\n import { useCameraStore } from '@/stores/camera';\n import { useMeasurementStore } from '@/stores/measurement';\n import Measure from '@/types/Measure';\n import { measurementModes } from '@/types/MeasurementMode';\n import Download from '@/utils/Download';\n\n const measures = useMeasurementStore();\n const cameraStore = useCameraStore();\n\n const measurementMode = ref<MeasurementMode>(measures.getMeasurementMode());\n watch(measurementMode, newMode => {\n measures.setMeasurementMode(newMode);\n });\n\n function downloadMeasure(measure: Measure): void {\n const geojson = measure.toGeoJSON();\n Download.downloadAsJson(geojson, `measure-${measure.title}.json`);\n }\n\n function exportMeasures(): void {\n const geojson = Measure.toCollection(measures.getMeasures());\n Download.downloadAsJson(geojson, 'measures.json');\n }\n\n function goTo(measure: Measure): void {\n cameraStore.lookTopDownAt(measure.object);\n }\n\n function importMeasureFile(files: File[]): void {\n measures.importMeasureFiles(files);\n }\n\n function setCurrentMode(src: Named | null): void {\n measurementMode.value = src?.value as MeasurementMode;\n }\n</script>\n\n<template>\n <div class=\"d-flex flex-column h-100\">\n <div class=\"alert alert-warning py-2\" role=\"alert\">\n <i class=\"bi bi-cone-striped\"></i> This feature is experimental\n </div>\n\n <EmptyIndicator text=\"No measurements\" v-if=\"measures.count === 0\" />\n\n <ul class=\"list-group list-group-flush flex-fill overflow-auto\">\n <MeasurementItem\n v-for=\"item in measures.getMeasures()\"\n :key=\"item.title\"\n :measure=\"item\"\n :visible=\"item.visible\"\n v-on:update:visible=\"\n () => {\n item.visible = !item.visible;\n $forceUpdate();\n }\n \"\n v-on:delete=\"measures.remove(item)\"\n v-on:download=\"downloadMeasure(item)\"\n v-on:zoom=\"goTo(item)\"\n />\n </ul>\n\n <ButtonArea id=\"measures-fieldset\">\n <DropdownView\n label=\"Mode\"\n description-position=\"top\"\n :current=\"measurementModes[0]\"\n :items=\"measurementModes\"\n @updated:current=\"src => setCurrentMode(src)\"\n class=\"mb-2\"\n />\n <ButtonWithIcon\n v-if=\"measures.isUserMeasuring()\"\n title=\"Stop measuring\"\n text=\"Stop measuring\"\n icon=\"bi-stop-circle\"\n class=\"btn-primary\"\n @click=\"measures.end()\"\n />\n <ButtonWithIcon\n v-else\n title=\"Start measuring\"\n text=\"Start measuring\"\n icon=\"bi-rulers\"\n class=\"btn-primary\"\n @click=\"measures.start()\"\n />\n <ButtonWithIcon\n title=\"Export measures to GeoJSON\"\n class=\"btn-outline-secondary\"\n @click=\"exportMeasures\"\n icon=\"bi-box-arrow-right\"\n text=\"Export measures\"\n />\n <ImportButton\n title=\"Import measures from GeoJSON\"\n text=\"Import measures\"\n @import=\"importMeasureFile\"\n />\n </ButtonArea>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import type { PanelType } from './Configuration';\n\n import getConfigurationPanels from './Configuration';\n import AboutPanel from './panels/AboutPanel.vue';\n import AnalysisPanel from './panels/AnalysisPanel.vue';\n import AnnotationPanel from './panels/AnnotationPanel.vue';\n import BookmarkPanel from './panels/BookmarkPanel.vue';\n import DatasetPanel from './panels/DatasetPanel.vue';\n import MeasurementPanel from './panels/MeasurementPanel.vue';\n\n defineProps<{\n /**\n * The name of the panel (must match the tooltip\n * of the corresponding tool in the toolbar)\n */\n selected: PanelType | null;\n }>();\n\n const panels = getConfigurationPanels();\n const gitCommit = import.meta.env.VITE_GIT_COMMIT;\n</script>\n\n<template>\n <div class=\"panel\" id=\"panel-container\">\n <h5 class=\"title\">\n {{ panels.find(p => p.key === selected)?.title }}\n <span\n v-if=\"selected === 'about'\"\n class=\"badge text-bg-primary rounded-pill float-end\"\n title=\"Version\"\n >Version: {{ gitCommit }}</span\n >\n </h5>\n <div class=\"content\">\n <DatasetPanel v-if=\"selected === 'datasets'\" />\n <AboutPanel v-if=\"selected === 'about'\" />\n <BookmarkPanel v-if=\"selected === 'bookmarks'\" />\n <AnalysisPanel v-if=\"selected === 'analysis'\" />\n <AnnotationPanel v-if=\"selected === 'annotations'\" />\n <MeasurementPanel v-if=\"selected === 'measures'\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n .title {\n margin: 1rem;\n }\n\n .content {\n flex-grow: 1;\n overflow: auto;\n margin-left: 0.5rem;\n margin-right: 0.5rem;\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .panel {\n border-color: var(--bs-border-color);\n border-width: 0 2px 0 2px;\n border-style: solid;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n</style>\n","<script setup lang=\"ts\">\n defineProps({\n progress: {\n required: true,\n type: Number,\n },\n });\n</script>\n\n<template>\n <div\n class=\"progress\"\n role=\"progressbar\"\n aria-label=\"Progress\"\n :aria-valuenow=\"progress * 100\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n >\n <div\n v-if=\"progress != 1\"\n class=\"progress-bar progress-bar-striped progress-bar-animated\"\n :style=\"`width: ${progress * 100}%`\"\n ></div>\n </div>\n</template>\n\n<script lang=\"ts\">\n export default {\n methods: {\n tick(): void {\n this.$forceUpdate();\n },\n },\n };\n</script>\n","import Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\n\nimport Fetcher from '@/utils/Fetcher';\n\nimport type { GeocodingResult } from './Geocoding';\n\nimport IgnProvider from './IgnProvider';\n\nexport default {\n /**\n * Searches for an address in the French BAN\n *\n * @param query - Search query\n * @returns Results\n */\n async geocode(query: string): Promise<GeocodingResult[]> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const data = await Fetcher.fetchJson<any>(\n `https://api-adresse.data.gouv.fr/search/?q=${query}`,\n );\n\n const coordinates: Coordinates[] = data.features.map(\n (feature: { geometry: { coordinates: [number, number] } }) =>\n new Coordinates(\n 'EPSG:4326',\n feature.geometry.coordinates[0],\n feature.geometry.coordinates[1],\n 0,\n ),\n );\n await IgnProvider.alticode(coordinates);\n\n coordinates.forEach((c, i) => {\n // Here we have EPSG:2154 coordinates, which are not the same as in feature.geometry!\n data.features[i].properties.crs = 'EPSG:2154';\n data.features[i].properties.z = c.altitude;\n });\n return data.features.map((f: { properties: object }) => f.properties);\n },\n};\n","<script setup lang=\"ts\">\n // @ts-expect-error autocomplete does not provide typing\n import autoComplete from '@tarekraafat/autocomplete.js';\n import { onMounted, ref } from 'vue';\n\n import BanProvider from '@/providers/BanProvider';\n import { type GeocodingResult } from '@/providers/Geocoding';\n\n const inputField = ref<HTMLInputElement | null>(null);\n\n const emits = defineEmits(['update:poi']);\n\n onMounted(() => {\n new autoComplete({\n data: {\n keys: ['label'],\n src: (query: string): Promise<GeocodingResult[]> => {\n return BanProvider.geocode(query);\n },\n },\n debounce: 300, // 300ms debounce\n placeHolder: 'Search places...',\n resultItem: {\n highlight: true,\n },\n resultsList: {\n noResults: true,\n },\n selector: '#search-place-autocomplete',\n threshold: 3,\n // Trust what we get from the query\n searchEngine: (query: string, record: unknown): unknown => record,\n });\n\n const inputElement = inputField.value as HTMLInputElement;\n\n inputElement.addEventListener('selection', (event: Event) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const poi = (event as any).detail.selection.value as GeocodingResult;\n\n emits('update:poi', poi);\n });\n });\n</script>\n\n<template>\n <div class=\"main\">\n <div class=\"input-group\" id=\"address-search\">\n <input\n ref=\"inputField\"\n id=\"search-place-autocomplete\"\n class=\"rounded-pill form-control\"\n type=\"search\"\n dir=\"ltr\"\n placeholder=\"Search places...\"\n spellcheck=\"false\"\n autocorrect=\"off\"\n autocomplete=\"off\"\n autocapitalize=\"off\"\n maxlength=\"2048\"\n tabindex=\"1\"\n />\n </div>\n </div>\n</template>\n\n<style scoped>\n .main {\n padding-top: 0.5rem;\n }\n\n input {\n height: 30pt;\n box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2);\n }\n</style>\n","<script setup lang=\"ts\">\n import CoordinateFragment from './CoordinateFragment.vue';\n\n defineProps({\n x: Number,\n y: Number,\n z: Number,\n });\n</script>\n\n<template>\n <div>\n <div class=\"d-flex column-gap-3\">\n <i class=\"bi text-secondary bi-cursor-fill\"></i>\n <CoordinateFragment :value=\"x?.toFixed(0)\" prefix=\"X:\" />\n <CoordinateFragment :value=\"y?.toFixed(0)\" prefix=\"Y:\" />\n <CoordinateFragment :value=\"z?.toFixed(0)\" prefix=\"Alt.:\" suffix=\"m\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n i {\n font-size: small;\n }\n div {\n margin-left: 1rem;\n }\n</style>\n","export default \"data:image/png;base64,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\"","<script setup lang=\"ts\">\n defineProps(['icon', 'tourkey', 'title', 'active']);\n</script>\n\n<template>\n <li class=\"nav-item\">\n <a\n :id=\"`toolbar-${tourkey}`\"\n :class=\"['nav-link', active ? 'active' : null]\"\n href=\"#\"\n :title=\"title\"\n ><i :class=\"['bi', icon]\"></i\n ></a>\n </li>\n</template>\n","<script setup lang=\"ts\">\n import logo from '@/assets/piero_logo_compact.png';\n\n import getConfigurationPanels from '../Configuration';\n import ToolbarButton from './ToolbarButton.vue';\n\n defineProps<{\n active: string | null;\n }>();\n defineEmits(['selected']);\n\n const panels = getConfigurationPanels();\n</script>\n\n<template>\n <div class=\"toolbar\">\n <ul id=\"menu\" class=\"nav nav-pills flex-column\">\n <li class=\"nav-item mt-2\">\n <a href=\"https://giro3d.org\" target=\"_blank\" title=\"Piero, powered by Giro3D\">\n <img :src=\"logo\" alt=\"Piero, powered by Giro3D\" class=\"mb-3 w-100 p-1\" />\n </a>\n </li>\n\n <template v-for=\"panel in panels\">\n <ToolbarButton\n v-if=\"panel.enabled\"\n :active=\"active === panel.key\"\n :key=\"panel.key\"\n :tourkey=\"panel.key\"\n :title=\"panel.title\"\n :icon=\"panel.icon\"\n @click=\"$emit('selected', panel.key)\"\n />\n </template>\n </ul>\n </div>\n</template>\n\n<style scoped>\n li {\n margin: 0.2rem;\n }\n</style>\n","<script setup lang=\"ts\">\n import type Instance from '@giro3d/giro3d/core/Instance';\n\n import Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\n import Extent from '@giro3d/giro3d/core/geographic/Extent';\n import { Vector2, Vector3 } from 'three';\n import { onMounted, onUnmounted, ref, shallowRef } from 'vue';\n\n import type Feature from '@/types/Feature';\n\n import { type GeocodingResult } from '@/providers/Geocoding';\n import Giro3DManager from '@/services/Giro3DManager';\n import MinimapController from '@/services/MinimapController';\n import { useAnnotationStore } from '@/stores/annotations';\n import { useCameraStore } from '@/stores/camera';\n import { useGiro3dStore } from '@/stores/giro3d';\n import { useMeasurementStore } from '@/stores/measurement';\n\n import type { PanelType } from './components/Configuration';\n import type { PieroContext } from './context';\n\n import { ViewApiImpl } from './api/ViewApi';\n import AlertToast from './components/AlertToast.vue';\n import AttributePanel from './components/AttributePanel.vue';\n import LoadingScreen from './components/LoadingScreen.vue';\n import MainView from './components/MainView.vue';\n import MinimapView from './components/MinimapView.vue';\n import NavigationButtons from './components/NavigationButtons.vue';\n import PanelContainer from './components/PanelContainer.vue';\n import ProgressBar from './components/ProgressBar.vue';\n import SearchOverlay from './components/SearchOverlay.vue';\n import StatusBar from './components/StatusBar.vue';\n import ToolBar from './components/toolbar/ToolBar.vue';\n import { GLOBAL_EVENT_DISPATCHER } from './events';\n\n const { getContext } = defineProps<{\n getContext: () => PieroContext;\n }>();\n\n const selectedTool = ref<PanelType | null>('datasets');\n const progress = ref(1);\n const coordinates = ref(new Vector3(0, 0, 0));\n const mouse = new Vector2();\n const pickedFeature = ref<Feature | null>(null);\n const tooltip = ref<string | null>(null);\n const isLoading = ref(false);\n const showLoadingScreen = ref(true);\n let hasMovedDuringFrame = false;\n\n const giro3dStore = useGiro3dStore();\n const cameraStore = useCameraStore();\n const annotationStore = useAnnotationStore();\n const measurementStore = useMeasurementStore();\n\n const giro3d = shallowRef<Giro3DManager | null>(null);\n const minimap = shallowRef<MinimapController | null>(null);\n const debounce = ref<NodeJS.Timeout | number | string | undefined>();\n\n onMounted(() => {\n const mainview = giro3dStore.getMainView();\n const minimapView = giro3dStore.getMinimapView();\n if (mainview) {\n initializeGiro3DManager(mainview);\n }\n if (minimapView) {\n initializeMinimap(minimapView);\n }\n\n giro3dStore.$onAction(({ after, args, name }) => {\n after(() => {\n switch (name) {\n case 'setMainView':\n if (args[0] === null) {\n disposeGiro3DManager();\n } else {\n initializeGiro3DManager(args[0]);\n }\n break;\n case 'setMinimapView':\n if (args[0] === null) {\n disposeMinimap();\n } else {\n void initializeMinimap(args[0]);\n }\n break;\n }\n });\n });\n\n // debouncing costly functions\n debounce.value = setInterval(() => {\n if (hasMovedDuringFrame) {\n updateCoordinates(mouse);\n updateCursor(mouse);\n hasMovedDuringFrame = false;\n }\n }, 50);\n\n if (import.meta.env.PROD) {\n setTimeout(() => {\n showLoadingScreen.value = false;\n }, 1000);\n } else {\n showLoadingScreen.value = false;\n }\n\n GLOBAL_EVENT_DISPATCHER.dispatchEvent({ type: 'ready' });\n });\n\n onUnmounted(() => {\n if (debounce.value != null) {\n clearInterval(debounce.value);\n debounce.value = undefined;\n }\n disposeMinimap();\n disposeGiro3DManager();\n });\n\n function disposeGiro3DManager(): void {\n if (minimap.value) {\n minimap.value.setMainInstance(null);\n }\n giro3d.value?.dispose();\n giro3d.value = null;\n }\n\n function disposeMinimap(): void {\n minimap.value?.dispose();\n }\n\n function initializeGiro3DManager(instance: Instance): void {\n const mainview = giro3dStore.getMainView();\n if (mainview === null) {\n throw new Error('mainview is null');\n }\n giro3d.value = new Giro3DManager(mainview);\n giro3d.value.addEventListener('update', () => {\n if (giro3d.value) {\n progress.value = giro3d.value.mainInstance.progress;\n isLoading.value = giro3d.value.mainInstance.loading;\n }\n });\n\n getContext().view = new ViewApiImpl({ camera: giro3d.value.camera });\n\n if (minimap.value) {\n minimap.value.setMainInstance(instance);\n }\n }\n\n function initializeMinimap(instance: Instance): void {\n minimap.value = new MinimapController(instance);\n if (giro3d.value) {\n minimap.value.setMainInstance(giro3d.value.mainInstance);\n }\n }\n\n function onMouseMove(event: MouseEvent): void {\n if (giro3d.value) {\n giro3d.value.mainInstance.eventToCanvasCoords(event, mouse);\n hasMovedDuringFrame = true;\n }\n }\n\n function onPointOfInterestSelected(poi: GeocodingResult): void {\n if (!giro3d.value) {\n return;\n }\n const instance = giro3d.value.mainInstance;\n const poiCoordinates = new Coordinates(poi.crs, poi.x, poi.y, poi.z).as(\n instance.referenceCrs,\n );\n const target = Extent.fromCenterAndSize(\n poiCoordinates.crs,\n poiCoordinates.toVector2(),\n 1000,\n 1000,\n );\n const bbox3 = target.toBox3(poi.z, poi.z + 200);\n void giro3d.value.camera.lookTopDownAt(bbox3, false);\n }\n\n function pick(event: MouseEvent, clicked?: boolean): void {\n if (giro3d.value == null || giro3d.value.mainInstance == null) {\n return;\n }\n\n if (\n cameraStore.getNavigationMode() === 'position-on-map' ||\n cameraStore.isUserInteracting() ||\n annotationStore.isUserDrawing() ||\n measurementStore.isUserMeasuring()\n ) {\n return;\n }\n\n const picked = giro3d.value.picker.pick(giro3d.value.mainInstance, event);\n\n if (picked?.point != null) {\n const point = picked.point;\n coordinates.value.x = point.x;\n coordinates.value.y = point.y;\n coordinates.value.z = point.z;\n }\n\n if (picked?.feature != null) {\n tooltip.value = picked.feature.name;\n if (clicked != null) {\n pickedFeature.value = picked.feature;\n }\n } else {\n tooltip.value = null;\n if (clicked != null) {\n pickedFeature.value = null;\n }\n }\n\n if (picked?.pickResult != null) {\n giro3d.value.highlighter.highlightFromPick(picked.pickResult);\n } else {\n giro3d.value.highlighter.clear();\n }\n }\n\n function selectPanel(key: PanelType): void {\n if (key === selectedTool.value) {\n selectedTool.value = null;\n } else {\n selectedTool.value = key;\n }\n }\n\n function updateCoordinates(mouse: Vector2): void {\n if (giro3d.value != null) {\n const point = giro3d.value.picker.getMouseCoordinate(giro3d.value.mainInstance, mouse);\n\n if (point) {\n coordinates.value.x = point.x;\n coordinates.value.y = point.y;\n coordinates.value.z = point.z;\n }\n }\n }\n\n function updateCursor(mouse: Vector2): void {\n if (giro3d.value) {\n if (\n cameraStore.getNavigationMode() === 'position-on-map' ||\n annotationStore.isUserDrawing() ||\n measurementStore.isUserMeasuring()\n ) {\n return;\n }\n const picked = giro3d.value.picker.hasFeature(giro3d.value.mainInstance, mouse);\n giro3d.value.mainInstance.domElement.style.cursor = picked ? 'pointer' : 'auto';\n }\n }\n</script>\n\n<template>\n <LoadingScreen v-if=\"showLoadingScreen\" />\n <MainView\n id=\"main-view\"\n @click=\"(evt: MouseEvent) => pick(evt, true)\"\n @mousemove=\"onMouseMove\"\n class=\"mainview\"\n />\n <AttributePanel\n v-if=\"pickedFeature != null\"\n @close=\"pickedFeature = null\"\n :attributes=\"pickedFeature.attributes\"\n :name=\"pickedFeature.name\"\n :parent=\"pickedFeature.parent\"\n :point=\"pickedFeature.point\"\n class=\"component attribute-panel\"\n />\n <StatusBar\n class=\"component statusbar\"\n :x=\"coordinates.x\"\n :y=\"coordinates.y\"\n :z=\"coordinates.z\"\n />\n <ToolBar\n id=\"toolbar\"\n :active=\"selectedTool\"\n class=\"component toolbar\"\n v-on:selected=\"v => selectPanel(v)\"\n />\n <MinimapView class=\"component minimap\" />\n <PanelContainer v-if=\"selectedTool != null\" class=\"component panel\" :selected=\"selectedTool\" />\n <ProgressBar :progress=\"progress\" class=\"loading-indicator\" />\n <SearchOverlay id=\"address-search\" class=\"search\" @update:poi=\"onPointOfInterestSelected\" />\n <NavigationButtons class=\"navigation-buttons\" />\n <AlertToast />\n</template>\n\n<style scoped>\n .component {\n background-color: var(--bs-body-bg);\n }\n\n .navigation-buttons {\n position: absolute;\n right: 0;\n bottom: 0;\n margin-bottom: 2rem;\n }\n\n .attribute-panel {\n position: absolute;\n box-shadow: -1px -1px 5px rgba(0, 0, 0, 0.5);\n border-style: sol;\n right: 0;\n bottom: 0;\n width: 370px;\n max-height: 60%;\n margin-right: 1rem;\n margin-bottom: 5rem;\n }\n\n .statusbar {\n padding: 0.2rem;\n text-align: center;\n border-top-left-radius: 0.5rem;\n box-shadow: -1px -1px 5px rgba(0, 0, 0, 0.1);\n height: 1.5rem;\n position: absolute;\n bottom: 0;\n right: 0;\n }\n\n .search {\n position: absolute;\n top: 0;\n left: calc(50% - 20rem / 2);\n width: 20rem;\n }\n\n .loading-indicator {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 3px;\n z-index: 1;\n background-color: transparent;\n }\n\n .panel {\n position: absolute;\n height: 100vh;\n left: 3.5rem;\n width: 27rem;\n z-index: 1;\n }\n\n .mainview {\n position: absolute;\n /* background-color: cadetblue; */\n height: 100vh;\n left: 3.5rem;\n width: calc(100% - 3.5rem);\n z-index: 0;\n }\n\n .toolbar {\n width: 3.5rem;\n height: 100vh;\n position: absolute;\n /* background-color: rgb(250, 250, 250); */\n top: 0;\n left: 0;\n }\n\n .minimap {\n width: 10rem;\n height: 10rem;\n position: absolute;\n margin: 0.5rem;\n top: 0;\n right: 0;\n }\n</style>\n","import { createPinia } from 'pinia';\nimport { createApp } from 'vue';\n\nimport type { PieroContext } from './context';\nimport type { Module } from './module';\nimport type { Configuration } from './types/Configuration';\n\nimport './assets/main.scss';\nimport type { DynamicStyleCollection } from './types/VectorStyle';\n\nimport { BookmarkApiImpl } from './api/BookmarkApi';\nimport { DatasetApiImpl } from './api/DatasetApi';\nimport App from './App.vue';\nimport { loadRemoteConfiguration, setConfiguration, setDynamicStyles } from './config-loader';\nimport { GLOBAL_EVENT_DISPATCHER } from './events';\nimport { useBookmarkStore } from './stores/bookmarks';\nimport { useModuleStore } from './stores/modules';\nimport Download from './utils/Download';\n\nasync function resolveConfiguration(params: AppParameters): Promise<Configuration> {\n let configuration: Configuration;\n\n if (typeof params.configuration === 'string') {\n console.info(`Loading remote configuration from: ${params.configuration}`);\n const remoteConfiguration = await loadRemoteConfiguration(params.configuration);\n console.info('Remote configuration successfuly loaded.');\n configuration = remoteConfiguration;\n } else {\n configuration = params.configuration;\n }\n\n return configuration;\n}\n\nexport type AppParameters = {\n /**\n * The base URL of the application. This is used to resolve relative URLs.\n * @example 'http://localhost:8080/' or 'https://mydomain.com/myapp/'\n */\n baseUrl: string;\n /**\n * The static configuration to use, or the URL to a remote configuration.\n */\n configuration: Configuration | string;\n /**\n * Where to attach the piero root element.\n */\n container: Element | string;\n\n /**\n * Optional style functions to use.\n */\n dynamicStyles?: DynamicStyleCollection;\n\n /**\n * The list of modules to load.\n * @defaultValue []\n */\n modules?: Module[];\n};\n\n/**\n * Entry point for a Piero application.\n */\nexport default async function createPieroApp(params: AppParameters): Promise<void> {\n const configuration = await resolveConfiguration(params);\n await setConfiguration(configuration);\n\n console.info('Configuration loaded.');\n\n if (params.dynamicStyles) {\n setDynamicStyles(params.dynamicStyles);\n }\n\n Download.setBaseUrl(params.baseUrl);\n\n // We define the Pinia store in advance because we will have\n // to inject it into APIs.\n const pinia = createPinia();\n\n const moduleStore = useModuleStore(pinia);\n moduleStore.setLoadedModules(params.modules ?? []);\n\n // Here we create a context that will be used by modules\n // to interact with the Piero application, without having\n // to import individual services.\n const context: Partial<PieroContext> = {\n baseURL: new URL(Download.getBaseUrl()),\n bookmarks: new BookmarkApiImpl(useBookmarkStore(pinia)),\n configuration,\n datasets: new DatasetApiImpl(),\n events: GLOBAL_EVENT_DISPATCHER,\n };\n\n const readyContext = context as PieroContext;\n\n const moduleInitializations: Promise<void>[] = [];\n\n // Now we can register the modules.\n if (params.modules) {\n for (const module of params.modules) {\n const init = Promise.resolve(module.initialize(readyContext));\n moduleInitializations.push(init);\n console.info(`Module ${module.name} initialized.`);\n }\n }\n\n await Promise.all(moduleInitializations);\n\n // Mount the Piero root component in the provided element.\n const app = createApp(App, { getContext: () => context });\n app.use(pinia);\n app.mount(params.container);\n}\n"],"names":["BookmarkApiImpl","store","__publicField","bookmarks","bookmark","panels","getPanels","hasExperimentalFeature","propertyViews","datasetIcons","datasetTitles","FeatureCollectionEntity","FeatureCollection","options","crs","filename","vectorSource","VectorSource","GeoJSON","tile","createXYZ","bbox","extent","Extent","extrusionOffset","feature","style","properties","fillColor","Color","parentOptions","fillObject3DUserData","build","context","cfg","entity","CSVPointCloudSource","PointCloudSourceBase","OperationCounter","params","attribute","Float32BufferAttribute","raw","load","CSVLoader","Fetcher","posArray","zArray","volume","Box3","localVolume","point","Vector3","origin","i","x","y","z","localX","localY","localZ","pointCount","node","PointCloudEntity","PointCloud","config","getConfig","getColorMap","opts","dataset","source","COPCSource","getPublicFolderUrl","begin","end","buf","LASSource","d","Tiles3dEntity","Tiles3D","parameters","TiledPointCloudEntity","MODE","tmpCoords","Coordinates","alticode","lngs","lats","promises","chunkLng","chunkLat","alticodeBatch","IgnProvider","coordinates","lng","lat","c","value","IgnAlticoder","mapAlticoderGenerator","instance","map","o","coords","res","a","b","alticoders","noDataValue","missingCoordinates","coder","alticoderGenerator","fast","loadProjCrsIfNeeded","projection","epsgCode","regexes","regex","search","epsgString","proj4","text","Instance","Projections","fetchZCoordinates","features","featureProjection","alticoder","offset","clock","Clock","giroCoordinates","giroCoordinatesByFeature","geom","geomType","featureCoordinates","stride","g","k","j","m","fillZCoordinates","altitude","readFeatures","data","format","dataProjection","projIn","readSimpleFeatures","toSimpleFeatures","toMeshes","olFeatures","polygonOptions","root","Group","converter","GeometryConverter","meshes","f","geometry","type","mesh","name","_a","OLFeatures","geojsonFormat","GeoJSONFormat","gpxFormat","GPXFormat","kmlFormat","KMLFormat","defaultParameters","GeoJsonMeshSource","json","toGeoJSONFeatures","geojsonToOlFeatures","OlMeshSource","toOlFeatures","GpxMeshSource","KmlMeshSource","simpleFeatures","fetchElevationFast","fetchElevationOffset","olFeaturestoGroup","defaultElevation","elevation","VectorMeshEntity","Entity3D","sources","group","DEFAULT_SURFACE_COLOR","DEFAULT_LINE_COLOR","fetchGeopackage","url","GeoPackageGLLoader","table","array","GeopackageSource","fetchShapefile","ShapefileGLLoader","ShapefileSource","DEFAULT_SHAPE_COLOR","DEFAULT_MEASURE_COLOR","HIGHLIGHT_MEASURE_COLOR","EDIT_SHAPE_COLOR","SHAPE_POINT_RADIUS","tmpNDC","Vector2","thisColor","sRGB","sRgb","contrastColor","getContrastColor","DEFAULT_FONT_SIZE","DEFAULT_FONT_WEIGHT","tmpIntersectList","VectorLabelsEntity","pts","l","_options","normalized","raycaster","Raycaster","pickedLabel","cssOpacity","label","getPoint","olFeature","labels","at","container","span","innerContainer","object","CSS2DObject","intersects","MathUtils","padding","VectorShapeEntity","Shape","sourcesConfig","rendering","sourceConfig","commonOptions","builders","featureCollection.build","flatPointCloud.build","tiledPointCloud.build","tiledIfc.build","vector.build","getEntity","builder","registerEntityBuilder","datasetType","EntityBuilder","loadOverlay","fileType","loadMesh","loaders","csv.load","vector.load","las.load","getLoaderContext","fileOrUrl","absoluteUrl","extension","importFile","loader","selectLoader","datasetConfig","Dataset","keys","key","registerLoader","fileExtension","customHighlighters","Highlighter","pick","isShapePickResult","highlighter","clearHighlight","shape","previousColor","lengthFormat","formatLength","values","_Measure3D","obj","isObject","Measure3D","Feature","parent","attributes","Grid","dims","center","GridHelper","gridMat","v","createWMTSSource","layer","matrixSet","parser","WMTSCapabilities","result","optionsFromCapabilities","WMTS","getDatasetLayer","getLayerOptions","ColorLayer","ElevationLayer","MaskLayer","getDefaultStyle","Style","Stroke","Circle","Fill","getImageFormat","imageSourceConfig","BilFormat","GeoTIFFFormat","MapboxTerrainFormat","getImageSourceOptions","getLayer","basemap","getSource","getExtent","interpretation","Interpretation","colorMapConfig","colorMap","resolution","minFilter","magFilter","getOverlay","overlay","TiledImageSource","BingMaps","GeoTIFFSource","getSourceProjection","getVectorSourceOptions","GPX","KML","VectorTileSource","getVectorTileSourceOptions","MVT","OSM","StadiaMaps","TileWMS","getTiledImageSourceOptions","XYZ","getSourceDataUrl","defaultProjection","getStyle","dynamicStyles","getDynamicStyles","parseStaticStyle","parseStroke","stroke","parseFill","fill","parsePoint","LayerBuilder","Plane","Mesh","PlaneGeometry","MeshBasicMaterial","useGiro3dStore","defineStore","mainView","shallowRef","minimapView","inspector","getMainView","setMainView","getMinimapView","setMinimapView","getInspector","setInspector","getDefaultCameraPosition","conf","getDefaultCameraLookAt","getDefaultBasemapExtent","getDefaultBasemapOptions","FrontSide","size","centerLocal","getCRS","notifyChange","GraticuleLayer","EventDispatcher","LayerObject","BaseLayerObject","OverlayObject","buildBaseLayers","item","buildGraticuleLayer","shallowReactive","buildOverlays","useLayerStore","basemaps","basemapCount","computed","overlays","overlayCount","graticuleLayer","getBasemaps","getGraticuleLayer","setBasemapVisibility","visible","setBasemapOpacity","opacity","getOverlays","setOverlayVisibility","setOverlayOpacity","moveOverlayUp","index","current","moveOverlayDown","GRID_ALTITUDE_THRESHOLD","GRID_NAME","PLANE_NAME","GRATICULE_ALTITUDE_THRESHOLD","LayerManager","useCameraStore","mapOptions","Giro3dMap","after","args","isColorLayer","isElevationLayer","pos","oldGridVisible","newGridVisible","graticule","oldGraticuleVisible","newGraticuleVisible","newOpacity","newVisibility","uuid","elevationLayer","storeLayer","order","orderA","orderB","customAttributeExtractors","comparePickResults","Picker","useAnalysisStore","pickedObject","object3d","_b","datasetAttributes","attributesGroups","isMapPickResult","isPointsPickResult","measure","annotation","customExtractor","e","radius","filterOnObjects","picked","pickedOnMap","unit","where","mouse","isMap","event","containsPoint","pickResult","attributesGeoJSON","userData","measurements","_d","_c","DatasetApiImpl","DEFAULT_HEIGHT","FloodingPlane","width","height","FloodingPlaneManager","layerManager","helperMaterial","ClippingBoxManager","useDatasetStore","planes","mat","boxGeometry","BoxGeometry","Box3Helper","TransformControls","_e","_f","_g","_h","plane","CrossSectionManager","clippingPlanes","radians","cos","sin","normal","distance","AnalysisManager","useAnnotationStore","annotations","reactive","annotationMode","ref","count","_isUserDrawing","_showLabels","isUserDrawing","showLabels","setShowLabels","setIsUserDrawing","getAnnotationMode","setAnnotationMode","mode","getAnnotations","remove","createPoint","createLine","createPolygon","add","hasAnnotation","edit","stopEdition","importAnnotationFile","file","importAnnotationsFiles","files","useNotificationStore","push","notification","Annotation","title","Download","geojson","Notification","level","getMinMaxAltitudes","coordsOrDrawing","min","max","points","Measure$1","promptTitle","defaultValue","numberFormat","areaFormatter","area","tmpStart","tmpEnd","lengthFormatter","view","camera","start","ndcStart","ndcEnd","sqLimit","length","pointFormatter","AnnotationManager","picker","DrawTool","defaultName","Measure","drawFn","results","edition","skipNames","existingAnnotations","nbImported","nbSkipped","nbTotalImported","nbTotalSkipped","errors","reason","str","coord","limitRemovePointHook","inhibitHook","afterRemovePointOfRing","afterUpdatePointOfRing","restoreShape","show","CameraPosition","target","focalOffset","CameraControlsInspector","Panel","gui","cameraController","position","CameraControls","Matrix4","Quaternion","Sphere","Spherical","Vector4","CameraController","orbitHelperElement","orbitHelperElementIcon","positionOnMapElement","positionOnMapElementIcon","callback","controls","cameraPosition","enableTransition","lookAt","newCameraPosition","entity3d","entityBbox","delta","direction","newPosition","newTarget","navigationMode","forwardDirection","dollyDirection","truckDirectionX","truckDirectionY","factor","GLOBAL_EVENT_DISPATCHER","datasetSupportsOverlay","datasetSupportsMeshes","DatasetManager","box","grid","AxisGrid","Polygon","mask","Giro3dVectorSource","MaskMode","maps","_dataset","Datagroup","ds","MeasureTool","isShape","n","useMeasurementStore","measurementMode","_isUserMeasuring","isUserMeasuring","setIsUserMeasuring","getMeasurementMode","setMeasurementMode","getMeasures","hasMeasure","importMeasureFile","importMeasureFiles","measures","MeasurementManager","from","to","existingMeasures","measurement","Giro3DManager","lightColor","AmbientLight","DirectionalLight","bbox2","Viewbox","BufferGeometry","LineSegments","LineBasicMaterial","ul","ur","lr","ll","DEFAULT_EXTENT","loadOSMLayer","MinimapController","GiroMap","xyz","minimapInstance","canvasSize","raycast","mainCamera","minimapCamera","coordinate","ViewApiImpl","alertToast","showNotification","notif","bootstrap","getIcon","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_3","_toDisplayString","hexString","__props","_createTextVNode","props","_Fragment","_hoisted_5","_hoisted_6","_hoisted_8","_hoisted_9","styles","attrName","_unref","_hoisted_2","_hoisted_4","subitem","_createBlock","_component_AttributeItem","isLink","LinkFragment","isColor","ColorFragment","isVector3","_createVNode","CoordinateFragment","_hoisted_7","children","_renderList","list","AttributeItem","copied","copyText","$emit","AttributeGroup","_normalizeClass","logo$1","_cache","logo","inspectorView","onMounted","onUnmounted","$event","_renderSlot","_ctx","notificationStore","watch","newMode","description","onPositionOnMapToggle","SwitchToggle","bpi","france2030","franceRelance","oslandia","ueNext","useModuleStore","loadedModules","setLoadedModules","modules","getLoadedModules","dependencies","define_import_meta_env_VITE_DEPENDENCIES_default","_hoisted_11","_hoisted_12","_hoisted_13","info","_hoisted_16","_hoisted_17","module","analysis","floatValue","setFromCamera","setSizeX","setSizeY","setSizeZ","setX","setY","setZ","floorReferenceAltitude","floorSize","floorNumber","floorDown","getFloorAltitude","floorUp","presetFromFloor","boxCenter","boxSize","_hoisted_10","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","setOrientation","setHeight","Chart","BarController","BarElement","CategoryScale","LinearScale","ctx","DoughnutController","ArcElement","emits","__emit","currentSelection","setCurrent","id","descriptionPosition","items","useStatisticsStore","getCompatibleDatasets","isLoading","showCharts","createStatistics","PromiseUtils","setCurrentSource","src","DropdownView","ButtonWithIcon","LoadingIndicator","BarChart","DoughnutChart","expanded","collapsible","icon","ToolWrapper","CrossSection","ClippingBox","Statistics","hover","hiddenInput","importFiles","importFromFile","onDragEnter","onDragLeave","onDragOver","onDrop","isEditing","onIsEditingChanged","VisibilityControl","EmptyIndicator","annotationModes","cameraStore","downloadAnnotation","exportAnnotations","goTo","setCurrentMode","AnnotationItem","$forceUpdate","ButtonArea","ImportButton","copyToClipboard","Bookmark","urlString","base","cam","buildInitialList","fo","useBookmarkStore","clear","getBookmarks","showShareModal","shareUrl","modalTitle","bookmarkStore","addBookmark","exportBookmarks","importBookmarkFile","importBookmarks","serializedBookmarks","existingBookmarks","shareBookmark","shareCurrentView","temp","BookmarkItem","ModalOverlay","ShareBookmarkModal","emit","iconPosition","$attrs","icons","iconTitles","IconList","Icon","ListLabel","hasOpacitySlider","OpacitySlider","leafs","hasLeafPreloading","hasLeafPreloaded","isVisible","newValues","IconListButton","ListLabelButton","SpinnerControl","CompactList","DatasetOrGroupItem","isPreloading","refAndWatch","isPreloaded","deleteDataset","_resolveDynamicComponent","DatagroupItem","DatasetItem","datasets","layers","clipToDataset","importDataset","importDatasetFromUrl","zoomOnDataset","SectionCollapsible","BasemapItem","OverlayItem","measurementModes","downloadMeasure","exportMeasures","MeasurementItem","getConfigurationPanels","gitCommit","p","selected","DatasetPanel","AboutPanel","BookmarkPanel","AnalysisPanel","AnnotationPanel","MeasurementPanel","__default__","BanProvider","query","inputField","autoComplete","record","poi","panel","ToolbarButton","active","selectedTool","progress","pickedFeature","tooltip","showLoadingScreen","hasMovedDuringFrame","giro3dStore","annotationStore","measurementStore","giro3d","minimap","debounce","mainview","initializeGiro3DManager","initializeMinimap","disposeGiro3DManager","disposeMinimap","updateCoordinates","updateCursor","onMouseMove","onPointOfInterestSelected","poiCoordinates","bbox3","clicked","selectPanel","LoadingScreen","MainView","evt","AttributePanel","StatusBar","ToolBar","MinimapView","PanelContainer","ProgressBar","SearchOverlay","NavigationButtons","AlertToast","resolveConfiguration","configuration","remoteConfiguration","loadRemoteConfiguration","createPieroApp","setConfiguration","setDynamicStyles","pinia","createPinia","readyContext","moduleInitializations","init","app","createApp","App"],"mappings":"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"}
|