@giro3d/piero 1.0.0-beta.2 → 1.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/Components.cjs.js +3 -2
  2. package/dist/Components.cjs.js.map +1 -1
  3. package/dist/Components.es.js +3193 -1778
  4. package/dist/Components.es.js.map +1 -1
  5. package/dist/assets/piero.css +2 -2
  6. package/dist/index.cjs.js +7 -7
  7. package/dist/index.cjs.js.map +1 -1
  8. package/dist/index.es.js +3192 -4319
  9. package/dist/index.es.js.map +1 -1
  10. package/dist/modules.cjs.js +1 -2
  11. package/dist/modules.cjs.js.map +1 -1
  12. package/dist/modules.es.js +981 -965
  13. package/dist/modules.es.js.map +1 -1
  14. package/dist/src/api/SearchApi.d.ts +34 -0
  15. package/dist/src/api/ViewApi.d.ts +2 -0
  16. package/dist/src/api/WidgetApi.d.ts +17 -0
  17. package/dist/src/api/index.d.ts +2 -1
  18. package/dist/src/components/CoordinateInput.vue.d.ts +31 -0
  19. package/dist/src/components/SearchOverlay.vue.d.ts +4 -5
  20. package/dist/src/context.d.ts +10 -0
  21. package/dist/src/events.d.ts +7 -1
  22. package/dist/src/modules/OpenLayersMinimap.d.ts +7 -0
  23. package/dist/src/modules/PostProcessEntities.d.ts +16 -0
  24. package/dist/src/modules/crossSectionAnalysis/CrossSection.vue.d.ts +1 -1
  25. package/dist/src/modules/crossSectionAnalysis/CrossSectionHelper.d.ts +4 -0
  26. package/dist/src/modules/crossSectionAnalysis/CrossSectionManager.d.ts +7 -0
  27. package/dist/src/modules/crossSectionAnalysis/store.d.ts +22 -2
  28. package/dist/src/modules/geocoding/CoordinatesSearch.d.ts +7 -0
  29. package/dist/src/modules/geocoding/FrenchBanGeocoder.d.ts +10 -0
  30. package/dist/src/modules/index.d.ts +5 -1
  31. package/dist/src/modules/minimap/OpenLayersMinimapComponent.vue.d.ts +8 -0
  32. package/dist/src/services/CameraController.d.ts +3 -3
  33. package/dist/src/services/Giro3DManager.d.ts +2 -0
  34. package/dist/src/services/SceneCursorManager.d.ts +19 -0
  35. package/dist/src/stores/giro3d.d.ts +1 -7
  36. package/dist/src/stores/search.d.ts +12 -0
  37. package/dist/src/stores/widgets.d.ts +12 -0
  38. package/dist/src/utils/Types.d.ts +1 -0
  39. package/package.json +2 -2
  40. package/dist/src/components/MinimapView.vue.d.ts +0 -4
  41. package/dist/src/providers/BanProvider.d.ts +0 -11
  42. package/dist/src/providers/Geocoding.d.ts +0 -7
  43. package/dist/src/services/MinimapController.d.ts +0 -19
@@ -1 +1 @@
1
- {"version":3,"file":"modules.es.js","sources":["../src/modules/crossSectionAnalysis/store.ts","../src/modules/crossSectionAnalysis/CrossSection.vue","../src/modules/crossSectionAnalysis/CrossSectionManager.ts","../src/modules/CrossSectionAnalysis.ts","../src/modules/DownloadDataset.ts","../src/modules/floodingPlaneAnalysis/store.ts","../src/modules/floodingPlaneAnalysis/FloodingPlane.vue","../src/modules/floodingPlaneAnalysis/FloodingPlaneObject.ts","../src/modules/floodingPlaneAnalysis/FloodingPlaneManager.ts","../src/modules/FloodingPlaneAnalysis.ts","../src/modules/ifc/IfcEntity.ts","../src/modules/ifc/IfcEntityInspector.ts","../src/modules/ifc/IfcSubtree.vue","../src/modules/ifc/IfcPropertyView.vue","../src/modules/IFCLoader.ts","../../../node_modules/three/examples/jsm/loaders/PLYLoader.js","../src/modules/ply/PlyEntity.ts","../src/modules/PLYLoader.ts","../src/modules/PotreeLoader.ts","../src/modules/Tour.ts"],"sourcesContent":["import { defineStore } from 'pinia';\nimport { Vector3 } from 'three';\nimport { ref } from 'vue';\n\nexport const useCrossSectionStore = defineStore('crossSection', () => {\n const orientation = ref(0);\n const center = ref(new Vector3(0, 0, 0));\n const enable = ref(false);\n\n function setEnabled(v: boolean): void {\n enable.value = v;\n }\n\n function setOrientation(v: number): void {\n orientation.value = v;\n }\n\n function setCenter(v: Vector3): void {\n center.value = v;\n }\n\n return {\n center,\n enable,\n orientation,\n setCenter,\n setEnabled,\n setOrientation,\n };\n});\n\nexport type CrossSectionStore = ReturnType<typeof useCrossSectionStore>;\n","<script setup lang=\"ts\">\n import SwitchToggle from '@/components/SwitchToggle.vue';\n\n import { useCrossSectionStore } from './store';\n\n const store = useCrossSectionStore();\n\n function setOrientation(orientation: number): void {\n store.setOrientation(orientation);\n }\n\n function setX(x: number): void {\n const center = store.center.clone();\n center.setX(x);\n store.setCenter(center);\n }\n\n function setY(y: number): void {\n const center = store.center.clone();\n center.setY(y);\n store.setCenter(center);\n }\n</script>\n\n<template>\n <div>\n <div class=\"input-group mb-3\">\n <SwitchToggle\n v-bind:model-value=\"store.enable\"\n v-on:update:model-value=\"v => store.setEnabled(v)\"\n id=\"cross-section-enable\"\n title=\"foo\"\n />\n <label for=\"cross-section-enable\" class=\"form-label\">Enable cross section</label>\n </div>\n\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=\"store.orientation\"\n @input=\"\n event =>\n setOrientation(Number.parseFloat((event.target as HTMLInputElement).value))\n \"\n />\n </div>\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=\"store.orientation\"\n @input=\"\n event =>\n setOrientation(Number.parseFloat((event.target as HTMLInputElement).value))\n \"\n />\n </div>\n <hr />\n <div class=\"input-group\">\n <label class=\"form-label\">Center (x, y)</label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"plane-center-x\"\n :value=\"store.center.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=\"store.center.y\"\n @input=\"\n event => setY(Number.parseFloat((event.target as HTMLInputElement).value))\n \"\n />\n </div>\n </div>\n </div>\n</template>\n","import Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport { isEntity3D } from '@giro3d/giro3d/entities/Entity3D';\nimport { MathUtils, Plane, Vector3 } from 'three';\n\nimport type { PieroContext } from '@/context';\n\nimport { useCrossSectionStore } from './store';\n\nexport default class CrossSectionManager {\n private readonly _store = useCrossSectionStore();\n\n public constructor(private readonly context: PieroContext) {\n context.events.addEventListener('ready', () => {\n const defaultCrs = context.configuration.default_crs;\n const config = context.configuration.analysis.cross_section;\n\n this._store.setOrientation(config.orientation);\n const pivot = config.pivot;\n const pivotLocal = new Coordinates(pivot.crs ?? defaultCrs, pivot.x, pivot.y, 0).as(\n defaultCrs,\n );\n this._store.setCenter(pivotLocal.toVector3());\n\n this._store.$onAction(({ after, name }) => {\n after(() => {\n switch (name) {\n case 'setCenter':\n case 'setEnabled':\n case 'setOrientation':\n this.updateCrossSection();\n break;\n }\n });\n });\n\n this.updateCrossSection();\n });\n }\n\n public dispose(): void {\n // Nothing to do\n }\n\n private updateCrossSection(): void {\n const clippingPlanes = [];\n\n if (this._store.enable) {\n const radians = MathUtils.DEG2RAD * this._store.orientation;\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.center);\n const plane = new Plane(normal, -distance);\n clippingPlanes.push(plane);\n }\n\n const instance = this.context.view.getInstance();\n\n instance.renderer.clippingPlanes = clippingPlanes;\n for (const entity of this.context.view.getInstance().getEntities()) {\n if (isEntity3D(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 instance.notifyChange();\n }\n}\n","import type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport CrossSection from './crossSectionAnalysis/CrossSection.vue';\nimport CrossSectionManager from './crossSectionAnalysis/CrossSectionManager';\n\n/**\n * An analysis module that displays a cross section.\n */\nexport default class CrossSectionAnalysis implements Module {\n public readonly id = 'builtin-cross-section-analysis';\n public readonly name = 'Cross section';\n\n private _manager: CrossSectionManager | null = null;\n\n public initialize(context: PieroContext): void {\n context.analysis.registerTool({\n component: CrossSection,\n icon: 'bi-circle-half',\n name: 'Cross section',\n });\n\n this._manager = new CrossSectionManager(context);\n }\n}\n","import type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\nimport type { DatasetOrGroup } from '@/types/Dataset';\n\nimport Download from '@/utils/Download';\nimport Fetcher from '@/utils/Fetcher';\n\nfunction getUrl(dataset: DatasetOrGroup): string | undefined {\n if ('url' in dataset.config && typeof dataset.config.url === 'string') {\n return dataset.config.url;\n }\n\n if ('source' in dataset.config && typeof dataset.config.source === 'object') {\n if ('url' in dataset.config.source && typeof dataset.config.source.url === 'string') {\n return dataset.config.source.url;\n }\n }\n\n return undefined;\n}\n\nfunction predicate(dataset: DatasetOrGroup): boolean {\n const url = getUrl(dataset);\n return url != null;\n}\n\n/**\n * Adds a button to download a dataset from its URL.\n */\nexport default class DownloadDataset implements Module {\n public readonly id: string = 'builtin-download-dataset';\n public readonly name: string = 'Download dataset';\n\n private _context: PieroContext | null = null;\n\n public initialize(context: PieroContext): void {\n this._context = context;\n\n context.datasets.registerDatasetAction({\n action: this.download.bind(this),\n icon: 'bi-download',\n predicate,\n title: 'Download dataset',\n });\n }\n\n private download(dataset: DatasetOrGroup): void {\n const uri = getUrl(dataset);\n\n if (uri == null) {\n console.warn('invalid');\n return;\n }\n\n const context = this._context as PieroContext;\n const fragments = new URL(uri).pathname.split('/');\n const filename = fragments[fragments.length - 1];\n\n console.info(`download ${getUrl(dataset)}`);\n\n Fetcher.fetch(uri)\n .then(res => {\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}`);\n }\n return res.blob();\n })\n .then(blob => {\n Download.downloadBlob(blob, filename);\n\n context.notifications.pushNotification({\n level: 'success',\n text: filename,\n title: 'Download successful',\n });\n })\n .catch(e => {\n console.error(e);\n\n const message = e instanceof Error ? e.message : 'Download failed';\n\n context.notifications.pushNotification({\n level: 'error',\n text: message,\n title: dataset.name,\n });\n });\n }\n}\n","import { defineStore } from 'pinia';\nimport { ref } from 'vue';\n\nexport const useFloodingPlaneStore = defineStore('floodingPlane', () => {\n const height = ref(0);\n const enable = ref(false);\n\n function getHeight(): number {\n return height.value;\n }\n\n function setHeight(v: number): void {\n height.value = v;\n }\n\n function setEnabled(v: boolean): void {\n enable.value = v;\n }\n\n return { enable, getHeight, setEnabled, setHeight };\n});\n","<script setup lang=\"ts\">\n import SwitchToggle from '@/components/SwitchToggle.vue';\n\n import { useFloodingPlaneStore } from './store';\n\n const store = useFloodingPlaneStore();\n\n function setHeight(height: number): void {\n store.setHeight(height);\n }\n</script>\n\n<template>\n <div class=\"input-group mb-3\">\n <SwitchToggle\n v-bind:model-value=\"store.enable\"\n v-on:update:model-value=\"v => store.setEnabled(v)\"\n id=\"flooding-plane-enable\"\n title=\"foo\"\n />\n <label for=\"flooding-plane-enable\" class=\"form-label\">Enable flooding plane</label>\n </div>\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=\"store.getHeight()\"\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=\"store.getHeight()\"\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","import { Mesh, MeshBasicMaterial, PlaneGeometry } from 'three';\n\nexport default class FloodingPlaneObject {\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 = 0;\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 { Vector3 } from 'three';\n\nimport type { PieroContext } from '@/context';\n\nimport FloodingPlaneObject from './FloodingPlaneObject';\nimport { useFloodingPlaneStore } from './store';\n\nexport default class FloodingPlaneManager {\n private readonly _context: PieroContext;\n private _plane: FloodingPlaneObject | null;\n private readonly _store = useFloodingPlaneStore();\n\n public constructor(context: PieroContext) {\n this._context = context;\n this._plane = null;\n\n context.events.addEventListener('ready', () => {\n this._store.$onAction(({ after, name }) => {\n after(() => {\n switch (name) {\n case 'setEnabled':\n void this.updatePlane();\n break;\n case 'setHeight':\n void this.updatePlane();\n break;\n }\n });\n });\n });\n }\n\n public dispose(): void {\n if (this._plane) {\n this._context.view.getInstance().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 FloodingPlaneObject();\n await this._context.view.getInstance().add(this._plane.object3D);\n }\n const extent = this._context.view.getBoundingBox();\n const center = extent.getCenter(new Vector3());\n const dims = extent.getSize(new Vector3());\n\n this._plane.visible = this._store.enable;\n this._plane.setPosition(center.x, center.y, this._store.getHeight(), dims.x, dims.y);\n this._context.view.getInstance().notifyChange();\n }\n}\n","import type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport FloodingPlane from './floodingPlaneAnalysis/FloodingPlane.vue';\nimport FloodingPlaneManager from './floodingPlaneAnalysis/FloodingPlaneManager';\n\n/**\n * An analysis module that displays a flooding plane with variable altitude.\n */\nexport default class FloodingPlaneAnalysis implements Module {\n public readonly id = 'builtin-flooding-plane-analysis';\n public readonly name = 'Flooding plane';\n\n private _manager: FloodingPlaneManager | null = null;\n\n public initialize(context: PieroContext): void {\n context.analysis.registerTool({\n component: FloodingPlane,\n icon: 'bi-layers-half',\n name: 'Flooding plane',\n });\n\n this._manager = new FloodingPlaneManager(context);\n }\n}\n","import type PickableFeatures from '@giro3d/giro3d/core/picking/PickableFeatures';\nimport type PickOptions from '@giro3d/giro3d/core/picking/PickOptions';\nimport type PickResult from '@giro3d/giro3d/core/picking/PickResult';\nimport type { Fragment } from 'bim-fragment/fragment';\nimport type { FragmentMesh } from 'bim-fragment/fragment-mesh';\nimport type { FragmentsGroup } from 'bim-fragment/fragments-group';\nimport type { FragmentIdMap } from 'openbim-components';\nimport type { Box3, Material, Vector2 } from 'three';\n\nimport Entity3D from '@giro3d/giro3d/entities/Entity3D';\nimport {\n Components,\n FragmentBoundingBox,\n FragmentClassifier,\n FragmentIfcLoader,\n FragmentManager,\n IfcPropertiesUtils,\n SimpleCamera,\n SimpleRaycaster,\n SimpleRenderer,\n SimpleScene,\n toCompositeID,\n} from 'openbim-components';\nimport { Group, Matrix4, MeshBasicMaterial, Vector3 } from 'three';\n\nimport { fillObject3DUserData } from '@/loaders/userData';\nimport Fetcher from '@/utils/Fetcher';\nimport { isObject } from '@/utils/Types';\n\nimport type { CoordinatesMixin, UrlOrDataMixin } from '../../giro3d/sources/mixins';\n\n// Copied/extract quite a lot from openbim-components library:\n// - src/fragments/FragmentHighlighter/index.ts for highlighting\n// - src/fragments/FragmentClassifier/index.ts for classification\n// - src/ifc/IfcPropertiesProcessor/index.ts for property-related stuff\n\n///// HIGHLIGHTING\n\nconst tempMatrix = new Matrix4();\n\ntype FragmentTypeName = 'bbox' | 'selection';\n\ntype MaterialMap = {\n [name in FragmentTypeName]: Material;\n};\ntype SelectionMap = {\n [name in FragmentTypeName]: FragmentIdMap;\n};\n\nconst materials: MaterialMap = {\n bbox: new MeshBasicMaterial({\n color: '#FFFF00',\n depthTest: true,\n opacity: 0.2,\n transparent: true,\n }),\n selection: new MeshBasicMaterial({\n color: '#FF0000',\n depthTest: false,\n opacity: 0.6,\n transparent: true,\n }),\n};\n\n///// PROPERTIES\n\ninterface IndexMap {\n [expressID: string]: Set<number>;\n}\n\n// Re-defined from Web-ifc\nconst IFCRELDEFINESBYPROPERTIES = 4186316022;\nconst IFCRELDEFINESBYTYPE = 781010003;\nconst IFCRELASSOCIATESMATERIAL = 2655215786;\nconst IFCRELCONTAINEDINSPATIALSTRUCTURE = 3242617779;\nconst IFCRELASSOCIATESCLASSIFICATION = 919958153;\nconst IFCRELASSIGNSTOGROUP = 1307041759;\nconst IFCPROPERTYSET = 1451395588;\nconst IFCELEMENTQUANTITY = 1883228015;\n\n// IFC properties we want to explore\nconst setEntities = [IFCPROPERTYSET, IFCELEMENTQUANTITY];\n\n// IFC relations we want to process to extract properties\nconst relationsToProcess = [\n IFCRELDEFINESBYPROPERTIES,\n IFCRELDEFINESBYTYPE,\n IFCRELASSOCIATESMATERIAL,\n IFCRELCONTAINEDINSPATIALSTRUCTURE,\n IFCRELASSOCIATESCLASSIFICATION,\n IFCRELASSIGNSTOGROUP,\n];\n\n///// CLASSIFICATION\n\nexport enum ClassificationSystem {\n ENTITY = 'entities',\n STOREY = 'storeys',\n}\n\nexport type ClassificationItem = {\n children: ClassificationItem[];\n fragments: FragmentIdMap;\n name: string;\n treeItemName: string;\n};\n\nexport interface IFCFeature {\n ifcProperties: IFCProperty[];\n itemProperties: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [attribute: string]: any;\n };\n}\n\nexport interface IFCPickResult extends PickResult<IFCFeature> {\n entity: IfcEntity;\n features?: IFCFeature[];\n isIFCPickResult: true;\n object: FragmentMesh;\n}\n\nexport interface IFCProperty {\n name: string;\n parentName: string;\n value: number | null;\n}\n\nexport const isIFCPickResult = (obj: unknown): obj is IFCPickResult =>\n isObject(obj) && (obj as IFCPickResult).isIFCPickResult;\n\n/** Source interface for {@link IfcEntity} */\nexport interface IfcSource extends CoordinatesMixin, UrlOrDataMixin {\n /** Name of the IFC */\n name: string;\n}\n\n/**\n * Entity for displaying an IFC file\n */\nexport default class IfcEntity\n extends Entity3D\n implements PickableFeatures<IFCFeature, IFCPickResult>\n{\n public readonly isIfcEntity = true as const;\n public readonly isPickableFeatures = true as const;\n public override readonly type = 'IfcEntity' as const;\n\n private _classificationCache: ClassificationItem[] | null;\n\n private _components: Components;\n private _fragmentBoundingBox: FragmentBoundingBox | null;\n private _fragmentClassifier!: FragmentClassifier;\n private _fragmentManager!: FragmentManager;\n private _ifcSelection: SelectionMap; // Currently selected fragments\n private _indexMap: IndexMap; // Properties relationships\n private _model!: FragmentsGroup;\n private readonly _source: IfcSource;\n\n public constructor(source: IfcSource) {\n super(new Group());\n this._source = source;\n\n this._components = new Components();\n this._components.ui.enabled = false;\n\n this._components.scene = new SimpleScene(this._components);\n this._components.renderer = new SimpleRenderer(\n this._components,\n document.createElement('div'),\n );\n this._components.camera = new SimpleCamera(this._components);\n this._components.raycaster = new SimpleRaycaster(this._components);\n\n this._components.init();\n\n this._ifcSelection = { bbox: {}, selection: {} };\n this._indexMap = {};\n this._classificationCache = null;\n this._fragmentBoundingBox = null;\n }\n\n public static isIFCEntity = (obj: unknown): obj is IfcEntity =>\n isObject(obj) && (obj as IfcEntity).isIfcEntity;\n\n public static isIFCPickResult = (obj: unknown): obj is IFCPickResult =>\n isObject(obj) && IfcEntity.isIFCEntity((obj as PickResult<unknown>).entity);\n\n public clearHighlight(name: FragmentTypeName = 'selection'): void {\n for (const fragID of Object.keys(this._ifcSelection[name])) {\n const fragment = this._fragmentManager.list[fragID];\n const selection = fragment?.fragments[name];\n if (selection != null) {\n selection.mesh.removeFromParent();\n }\n }\n this.notifyChange(this);\n\n this._ifcSelection[name] = {};\n }\n\n public getBoundingBoxById(ids: FragmentIdMap): Box3 | undefined {\n this.clearHighlight('bbox');\n this.highlightById(ids, 'bbox');\n\n const bbox = this._fragmentBoundingBox;\n if (bbox === null) {\n throw new Error('Must call initClassification before getBoundingBoxById');\n }\n\n const fragments = this._fragmentManager;\n bbox.reset();\n\n const selected = this._ifcSelection.bbox;\n if (!Object.keys(selected).length) {\n return;\n }\n for (const fragID of Object.keys(selected)) {\n const fragment = fragments.list[fragID];\n const highlight = fragment.fragments['bbox'];\n bbox.addMesh(highlight.mesh);\n }\n\n const box = bbox.get();\n\n // since Giro3D is Z-up, we need to swap Y and Z, and then invert the sign of\n // the new Y (i.e the Z before the swap).\n const { y: ymin, z: zmin } = box.min;\n const { y: ymax, z: zmax } = box.max;\n\n box.min.y = -zmax;\n box.max.y = -zmin;\n box.min.z = ymin;\n box.max.z = ymax;\n\n box.translate(this._model.position);\n\n this.clearHighlight('bbox');\n return box;\n }\n\n public getClassification(): ClassificationItem[] {\n if (this._classificationCache === null) {\n throw new Error('Must call initClassification before getClassification');\n }\n return this._classificationCache;\n }\n\n public getProperties(expressID: string): IFCProperty[] {\n const properties = [];\n const objectRawProperties = this._model.properties;\n if (!objectRawProperties) {\n return [];\n }\n\n for (const id of this._indexMap[expressID]) {\n const entity = objectRawProperties[id];\n if (entity == null) {\n continue;\n }\n const { name } = IfcPropertiesUtils.getEntityName(objectRawProperties, id);\n if (name === null) {\n continue;\n }\n\n if (entity.type === IFCPROPERTYSET) {\n const psetPropsIds = IfcPropertiesUtils.getPsetProps(objectRawProperties, id);\n if (psetPropsIds !== null) {\n for (const psetPropId of psetPropsIds) {\n const psetProp = objectRawProperties[psetPropId];\n if (psetProp == null) {\n continue;\n }\n const psetProperties = this.getProperty(psetPropId);\n if (psetProperties === null) {\n continue;\n }\n properties.push({\n parentName: name,\n ...psetProperties,\n });\n }\n }\n } else if (entity.type === IFCELEMENTQUANTITY) {\n const qsetQuantityIds = IfcPropertiesUtils.getQsetQuantities(\n objectRawProperties,\n id,\n );\n if (qsetQuantityIds !== null) {\n for (const quantityId of qsetQuantityIds) {\n const { key } = IfcPropertiesUtils.getQuantityValue(\n objectRawProperties,\n quantityId,\n );\n if (key === null) {\n continue;\n }\n const qsetProperties = this.getProperty(quantityId);\n if (qsetProperties === null) {\n continue;\n }\n properties.push({\n parentName: name,\n ...qsetProperties,\n });\n }\n }\n }\n }\n\n return properties;\n }\n\n public getProperty(expressID: number): { name: string; value: number | null } | null {\n const properties = this._model.properties;\n if (properties === undefined) {\n return null;\n }\n\n const { name } = IfcPropertiesUtils.getEntityName(properties, expressID);\n if (name === null) {\n return null;\n }\n\n const { value } = IfcPropertiesUtils.getQuantityValue(properties, expressID);\n return { name, value };\n }\n\n public highlight(name: FragmentTypeName, mesh: FragmentMesh, itemId: string): void {\n this._ifcSelection[name][mesh.uuid] = new Set<string>();\n\n const idNum = parseInt(itemId, 10);\n this._ifcSelection[name][mesh.uuid].add(itemId);\n this.addComposites(name, mesh, idNum);\n this.regenerate(name, mesh.uuid);\n\n const group = mesh.fragment.group;\n if (group) {\n const keys = group.data[idNum][0];\n for (let i = 0; i < keys.length; i++) {\n const fragKey = keys[i];\n const fragID = group.keyFragments[fragKey];\n const fragment = this._fragmentManager.list[fragID];\n\n if (!(fragID in this._ifcSelection[name])) {\n this._ifcSelection[name][fragID] = new Set<string>();\n }\n this._ifcSelection[name][fragID].add(itemId);\n this.addComposites(name, fragment.mesh, idNum);\n this.regenerate(name, fragID);\n }\n }\n this.notifyChange(this);\n }\n\n public highlightById(ids: FragmentIdMap, name: FragmentTypeName = 'selection'): void {\n for (const fragID of Object.keys(ids)) {\n if (!(fragID in this._ifcSelection[name])) {\n this._ifcSelection[name][fragID] = new Set<string>();\n }\n\n const fragment = this._fragmentManager.list[fragID];\n\n const idsNum = new Set<number>();\n for (const id of ids[fragID]) {\n this._ifcSelection[name][fragID].add(id);\n idsNum.add(parseInt(id, 10));\n }\n for (const id of idsNum) {\n this.addComposites(name, fragment.mesh, id);\n }\n this.regenerate(name, fragID);\n }\n\n this.notifyChange(this);\n }\n\n public override pick(canvasCoords: Vector2, options?: PickOptions): IFCPickResult[] {\n return super.pick(canvasCoords, options).map(p => ({\n ...p,\n entity: this,\n features: p.features as IFCFeature[] | undefined,\n isIFCPickResult: true,\n object: p.object as FragmentMesh,\n }));\n }\n\n public pickFeaturesFrom(pickedResult: IFCPickResult): IFCFeature[] {\n const mesh = pickedResult.object;\n if (mesh.fragment != null && pickedResult.instanceId != null && pickedResult.face) {\n const blockId = mesh.fragment.getVertexBlockID(mesh.geometry, pickedResult.face.a);\n\n const itemId = mesh.fragment\n .getItemID(pickedResult.instanceId, blockId)\n ?.replace(/\\..*/, '');\n\n // @ts-expect-error IfcProperties defines indexes as numbers, but actually are strings\n if (itemId && mesh.fragment.group?.properties?.[itemId] != null) {\n const properties = mesh.fragment.group.properties;\n // @ts-expect-error IfcProperties defines indexes as numbers, but actually are strings\n const itemProperties = properties[itemId];\n const ifcProperties = this.getProperties(itemId);\n\n const result = [{ ifcProperties, itemProperties }];\n pickedResult.features = result;\n return result;\n }\n }\n return [];\n }\n\n protected async initClassification(): Promise<void> {\n this._classificationCache = await this.regenerateClassification([\n ClassificationSystem.STOREY,\n ClassificationSystem.ENTITY,\n ]);\n if (this._classificationCache.length === 0) {\n // Maybe we don't have storeys, try to classify by entity\n this._classificationCache = await this.regenerateClassification([\n ClassificationSystem.ENTITY,\n ]);\n }\n this._fragmentBoundingBox = await this._components.tools.get(FragmentBoundingBox);\n }\n\n protected override async preprocess(): Promise<void> {\n const data = await Fetcher.fetchArrayBuffer(this._source.url);\n\n this._fragmentManager = await this._components.tools.get(FragmentManager);\n\n this._fragmentClassifier = await this._components.tools.get(FragmentClassifier);\n const fragmentIfcLoader = new FragmentIfcLoader(this._components);\n\n fragmentIfcLoader.settings.webIfc.COORDINATE_TO_ORIGIN = true;\n fragmentIfcLoader.settings.webIfc.OPTIMIZE_PROFILES = true;\n\n const buffer = new Uint8Array(data);\n this._model = await fragmentIfcLoader.load(buffer, this._source.name);\n\n // IFC models are Y-up, so we need to rotate them to be Z-up.\n this._model.rotateX(Math.PI / 2);\n\n const position = new Vector3();\n // If custom coordinates are provided, we ignore the IFC's placement\n if (this._source.at) {\n this._source.at.toVector3(position);\n this._model.position.copy(position);\n } else {\n // Since we are loading the model with COORDINATE_TO_ORIGIN = true, all vertices will be\n // expressed as an offset from the root object, rather than their absolute world space\n // positions. We then have to compute a transformation matrix to put the object back in\n // its original position.\n // For this, we use the undocumented coordination matrix which is the transformation\n // from world to local space.\n //\n // However, since Giro3D is Z-up, we need to swap Y and Z, and then invert the sign of\n // the new Y (i.e the Z before the swap).\n //\n // Important note: the IFC's origin is not transformed to the instance's CRS. We assume that\n // The IFC file is in the same coordinate system as the instance.\n const coordinationMatrix = this._model.coordinationMatrix.clone().invert();\n position.applyMatrix4(coordinationMatrix);\n this._model.position.set(position.x, -position.z, position.y);\n }\n\n this._model.updateWorldMatrix(true, true);\n this._model.updateMatrix();\n this._model.updateMatrixWorld(true);\n this.initializeEntityIndexes();\n\n this._fragmentClassifier.byStorey(this._model);\n this._fragmentClassifier.byEntity(this._model);\n\n await this.initClassification();\n\n this.object3d.add(this._model);\n this.onObjectCreated(this._model);\n\n const context = Fetcher.getContext(this._source.url);\n fillObject3DUserData(this, { filename: context.filename });\n\n this.notifyChange(this.object3d);\n }\n\n private addComposites(name: FragmentTypeName, mesh: FragmentMesh, itemID: number): void {\n this.addHighlightToFragment(name, mesh.fragment);\n const composites = mesh.fragment.composites[itemID];\n if (composites) {\n for (let i = 1; i < composites; i++) {\n const compositeID = toCompositeID(itemID, i);\n this._ifcSelection[name][mesh.uuid].add(compositeID);\n }\n }\n }\n\n private addHighlightToFragment(name: FragmentTypeName, fragment: Fragment): void {\n if (!(name in fragment.fragments)) {\n const subFragment = fragment.addFragment(name, [materials[name]]);\n if (fragment.blocks.count > 1) {\n subFragment.setInstance(0, {\n ids: Array.from(fragment.ids),\n transform: tempMatrix,\n });\n subFragment.blocks.setVisibility(false);\n }\n\n this._model.add(subFragment.mesh);\n\n subFragment.mesh.renderOrder = 30;\n subFragment.mesh.frustumCulled = false;\n subFragment.mesh.name = name;\n subFragment.mesh.updateMatrixWorld(true);\n }\n }\n\n private initializeEntityIndexes(): void {\n this._indexMap = {};\n const properties = this._model.properties;\n if (properties === undefined) {\n return;\n }\n\n for (const relation of relationsToProcess) {\n IfcPropertiesUtils.getRelationMap(properties, relation, (relationID, relatedIDs) => {\n const relationEntity = properties[relationID];\n if (!setEntities.includes(relationEntity.type)) {\n this.setEntityIndex(relationID);\n }\n for (const expressID of relatedIDs) {\n this.setEntityIndex(expressID).add(relationID);\n }\n });\n }\n }\n\n private regenerate(name: FragmentTypeName, fragID: string): void {\n this.updateFragmentFill(name, fragID);\n }\n\n private async regenerateClassification(\n groupSystemNames: string[],\n result = {},\n ): Promise<ClassificationItem[]> {\n const systems = this._fragmentClassifier.get();\n const groups: ClassificationItem[] = [];\n const currentSystemName = groupSystemNames[0]; // storeys\n const systemGroups = systems[currentSystemName];\n\n if (currentSystemName == null || systemGroups == null) {\n return groups;\n }\n for (const name of Object.keys(systemGroups)) {\n // name is N00, N01, N02...\n // { storeys: \"N00\" }, { storeys: \"N01\" }...\n const filter = { ...result, [currentSystemName]: [name] };\n const found = await this._fragmentClassifier.find(filter);\n const hasElements = Object.keys(found).length > 0;\n\n if (hasElements) {\n const firstLetter = currentSystemName[0].toUpperCase();\n const treeItemName = firstLetter + currentSystemName.slice(1); // Storeys\n const children = await this.regenerateClassification(\n groupSystemNames.slice(1),\n filter,\n );\n\n groups.push({ children, fragments: found, name, treeItemName });\n }\n }\n return groups;\n }\n\n private setEntityIndex(expressID: number): Set<number> {\n if (!(expressID in this._indexMap)) {\n this._indexMap[expressID] = new Set();\n }\n return this._indexMap[expressID];\n }\n private updateFragmentFill(name: FragmentTypeName, fragmentID: string): void {\n const ids = this._ifcSelection[name][fragmentID];\n const fragment = this._fragmentManager.list[fragmentID];\n if (fragment == null) {\n return;\n }\n const selection = fragment.fragments[name];\n if (selection == null) {\n return;\n }\n\n const fragmentParent = fragment.mesh.parent;\n if (fragmentParent == null) {\n return;\n }\n fragmentParent.add(selection.mesh);\n\n const isBlockFragment = selection.blocks.count > 1;\n if (isBlockFragment) {\n fragment.getInstance(0, tempMatrix);\n selection.setInstance(0, {\n ids: Array.from(fragment.ids),\n transform: tempMatrix,\n });\n\n selection.blocks.setVisibility(true, ids, true);\n } else {\n let i = 0;\n for (const id of ids) {\n selection.mesh.count = i + 1;\n const { instanceID } = fragment.getInstanceAndBlockID(id);\n fragment.getInstance(instanceID, tempMatrix);\n selection.setInstance(i, { ids: [id], transform: tempMatrix });\n i++;\n }\n }\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type GUI from 'lil-gui';\n\nimport EntityInspector from '@giro3d/giro3d/gui/EntityInspector';\n\nimport type IfcEntity from './IfcEntity';\n\nexport default class IfcEntityInspector extends EntityInspector<IfcEntity> {\n public constructor(parentGui: GUI, instance: Instance, entity: IfcEntity) {\n super(parentGui, instance, entity, { visibility: true });\n }\n}\n","<script setup lang=\"ts\">\n import { MathUtils } from 'three';\n import { ref } from 'vue';\n\n import type IfcEntity from '@/modules/ifc/IfcEntity';\n import type { ClassificationItem } from '@/modules/ifc/IfcEntity';\n\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 { useCameraStore } from '@/stores/camera';\n import { useModuleStore } from '@/stores/modules';\n\n import type ClippingBoxAnalysis from '../ClippingBoxAnalysis';\n\n import { moduleId } from '../ClippingBoxAnalysis';\n\n const props = defineProps<{\n classificationElement: ClassificationItem;\n ifcEntity: IfcEntity;\n }>();\n\n const id = MathUtils.generateUUID();\n const target = `#${id}`;\n\n const highlighted = ref(false);\n const cameraStore = useCameraStore();\n const moduleStore = useModuleStore();\n\n const clippingBoxModule = moduleStore.getModule<ClippingBoxAnalysis>(moduleId);\n\n function clipTo(): void {\n if (clippingBoxModule == null) {\n console.warn('Cannot clip IFC element, ClippingBoxAnalysis module is not present');\n return;\n }\n\n const bbox = props.ifcEntity.getBoundingBoxById(props.classificationElement.fragments);\n if (bbox && !bbox.isEmpty()) {\n clippingBoxModule.setClippingBox(bbox);\n }\n }\n\n function highlight(): void {\n highlighted.value = true;\n props.ifcEntity.clearHighlight();\n props.ifcEntity.highlightById(props.classificationElement.fragments);\n\n setTimeout(() => (highlighted.value = false), 2000);\n }\n\n function zoomTo(): void {\n const bbox = props.ifcEntity.getBoundingBoxById(props.classificationElement.fragments);\n if (bbox && !bbox.isEmpty()) {\n cameraStore.lookTopDownAt(bbox);\n }\n }\n</script>\n\n<template>\n <div>\n <div class=\"d-flex\">\n <span\n class=\"border rounded px-1 py-0 fw-normal\"\n :class=\"\n highlighted ? 'text-danger border-danger' : 'text-secondary border-secondary'\n \"\n :title=\"classificationElement.treeItemName\"\n >{{ classificationElement.treeItemName }}</span\n >\n <IconList v-if=\"classificationElement.children.length > 0\">\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=\"true\"\n />\n </IconList>\n <ListLabelButton\n class=\"label\"\n :class=\"highlighted ? 'text-danger-emphasis' : 'text-muted'\"\n :text=\"classificationElement.name\"\n :title=\"`Zoom to ${classificationElement.name}`\"\n @click=\"zoomTo\"\n />\n <IconList class=\"ms-1\">\n <IconListButton title=\"Highlight\" icon=\"bi-highlighter\" @click=\"highlight\" />\n <IconListButton\n v-if=\"clippingBoxModule != null\"\n title=\"Clip to\"\n icon=\"bi-bounding-box\"\n @click=\"clipTo\"\n />\n </IconList>\n </div>\n <div v-if=\"classificationElement.children.length > 0\" :id=\"id\" class=\"collapse show\">\n <ul class=\"list-unstyled border-start\">\n <li v-for=\"(item, index) in classificationElement.children\" :key=\"index\">\n <IfcSubtree :ifc-entity=\"props.ifcEntity\" :classification-element=\"item\" />\n </li>\n </ul>\n </div>\n </div>\n</template>\n\n<style scoped>\n ul {\n margin-left: 0.5rem;\n padding-left: 0.5rem;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { Dataset } from '@/types/Dataset';\n\n import { useDatasetStore } from '@/stores/datasets';\n import { refAndWatch } from '@/utils/Components';\n\n import type IfcEntity from './IfcEntity';\n import type { ClassificationItem } from './IfcEntity';\n\n import IfcSubtree from './IfcSubtree.vue';\n\n const datasets = useDatasetStore();\n\n const props = defineProps<{\n dataset: Dataset;\n }>();\n\n const isPreloaded = refAndWatch(props.dataset, 'isPreloaded');\n\n function getClassificationRoot(): ClassificationItem[] | null {\n const ifcEntity = getIfcEntity();\n\n if (ifcEntity == null) {\n return null;\n }\n\n return ifcEntity.getClassification();\n }\n\n function getIfcEntity(): IfcEntity | null {\n const entity = datasets.getEntity(props.dataset);\n\n if (entity == null) {\n return null;\n }\n\n return entity as IfcEntity;\n }\n</script>\n\n<template>\n <div v-if=\"isPreloaded\">\n <ul>\n <li v-for=\"(item, index) in getClassificationRoot()\" :key=\"index\">\n <IfcSubtree\n :ifc-entity=\"getIfcEntity() as IfcEntity\"\n :classification-element=\"item\"\n />\n </li>\n </ul>\n </div>\n</template>\n\n<style scoped>\n ul {\n font-size: smaller;\n }\n</style>\n","import type PickResult from '@giro3d/giro3d/core/picking/PickResult';\n\nimport EntityPanel from '@giro3d/giro3d/gui/EntityPanel';\nimport { IfcCategoryMap } from 'openbim-components';\n\nimport type { PieroContext } from '@/context';\nimport type { EntityBuilder } from '@/giro3d/EntityBuilder';\nimport type { LoadDatasetFromFile } from '@/loaders/loader';\nimport type { Module } from '@/module';\nimport type { HighlightFn } from '@/services/Highlighter';\nimport type { AttributeExtractorFn } from '@/services/Picker';\nimport type { IFCDatasetConfig } from '@/types/configuration/datasets/ifc';\nimport type { Attribute, AttributesGroups } from '@/types/Feature';\n\nimport { getCoordinates } from '@/utils/Configuration';\nimport Fetcher from '@/utils/Fetcher';\n\nimport IfcEntity, { isIFCPickResult } from './ifc/IfcEntity';\nimport IfcEntityInspector from './ifc/IfcEntityInspector';\nimport IfcPropertyView from './ifc/IfcPropertyView.vue';\n\nconst highlight: HighlightFn = (pick: PickResult) => {\n if (isIFCPickResult(pick)) {\n const mesh = pick.object;\n if (mesh.fragment != null && pick.face && pick.instanceId != null) {\n const blockId = mesh.fragment.getVertexBlockID(mesh.geometry, pick.face.a);\n\n const itemId = mesh.fragment.getItemID(pick.instanceId, blockId).replace(/\\..*/, '');\n\n pick.entity.highlight('selection', mesh, itemId);\n\n return () => pick.entity.clearHighlight();\n }\n }\n\n return null;\n};\n\nconst loader: LoadDatasetFromFile<IFCDatasetConfig> = context => {\n return {\n name: context.filename,\n source: {\n url: context.file,\n },\n type: 'ifc',\n visible: true,\n } satisfies IFCDatasetConfig;\n};\n\nconst attributeExtractor: AttributeExtractorFn = (\n pickResult: PickResult,\n attributesGroups: AttributesGroups,\n) => {\n if (!isIFCPickResult(pickResult)) {\n return;\n }\n\n const feature = pickResult.features?.at(0);\n if (!feature) {\n return;\n }\n\n if (!attributesGroups.has('IFC')) {\n attributesGroups.set('IFC', []);\n }\n const attributes = attributesGroups.get('IFC') as Attribute[];\n\n const { ifcProperties, itemProperties } = feature;\n\n const nullValue = 'NULL';\n const name = itemProperties.Name?.value ?? nullValue;\n\n attributes.push({\n key: 'Site',\n value: pickResult.entity.object3d.userData?.dataset?.name ?? nullValue,\n });\n attributes.push({\n key: 'IFCType',\n value: IfcCategoryMap[itemProperties.type] ?? nullValue,\n });\n attributes.push({ key: 'Name', value: name });\n attributes.push({ key: 'ID', value: itemProperties.expressID });\n attributes.push({ key: 'GlobalId', value: itemProperties.GlobalId?.value ?? nullValue });\n if (itemProperties.Description?.value != null) {\n attributes.push({ key: 'Description', value: itemProperties.Description.value });\n }\n if (itemProperties.PredefinedType?.value != null) {\n attributes.push({ key: 'PredefinedType', value: itemProperties.PredefinedType.value });\n }\n if (itemProperties.ObjectType?.value != null) {\n attributes.push({ key: 'ObjectType', value: itemProperties.ObjectType.value });\n }\n\n for (const { name, parentName, value } of ifcProperties) {\n if (!attributesGroups.has(parentName)) {\n attributesGroups.set(parentName, []);\n }\n attributesGroups.get(parentName)?.push({ key: name, value });\n }\n};\n\nconst entityBuilder: EntityBuilder = context => {\n const dataset = context.dataset;\n\n const cfg = dataset.config as IFCDatasetConfig;\n const at = getCoordinates(cfg.source.position ?? dataset.get('position'));\n const entity = new IfcEntity({\n ...cfg.source,\n at,\n name: dataset.name,\n });\n\n return Promise.resolve(entity);\n};\n\n/**\n * Loads IFC (Industry Foundation Classes) files.\n */\nexport default class IFCLoader implements Module {\n public readonly id = 'builtin-ifc-loader';\n public readonly name = 'IFC';\n\n public async initialize(context: PieroContext): Promise<void> {\n context.datasets.registerDatasetType('ifc', {\n attributeExtractor,\n entityBuilder,\n fileExtensions: ['ifc'],\n highlight,\n icon: 'bi-building',\n loader,\n name: 'IFC',\n propertyView: IfcPropertyView,\n });\n\n EntityPanel.registerInspector('IfcEntity', IfcEntityInspector);\n\n // Preload web-ifc.wasm\n await Fetcher.fetch('web-ifc.wasm').catch(e => {\n console.warn('Could not load web-ifc.wasm', e);\n });\n }\n}\n","import {\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tColor,\n\tSRGBColorSpace\n} from 'three';\n\n/**\n * Description: A THREE loader for PLY ASCII files (known as the Polygon\n * File Format or the Stanford Triangle Format).\n *\n * Limitations: ASCII decoding assumes file is UTF-8.\n *\n * Usage:\n *\tconst loader = new PLYLoader();\n *\tloader.load('./models/ply/ascii/dolphins.ply', function (geometry) {\n *\n *\t\tscene.add( new THREE.Mesh( geometry ) );\n *\n *\t} );\n *\n * If the PLY file uses non standard property names, they can be mapped while\n * loading. For example, the following maps the properties\n * “diffuse_(red|green|blue)” in the file to standard color names.\n *\n * loader.setPropertyNameMapping( {\n *\tdiffuse_red: 'red',\n *\tdiffuse_green: 'green',\n *\tdiffuse_blue: 'blue'\n * } );\n *\n * Custom properties outside of the defaults for position, uv, normal\n * and color attributes can be added using the setCustomPropertyNameMapping method.\n * For example, the following maps the element properties “custom_property_a”\n * and “custom_property_b” to an attribute “customAttribute” with an item size of 2.\n * Attribute item sizes are set from the number of element properties in the property array.\n *\n * loader.setCustomPropertyNameMapping( {\n *\tcustomAttribute: ['custom_property_a', 'custom_property_b'],\n * } );\n *\n */\n\nconst _color = new Color();\n\nclass PLYLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.propertyNameMapping = {};\n\t\tthis.customPropertyMapping = {};\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tsetPropertyNameMapping( mapping ) {\n\n\t\tthis.propertyNameMapping = mapping;\n\n\t}\n\n\tsetCustomPropertyNameMapping( mapping ) {\n\n\t\tthis.customPropertyMapping = mapping;\n\n\t}\n\n\tparse( data ) {\n\n\t\tfunction parseHeader( data, headerLength = 0 ) {\n\n\t\t\tconst patternHeader = /^ply([\\s\\S]*)end_header(\\r\\n|\\r|\\n)/;\n\t\t\tlet headerText = '';\n\t\t\tconst result = patternHeader.exec( data );\n\n\t\t\tif ( result !== null ) {\n\n\t\t\t\theaderText = result[ 1 ];\n\n\t\t\t}\n\n\t\t\tconst header = {\n\t\t\t\tcomments: [],\n\t\t\t\telements: [],\n\t\t\t\theaderLength: headerLength,\n\t\t\t\tobjInfo: ''\n\t\t\t};\n\n\t\t\tconst lines = headerText.split( /\\r\\n|\\r|\\n/ );\n\t\t\tlet currentElement;\n\n\t\t\tfunction make_ply_element_property( propertValues, propertyNameMapping ) {\n\n\t\t\t\tconst property = { type: propertValues[ 0 ] };\n\n\t\t\t\tif ( property.type === 'list' ) {\n\n\t\t\t\t\tproperty.name = propertValues[ 3 ];\n\t\t\t\t\tproperty.countType = propertValues[ 1 ];\n\t\t\t\t\tproperty.itemType = propertValues[ 2 ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tproperty.name = propertValues[ 1 ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( property.name in propertyNameMapping ) {\n\n\t\t\t\t\tproperty.name = propertyNameMapping[ property.name ];\n\n\t\t\t\t}\n\n\t\t\t\treturn property;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < lines.length; i ++ ) {\n\n\t\t\t\tlet line = lines[ i ];\n\t\t\t\tline = line.trim();\n\n\t\t\t\tif ( line === '' ) continue;\n\n\t\t\t\tconst lineValues = line.split( /\\s+/ );\n\t\t\t\tconst lineType = lineValues.shift();\n\t\t\t\tline = lineValues.join( ' ' );\n\n\t\t\t\tswitch ( lineType ) {\n\n\t\t\t\t\tcase 'format':\n\n\t\t\t\t\t\theader.format = lineValues[ 0 ];\n\t\t\t\t\t\theader.version = lineValues[ 1 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'comment':\n\n\t\t\t\t\t\theader.comments.push( line );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'element':\n\n\t\t\t\t\t\tif ( currentElement !== undefined ) {\n\n\t\t\t\t\t\t\theader.elements.push( currentElement );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentElement = {};\n\t\t\t\t\t\tcurrentElement.name = lineValues[ 0 ];\n\t\t\t\t\t\tcurrentElement.count = parseInt( lineValues[ 1 ] );\n\t\t\t\t\t\tcurrentElement.properties = [];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'property':\n\n\t\t\t\t\t\tcurrentElement.properties.push( make_ply_element_property( lineValues, scope.propertyNameMapping ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'obj_info':\n\n\t\t\t\t\t\theader.objInfo = line;\n\n\t\t\t\t\t\tbreak;\n\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tconsole.log( 'unhandled', lineType, lineValues );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( currentElement !== undefined ) {\n\n\t\t\t\theader.elements.push( currentElement );\n\n\t\t\t}\n\n\t\t\treturn header;\n\n\t\t}\n\n\t\tfunction parseASCIINumber( n, type ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'char': case 'uchar': case 'short': case 'ushort': case 'int': case 'uint':\n\t\t\t\tcase 'int8': case 'uint8': case 'int16': case 'uint16': case 'int32': case 'uint32':\n\n\t\t\t\t\treturn parseInt( n );\n\n\t\t\t\tcase 'float': case 'double': case 'float32': case 'float64':\n\n\t\t\t\t\treturn parseFloat( n );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseASCIIElement( properties, tokens ) {\n\n\t\t\tconst element = {};\n\n\t\t\tfor ( let i = 0; i < properties.length; i ++ ) {\n\n\t\t\t\tif ( tokens.empty() ) return null;\n\n\t\t\t\tif ( properties[ i ].type === 'list' ) {\n\n\t\t\t\t\tconst list = [];\n\t\t\t\t\tconst n = parseASCIINumber( tokens.next(), properties[ i ].countType );\n\n\t\t\t\t\tfor ( let j = 0; j < n; j ++ ) {\n\n\t\t\t\t\t\tif ( tokens.empty() ) return null;\n\n\t\t\t\t\t\tlist.push( parseASCIINumber( tokens.next(), properties[ i ].itemType ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\telement[ properties[ i ].name ] = list;\n\n\t\t\t\t} else {\n\n\t\t\t\t\telement[ properties[ i ].name ] = parseASCIINumber( tokens.next(), properties[ i ].type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn element;\n\n\t\t}\n\n\t\tfunction createBuffer() {\n\n\t\t\tconst buffer = {\n\t\t\t indices: [],\n\t\t\t vertices: [],\n\t\t\t normals: [],\n\t\t\t uvs: [],\n\t\t\t faceVertexUvs: [],\n\t\t\t colors: [],\n\t\t\t faceVertexColors: []\n\t\t\t};\n\n\t\t\tfor ( const customProperty of Object.keys( scope.customPropertyMapping ) ) {\n\n\t\t\t buffer[ customProperty ] = [];\n\n\t\t\t}\n\n\t\t\treturn buffer;\n\n\t\t}\n\n\t\tfunction mapElementAttributes( properties ) {\n\n\t\t\tconst elementNames = properties.map( property => {\n\n\t\t\t\treturn property.name;\n\n\t\t\t} );\n\n\t\t\tfunction findAttrName( names ) {\n\n\t\t\t\tfor ( let i = 0, l = names.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst name = names[ i ];\n\n\t\t\t\t\tif ( elementNames.includes( name ) ) return name;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tattrX: findAttrName( [ 'x', 'px', 'posx' ] ) || 'x',\n\t\t\t\tattrY: findAttrName( [ 'y', 'py', 'posy' ] ) || 'y',\n\t\t\t\tattrZ: findAttrName( [ 'z', 'pz', 'posz' ] ) || 'z',\n\t\t\t\tattrNX: findAttrName( [ 'nx', 'normalx' ] ),\n\t\t\t\tattrNY: findAttrName( [ 'ny', 'normaly' ] ),\n\t\t\t\tattrNZ: findAttrName( [ 'nz', 'normalz' ] ),\n\t\t\t\tattrS: findAttrName( [ 's', 'u', 'texture_u', 'tx' ] ),\n\t\t\t\tattrT: findAttrName( [ 't', 'v', 'texture_v', 'ty' ] ),\n\t\t\t\tattrR: findAttrName( [ 'red', 'diffuse_red', 'r', 'diffuse_r' ] ),\n\t\t\t\tattrG: findAttrName( [ 'green', 'diffuse_green', 'g', 'diffuse_g' ] ),\n\t\t\t\tattrB: findAttrName( [ 'blue', 'diffuse_blue', 'b', 'diffuse_b' ] ),\n\t\t\t};\n\n\t\t}\n\n\t\tfunction parseASCII( data, header ) {\n\n\t\t\t// PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)\n\n\t\t\tconst buffer = createBuffer();\n\n\t\t\tconst patternBody = /end_header\\s+(\\S[\\s\\S]*\\S|\\S)\\s*$/;\n\t\t\tlet body, matches;\n\n\t\t\tif ( ( matches = patternBody.exec( data ) ) !== null ) {\n\n\t\t\t\tbody = matches[ 1 ].split( /\\s+/ );\n\n\t\t\t} else {\n\n\t\t\t\tbody = [ ];\n\n\t\t\t}\n\n\t\t\tconst tokens = new ArrayStream( body );\n\n\t\t\tloop: for ( let i = 0; i < header.elements.length; i ++ ) {\n\n\t\t\t\tconst elementDesc = header.elements[ i ];\n\t\t\t\tconst attributeMap = mapElementAttributes( elementDesc.properties );\n\n\t\t\t\tfor ( let j = 0; j < elementDesc.count; j ++ ) {\n\n\t\t\t\t\tconst element = parseASCIIElement( elementDesc.properties, tokens );\n\n\t\t\t\t\tif ( ! element ) break loop;\n\n\t\t\t\t\thandleElement( buffer, elementDesc.name, element, attributeMap );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn postProcess( buffer );\n\n\t\t}\n\n\t\tfunction postProcess( buffer ) {\n\n\t\t\tlet geometry = new BufferGeometry();\n\n\t\t\t// mandatory buffer data\n\n\t\t\tif ( buffer.indices.length > 0 ) {\n\n\t\t\t\tgeometry.setIndex( buffer.indices );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( buffer.vertices, 3 ) );\n\n\t\t\t// optional buffer data\n\n\t\t\tif ( buffer.normals.length > 0 ) {\n\n\t\t\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( buffer.normals, 3 ) );\n\n\t\t\t}\n\n\t\t\tif ( buffer.uvs.length > 0 ) {\n\n\t\t\t\tgeometry.setAttribute( 'uv', new Float32BufferAttribute( buffer.uvs, 2 ) );\n\n\t\t\t}\n\n\t\t\tif ( buffer.colors.length > 0 ) {\n\n\t\t\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( buffer.colors, 3 ) );\n\n\t\t\t}\n\n\t\t\tif ( buffer.faceVertexUvs.length > 0 || buffer.faceVertexColors.length > 0 ) {\n\n\t\t\t\tgeometry = geometry.toNonIndexed();\n\n\t\t\t\tif ( buffer.faceVertexUvs.length > 0 ) geometry.setAttribute( 'uv', new Float32BufferAttribute( buffer.faceVertexUvs, 2 ) );\n\t\t\t\tif ( buffer.faceVertexColors.length > 0 ) geometry.setAttribute( 'color', new Float32BufferAttribute( buffer.faceVertexColors, 3 ) );\n\n\t\t\t}\n\n\t\t\t// custom buffer data\n\n\t\t\tfor ( const customProperty of Object.keys( scope.customPropertyMapping ) ) {\n\n\t\t\t\tif ( buffer[ customProperty ].length > 0 ) {\n\n\t\t\t\t \tgeometry.setAttribute(\n\t\t\t\t\t\tcustomProperty,\n\t\t\t\t\t\tnew Float32BufferAttribute(\n\t\t\t\t\t \t\tbuffer[ customProperty ],\n\t\t\t\t\t \t\tscope.customPropertyMapping[ customProperty ].length\n\t\t\t\t\t\t)\n\t\t\t\t \t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction handleElement( buffer, elementName, element, cacheEntry ) {\n\n\t\t\tif ( elementName === 'vertex' ) {\n\n\t\t\t\tbuffer.vertices.push( element[ cacheEntry.attrX ], element[ cacheEntry.attrY ], element[ cacheEntry.attrZ ] );\n\n\t\t\t\tif ( cacheEntry.attrNX !== null && cacheEntry.attrNY !== null && cacheEntry.attrNZ !== null ) {\n\n\t\t\t\t\tbuffer.normals.push( element[ cacheEntry.attrNX ], element[ cacheEntry.attrNY ], element[ cacheEntry.attrNZ ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( cacheEntry.attrS !== null && cacheEntry.attrT !== null ) {\n\n\t\t\t\t\tbuffer.uvs.push( element[ cacheEntry.attrS ], element[ cacheEntry.attrT ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( cacheEntry.attrR !== null && cacheEntry.attrG !== null && cacheEntry.attrB !== null ) {\n\n\t\t\t\t\t_color.setRGB(\n\t\t\t\t\t\telement[ cacheEntry.attrR ] / 255.0,\n\t\t\t\t\t\telement[ cacheEntry.attrG ] / 255.0,\n\t\t\t\t\t\telement[ cacheEntry.attrB ] / 255.0,\n\t\t\t\t\t\tSRGBColorSpace\n\t\t\t\t\t);\n\n\t\t\t\t\tbuffer.colors.push( _color.r, _color.g, _color.b );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( const customProperty of Object.keys( scope.customPropertyMapping ) ) {\n\n\t\t\t\t\tfor ( const elementProperty of scope.customPropertyMapping[ customProperty ] ) {\n\n\t\t\t\t\t buffer[ customProperty ].push( element[ elementProperty ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( elementName === 'face' ) {\n\n\t\t\t\tconst vertex_indices = element.vertex_indices || element.vertex_index; // issue #9338\n\t\t\t\tconst texcoord = element.texcoord;\n\n\t\t\t\tif ( vertex_indices.length === 3 ) {\n\n\t\t\t\t\tbuffer.indices.push( vertex_indices[ 0 ], vertex_indices[ 1 ], vertex_indices[ 2 ] );\n\n\t\t\t\t\tif ( texcoord && texcoord.length === 6 ) {\n\n\t\t\t\t\t\tbuffer.faceVertexUvs.push( texcoord[ 0 ], texcoord[ 1 ] );\n\t\t\t\t\t\tbuffer.faceVertexUvs.push( texcoord[ 2 ], texcoord[ 3 ] );\n\t\t\t\t\t\tbuffer.faceVertexUvs.push( texcoord[ 4 ], texcoord[ 5 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( vertex_indices.length === 4 ) {\n\n\t\t\t\t\tbuffer.indices.push( vertex_indices[ 0 ], vertex_indices[ 1 ], vertex_indices[ 3 ] );\n\t\t\t\t\tbuffer.indices.push( vertex_indices[ 1 ], vertex_indices[ 2 ], vertex_indices[ 3 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// face colors\n\n\t\t\t\tif ( cacheEntry.attrR !== null && cacheEntry.attrG !== null && cacheEntry.attrB !== null ) {\n\n\t\t\t\t\t_color.setRGB(\n\t\t\t\t\t\telement[ cacheEntry.attrR ] / 255.0,\n\t\t\t\t\t\telement[ cacheEntry.attrG ] / 255.0,\n\t\t\t\t\t\telement[ cacheEntry.attrB ] / 255.0,\n\t\t\t\t\t\tSRGBColorSpace\n\t\t\t\t\t);\n\t\t\t\t\tbuffer.faceVertexColors.push( _color.r, _color.g, _color.b );\n\t\t\t\t\tbuffer.faceVertexColors.push( _color.r, _color.g, _color.b );\n\t\t\t\t\tbuffer.faceVertexColors.push( _color.r, _color.g, _color.b );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction binaryReadElement( at, properties ) {\n\n\t\t\tconst element = {};\n\t\t\tlet read = 0;\n\n\t\t\tfor ( let i = 0; i < properties.length; i ++ ) {\n\n\t\t\t\tconst property = properties[ i ];\n\t\t\t\tconst valueReader = property.valueReader;\n\n\t\t\t\tif ( property.type === 'list' ) {\n\n\t\t\t\t\tconst list = [];\n\n\t\t\t\t\tconst n = property.countReader.read( at + read );\n\t\t\t\t\tread += property.countReader.size;\n\n\t\t\t\t\tfor ( let j = 0; j < n; j ++ ) {\n\n\t\t\t\t\t\tlist.push( valueReader.read( at + read ) );\n\t\t\t\t\t\tread += valueReader.size;\n\n\t\t\t\t\t}\n\n\t\t\t\t\telement[ property.name ] = list;\n\n\t\t\t\t} else {\n\n\t\t\t\t\telement[ property.name ] = valueReader.read( at + read );\n\t\t\t\t\tread += valueReader.size;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn [ element, read ];\n\n\t\t}\n\n\t\tfunction setPropertyBinaryReaders( properties, body, little_endian ) {\n\n\t\t\tfunction getBinaryReader( dataview, type, little_endian ) {\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\t// corespondences for non-specific length types here match rply:\n\t\t\t\t\tcase 'int8':\tcase 'char':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getInt8( at );\n\n\t\t\t\t\t}, size: 1 };\n\t\t\t\t\tcase 'uint8':\tcase 'uchar':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getUint8( at );\n\n\t\t\t\t\t}, size: 1 };\n\t\t\t\t\tcase 'int16':\tcase 'short':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getInt16( at, little_endian );\n\n\t\t\t\t\t}, size: 2 };\n\t\t\t\t\tcase 'uint16':\tcase 'ushort':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getUint16( at, little_endian );\n\n\t\t\t\t\t}, size: 2 };\n\t\t\t\t\tcase 'int32':\tcase 'int':\t\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getInt32( at, little_endian );\n\n\t\t\t\t\t}, size: 4 };\n\t\t\t\t\tcase 'uint32':\tcase 'uint':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getUint32( at, little_endian );\n\n\t\t\t\t\t}, size: 4 };\n\t\t\t\t\tcase 'float32': case 'float':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getFloat32( at, little_endian );\n\n\t\t\t\t\t}, size: 4 };\n\t\t\t\t\tcase 'float64': case 'double':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getFloat64( at, little_endian );\n\n\t\t\t\t\t}, size: 8 };\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = properties.length; i < l; i ++ ) {\n\n\t\t\t\tconst property = properties[ i ];\n\n\t\t\t\tif ( property.type === 'list' ) {\n\n\t\t\t\t\tproperty.countReader = getBinaryReader( body, property.countType, little_endian );\n\t\t\t\t\tproperty.valueReader = getBinaryReader( body, property.itemType, little_endian );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tproperty.valueReader = getBinaryReader( body, property.type, little_endian );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseBinary( data, header ) {\n\n\t\t\tconst buffer = createBuffer();\n\n\t\t\tconst little_endian = ( header.format === 'binary_little_endian' );\n\t\t\tconst body = new DataView( data, header.headerLength );\n\t\t\tlet result, loc = 0;\n\n\t\t\tfor ( let currentElement = 0; currentElement < header.elements.length; currentElement ++ ) {\n\n\t\t\t\tconst elementDesc = header.elements[ currentElement ];\n\t\t\t\tconst properties = elementDesc.properties;\n\t\t\t\tconst attributeMap = mapElementAttributes( properties );\n\n\t\t\t\tsetPropertyBinaryReaders( properties, body, little_endian );\n\n\t\t\t\tfor ( let currentElementCount = 0; currentElementCount < elementDesc.count; currentElementCount ++ ) {\n\n\t\t\t\t\tresult = binaryReadElement( loc, properties );\n\t\t\t\t\tloc += result[ 1 ];\n\t\t\t\t\tconst element = result[ 0 ];\n\n\t\t\t\t\thandleElement( buffer, elementDesc.name, element, attributeMap );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn postProcess( buffer );\n\n\t\t}\n\n\t\tfunction extractHeaderText( bytes ) {\n\n\t\t\tlet i = 0;\n\t\t\tlet cont = true;\n\n\t\t\tlet line = '';\n\t\t\tconst lines = [];\n\n\t\t\tconst startLine = new TextDecoder().decode( bytes.subarray( 0, 5 ) );\n\t\t\tconst hasCRNL = /^ply\\r\\n/.test( startLine );\n\n\t\t\tdo {\n\n\t\t\t\tconst c = String.fromCharCode( bytes[ i ++ ] );\n\n\t\t\t\tif ( c !== '\\n' && c !== '\\r' ) {\n\n\t\t\t\t\tline += c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( line === 'end_header' ) cont = false;\n\t\t\t\t\tif ( line !== '' ) {\n\n\t\t\t\t\t\tlines.push( line );\n\t\t\t\t\t\tline = '';\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} while ( cont && i < bytes.length );\n\n\t\t\t// ascii section using \\r\\n as line endings\n\t\t\tif ( hasCRNL === true ) i ++;\n\n\t\t\treturn { headerText: lines.join( '\\r' ) + '\\r', headerLength: i };\n\n\t\t}\n\n\t\t//\n\n\t\tlet geometry;\n\t\tconst scope = this;\n\n\t\tif ( data instanceof ArrayBuffer ) {\n\n\t\t\tconst bytes = new Uint8Array( data );\n\t\t\tconst { headerText, headerLength } = extractHeaderText( bytes );\n\t\t\tconst header = parseHeader( headerText, headerLength );\n\n\t\t\tif ( header.format === 'ascii' ) {\n\n\t\t\t\tconst text = new TextDecoder().decode( bytes );\n\n\t\t\t\tgeometry = parseASCII( text, header );\n\n\t\t\t} else {\n\n\t\t\t\tgeometry = parseBinary( data, header );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tgeometry = parseASCII( data, parseHeader( data ) );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n}\n\nclass ArrayStream {\n\n\tconstructor( arr ) {\n\n\t\tthis.arr = arr;\n\t\tthis.i = 0;\n\n\t}\n\n\tempty() {\n\n\t\treturn this.i >= this.arr.length;\n\n\t}\n\n\tnext() {\n\n\t\treturn this.arr[ this.i ++ ];\n\n\t}\n\n}\n\nexport { PLYLoader };\n","import type PickableFeatures from '@giro3d/giro3d/core/picking/PickableFeatures';\nimport type PickResult from '@giro3d/giro3d/core/picking/PickResult';\n\nimport Entity3D from '@giro3d/giro3d/entities/Entity3D';\nimport { Color, DoubleSide, Group, Mesh, MeshLambertMaterial } from 'three';\nimport { PLYLoader as PLYThreeLoader } from 'three/examples/jsm/loaders/PLYLoader.js';\n\nimport type {\n CoordinatesMixin,\n FeatureProjectionMixin,\n UrlOrDataMixin,\n} from '@/giro3d/sources/mixins';\n\nimport { fillObject3DUserData } from '@/loaders/userData';\nimport Fetcher from '@/utils/Fetcher';\nimport { isObject } from '@/utils/Types';\n\n/**\n * Feature returned when picking on Ply objects\n */\nexport interface PlyFeature {\n color: Color;\n}\n\n/** Parameters for creating {@link PlyEntity} */\nexport interface PlySource\n extends Required<CoordinatesMixin>,\n Required<FeatureProjectionMixin>,\n UrlOrDataMixin {}\n\n/**\n * PLY 3D object implementing our picking\n */\nexport class PlyMesh extends Mesh implements PickableFeatures<PlyFeature> {\n public readonly isPickableFeatures = true;\n public readonly isPlyMesh = true;\n\n public static isPlyMesh = (obj: unknown): obj is PlyMesh =>\n isObject(obj) && (obj as PlyMesh).isPlyMesh;\n\n public static isPlyPickResult = (obj: unknown): obj is PickResult<PlyFeature> =>\n isObject(obj) && PlyMesh.isPlyMesh((obj as PickResult<unknown>)?.object);\n\n public pickFeaturesFrom(pickedResult: PickResult): PlyFeature[] {\n if (this.geometry.hasAttribute('color') && pickedResult.face) {\n const colors = this.geometry.getAttribute('color').array;\n const face = pickedResult.face;\n\n const color = new Color(\n colors[face.a * 3],\n colors[face.a * 3 + 1],\n colors[face.a * 3 + 2],\n );\n const result = [{ color }];\n pickedResult.features = result;\n return result;\n }\n\n return [];\n }\n}\n\n/**\n * Entity for displaying a PLY file\n */\nexport default class PlyEntity extends Entity3D {\n public readonly isPlyEntity = true;\n public readonly source: PlySource;\n\n public constructor(source: PlySource) {\n super(new Group());\n this.source = source;\n }\n\n protected override async preprocess(): Promise<void> {\n const data = await Fetcher.fetchArrayBuffer(this.source.url);\n\n const position = this.source.at.as(this.source.featureProjection).toVector3();\n\n const loader = new PLYThreeLoader();\n const geometry = loader.parse(data);\n\n const material = new MeshLambertMaterial({\n side: DoubleSide,\n });\n if (geometry.hasAttribute('color')) {\n material.vertexColors = true;\n }\n geometry.computeVertexNormals();\n\n const mesh = new PlyMesh(geometry, material);\n mesh.name = 'plyModel';\n geometry.computeBoundingBox();\n\n mesh.position.copy(position);\n mesh.updateWorldMatrix(true, true);\n\n this.object3d.add(mesh);\n this.onObjectCreated(mesh);\n\n const context = Fetcher.getContext(this.source.url);\n fillObject3DUserData(this, { filename: context.filename });\n\n this.notifyChange(this.object3d);\n }\n}\n","import type PickResult from '@giro3d/giro3d/core/picking/PickResult';\n\nimport type { PieroContext } from '@/context';\nimport type { EntityBuilder } from '@/giro3d/EntityBuilder';\nimport type { Module } from '@/module';\nimport type { AttributeExtractorFn } from '@/services/Picker';\nimport type { PLYDatasetConfig } from '@/types/configuration/datasets/ply';\nimport type { Attribute, AttributesGroups } from '@/types/Feature';\n\nimport { getCoordinates } from '@/utils/Configuration';\n\nimport PlyEntity, { PlyMesh } from './ply/PlyEntity';\n\nconst build: EntityBuilder = context => {\n const { dataset, instance } = context;\n\n const cfg = dataset.config as PLYDatasetConfig;\n const at = getCoordinates(cfg.source.position ?? dataset.get('position'));\n const entity = new PlyEntity({\n ...cfg.source,\n at,\n featureProjection: instance.referenceCrs,\n });\n\n return Promise.resolve(entity);\n};\n\nconst getAttributesFromPlyObject: AttributeExtractorFn = (\n pickResult: PickResult,\n attributesGroups: AttributesGroups,\n) => {\n if (!PlyMesh.isPlyPickResult(pickResult)) {\n return;\n }\n\n const feature = pickResult.features?.at(0);\n if (!feature) {\n return;\n }\n\n if (!attributesGroups.has('PLY')) {\n attributesGroups.set('PLY', []);\n }\n const plyAttributes = attributesGroups.get('PLY') as Attribute[];\n\n plyAttributes.push({ key: 'Color', value: feature.color });\n};\n\n/**\n * Loads .ply files.\n */\nexport default class PLYLoader implements Module {\n public readonly id = 'builtin-ply-loader';\n public readonly name = 'PLY';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.datasets.registerDatasetType('ply', {\n attributeExtractor: getAttributesFromPlyObject,\n entityBuilder: build,\n icon: 'bi-file-earmark-binary',\n name: 'PLY',\n });\n }\n}\n","import PointCloud from '@giro3d/giro3d/entities/PointCloud';\nimport PotreeSource from '@giro3d/giro3d/sources/PotreeSource';\n\nimport type { PieroContext } from '@/context';\nimport type { EntityBuilder } from '@/giro3d/EntityBuilder';\nimport type { Module } from '@/module';\nimport type { PotreePointCloudDatasetConfig } from '@/types/configuration/datasets/potreePointCloud';\n\nimport { fillObject3DUserData } from '@/loaders/userData';\n\nconst entityBuilder: EntityBuilder = context => {\n const cfg = context.dataset.config as PotreePointCloudDatasetConfig;\n\n const entity = new PointCloud({\n source: new PotreeSource({ url: `${cfg.source.url}/${cfg.source.filename}` }),\n });\n\n fillObject3DUserData(entity, {\n filename: cfg.source.url,\n });\n\n return Promise.resolve(entity);\n};\n\n/**\n * Loads [Potree](https://potree.github.io/) datasets.\n */\nexport default class PotreeLoader implements Module {\n public readonly id = 'builtin-potree-loader';\n public readonly name = 'Potree';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.datasets.registerDatasetType('potree', {\n entityBuilder,\n icon: 'fg-multipoint',\n name: 'Potree Point Cloud',\n });\n }\n}\n","import Shepherd from 'shepherd.js';\n\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport { hasExperimentalFeature } from '@/utils/Configuration';\n\nimport type CameraController from '../services/CameraController';\n\ninterface TourEvent {\n previous?: Shepherd.Step;\n step: Shepherd.Step;\n tour: Shepherd.Tour & {\n id: string;\n };\n}\n\ntype Tours = {\n readonly analyzingTour: Shepherd.Tour;\n readonly mainTour: Shepherd.Tour;\n readonly navigatingTour: Shepherd.Tour;\n};\n\n/**\n * Provides a guided tour of the application.\n */\nexport default class TourModule implements Module {\n public readonly id = 'builtin-tour';\n public readonly name = 'Tour';\n\n private _camera: CameraController | null = null;\n private _cameraCallback: (() => void) | null = null;\n private _context: PieroContext | null = null;\n private _tours: Tours | null = null;\n\n public initialize(context: PieroContext): Promise<void> | void {\n this._context = context;\n context.events.addEventListener('ready', this.start.bind(this));\n }\n\n private buildTours(): Tours {\n const camera = this._camera as CameraController;\n\n const mainTour = new Shepherd.Tour({\n tourName: 'main',\n useModalOverlay: true,\n });\n const navigatingTour = new Shepherd.Tour({\n tourName: 'navigating',\n useModalOverlay: true,\n });\n const analyzingTour = new Shepherd.Tour({\n tourName: 'analyzing',\n useModalOverlay: true,\n });\n\n const buttonsOptions = [\n { action: (): void => Shepherd.activeTour?.next(), text: 'Next' },\n { action: (): void => Shepherd.activeTour?.cancel(), secondary: true, text: 'Exit' },\n ];\n\n const displayProgress = (): void => {\n const currentStep = Shepherd.activeTour?.getCurrentStep();\n const currentStepElement = currentStep?.getElement();\n const content = currentStepElement?.querySelector('.shepherd-text');\n const steps = Shepherd.activeTour?.steps;\n\n if (\n currentStep == null ||\n currentStepElement == null ||\n content == null ||\n steps == null\n ) {\n return;\n }\n\n const progress = document.createElement('div');\n progress.className = 'progress mt-3';\n progress.setAttribute('role', 'progressbar');\n progress.style.height = '2px';\n\n const progressbar = document.createElement('div');\n progressbar.className = 'progress-bar bg-success';\n progressbar.style.width = `${100 * (steps.indexOf(currentStep) / steps.length)}%`;\n\n progress.appendChild(progressbar);\n content.appendChild(progress);\n };\n\n const loadPanel = async (\n panelId: string,\n waitSelector: string,\n ): Promise<Element | null> => {\n return new Promise(resolve => {\n const link = document.getElementById(panelId);\n if (link && !link.classList.contains('active')) {\n link.click();\n }\n\n if (document.querySelector(waitSelector)) {\n return resolve(document.querySelector(waitSelector));\n }\n\n const observer = new MutationObserver(() => {\n if (document.querySelector(waitSelector)) {\n observer.disconnect();\n resolve(document.querySelector(waitSelector));\n }\n });\n\n // If you get \"parameter 1 is not of type 'Node'\" error, see https://stackoverflow.com/a/77855838/492336\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n });\n };\n\n mainTour.addStep({\n buttons: [\n {\n action: (): void => {\n Shepherd.activeTour?.complete();\n navigatingTour.show(0);\n },\n text: 'Navigating',\n },\n {\n action: (): void => {\n Shepherd.activeTour?.complete();\n analyzingTour.show(0);\n },\n text: 'Analyzing data',\n },\n {\n action: (): void => Shepherd.activeTour?.cancel(),\n secondary: true,\n text: 'Exit',\n },\n ],\n cancelIcon: { enabled: true, label: 'Exit tutorial' },\n id: 'example-step',\n text: '<p>Welcome to <strong>Piero</strong>, the Giro3D application.<br/>We can guide you through the different features.</p>',\n title: 'Welcome!',\n when: {\n show: displayProgress,\n },\n });\n\n navigatingTour.addStep({\n attachTo: {\n element: '#main-view',\n on: 'bottom',\n },\n buttons: buttonsOptions,\n id: 'view',\n text: '<p>This is the <b>main view</b>.</p><p>Giro3D natively supports a broad range of data sources, from 2D raster and vector data, to 3D point clouds and tilesets.</p><p>Piero adds support for CityJSON and IFC files.</p>',\n when: {\n show: displayProgress,\n },\n });\n\n navigatingTour.addStep({\n attachTo: {\n element: '#main-view',\n on: 'bottom',\n },\n buttons: buttonsOptions,\n id: 'navigate',\n text: '<p>This application integrates <a href=\"https://github.com/yomotsu/camera-controls\">camera-controls</a>, a camera control for three.js.</p><p><b>Click</b> to move the camera. <b>Right-click</b> to rotate around a point. <b>Scroll</b> to zoom in or out.</p>',\n when: {\n hide: () => {\n if (this._cameraCallback) {\n camera.removeEventListener('interaction-end', this._cameraCallback);\n }\n this._cameraCallback = null;\n },\n show: () => {\n let nbEvents = 0;\n this._cameraCallback = (): void => {\n nbEvents += 1;\n if (nbEvents > 2) {\n Shepherd.activeTour?.next();\n }\n };\n camera.addEventListener('interaction-end', this._cameraCallback);\n displayProgress();\n },\n },\n });\n\n navigatingTour.addStep({\n attachTo: {\n element: '#toolbar',\n on: 'right',\n },\n beforeShowPromise: () => loadPanel('toolbar-datasets', '#datasets-drop-zone'),\n buttons: buttonsOptions,\n id: 'toolbar-layers',\n text: '<p>Giro3D supports multiple datasets.</p><p>You can toggle datasets as you wish with the <b>Datasets</b> panel.</p>',\n when: {\n show: displayProgress,\n },\n });\n\n navigatingTour.addStep({\n attachTo: {\n element: '#basemap-list',\n on: 'right',\n },\n beforeShowPromise: () => loadPanel('toolbar-datasets', '#datasets-drop-zone'),\n buttons: buttonsOptions,\n id: 'basemaps',\n text: '<p><b>Basemaps</b> are color and elevation layers that make the basic shape and aspect of the <b>Map</b>.</p>',\n when: {\n show: displayProgress,\n },\n });\n\n navigatingTour.addStep({\n attachTo: {\n element: '#overlay-list',\n on: 'right',\n },\n beforeShowPromise: () => loadPanel('toolbar-datasets', '#datasets-drop-zone'),\n buttons: buttonsOptions,\n id: 'overlays',\n text: '<p><b>Overlays</b> are vector layers in various formats (WFS, GML, GeoJSON...).</p>',\n when: {\n show: displayProgress,\n },\n });\n\n navigatingTour.addStep({\n attachTo: {\n element: '#dataset-list',\n on: 'right',\n },\n beforeShowPromise: () => loadPanel('toolbar-datasets', '#datasets-drop-zone'),\n buttons: buttonsOptions,\n id: 'layers',\n text: \"<p>The <b>Datasets</b> panel contains all 3D objects in the scene.</><p>You can toggle their visibility and delete them.<p><p>Most objects leverage Giro3D's adaptive resolution to optimize their display.</p>\",\n when: {\n show: displayProgress,\n },\n });\n\n navigatingTour.addStep({\n attachTo: {\n element: '#datasets-drop-zone',\n on: 'right',\n },\n beforeShowPromise: () => loadPanel('toolbar-datasets', '#datasets-drop-zone'),\n buttons: buttonsOptions,\n id: 'adddata',\n text: \"<p>You can add your own data from your computer by <b>dragging the file</b> into this page.</p><p>While you won't benefit from Giro3D's tiling mechanism, this can be a great way to quickly visualize datasets up to 100MB.</p><p>This application supports CityJSONs, IFCs, LAS/LAZs, CSV pointclouds, and simple GeoJSON features.</p>\",\n when: {\n show: displayProgress,\n },\n });\n\n navigatingTour.addStep({\n attachTo: {\n element: '#main-view',\n on: 'bottom',\n },\n buttons: buttonsOptions,\n id: 'attributes',\n text: '<p>By clicking on any feature on the map, you can see its <strong>Attribute table</strong>. Clickable features display a cursor when hovered.</p>',\n when: {\n show: displayProgress,\n },\n });\n\n navigatingTour.addStep({\n attachTo: {\n element: '#search-place-autocomplete',\n on: 'bottom',\n },\n buttons: [\n {\n action: (): void => {\n Shepherd.activeTour?.complete();\n analyzingTour.show(0);\n },\n text: 'Analyzing data',\n },\n {\n action: (): void => Shepherd.activeTour?.complete(),\n secondary: true,\n text: 'Exit',\n },\n ],\n id: 'widgets',\n text: 'Giro3D is highly extensible. Here we added a widget to search and navigate to locations based on the French address database.',\n when: {\n show: displayProgress,\n },\n });\n\n analyzingTour.addStep({\n attachTo: {\n element: '#annotations-fieldset',\n on: 'right',\n },\n beforeShowPromise: () => loadPanel('toolbar-annotations', '#annotations-fieldset'),\n buttons: buttonsOptions,\n id: 'annotation',\n text: '<p>You can <strong>annotate</strong> any data displayed using Giro3D native tools.<br>Select the <strong>geometry</strong> of your annotation, and <strong>click</strong> on the scene to add points. <strong>Right-click</strong> to end the shape.</p>',\n when: {\n show: displayProgress,\n },\n });\n\n analyzingTour.addStep({\n attachTo: {\n element: '#annotations-fieldset',\n on: 'right',\n },\n beforeShowPromise: () => loadPanel('toolbar-annotations', '#annotations-fieldset'),\n buttons: buttonsOptions,\n id: 'annotations',\n text: 'You can download your annotations as GeoJSON files. You can also upload your own by dragging them into this panel.',\n when: {\n show: displayProgress,\n },\n });\n\n if (hasExperimentalFeature('measurements')) {\n analyzingTour.addStep({\n attachTo: {\n element: '#panel-container',\n on: 'right',\n },\n beforeShowPromise: () => loadPanel('toolbar-measures', '#measures-fieldset'),\n buttons: buttonsOptions,\n id: 'measurements',\n text: 'You can add <strong>measurements</strong> to easily get distances betwween objects.<br>Once started, moving the mouse will display the measure. <strong>Click</strong> to save the measurement. <strong>Right-click</strong> to end.',\n when: {\n show: displayProgress,\n },\n });\n }\n\n analyzingTour.addStep({\n attachTo: {\n element: '#panel-container',\n on: 'right',\n },\n beforeShowPromise: () => loadPanel('toolbar-analysis', '#panel-container .card'),\n buttons: [{ action: (): void => Shepherd.activeTour?.complete(), text: 'Done!' }],\n id: 'analysis',\n text: \"In the <strong>Analysis</strong> panel you'll find some advanced analysis tools.\",\n when: {\n show: displayProgress,\n },\n });\n\n const markSkiptour = (): void => {\n const url = new URL(document.URL);\n url.searchParams.delete('tourStep');\n url.searchParams.set('tour', 'none');\n window.history.replaceState({}, '', url.toString());\n };\n\n const markTour = (current: TourEvent): void => {\n const url = new URL(document.URL);\n let tourName = 'main';\n if (current.tour.id.startsWith('navigating')) {\n tourName = 'navigating';\n } else if (current.tour.id.startsWith('analyzing')) {\n tourName = 'analyzing';\n }\n url.searchParams.set('tour', tourName);\n url.searchParams.set('tourStep', current.step.id);\n window.history.replaceState({}, '', url.toString());\n };\n\n mainTour.on('cancel', markSkiptour);\n mainTour.on('complete', markSkiptour);\n mainTour.on('show', markTour);\n\n navigatingTour.on('cancel', markSkiptour);\n navigatingTour.on('complete', markSkiptour);\n navigatingTour.on('show', markTour);\n\n analyzingTour.on('cancel', markSkiptour);\n analyzingTour.on('complete', markSkiptour);\n analyzingTour.on('show', markTour);\n\n return { analyzingTour, mainTour, navigatingTour };\n }\n\n private getTours(): Tours {\n if (!this._tours) {\n this._tours = this.buildTours();\n }\n return this._tours;\n }\n\n private restart(): void {\n const { mainTour } = this.getTours();\n mainTour.show(0);\n }\n\n private start(): void {\n if (!this._context) {\n throw new Error('module is not initialized');\n }\n\n const { analyzingTour, mainTour, navigatingTour } = this.getTours();\n this._camera = this._context.view.getCameraController();\n\n const url = new URL(document.URL);\n const tour = url.searchParams.get('tour') ?? 'main';\n if (tour !== 'none') {\n const tourStep = url.searchParams.get('tourStep') ?? 0;\n if (tour === 'navigating') {\n navigatingTour.show(tourStep);\n } else if (tour === 'analyzing') {\n analyzingTour.show(tourStep);\n } else {\n mainTour.show(tourStep);\n }\n }\n }\n}\n"],"names":["useCrossSectionStore","defineStore","orientation","ref","center","Vector3","enable","setEnabled","v","setOrientation","setCenter","store","setX","x","setY","y","_createElementBlock","_createElementVNode","_hoisted_1","_createVNode","SwitchToggle","_unref","_hoisted_2","_cache","event","_hoisted_4","_hoisted_6","_hoisted_7","CrossSectionManager","context","__publicField","defaultCrs","config","pivot","pivotLocal","Coordinates","after","name","clippingPlanes","radians","MathUtils","cos","sin","normal","distance","Plane","plane","instance","entity","isEntity3D","CrossSectionAnalysis","CrossSection","getUrl","dataset","predicate","DownloadDataset","uri","fragments","filename","Fetcher","res","blob","Download","e","message","useFloodingPlaneStore","height","getHeight","setHeight","FloodingPlaneObject","PlaneGeometry","MeshBasicMaterial","Mesh","z","width","FloodingPlaneManager","extent","dims","FloodingPlaneAnalysis","FloodingPlane","tempMatrix","Matrix4","materials","IFCRELDEFINESBYPROPERTIES","IFCRELDEFINESBYTYPE","IFCRELASSOCIATESMATERIAL","IFCRELCONTAINEDINSPATIALSTRUCTURE","IFCRELASSOCIATESCLASSIFICATION","IFCRELASSIGNSTOGROUP","IFCPROPERTYSET","IFCELEMENTQUANTITY","setEntities","relationsToProcess","isIFCPickResult","obj","isObject","_IfcEntity","Entity3D","source","Group","Components","SimpleScene","SimpleRenderer","SimpleCamera","SimpleRaycaster","fragID","fragment","selection","ids","bbox","selected","highlight","box","ymin","zmin","ymax","zmax","expressID","properties","objectRawProperties","id","IfcPropertiesUtils","psetPropsIds","psetPropId","psetProperties","qsetQuantityIds","quantityId","key","qsetProperties","value","mesh","itemId","idNum","group","keys","i","fragKey","idsNum","canvasCoords","options","p","pickedResult","blockId","_a","_c","_b","itemProperties","result","FragmentBoundingBox","data","FragmentManager","FragmentClassifier","fragmentIfcLoader","FragmentIfcLoader","buffer","position","coordinationMatrix","fillObject3DUserData","itemID","composites","compositeID","toCompositeID","subFragment","relation","relationID","relatedIDs","relationEntity","groupSystemNames","systems","groups","currentSystemName","systemGroups","filter","found","treeItemName","children","fragmentID","fragmentParent","instanceID","IfcEntity","IfcEntityInspector","EntityInspector","parentGui","props","__props","target","highlighted","cameraStore","useCameraStore","clippingBoxModule","useModuleStore","moduleId","clipTo","zoomTo","classificationElement","_createBlock","IconList","IconListButton","ListLabelButton","_normalizeClass","_openBlock","_Fragment","item","index","_component_IfcSubtree","datasets","useDatasetStore","isPreloaded","refAndWatch","getClassificationRoot","ifcEntity","getIfcEntity","_renderList","IfcSubtree","pick","loader","attributeExtractor","pickResult","attributesGroups","feature","attributes","ifcProperties","nullValue","_d","IfcCategoryMap","_e","_f","_g","_h","parentName","_i","entityBuilder","cfg","at","getCoordinates","IFCLoader","IfcPropertyView","EntityPanel","_color","Color","Loader","manager","url","onLoad","onProgress","onError","scope","FileLoader","text","mapping","parseHeader","headerLength","patternHeader","headerText","header","lines","currentElement","make_ply_element_property","propertValues","propertyNameMapping","property","line","lineValues","lineType","parseASCIINumber","n","type","parseASCIIElement","tokens","element","list","j","createBuffer","customProperty","mapElementAttributes","elementNames","findAttrName","names","l","parseASCII","patternBody","body","matches","ArrayStream","loop","elementDesc","attributeMap","handleElement","postProcess","geometry","BufferGeometry","Float32BufferAttribute","elementName","cacheEntry","SRGBColorSpace","elementProperty","vertex_indices","texcoord","binaryReadElement","read","valueReader","setPropertyBinaryReaders","little_endian","getBinaryReader","dataview","parseBinary","loc","currentElementCount","extractHeaderText","bytes","cont","startLine","hasCRNL","c","arr","_PlyMesh","colors","face","PlyMesh","PlyEntity","PLYThreeLoader","material","MeshLambertMaterial","DoubleSide","build","getAttributesFromPlyObject","PLYLoader","PointCloud","PotreeSource","PotreeLoader","TourModule","camera","mainTour","Shepherd","navigatingTour","analyzingTour","buttonsOptions","displayProgress","currentStep","currentStepElement","content","steps","progress","progressbar","loadPanel","panelId","waitSelector","resolve","link","observer","nbEvents","hasExperimentalFeature","markSkiptour","markTour","current","tourName","tour","tourStep"],"mappings":"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","x_google_ignoreList":[15]}
1
+ {"version":3,"file":"modules.es.js","sources":["../src/components/CoordinateInput.vue","../src/modules/crossSectionAnalysis/store.ts","../src/modules/crossSectionAnalysis/CrossSection.vue","../src/modules/crossSectionAnalysis/CrossSectionHelper.ts","../src/modules/crossSectionAnalysis/CrossSectionManager.ts","../src/modules/CrossSectionAnalysis.ts","../src/modules/DownloadDataset.ts","../src/modules/floodingPlaneAnalysis/store.ts","../src/modules/floodingPlaneAnalysis/FloodingPlane.vue","../src/modules/floodingPlaneAnalysis/FloodingPlaneObject.ts","../src/modules/floodingPlaneAnalysis/FloodingPlaneManager.ts","../src/modules/FloodingPlaneAnalysis.ts","../src/modules/geocoding/CoordinatesSearch.ts","../src/modules/geocoding/FrenchBanGeocoder.ts","../src/modules/ifc/IfcEntity.ts","../src/modules/ifc/IfcEntityInspector.ts","../src/modules/ifc/IfcSubtree.vue","../src/modules/ifc/IfcPropertyView.vue","../src/modules/IFCLoader.ts","../src/modules/minimap/OpenLayersMinimapComponent.vue","../src/modules/OpenLayersMinimap.ts","../src/modules/ply/PlyEntity.ts","../src/modules/PLYLoader.ts","../src/modules/PostProcessEntities.ts","../src/modules/PotreeLoader.ts","../src/modules/Tour.ts"],"sourcesContent":["<script setup lang=\"ts\">\n import type Instance from '@giro3d/giro3d/core/Instance';\n import type { Vector3 } from 'three';\n\n import Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\n import { ref } from 'vue';\n\n import type SceneCursorManager from '@/services/SceneCursorManager';\n\n import ButtonWithIcon from '@/components/atoms/ButtonWithIcon.vue';\n import Picker from '@/services/Picker';\n import { nonNull } from '@/utils/Types';\n\n const props = defineProps<{\n cursorManager?: SceneCursorManager;\n /**\n * The initial value of the coordinates.\n * @defaultValue `(0, 0, 0)`\n */\n initialValue?: Vector3;\n /**\n * The Giro3D instance to perform picking. If undefined, the picking button is hidden.\n */\n instance?: Instance;\n /**\n * The label to display.\n */\n label: string;\n /**\n * Display the Z component ?\n * @defaultValue false\n */\n showZ?: boolean;\n }>();\n\n const x = ref(props.initialValue?.x ?? 0);\n const y = ref(props.initialValue?.y ?? 0);\n const z = ref(props.initialValue?.z ?? 0);\n\n const emits = defineEmits<{\n 'update:coordinates': [value: Coordinates];\n }>();\n\n const picker = new Picker();\n const isPicking = ref(false);\n\n const emitCoordinates = (): void => {\n emits(\n 'update:coordinates',\n new Coordinates(nonNull(props.instance).referenceCrs, x.value, y.value, z.value),\n );\n };\n\n const pickCoordinate = (): void => {\n const instance = nonNull(props.instance);\n\n isPicking.value = true;\n\n const onMouseMove = (e: MouseEvent): void => {\n const p = picker.getFirstFeatureAt(instance, e)?.at(0)?.point;\n\n if (p) {\n x.value = p.x;\n y.value = p.y;\n z.value = p.z;\n\n props.cursorManager?.setCursor('location');\n props.cursorManager?.setCursorLocation(p);\n }\n };\n\n const onClick = (e: MouseEvent): void => {\n props.cursorManager?.setCursor(null);\n instance.domElement.removeEventListener('click', onClick);\n instance.domElement.removeEventListener('mousemove', onMouseMove);\n isPicking.value = false;\n\n const p = picker.getFirstFeatureAt(instance, e)?.at(0)?.point;\n\n if (p) {\n x.value = p.x;\n y.value = p.y;\n z.value = p.z;\n\n emitCoordinates();\n }\n };\n\n instance.domElement.addEventListener('mousemove', onMouseMove);\n instance.domElement.addEventListener('click', onClick);\n };\n\n function setX(v: number): void {\n x.value = v;\n emitCoordinates();\n }\n\n function setY(v: number): void {\n y.value = v;\n emitCoordinates();\n }\n\n function setZ(v: number): void {\n z.value = v;\n emitCoordinates();\n }\n</script>\n\n<template>\n <div class=\"input-group\">\n <label class=\"form-label\">{{ props.label }}</label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"plane-center-x\"\n :value=\"x.toFixed(2)\"\n @input=\"event => setX(Number.parseFloat((event.target as HTMLInputElement).value))\"\n />\n <input\n type=\"number\"\n class=\"form-control\"\n id=\"plane-center-y\"\n :value=\"y.toFixed(2)\"\n @input=\"event => setY(Number.parseFloat((event.target as HTMLInputElement).value))\"\n />\n <input\n type=\"number\"\n v-if=\"props.showZ === true\"\n class=\"form-control\"\n id=\"plane-center-z\"\n :value=\"z.toFixed(2)\"\n @input=\"event => setZ(Number.parseFloat((event.target as HTMLInputElement).value))\"\n />\n <ButtonWithIcon\n v-if=\"props.instance != null\"\n title=\"Pick point in scene\"\n icon=\"fg-location\"\n :disabled=\"isPicking\"\n @click=\"pickCoordinate\"\n class=\"btn-primary\"\n />\n </div>\n </div>\n</template>\n","import type Instance from '@giro3d/giro3d/core/Instance';\n\nimport { defineStore } from 'pinia';\nimport { Vector3 } from 'three';\nimport { ref, shallowRef } from 'vue';\n\nimport type SceneCursorManager from '@/services/SceneCursorManager';\n\nexport const useCrossSectionStore = defineStore('crossSection', () => {\n const orientation = ref(0);\n const instance = shallowRef<Instance>();\n const cursorManager = shallowRef<SceneCursorManager>();\n const center = ref(new Vector3(0, 0, 0));\n const enable = ref(false);\n const showHelper = ref(false);\n\n function setEnabled(v: boolean): void {\n enable.value = v;\n }\n\n function setOrientation(v: number): void {\n orientation.value = v;\n }\n\n function setCenter(v: Vector3): void {\n center.value = v;\n }\n\n function setShowHelper(v: boolean): void {\n showHelper.value = v;\n }\n\n function setInstance(v: Instance): void {\n instance.value = v;\n }\n\n function setCursorManager(v: SceneCursorManager): void {\n cursorManager.value = v;\n }\n\n return {\n center,\n cursorManager,\n enable,\n instance,\n orientation,\n setCenter,\n setCursorManager,\n setEnabled,\n setInstance,\n setOrientation,\n setShowHelper,\n showHelper,\n };\n});\n\nexport type CrossSectionStore = ReturnType<typeof useCrossSectionStore>;\n","<script setup lang=\"ts\">\n import type Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\n\n import CoordinateInput from '@/components/CoordinateInput.vue';\n import SwitchToggle from '@/components/SwitchToggle.vue';\n\n import { useCrossSectionStore } from './store';\n\n const store = useCrossSectionStore();\n\n function setOrientation(orientation: number): void {\n store.setOrientation(orientation);\n }\n\n const onCenterUpdated = (v: Coordinates): void => {\n store.setCenter(v.toVector3());\n };\n</script>\n\n<template>\n <div class=\"input-group\">\n <SwitchToggle\n v-bind:model-value=\"store.enable\"\n v-on:update:model-value=\"v => store.setEnabled(v)\"\n id=\"cross-section-enable\"\n title=\"Enable cross-section\"\n />\n <label for=\"cross-section-enable\" class=\"form-check-label\">Enable cross section</label>\n </div>\n\n <div class=\"input-group\">\n <SwitchToggle\n v-bind:model-value=\"store.showHelper\"\n v-on:update:model-value=\"v => store.setShowHelper(v)\"\n id=\"cross-section-helper-enable\"\n title=\"Show plane helper\"\n />\n <label for=\"cross-section-helper-enable\" class=\"form-check-label\">Show plane helper</label>\n </div>\n\n <div class=\"input-group my-3\">\n <label for=\"plane-orientation-range\" class=\"form-check-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=\"store.orientation\"\n @input=\"\n event => setOrientation(Number.parseFloat((event.target as HTMLInputElement).value))\n \"\n />\n </div>\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=\"store.orientation\"\n @input=\"\n event => setOrientation(Number.parseFloat((event.target as HTMLInputElement).value))\n \"\n />\n </div>\n <hr />\n <CoordinateInput\n label=\"Center\"\n :initial-value=\"store.center\"\n v-if=\"store.instance != null\"\n :instance=\"store.instance\"\n :cursor-manager=\"store.cursorManager\"\n @update:coordinates=\"onCenterUpdated\"\n />\n</template>\n","import { ArrowHelper, Mesh, MeshBasicMaterial, Object3D, PlaneGeometry, Vector3 } from 'three';\n\nexport default class CrossSectionHelper extends Object3D {\n public constructor() {\n super();\n\n const plane = new Mesh(\n new PlaneGeometry(50, 100, 1, 10),\n new MeshBasicMaterial({\n color: '#6bf904',\n depthTest: false,\n depthWrite: false,\n wireframe: true,\n }),\n );\n const arrow = new ArrowHelper(new Vector3(0, 1, 0), new Vector3(0, 0, 0), 200);\n plane.renderOrder = 999;\n plane.rotateY(Math.PI / 2);\n this.add(plane);\n this.add(arrow);\n\n this.updateMatrixWorld(true);\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\n\nimport Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport { isEntity3D } from '@giro3d/giro3d/entities/Entity3D';\nimport { MathUtils, Plane, Vector3 } from 'three';\n\nimport type { PieroContext } from '@/context';\n\nimport CrossSectionHelper from './CrossSectionHelper';\nimport { useCrossSectionStore } from './store';\n\nexport default class CrossSectionManager {\n private _clippingPlanes: Plane[] | null = null;\n private _helper?: CrossSectionHelper;\n private _instance?: Instance;\n private readonly _store = useCrossSectionStore();\n\n public constructor(private readonly context: PieroContext) {\n context.events.addEventListener('ready', () => {\n this._instance = context.view.getInstance();\n const defaultCrs = context.configuration.default_crs;\n const config = context.configuration.analysis.cross_section;\n\n this._store.setCursorManager(context.view.getSceneCursorManager());\n this._store.setInstance(context.view.getInstance());\n this._store.setOrientation(config.orientation);\n const pivot = config.pivot;\n const pivotLocal = new Coordinates(pivot.crs ?? defaultCrs, pivot.x, pivot.y, 0).as(\n defaultCrs,\n );\n this._store.setCenter(pivotLocal.toVector3());\n\n this._instance.addEventListener('entity-added', this.updateCrossSection.bind(this));\n\n this._store.$onAction(({ after, name }) => {\n after(() => {\n switch (name) {\n case 'setCenter':\n case 'setEnabled':\n case 'setOrientation':\n case 'setShowHelper':\n this.updateCrossSection();\n this.updateHelper();\n this.showHelper(this._store.showHelper);\n break;\n }\n });\n });\n\n this.updateCrossSection();\n this.updateHelper();\n this.showHelper(this._store.showHelper);\n });\n }\n\n public dispose(): void {\n // Nothing to do\n }\n\n private createHelperIfNecessary(): void {\n if (this._store.showHelper && this._helper == null && this._instance) {\n this._helper = new CrossSectionHelper();\n this._instance.add(this._helper).catch(console.error);\n }\n }\n\n private showHelper(show: boolean): void {\n this.createHelperIfNecessary();\n\n if (this._helper) {\n this._helper.visible = show;\n }\n\n this.updateHelper();\n }\n\n private updateCrossSection(): void {\n if (this._store.enable) {\n const clippingPlanes = [];\n const radians = MathUtils.DEG2RAD * this._store.orientation;\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.center);\n const plane = new Plane(normal, -distance);\n clippingPlanes.push(plane);\n this._clippingPlanes = clippingPlanes;\n } else {\n this._clippingPlanes = null;\n }\n\n this.updateEntities();\n }\n\n private updateEntities(): void {\n const instance = this.context.view.getInstance();\n\n for (const entity of instance.getEntities()) {\n if (isEntity3D(entity)) {\n entity.clippingPlanes = this._clippingPlanes;\n }\n }\n\n instance.notifyChange();\n }\n\n private updateHelper(): void {\n this.createHelperIfNecessary();\n\n this._helper?.position.copy(this._store.center);\n this._helper?.updateMatrixWorld(true);\n this._helper?.setRotationFromAxisAngle(\n new Vector3(0, 0, 1),\n MathUtils.degToRad(this._store.orientation),\n );\n this._instance?.notifyChange();\n }\n}\n","import type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport CrossSection from './crossSectionAnalysis/CrossSection.vue';\nimport CrossSectionManager from './crossSectionAnalysis/CrossSectionManager';\n\n/**\n * An analysis module that displays a cross section.\n */\nexport default class CrossSectionAnalysis implements Module {\n public readonly id = 'builtin-cross-section-analysis';\n public readonly name = 'Cross section';\n\n private _manager: CrossSectionManager | null = null;\n\n public initialize(context: PieroContext): void {\n context.analysis.registerTool({\n component: CrossSection,\n icon: 'bi-circle-half',\n name: 'Cross section',\n });\n\n this._manager = new CrossSectionManager(context);\n }\n}\n","import type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\nimport type { DatasetOrGroup } from '@/types/Dataset';\n\nimport Download from '@/utils/Download';\nimport Fetcher from '@/utils/Fetcher';\n\nfunction getUrl(dataset: DatasetOrGroup): string | undefined {\n if ('url' in dataset.config && typeof dataset.config.url === 'string') {\n return dataset.config.url;\n }\n\n if ('source' in dataset.config && typeof dataset.config.source === 'object') {\n if ('url' in dataset.config.source && typeof dataset.config.source.url === 'string') {\n return dataset.config.source.url;\n }\n }\n\n return undefined;\n}\n\nfunction predicate(dataset: DatasetOrGroup): boolean {\n const url = getUrl(dataset);\n return url != null;\n}\n\n/**\n * Adds a button to download a dataset from its URL.\n */\nexport default class DownloadDataset implements Module {\n public readonly id: string = 'builtin-download-dataset';\n public readonly name: string = 'Download dataset';\n\n private _context: PieroContext | null = null;\n\n public initialize(context: PieroContext): void {\n this._context = context;\n\n context.datasets.registerDatasetAction({\n action: this.download.bind(this),\n icon: 'bi-download',\n predicate,\n title: 'Download dataset',\n });\n }\n\n private download(dataset: DatasetOrGroup): void {\n const uri = getUrl(dataset);\n\n if (uri == null) {\n console.warn('invalid');\n return;\n }\n\n const context = this._context as PieroContext;\n const fragments = new URL(uri).pathname.split('/');\n const filename = fragments[fragments.length - 1];\n\n console.info(`download ${getUrl(dataset)}`);\n\n Fetcher.fetch(uri)\n .then(res => {\n if (!res.ok) {\n throw new Error(`${res.status} ${res.statusText}`);\n }\n return res.blob();\n })\n .then(blob => {\n Download.downloadBlob(blob, filename);\n\n context.notifications.pushNotification({\n level: 'success',\n text: filename,\n title: 'Download successful',\n });\n })\n .catch(e => {\n console.error(e);\n\n const message = e instanceof Error ? e.message : 'Download failed';\n\n context.notifications.pushNotification({\n level: 'error',\n text: message,\n title: dataset.name,\n });\n });\n }\n}\n","import { defineStore } from 'pinia';\nimport { ref } from 'vue';\n\nexport const useFloodingPlaneStore = defineStore('floodingPlane', () => {\n const height = ref(0);\n const enable = ref(false);\n\n function getHeight(): number {\n return height.value;\n }\n\n function setHeight(v: number): void {\n height.value = v;\n }\n\n function setEnabled(v: boolean): void {\n enable.value = v;\n }\n\n return { enable, getHeight, setEnabled, setHeight };\n});\n","<script setup lang=\"ts\">\n import SwitchToggle from '@/components/SwitchToggle.vue';\n\n import { useFloodingPlaneStore } from './store';\n\n const store = useFloodingPlaneStore();\n\n function setHeight(height: number): void {\n store.setHeight(height);\n }\n</script>\n\n<template>\n <div class=\"input-group mb-3\">\n <SwitchToggle\n v-bind:model-value=\"store.enable\"\n v-on:update:model-value=\"v => store.setEnabled(v)\"\n id=\"flooding-plane-enable\"\n title=\"foo\"\n />\n <label for=\"flooding-plane-enable\" class=\"form-label\">Enable flooding plane</label>\n </div>\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=\"store.getHeight()\"\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=\"store.getHeight()\"\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","import { Mesh, MeshBasicMaterial, PlaneGeometry } from 'three';\n\nexport default class FloodingPlaneObject {\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 = 0;\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 { Vector3 } from 'three';\n\nimport type { PieroContext } from '@/context';\n\nimport FloodingPlaneObject from './FloodingPlaneObject';\nimport { useFloodingPlaneStore } from './store';\n\nexport default class FloodingPlaneManager {\n private readonly _context: PieroContext;\n private _plane: FloodingPlaneObject | null;\n private readonly _store = useFloodingPlaneStore();\n\n public constructor(context: PieroContext) {\n this._context = context;\n this._plane = null;\n\n context.events.addEventListener('ready', () => {\n this._store.$onAction(({ after, name }) => {\n after(() => {\n switch (name) {\n case 'setEnabled':\n void this.updatePlane();\n break;\n case 'setHeight':\n void this.updatePlane();\n break;\n }\n });\n });\n });\n }\n\n public dispose(): void {\n if (this._plane) {\n this._context.view.getInstance().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 FloodingPlaneObject();\n await this._context.view.getInstance().add(this._plane.object3D);\n }\n const extent = this._context.view.getBoundingBox();\n const center = extent.getCenter(new Vector3());\n const dims = extent.getSize(new Vector3());\n\n this._plane.visible = this._store.enable;\n this._plane.setPosition(center.x, center.y, this._store.getHeight(), dims.x, dims.y);\n this._context.view.getInstance().notifyChange();\n }\n}\n","import type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport FloodingPlane from './floodingPlaneAnalysis/FloodingPlane.vue';\nimport FloodingPlaneManager from './floodingPlaneAnalysis/FloodingPlaneManager';\n\n/**\n * An analysis module that displays a flooding plane with variable altitude.\n */\nexport default class FloodingPlaneAnalysis implements Module {\n public readonly id = 'builtin-flooding-plane-analysis';\n public readonly name = 'Flooding plane';\n\n private _manager: FloodingPlaneManager | null = null;\n\n public initialize(context: PieroContext): void {\n context.analysis.registerTool({\n component: FloodingPlane,\n icon: 'bi-layers-half',\n name: 'Flooding plane',\n });\n\n this._manager = new FloodingPlaneManager(context);\n }\n}\n","import Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\n\nimport type { SearchProvider, SearchResult } from '@/api';\nimport type { LocationSearchResult } from '@/api/SearchApi';\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nconst latLonDd = /^(\\d+\\.\\d+)\\s*,\\s*(\\d+\\.\\d+)$/;\n\nclass CoordinatesSearchProvider implements SearchProvider {\n public readonly name = 'Go to coordinates';\n\n public search(query: string): Promise<SearchResult[]> {\n const results = latLonDd.exec(query);\n\n if (results) {\n const lat = Number.parseFloat(results[1]);\n const lon = Number.parseFloat(results[2]);\n\n const coordinates = Coordinates.WGS84(lat, lon);\n\n const result: LocationSearchResult = {\n coordinates,\n label: `${lat.toFixed(6)}, ${lon.toFixed(6)}`,\n provider: this,\n };\n\n return Promise.resolve([result]);\n } else {\n return Promise.resolve([]);\n }\n }\n}\n\nexport default class CoordinatesSearch implements Module {\n public readonly id = 'builtin-coordinates-search';\n public readonly name = 'Coordinates search';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.search.registerProvider(new CoordinatesSearchProvider());\n }\n}\n","import type { FeatureCollection, Point } from 'geojson';\n\nimport Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport { HttpError } from '@giro3d/giro3d/utils/Fetcher';\n\nimport type { SearchProvider } from '@/api';\nimport type { LocationSearchResult } from '@/api/SearchApi';\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport Fetcher from '@/utils/Fetcher';\n\ntype AltitudeResponse = {\n elevations: number[];\n};\n\nconst validationRegex = /[a-z]{3}/;\n\nclass BanSearchProvider implements SearchProvider<LocationSearchResult> {\n public readonly name = 'Base adresse nationale (BAN)';\n\n public async search(query: string): Promise<LocationSearchResult[]> {\n // Basic validation that the query could be applicable to us.\n if (!validationRegex.test(query)) {\n return [];\n }\n\n try {\n const data = await Fetcher.fetchJson<FeatureCollection>(\n `https://api-adresse.data.gouv.fr/search/?q=${query}`,\n );\n\n const result: LocationSearchResult[] = data.features.map(f => {\n const props = f.properties as Record<string, unknown>;\n const point = f.geometry as Point;\n const [x, y] = point.coordinates;\n\n return {\n coordinates: new Coordinates('EPSG:4326', x, y, 0),\n label: props.label as string,\n provider: this,\n } satisfies LocationSearchResult;\n });\n\n await alticode(result.map(r => r.coordinates));\n\n return result;\n } catch (e) {\n if (e instanceof HttpError) {\n return [];\n }\n throw e;\n }\n }\n}\n\nasync function alticode(coordinates: Coordinates[]): Promise<AltitudeResponse> {\n const url = new URL('https://data.geopf.fr/altimetrie/1.0/calcul/alti/rest/elevation.json');\n\n url.searchParams.append('lon', coordinates.map(c => c.longitude).join('|'));\n url.searchParams.append('lat', coordinates.map(c => c.latitude).join('|'));\n url.searchParams.append('zonly', 'true');\n url.searchParams.append('resource', 'ign_rge_alti_wld');\n url.searchParams.append('delimiter', '|');\n url.searchParams.append('indent', 'false');\n\n const result = await Fetcher.fetchJson<AltitudeResponse>(url.toString());\n\n for (let i = 0; i < coordinates.length; i++) {\n const element = coordinates[i];\n element.setAltitude(result.elevations[i]);\n }\n\n return result;\n}\n\n/**\n * Provides geocoding capabilities from the french address database.\n */\nexport default class FrenchBanGeocoder implements Module {\n public readonly id = 'builtin-geocoding-ban';\n public readonly name = 'Base adresse nationale';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.search.registerProvider(new BanSearchProvider());\n }\n}\n","import type PickableFeatures from '@giro3d/giro3d/core/picking/PickableFeatures';\nimport type PickOptions from '@giro3d/giro3d/core/picking/PickOptions';\nimport type PickResult from '@giro3d/giro3d/core/picking/PickResult';\nimport type { Fragment } from 'bim-fragment/fragment';\nimport type { FragmentMesh } from 'bim-fragment/fragment-mesh';\nimport type { FragmentsGroup } from 'bim-fragment/fragments-group';\nimport type { FragmentIdMap } from 'openbim-components';\nimport type { Box3, Material, Vector2 } from 'three';\n\nimport Entity3D from '@giro3d/giro3d/entities/Entity3D';\nimport {\n Components,\n FragmentBoundingBox,\n FragmentClassifier,\n FragmentIfcLoader,\n FragmentManager,\n IfcPropertiesUtils,\n SimpleCamera,\n SimpleRaycaster,\n SimpleRenderer,\n SimpleScene,\n toCompositeID,\n} from 'openbim-components';\nimport { Group, Matrix4, MeshBasicMaterial, Vector3 } from 'three';\n\nimport { fillObject3DUserData } from '@/loaders/userData';\nimport Fetcher from '@/utils/Fetcher';\nimport { isObject } from '@/utils/Types';\n\nimport type { CoordinatesMixin, UrlOrDataMixin } from '../../giro3d/sources/mixins';\n\n// Copied/extract quite a lot from openbim-components library:\n// - src/fragments/FragmentHighlighter/index.ts for highlighting\n// - src/fragments/FragmentClassifier/index.ts for classification\n// - src/ifc/IfcPropertiesProcessor/index.ts for property-related stuff\n\n///// HIGHLIGHTING\n\nconst tempMatrix = new Matrix4();\n\ntype FragmentTypeName = 'bbox' | 'selection';\n\ntype MaterialMap = {\n [name in FragmentTypeName]: Material;\n};\ntype SelectionMap = {\n [name in FragmentTypeName]: FragmentIdMap;\n};\n\nconst materials: MaterialMap = {\n bbox: new MeshBasicMaterial({\n color: '#FFFF00',\n depthTest: true,\n opacity: 0.2,\n transparent: true,\n }),\n selection: new MeshBasicMaterial({\n color: '#FF0000',\n depthTest: false,\n opacity: 0.6,\n transparent: true,\n }),\n};\n\n///// PROPERTIES\n\ninterface IndexMap {\n [expressID: string]: Set<number>;\n}\n\n// Re-defined from Web-ifc\nconst IFCRELDEFINESBYPROPERTIES = 4186316022;\nconst IFCRELDEFINESBYTYPE = 781010003;\nconst IFCRELASSOCIATESMATERIAL = 2655215786;\nconst IFCRELCONTAINEDINSPATIALSTRUCTURE = 3242617779;\nconst IFCRELASSOCIATESCLASSIFICATION = 919958153;\nconst IFCRELASSIGNSTOGROUP = 1307041759;\nconst IFCPROPERTYSET = 1451395588;\nconst IFCELEMENTQUANTITY = 1883228015;\n\n// IFC properties we want to explore\nconst setEntities = [IFCPROPERTYSET, IFCELEMENTQUANTITY];\n\n// IFC relations we want to process to extract properties\nconst relationsToProcess = [\n IFCRELDEFINESBYPROPERTIES,\n IFCRELDEFINESBYTYPE,\n IFCRELASSOCIATESMATERIAL,\n IFCRELCONTAINEDINSPATIALSTRUCTURE,\n IFCRELASSOCIATESCLASSIFICATION,\n IFCRELASSIGNSTOGROUP,\n];\n\n///// CLASSIFICATION\n\nexport enum ClassificationSystem {\n ENTITY = 'entities',\n STOREY = 'storeys',\n}\n\nexport type ClassificationItem = {\n children: ClassificationItem[];\n fragments: FragmentIdMap;\n name: string;\n treeItemName: string;\n};\n\nexport interface IFCFeature {\n ifcProperties: IFCProperty[];\n itemProperties: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [attribute: string]: any;\n };\n}\n\nexport interface IFCPickResult extends PickResult<IFCFeature> {\n entity: IfcEntity;\n features?: IFCFeature[];\n isIFCPickResult: true;\n object: FragmentMesh;\n}\n\nexport interface IFCProperty {\n name: string;\n parentName: string;\n value: number | null;\n}\n\nexport const isIFCPickResult = (obj: unknown): obj is IFCPickResult =>\n isObject(obj) && (obj as IFCPickResult).isIFCPickResult;\n\n/** Source interface for {@link IfcEntity} */\nexport interface IfcSource extends CoordinatesMixin, UrlOrDataMixin {\n /** Name of the IFC */\n name: string;\n}\n\n/**\n * Entity for displaying an IFC file\n */\nexport default class IfcEntity\n extends Entity3D\n implements PickableFeatures<IFCFeature, IFCPickResult>\n{\n public readonly isIfcEntity = true as const;\n public readonly isPickableFeatures = true as const;\n public override readonly type = 'IfcEntity' as const;\n\n private _classificationCache: ClassificationItem[] | null;\n\n private _components: Components;\n private _fragmentBoundingBox: FragmentBoundingBox | null;\n private _fragmentClassifier!: FragmentClassifier;\n private _fragmentManager!: FragmentManager;\n private _ifcSelection: SelectionMap; // Currently selected fragments\n private _indexMap: IndexMap; // Properties relationships\n private _model!: FragmentsGroup;\n private readonly _source: IfcSource;\n\n public constructor(source: IfcSource) {\n super(new Group());\n this._source = source;\n\n this._components = new Components();\n this._components.ui.enabled = false;\n\n this._components.scene = new SimpleScene(this._components);\n this._components.renderer = new SimpleRenderer(\n this._components,\n document.createElement('div'),\n );\n this._components.camera = new SimpleCamera(this._components);\n this._components.raycaster = new SimpleRaycaster(this._components);\n\n this._components.init();\n\n this._ifcSelection = { bbox: {}, selection: {} };\n this._indexMap = {};\n this._classificationCache = null;\n this._fragmentBoundingBox = null;\n }\n\n public static isIFCEntity = (obj: unknown): obj is IfcEntity =>\n isObject(obj) && (obj as IfcEntity).isIfcEntity;\n\n public static isIFCPickResult = (obj: unknown): obj is IFCPickResult =>\n isObject(obj) && IfcEntity.isIFCEntity((obj as PickResult<unknown>).entity);\n\n public clearHighlight(name: FragmentTypeName = 'selection'): void {\n for (const fragID of Object.keys(this._ifcSelection[name])) {\n const fragment = this._fragmentManager.list[fragID];\n const selection = fragment?.fragments[name];\n if (selection != null) {\n selection.mesh.removeFromParent();\n }\n }\n this.notifyChange(this);\n\n this._ifcSelection[name] = {};\n }\n\n public getBoundingBoxById(ids: FragmentIdMap): Box3 | undefined {\n this.clearHighlight('bbox');\n this.highlightById(ids, 'bbox');\n\n const bbox = this._fragmentBoundingBox;\n if (bbox === null) {\n throw new Error('Must call initClassification before getBoundingBoxById');\n }\n\n const fragments = this._fragmentManager;\n bbox.reset();\n\n const selected = this._ifcSelection.bbox;\n if (!Object.keys(selected).length) {\n return;\n }\n for (const fragID of Object.keys(selected)) {\n const fragment = fragments.list[fragID];\n const highlight = fragment.fragments['bbox'];\n bbox.addMesh(highlight.mesh);\n }\n\n const box = bbox.get();\n\n // since Giro3D is Z-up, we need to swap Y and Z, and then invert the sign of\n // the new Y (i.e the Z before the swap).\n const { y: ymin, z: zmin } = box.min;\n const { y: ymax, z: zmax } = box.max;\n\n box.min.y = -zmax;\n box.max.y = -zmin;\n box.min.z = ymin;\n box.max.z = ymax;\n\n box.translate(this._model.position);\n\n this.clearHighlight('bbox');\n return box;\n }\n\n public getClassification(): ClassificationItem[] {\n if (this._classificationCache === null) {\n throw new Error('Must call initClassification before getClassification');\n }\n return this._classificationCache;\n }\n\n public getProperties(expressID: string): IFCProperty[] {\n const properties = [];\n const objectRawProperties = this._model.properties;\n if (!objectRawProperties) {\n return [];\n }\n\n for (const id of this._indexMap[expressID]) {\n const entity = objectRawProperties[id];\n if (entity == null) {\n continue;\n }\n const { name } = IfcPropertiesUtils.getEntityName(objectRawProperties, id);\n if (name === null) {\n continue;\n }\n\n if (entity.type === IFCPROPERTYSET) {\n const psetPropsIds = IfcPropertiesUtils.getPsetProps(objectRawProperties, id);\n if (psetPropsIds !== null) {\n for (const psetPropId of psetPropsIds) {\n const psetProp = objectRawProperties[psetPropId];\n if (psetProp == null) {\n continue;\n }\n const psetProperties = this.getProperty(psetPropId);\n if (psetProperties === null) {\n continue;\n }\n properties.push({\n parentName: name,\n ...psetProperties,\n });\n }\n }\n } else if (entity.type === IFCELEMENTQUANTITY) {\n const qsetQuantityIds = IfcPropertiesUtils.getQsetQuantities(\n objectRawProperties,\n id,\n );\n if (qsetQuantityIds !== null) {\n for (const quantityId of qsetQuantityIds) {\n const { key } = IfcPropertiesUtils.getQuantityValue(\n objectRawProperties,\n quantityId,\n );\n if (key === null) {\n continue;\n }\n const qsetProperties = this.getProperty(quantityId);\n if (qsetProperties === null) {\n continue;\n }\n properties.push({\n parentName: name,\n ...qsetProperties,\n });\n }\n }\n }\n }\n\n return properties;\n }\n\n public getProperty(expressID: number): { name: string; value: number | null } | null {\n const properties = this._model.properties;\n if (properties === undefined) {\n return null;\n }\n\n const { name } = IfcPropertiesUtils.getEntityName(properties, expressID);\n if (name === null) {\n return null;\n }\n\n const { value } = IfcPropertiesUtils.getQuantityValue(properties, expressID);\n return { name, value };\n }\n\n public highlight(name: FragmentTypeName, mesh: FragmentMesh, itemId: string): void {\n this._ifcSelection[name][mesh.uuid] = new Set<string>();\n\n const idNum = parseInt(itemId, 10);\n this._ifcSelection[name][mesh.uuid].add(itemId);\n this.addComposites(name, mesh, idNum);\n this.regenerate(name, mesh.uuid);\n\n const group = mesh.fragment.group;\n if (group) {\n const keys = group.data[idNum][0];\n for (let i = 0; i < keys.length; i++) {\n const fragKey = keys[i];\n const fragID = group.keyFragments[fragKey];\n const fragment = this._fragmentManager.list[fragID];\n\n if (!(fragID in this._ifcSelection[name])) {\n this._ifcSelection[name][fragID] = new Set<string>();\n }\n this._ifcSelection[name][fragID].add(itemId);\n this.addComposites(name, fragment.mesh, idNum);\n this.regenerate(name, fragID);\n }\n }\n this.notifyChange(this);\n }\n\n public highlightById(ids: FragmentIdMap, name: FragmentTypeName = 'selection'): void {\n for (const fragID of Object.keys(ids)) {\n if (!(fragID in this._ifcSelection[name])) {\n this._ifcSelection[name][fragID] = new Set<string>();\n }\n\n const fragment = this._fragmentManager.list[fragID];\n\n const idsNum = new Set<number>();\n for (const id of ids[fragID]) {\n this._ifcSelection[name][fragID].add(id);\n idsNum.add(parseInt(id, 10));\n }\n for (const id of idsNum) {\n this.addComposites(name, fragment.mesh, id);\n }\n this.regenerate(name, fragID);\n }\n\n this.notifyChange(this);\n }\n\n public override pick(canvasCoords: Vector2, options?: PickOptions): IFCPickResult[] {\n return super.pick(canvasCoords, options).map(p => ({\n ...p,\n entity: this,\n features: p.features as IFCFeature[] | undefined,\n isIFCPickResult: true,\n object: p.object as FragmentMesh,\n }));\n }\n\n public pickFeaturesFrom(pickedResult: IFCPickResult): IFCFeature[] {\n const mesh = pickedResult.object;\n if (mesh.fragment != null && pickedResult.instanceId != null && pickedResult.face) {\n const blockId = mesh.fragment.getVertexBlockID(mesh.geometry, pickedResult.face.a);\n\n const itemId = mesh.fragment\n .getItemID(pickedResult.instanceId, blockId)\n ?.replace(/\\..*/, '');\n\n // @ts-expect-error IfcProperties defines indexes as numbers, but actually are strings\n if (itemId && mesh.fragment.group?.properties?.[itemId] != null) {\n const properties = mesh.fragment.group.properties;\n // @ts-expect-error IfcProperties defines indexes as numbers, but actually are strings\n const itemProperties = properties[itemId];\n const ifcProperties = this.getProperties(itemId);\n\n const result = [{ ifcProperties, itemProperties }];\n pickedResult.features = result;\n return result;\n }\n }\n return [];\n }\n\n protected async initClassification(): Promise<void> {\n this._classificationCache = await this.regenerateClassification([\n ClassificationSystem.STOREY,\n ClassificationSystem.ENTITY,\n ]);\n if (this._classificationCache.length === 0) {\n // Maybe we don't have storeys, try to classify by entity\n this._classificationCache = await this.regenerateClassification([\n ClassificationSystem.ENTITY,\n ]);\n }\n this._fragmentBoundingBox = await this._components.tools.get(FragmentBoundingBox);\n }\n\n protected override async preprocess(): Promise<void> {\n const data = await Fetcher.fetchArrayBuffer(this._source.url);\n\n this._fragmentManager = await this._components.tools.get(FragmentManager);\n\n this._fragmentClassifier = await this._components.tools.get(FragmentClassifier);\n const fragmentIfcLoader = new FragmentIfcLoader(this._components);\n\n fragmentIfcLoader.settings.webIfc.COORDINATE_TO_ORIGIN = true;\n fragmentIfcLoader.settings.webIfc.OPTIMIZE_PROFILES = true;\n\n const buffer = new Uint8Array(data);\n this._model = await fragmentIfcLoader.load(buffer, this._source.name);\n\n // IFC models are Y-up, so we need to rotate them to be Z-up.\n this._model.rotateX(Math.PI / 2);\n\n const position = new Vector3();\n // If custom coordinates are provided, we ignore the IFC's placement\n if (this._source.at) {\n this._source.at.toVector3(position);\n this._model.position.copy(position);\n } else {\n // Since we are loading the model with COORDINATE_TO_ORIGIN = true, all vertices will be\n // expressed as an offset from the root object, rather than their absolute world space\n // positions. We then have to compute a transformation matrix to put the object back in\n // its original position.\n // For this, we use the undocumented coordination matrix which is the transformation\n // from world to local space.\n //\n // However, since Giro3D is Z-up, we need to swap Y and Z, and then invert the sign of\n // the new Y (i.e the Z before the swap).\n //\n // Important note: the IFC's origin is not transformed to the instance's CRS. We assume that\n // The IFC file is in the same coordinate system as the instance.\n const coordinationMatrix = this._model.coordinationMatrix.clone().invert();\n position.applyMatrix4(coordinationMatrix);\n this._model.position.set(position.x, -position.z, position.y);\n }\n\n this._model.updateWorldMatrix(true, true);\n this._model.updateMatrix();\n this._model.updateMatrixWorld(true);\n this.initializeEntityIndexes();\n\n this._fragmentClassifier.byStorey(this._model);\n this._fragmentClassifier.byEntity(this._model);\n\n await this.initClassification();\n\n this.object3d.add(this._model);\n this.onObjectCreated(this._model);\n\n const context = Fetcher.getContext(this._source.url);\n fillObject3DUserData(this, { filename: context.filename });\n\n this.notifyChange(this.object3d);\n }\n\n private addComposites(name: FragmentTypeName, mesh: FragmentMesh, itemID: number): void {\n this.addHighlightToFragment(name, mesh.fragment);\n const composites = mesh.fragment.composites[itemID];\n if (composites) {\n for (let i = 1; i < composites; i++) {\n const compositeID = toCompositeID(itemID, i);\n this._ifcSelection[name][mesh.uuid].add(compositeID);\n }\n }\n }\n\n private addHighlightToFragment(name: FragmentTypeName, fragment: Fragment): void {\n if (!(name in fragment.fragments)) {\n const subFragment = fragment.addFragment(name, [materials[name]]);\n if (fragment.blocks.count > 1) {\n subFragment.setInstance(0, {\n ids: Array.from(fragment.ids),\n transform: tempMatrix,\n });\n subFragment.blocks.setVisibility(false);\n }\n\n this._model.add(subFragment.mesh);\n\n subFragment.mesh.renderOrder = 30;\n subFragment.mesh.frustumCulled = false;\n subFragment.mesh.name = name;\n subFragment.mesh.updateMatrixWorld(true);\n }\n }\n\n private initializeEntityIndexes(): void {\n this._indexMap = {};\n const properties = this._model.properties;\n if (properties === undefined) {\n return;\n }\n\n for (const relation of relationsToProcess) {\n IfcPropertiesUtils.getRelationMap(properties, relation, (relationID, relatedIDs) => {\n const relationEntity = properties[relationID];\n if (!setEntities.includes(relationEntity.type)) {\n this.setEntityIndex(relationID);\n }\n for (const expressID of relatedIDs) {\n this.setEntityIndex(expressID).add(relationID);\n }\n });\n }\n }\n\n private regenerate(name: FragmentTypeName, fragID: string): void {\n this.updateFragmentFill(name, fragID);\n }\n\n private async regenerateClassification(\n groupSystemNames: string[],\n result = {},\n ): Promise<ClassificationItem[]> {\n const systems = this._fragmentClassifier.get();\n const groups: ClassificationItem[] = [];\n const currentSystemName = groupSystemNames[0]; // storeys\n const systemGroups = systems[currentSystemName];\n\n if (currentSystemName == null || systemGroups == null) {\n return groups;\n }\n for (const name of Object.keys(systemGroups)) {\n // name is N00, N01, N02...\n // { storeys: \"N00\" }, { storeys: \"N01\" }...\n const filter = { ...result, [currentSystemName]: [name] };\n const found = await this._fragmentClassifier.find(filter);\n const hasElements = Object.keys(found).length > 0;\n\n if (hasElements) {\n const firstLetter = currentSystemName[0].toUpperCase();\n const treeItemName = firstLetter + currentSystemName.slice(1); // Storeys\n const children = await this.regenerateClassification(\n groupSystemNames.slice(1),\n filter,\n );\n\n groups.push({ children, fragments: found, name, treeItemName });\n }\n }\n return groups;\n }\n\n private setEntityIndex(expressID: number): Set<number> {\n if (!(expressID in this._indexMap)) {\n this._indexMap[expressID] = new Set();\n }\n return this._indexMap[expressID];\n }\n private updateFragmentFill(name: FragmentTypeName, fragmentID: string): void {\n const ids = this._ifcSelection[name][fragmentID];\n const fragment = this._fragmentManager.list[fragmentID];\n if (fragment == null) {\n return;\n }\n const selection = fragment.fragments[name];\n if (selection == null) {\n return;\n }\n\n const fragmentParent = fragment.mesh.parent;\n if (fragmentParent == null) {\n return;\n }\n fragmentParent.add(selection.mesh);\n\n const isBlockFragment = selection.blocks.count > 1;\n if (isBlockFragment) {\n fragment.getInstance(0, tempMatrix);\n selection.setInstance(0, {\n ids: Array.from(fragment.ids),\n transform: tempMatrix,\n });\n\n selection.blocks.setVisibility(true, ids, true);\n } else {\n let i = 0;\n for (const id of ids) {\n selection.mesh.count = i + 1;\n const { instanceID } = fragment.getInstanceAndBlockID(id);\n fragment.getInstance(instanceID, tempMatrix);\n selection.setInstance(i, { ids: [id], transform: tempMatrix });\n i++;\n }\n }\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type GUI from 'lil-gui';\n\nimport EntityInspector from '@giro3d/giro3d/gui/EntityInspector';\n\nimport type IfcEntity from './IfcEntity';\n\nexport default class IfcEntityInspector extends EntityInspector<IfcEntity> {\n public constructor(parentGui: GUI, instance: Instance, entity: IfcEntity) {\n super(parentGui, instance, entity, { visibility: true });\n }\n}\n","<script setup lang=\"ts\">\n import { MathUtils } from 'three';\n import { ref } from 'vue';\n\n import type IfcEntity from '@/modules/ifc/IfcEntity';\n import type { ClassificationItem } from '@/modules/ifc/IfcEntity';\n\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 { useCameraStore } from '@/stores/camera';\n import { useModuleStore } from '@/stores/modules';\n\n import type ClippingBoxAnalysis from '../ClippingBoxAnalysis';\n\n import { moduleId } from '../ClippingBoxAnalysis';\n\n const props = defineProps<{\n classificationElement: ClassificationItem;\n ifcEntity: IfcEntity;\n }>();\n\n const id = MathUtils.generateUUID();\n const target = `#${id}`;\n\n const highlighted = ref(false);\n const cameraStore = useCameraStore();\n const moduleStore = useModuleStore();\n\n const clippingBoxModule = moduleStore.getModule<ClippingBoxAnalysis>(moduleId);\n\n function clipTo(): void {\n if (clippingBoxModule == null) {\n console.warn('Cannot clip IFC element, ClippingBoxAnalysis module is not present');\n return;\n }\n\n const bbox = props.ifcEntity.getBoundingBoxById(props.classificationElement.fragments);\n if (bbox && !bbox.isEmpty()) {\n clippingBoxModule.setClippingBox(bbox);\n }\n }\n\n function highlight(): void {\n highlighted.value = true;\n props.ifcEntity.clearHighlight();\n props.ifcEntity.highlightById(props.classificationElement.fragments);\n\n setTimeout(() => (highlighted.value = false), 2000);\n }\n\n function zoomTo(): void {\n const bbox = props.ifcEntity.getBoundingBoxById(props.classificationElement.fragments);\n if (bbox && !bbox.isEmpty()) {\n cameraStore.lookTopDownAt(bbox);\n }\n }\n</script>\n\n<template>\n <div>\n <div class=\"d-flex\">\n <span\n class=\"border rounded px-1 py-0 fw-normal\"\n :class=\"\n highlighted ? 'text-danger border-danger' : 'text-secondary border-secondary'\n \"\n :title=\"classificationElement.treeItemName\"\n >{{ classificationElement.treeItemName }}</span\n >\n <IconList v-if=\"classificationElement.children.length > 0\">\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=\"true\"\n />\n </IconList>\n <ListLabelButton\n class=\"label\"\n :class=\"highlighted ? 'text-danger-emphasis' : 'text-muted'\"\n :text=\"classificationElement.name\"\n :title=\"`Zoom to ${classificationElement.name}`\"\n @click=\"zoomTo\"\n />\n <IconList class=\"ms-1\">\n <IconListButton title=\"Highlight\" icon=\"bi-highlighter\" @click=\"highlight\" />\n <IconListButton\n v-if=\"clippingBoxModule != null\"\n title=\"Clip to\"\n icon=\"bi-bounding-box\"\n @click=\"clipTo\"\n />\n </IconList>\n </div>\n <div v-if=\"classificationElement.children.length > 0\" :id=\"id\" class=\"collapse show\">\n <ul class=\"list-unstyled border-start\">\n <li v-for=\"(item, index) in classificationElement.children\" :key=\"index\">\n <IfcSubtree :ifc-entity=\"props.ifcEntity\" :classification-element=\"item\" />\n </li>\n </ul>\n </div>\n </div>\n</template>\n\n<style scoped>\n ul {\n margin-left: 0.5rem;\n padding-left: 0.5rem;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { Dataset } from '@/types/Dataset';\n\n import { useDatasetStore } from '@/stores/datasets';\n import { refAndWatch } from '@/utils/Components';\n\n import type IfcEntity from './IfcEntity';\n import type { ClassificationItem } from './IfcEntity';\n\n import IfcSubtree from './IfcSubtree.vue';\n\n const datasets = useDatasetStore();\n\n const props = defineProps<{\n dataset: Dataset;\n }>();\n\n const isPreloaded = refAndWatch(props.dataset, 'isPreloaded');\n\n function getClassificationRoot(): ClassificationItem[] | null {\n const ifcEntity = getIfcEntity();\n\n if (ifcEntity == null) {\n return null;\n }\n\n return ifcEntity.getClassification();\n }\n\n function getIfcEntity(): IfcEntity | null {\n const entity = datasets.getEntity(props.dataset);\n\n if (entity == null) {\n return null;\n }\n\n return entity as IfcEntity;\n }\n</script>\n\n<template>\n <div v-if=\"isPreloaded\">\n <ul>\n <li v-for=\"(item, index) in getClassificationRoot()\" :key=\"index\">\n <IfcSubtree\n :ifc-entity=\"getIfcEntity() as IfcEntity\"\n :classification-element=\"item\"\n />\n </li>\n </ul>\n </div>\n</template>\n\n<style scoped>\n ul {\n font-size: smaller;\n }\n</style>\n","import type PickResult from '@giro3d/giro3d/core/picking/PickResult';\n\nimport EntityPanel from '@giro3d/giro3d/gui/EntityPanel';\nimport { IfcCategoryMap } from 'openbim-components';\n\nimport type { PieroContext } from '@/context';\nimport type { EntityBuilder } from '@/giro3d/EntityBuilder';\nimport type { LoadDatasetFromFile } from '@/loaders/loader';\nimport type { Module } from '@/module';\nimport type { HighlightFn } from '@/services/Highlighter';\nimport type { AttributeExtractorFn } from '@/services/Picker';\nimport type { IFCDatasetConfig } from '@/types/configuration/datasets/ifc';\nimport type { Attribute, AttributesGroups } from '@/types/Feature';\n\nimport { getCoordinates } from '@/utils/Configuration';\nimport Fetcher from '@/utils/Fetcher';\n\nimport IfcEntity, { isIFCPickResult } from './ifc/IfcEntity';\nimport IfcEntityInspector from './ifc/IfcEntityInspector';\nimport IfcPropertyView from './ifc/IfcPropertyView.vue';\n\nconst highlight: HighlightFn = (pick: PickResult) => {\n if (isIFCPickResult(pick)) {\n const mesh = pick.object;\n if (mesh.fragment != null && pick.face && pick.instanceId != null) {\n const blockId = mesh.fragment.getVertexBlockID(mesh.geometry, pick.face.a);\n\n const itemId = mesh.fragment.getItemID(pick.instanceId, blockId).replace(/\\..*/, '');\n\n pick.entity.highlight('selection', mesh, itemId);\n\n return () => pick.entity.clearHighlight();\n }\n }\n\n return null;\n};\n\nconst loader: LoadDatasetFromFile<IFCDatasetConfig> = context => {\n return {\n name: context.filename,\n source: {\n url: context.file,\n },\n type: 'ifc',\n visible: true,\n } satisfies IFCDatasetConfig;\n};\n\nconst attributeExtractor: AttributeExtractorFn = (\n pickResult: PickResult,\n attributesGroups: AttributesGroups,\n) => {\n if (!isIFCPickResult(pickResult)) {\n return;\n }\n\n const feature = pickResult.features?.at(0);\n if (!feature) {\n return;\n }\n\n if (!attributesGroups.has('IFC')) {\n attributesGroups.set('IFC', []);\n }\n const attributes = attributesGroups.get('IFC') as Attribute[];\n\n const { ifcProperties, itemProperties } = feature;\n\n const nullValue = 'NULL';\n const name = itemProperties.Name?.value ?? nullValue;\n\n attributes.push({\n key: 'Site',\n value: pickResult.entity.object3d.userData?.dataset?.name ?? nullValue,\n });\n attributes.push({\n key: 'IFCType',\n value: IfcCategoryMap[itemProperties.type] ?? nullValue,\n });\n attributes.push({ key: 'Name', value: name });\n attributes.push({ key: 'ID', value: itemProperties.expressID });\n attributes.push({ key: 'GlobalId', value: itemProperties.GlobalId?.value ?? nullValue });\n if (itemProperties.Description?.value != null) {\n attributes.push({ key: 'Description', value: itemProperties.Description.value });\n }\n if (itemProperties.PredefinedType?.value != null) {\n attributes.push({ key: 'PredefinedType', value: itemProperties.PredefinedType.value });\n }\n if (itemProperties.ObjectType?.value != null) {\n attributes.push({ key: 'ObjectType', value: itemProperties.ObjectType.value });\n }\n\n for (const { name, parentName, value } of ifcProperties) {\n if (!attributesGroups.has(parentName)) {\n attributesGroups.set(parentName, []);\n }\n attributesGroups.get(parentName)?.push({ key: name, value });\n }\n};\n\nconst entityBuilder: EntityBuilder = context => {\n const dataset = context.dataset;\n\n const cfg = dataset.config as IFCDatasetConfig;\n const at = getCoordinates(cfg.source.position ?? dataset.get('position'));\n const entity = new IfcEntity({\n ...cfg.source,\n at,\n name: dataset.name,\n });\n\n return Promise.resolve(entity);\n};\n\n/**\n * Loads IFC (Industry Foundation Classes) files.\n */\nexport default class IFCLoader implements Module {\n public readonly id = 'builtin-ifc-loader';\n public readonly name = 'IFC';\n\n public async initialize(context: PieroContext): Promise<void> {\n context.datasets.registerDatasetType('ifc', {\n attributeExtractor,\n entityBuilder,\n fileExtensions: ['ifc'],\n highlight,\n icon: 'bi-building',\n loader,\n name: 'IFC',\n propertyView: IfcPropertyView,\n });\n\n EntityPanel.registerInspector('IfcEntity', IfcEntityInspector);\n\n // Preload web-ifc.wasm\n await Fetcher.fetch('web-ifc.wasm').catch(e => {\n console.warn('Could not load web-ifc.wasm', e);\n });\n }\n}\n","<script setup lang=\"ts\">\n import Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\n import { Map, View } from 'ol';\n import TileLayer from 'ol/layer/Tile';\n import { fromLonLat } from 'ol/proj';\n import { OSM } from 'ol/source';\n import { Vector3 } from 'three';\n import { onMounted, onUnmounted, ref, shallowRef } from 'vue';\n\n import type { PieroContext } from '@/context';\n\n const target = ref<HTMLDivElement>();\n const map = shallowRef<Map>();\n const props = defineProps<{\n context: PieroContext;\n }>();\n\n const altitudeRanges = [\n [30_000, 12],\n [50_000, 10],\n [100_000, 8],\n [400_000, 6],\n [800_000, 4],\n ];\n\n function getZoomFromAltitude(altitude: number): number {\n for (const [alt, zoom] of altitudeRanges) {\n if (altitude < alt) {\n return zoom;\n }\n }\n\n return altitudeRanges[altitudeRanges.length - 1][1];\n }\n\n onMounted(() => {\n map.value = new Map({\n controls: [],\n layers: [new TileLayer({ source: new OSM() })],\n target: target.value,\n view: new View({\n center: fromLonLat([4, 44]),\n projection: 'EPSG:3857',\n zoom: 5,\n }),\n });\n\n let lastPosition = new Vector3();\n\n const updateView = (): void => {\n const instance = props.context.view.getInstance();\n const camera = props.context.view.getCameraController();\n const position = camera.getCameraPosition();\n\n const altitude = position.camera.z;\n\n if (!position.camera.equals(lastPosition)) {\n lastPosition = position.camera.clone();\n\n const latlon = new Coordinates(\n instance.referenceCrs,\n lastPosition.x,\n lastPosition.y,\n ).as('EPSG:4326');\n\n const zoom = getZoomFromAltitude(altitude);\n\n const view = map.value?.getView();\n view?.setCenter(fromLonLat([latlon.longitude, latlon.latitude]));\n view?.setZoom(zoom);\n }\n };\n\n props.context.events.addEventListener('updated', updateView);\n\n let collapsed = false;\n\n if (target.value) {\n target.value.onclick = (): void => {\n collapsed = !collapsed;\n if (collapsed) {\n target.value?.classList.add('collapsed');\n target.value?.classList.remove('expanded');\n } else {\n target.value?.classList.remove('collapsed');\n target.value?.classList.add('expanded');\n }\n };\n }\n });\n\n onUnmounted(() => {\n map.value?.dispose();\n map.value = undefined;\n });\n</script>\n\n<template>\n <div ref=\"target\" title=\"Toggle minimap\" class=\"minimap expanded\"></div>\n</template>\n\n<style scoped>\n .minimap {\n position: absolute;\n top: 0;\n right: 0;\n margin: 5pt;\n width: 50px;\n height: 50px;\n background-color: grey;\n overflow: hidden;\n border-color: darkgray;\n border-width: 1px;\n border-style: solid;\n\n border-radius: 10px;\n box-shadow: rgba(0, 0, 0, 0.16) 0px 1px 4px;\n transition:\n width 200ms ease-out,\n height 200ms ease-out;\n }\n\n .minimap:hover {\n border-color: #40ae80;\n border-width: 5px;\n }\n\n .collapsed {\n width: 50px;\n height: 50px;\n animation-name: expand;\n animation-duration: 0.3s;\n animation-direction: reverse;\n }\n\n .expanded {\n width: 300px;\n height: 200px;\n animation-name: expand;\n animation-duration: 0.3s;\n animation-direction: normal;\n }\n\n @keyframes expand {\n from {\n width: 50px;\n height: 50px;\n }\n to {\n width: 300px;\n height: 200px;\n }\n }\n</style>\n","import type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport OpenLayersMinimapComponent from './minimap/OpenLayersMinimapComponent.vue';\n\nexport default class OpenLayersMinimap implements Module {\n public readonly id: string = 'builtin-minimap-openlayers';\n public readonly name: string = 'Minimap';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.widgets.addWidget({\n component: OpenLayersMinimapComponent,\n id: 'minimap-ol',\n });\n }\n}\n","import type PickableFeatures from '@giro3d/giro3d/core/picking/PickableFeatures';\nimport type PickResult from '@giro3d/giro3d/core/picking/PickResult';\n\nimport Entity3D from '@giro3d/giro3d/entities/Entity3D';\nimport { Color, DoubleSide, Group, Mesh, MeshLambertMaterial } from 'three';\nimport { PLYLoader as PLYThreeLoader } from 'three/examples/jsm/loaders/PLYLoader.js';\n\nimport type {\n CoordinatesMixin,\n FeatureProjectionMixin,\n UrlOrDataMixin,\n} from '@/giro3d/sources/mixins';\n\nimport { fillObject3DUserData } from '@/loaders/userData';\nimport Fetcher from '@/utils/Fetcher';\nimport { isObject } from '@/utils/Types';\n\n/**\n * Feature returned when picking on Ply objects\n */\nexport interface PlyFeature {\n color: Color;\n}\n\n/** Parameters for creating {@link PlyEntity} */\nexport interface PlySource\n extends Required<CoordinatesMixin>,\n Required<FeatureProjectionMixin>,\n UrlOrDataMixin {}\n\n/**\n * PLY 3D object implementing our picking\n */\nexport class PlyMesh extends Mesh implements PickableFeatures<PlyFeature> {\n public readonly isPickableFeatures = true;\n public readonly isPlyMesh = true;\n\n public static isPlyMesh = (obj: unknown): obj is PlyMesh =>\n isObject(obj) && (obj as PlyMesh).isPlyMesh;\n\n public static isPlyPickResult = (obj: unknown): obj is PickResult<PlyFeature> =>\n isObject(obj) && PlyMesh.isPlyMesh((obj as PickResult<unknown>)?.object);\n\n public pickFeaturesFrom(pickedResult: PickResult): PlyFeature[] {\n if (this.geometry.hasAttribute('color') && pickedResult.face) {\n const colors = this.geometry.getAttribute('color').array;\n const face = pickedResult.face;\n\n const color = new Color(\n colors[face.a * 3],\n colors[face.a * 3 + 1],\n colors[face.a * 3 + 2],\n );\n const result = [{ color }];\n pickedResult.features = result;\n return result;\n }\n\n return [];\n }\n}\n\n/**\n * Entity for displaying a PLY file\n */\nexport default class PlyEntity extends Entity3D {\n public readonly isPlyEntity = true;\n public readonly source: PlySource;\n\n public constructor(source: PlySource) {\n super(new Group());\n this.source = source;\n }\n\n protected override async preprocess(): Promise<void> {\n const data = await Fetcher.fetchArrayBuffer(this.source.url);\n\n const position = this.source.at.as(this.source.featureProjection).toVector3();\n\n const loader = new PLYThreeLoader();\n const geometry = loader.parse(data);\n\n const material = new MeshLambertMaterial({\n side: DoubleSide,\n });\n if (geometry.hasAttribute('color')) {\n material.vertexColors = true;\n }\n geometry.computeVertexNormals();\n\n const mesh = new PlyMesh(geometry, material);\n mesh.name = 'plyModel';\n geometry.computeBoundingBox();\n\n mesh.position.copy(position);\n mesh.updateWorldMatrix(true, true);\n\n this.object3d.add(mesh);\n this.onObjectCreated(mesh);\n\n const context = Fetcher.getContext(this.source.url);\n fillObject3DUserData(this, { filename: context.filename });\n\n this.notifyChange(this.object3d);\n }\n}\n","import type PickResult from '@giro3d/giro3d/core/picking/PickResult';\n\nimport type { PieroContext } from '@/context';\nimport type { EntityBuilder } from '@/giro3d/EntityBuilder';\nimport type { Module } from '@/module';\nimport type { AttributeExtractorFn } from '@/services/Picker';\nimport type { PLYDatasetConfig } from '@/types/configuration/datasets/ply';\nimport type { Attribute, AttributesGroups } from '@/types/Feature';\n\nimport { getCoordinates } from '@/utils/Configuration';\n\nimport PlyEntity, { PlyMesh } from './ply/PlyEntity';\n\nconst build: EntityBuilder = context => {\n const { dataset, instance } = context;\n\n const cfg = dataset.config as PLYDatasetConfig;\n const at = getCoordinates(cfg.source.position ?? dataset.get('position'));\n const entity = new PlyEntity({\n ...cfg.source,\n at,\n featureProjection: instance.referenceCrs,\n });\n\n return Promise.resolve(entity);\n};\n\nconst getAttributesFromPlyObject: AttributeExtractorFn = (\n pickResult: PickResult,\n attributesGroups: AttributesGroups,\n) => {\n if (!PlyMesh.isPlyPickResult(pickResult)) {\n return;\n }\n\n const feature = pickResult.features?.at(0);\n if (!feature) {\n return;\n }\n\n if (!attributesGroups.has('PLY')) {\n attributesGroups.set('PLY', []);\n }\n const plyAttributes = attributesGroups.get('PLY') as Attribute[];\n\n plyAttributes.push({ key: 'Color', value: feature.color });\n};\n\n/**\n * Loads .ply files.\n */\nexport default class PLYLoader implements Module {\n public readonly id = 'builtin-ply-loader';\n public readonly name = 'PLY';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.datasets.registerDatasetType('ply', {\n attributeExtractor: getAttributesFromPlyObject,\n entityBuilder: build,\n icon: 'bi-file-earmark-binary',\n name: 'PLY',\n });\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type Entity from '@giro3d/giro3d/entities/Entity';\nimport type Entity3D from '@giro3d/giro3d/entities/Entity3D';\n\nimport { isEntity3D } from '@giro3d/giro3d/entities/Entity3D';\n\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nexport type PostProcessing = (entity: Entity3D, context: { instance: Instance }) => void;\n\nconst hideIfcSpace: PostProcessing = entity => {\n entity.addEventListener('object-created', evt => {\n const scene = evt.obj;\n scene.traverse(obj => {\n if (obj.userData?.class === 'IfcSpace') {\n obj.visible = false;\n }\n });\n });\n};\n\nexport default class PostProcessEntities implements Module {\n public readonly id = 'builtin-post-process-entities';\n public readonly name = 'Post-process 3D Tiles';\n\n private readonly _alreadyProcessedEntities = new Set<Entity['id']>();\n\n private readonly _processings = [hideIfcSpace];\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.events.addEventListener('ready', () => {\n const instance = context.view.getInstance();\n instance.addEventListener('entity-added', () => this.processEntities(instance));\n\n // Initial processing\n this.processEntities(instance);\n });\n }\n\n private processEntities(instance: Instance): void {\n for (const entity of instance.getEntities()) {\n if (this._alreadyProcessedEntities.has(entity.id)) {\n continue;\n }\n\n if (isEntity3D(entity)) {\n this.processEntity(entity, instance);\n }\n\n this._alreadyProcessedEntities.add(entity.id);\n }\n }\n\n private processEntity(entity: Entity3D, instance: Instance): void {\n const context = { instance };\n\n for (const processing of this._processings) {\n processing(entity, context);\n }\n }\n}\n","import PointCloud from '@giro3d/giro3d/entities/PointCloud';\nimport PotreeSource from '@giro3d/giro3d/sources/PotreeSource';\n\nimport type { PieroContext } from '@/context';\nimport type { EntityBuilder } from '@/giro3d/EntityBuilder';\nimport type { Module } from '@/module';\nimport type { PotreePointCloudDatasetConfig } from '@/types/configuration/datasets/potreePointCloud';\n\nimport { fillObject3DUserData } from '@/loaders/userData';\n\nconst entityBuilder: EntityBuilder = context => {\n const cfg = context.dataset.config as PotreePointCloudDatasetConfig;\n\n const entity = new PointCloud({\n source: new PotreeSource({ url: `${cfg.source.url}/${cfg.source.filename}` }),\n });\n\n fillObject3DUserData(entity, {\n filename: cfg.source.url,\n });\n\n return Promise.resolve(entity);\n};\n\n/**\n * Loads [Potree](https://potree.github.io/) datasets.\n */\nexport default class PotreeLoader implements Module {\n public readonly id = 'builtin-potree-loader';\n public readonly name = 'Potree';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.datasets.registerDatasetType('potree', {\n entityBuilder,\n icon: 'fg-multipoint',\n name: 'Potree Point Cloud',\n });\n }\n}\n","import Shepherd from 'shepherd.js';\n\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport { hasExperimentalFeature } from '@/utils/Configuration';\n\nimport type CameraController from '../services/CameraController';\n\ninterface TourEvent {\n previous?: Shepherd.Step;\n step: Shepherd.Step;\n tour: Shepherd.Tour & {\n id: string;\n };\n}\n\ntype Tours = {\n readonly analyzingTour: Shepherd.Tour;\n readonly mainTour: Shepherd.Tour;\n readonly navigatingTour: Shepherd.Tour;\n};\n\n/**\n * Provides a guided tour of the application.\n */\nexport default class TourModule implements Module {\n public readonly id = 'builtin-tour';\n public readonly name = 'Tour';\n\n private _camera: CameraController | null = null;\n private _cameraCallback: (() => void) | null = null;\n private _context: PieroContext | null = null;\n private _tours: Tours | null = null;\n\n public initialize(context: PieroContext): Promise<void> | void {\n this._context = context;\n context.events.addEventListener('ready', this.start.bind(this));\n }\n\n private buildTours(): Tours {\n const camera = this._camera as CameraController;\n\n const mainTour = new Shepherd.Tour({\n tourName: 'main',\n useModalOverlay: true,\n });\n const navigatingTour = new Shepherd.Tour({\n tourName: 'navigating',\n useModalOverlay: true,\n });\n const analyzingTour = new Shepherd.Tour({\n tourName: 'analyzing',\n useModalOverlay: true,\n });\n\n const buttonsOptions = [\n { action: (): void => Shepherd.activeTour?.next(), text: 'Next' },\n { action: (): void => Shepherd.activeTour?.cancel(), secondary: true, text: 'Exit' },\n ];\n\n const displayProgress = (): void => {\n const currentStep = Shepherd.activeTour?.getCurrentStep();\n const currentStepElement = currentStep?.getElement();\n const content = currentStepElement?.querySelector('.shepherd-text');\n const steps = Shepherd.activeTour?.steps;\n\n if (\n currentStep == null ||\n currentStepElement == null ||\n content == null ||\n steps == null\n ) {\n return;\n }\n\n const progress = document.createElement('div');\n progress.className = 'progress mt-3';\n progress.setAttribute('role', 'progressbar');\n progress.style.height = '2px';\n\n const progressbar = document.createElement('div');\n progressbar.className = 'progress-bar bg-success';\n progressbar.style.width = `${100 * (steps.indexOf(currentStep) / steps.length)}%`;\n\n progress.appendChild(progressbar);\n content.appendChild(progress);\n };\n\n const loadPanel = async (\n panelId: string,\n waitSelector: string,\n ): Promise<Element | null> => {\n return new Promise(resolve => {\n const link = document.getElementById(panelId);\n if (link && !link.classList.contains('active')) {\n link.click();\n }\n\n if (document.querySelector(waitSelector)) {\n return resolve(document.querySelector(waitSelector));\n }\n\n const observer = new MutationObserver(() => {\n if (document.querySelector(waitSelector)) {\n observer.disconnect();\n resolve(document.querySelector(waitSelector));\n }\n });\n\n // If you get \"parameter 1 is not of type 'Node'\" error, see https://stackoverflow.com/a/77855838/492336\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n });\n };\n\n mainTour.addStep({\n buttons: [\n {\n action: (): void => {\n Shepherd.activeTour?.complete();\n navigatingTour.show(0);\n },\n text: 'Navigating',\n },\n {\n action: (): void => {\n Shepherd.activeTour?.complete();\n analyzingTour.show(0);\n },\n text: 'Analyzing data',\n },\n {\n action: (): void => Shepherd.activeTour?.cancel(),\n secondary: true,\n text: 'Exit',\n },\n ],\n cancelIcon: { enabled: true, label: 'Exit tutorial' },\n id: 'example-step',\n text: '<p>Welcome to <strong>Piero</strong>, the Giro3D application.<br/>We can guide you through the different features.</p>',\n title: 'Welcome!',\n when: {\n show: displayProgress,\n },\n });\n\n navigatingTour.addStep({\n attachTo: {\n element: '#main-view',\n on: 'bottom',\n },\n buttons: buttonsOptions,\n id: 'view',\n text: '<p>This is the <b>main view</b>.</p><p>Giro3D natively supports a broad range of data sources, from 2D raster and vector data, to 3D point clouds and tilesets.</p><p>Piero adds support for CityJSON and IFC files.</p>',\n when: {\n show: displayProgress,\n },\n });\n\n navigatingTour.addStep({\n attachTo: {\n element: '#main-view',\n on: 'bottom',\n },\n buttons: buttonsOptions,\n id: 'navigate',\n text: '<p>This application integrates <a href=\"https://github.com/yomotsu/camera-controls\">camera-controls</a>, a camera control for three.js.</p><p><b>Click</b> to move the camera. <b>Right-click</b> to rotate around a point. <b>Scroll</b> to zoom in or out.</p>',\n when: {\n hide: () => {\n if (this._cameraCallback) {\n camera.removeEventListener('interaction-end', this._cameraCallback);\n }\n this._cameraCallback = null;\n },\n show: () => {\n let nbEvents = 0;\n this._cameraCallback = (): void => {\n nbEvents += 1;\n if (nbEvents > 2) {\n Shepherd.activeTour?.next();\n }\n };\n camera.addEventListener('interaction-end', this._cameraCallback);\n displayProgress();\n },\n },\n });\n\n navigatingTour.addStep({\n attachTo: {\n element: '#toolbar',\n on: 'right',\n },\n beforeShowPromise: () => loadPanel('toolbar-datasets', '#datasets-drop-zone'),\n buttons: buttonsOptions,\n id: 'toolbar-layers',\n text: '<p>Giro3D supports multiple datasets.</p><p>You can toggle datasets as you wish with the <b>Datasets</b> panel.</p>',\n when: {\n show: displayProgress,\n },\n });\n\n navigatingTour.addStep({\n attachTo: {\n element: '#basemap-list',\n on: 'right',\n },\n beforeShowPromise: () => loadPanel('toolbar-datasets', '#datasets-drop-zone'),\n buttons: buttonsOptions,\n id: 'basemaps',\n text: '<p><b>Basemaps</b> are color and elevation layers that make the basic shape and aspect of the <b>Map</b>.</p>',\n when: {\n show: displayProgress,\n },\n });\n\n navigatingTour.addStep({\n attachTo: {\n element: '#overlay-list',\n on: 'right',\n },\n beforeShowPromise: () => loadPanel('toolbar-datasets', '#datasets-drop-zone'),\n buttons: buttonsOptions,\n id: 'overlays',\n text: '<p><b>Overlays</b> are vector layers in various formats (WFS, GML, GeoJSON...).</p>',\n when: {\n show: displayProgress,\n },\n });\n\n navigatingTour.addStep({\n attachTo: {\n element: '#dataset-list',\n on: 'right',\n },\n beforeShowPromise: () => loadPanel('toolbar-datasets', '#datasets-drop-zone'),\n buttons: buttonsOptions,\n id: 'layers',\n text: \"<p>The <b>Datasets</b> panel contains all 3D objects in the scene.</><p>You can toggle their visibility and delete them.<p><p>Most objects leverage Giro3D's adaptive resolution to optimize their display.</p>\",\n when: {\n show: displayProgress,\n },\n });\n\n navigatingTour.addStep({\n attachTo: {\n element: '#datasets-drop-zone',\n on: 'right',\n },\n beforeShowPromise: () => loadPanel('toolbar-datasets', '#datasets-drop-zone'),\n buttons: buttonsOptions,\n id: 'adddata',\n text: \"<p>You can add your own data from your computer by <b>dragging the file</b> into this page.</p><p>While you won't benefit from Giro3D's tiling mechanism, this can be a great way to quickly visualize datasets up to 100MB.</p><p>This application supports CityJSONs, IFCs, LAS/LAZs, CSV pointclouds, and simple GeoJSON features.</p>\",\n when: {\n show: displayProgress,\n },\n });\n\n navigatingTour.addStep({\n attachTo: {\n element: '#main-view',\n on: 'bottom',\n },\n buttons: buttonsOptions,\n id: 'attributes',\n text: '<p>By clicking on any feature on the map, you can see its <strong>Attribute table</strong>. Clickable features display a cursor when hovered.</p>',\n when: {\n show: displayProgress,\n },\n });\n\n navigatingTour.addStep({\n attachTo: {\n element: '#search-place-autocomplete',\n on: 'bottom',\n },\n buttons: [\n {\n action: (): void => {\n Shepherd.activeTour?.complete();\n analyzingTour.show(0);\n },\n text: 'Analyzing data',\n },\n {\n action: (): void => Shepherd.activeTour?.complete(),\n secondary: true,\n text: 'Exit',\n },\n ],\n id: 'widgets',\n text: 'Giro3D is highly extensible. Here we added a widget to search and navigate to locations based on the French address database.',\n when: {\n show: displayProgress,\n },\n });\n\n analyzingTour.addStep({\n attachTo: {\n element: '#annotations-fieldset',\n on: 'right',\n },\n beforeShowPromise: () => loadPanel('toolbar-annotations', '#annotations-fieldset'),\n buttons: buttonsOptions,\n id: 'annotation',\n text: '<p>You can <strong>annotate</strong> any data displayed using Giro3D native tools.<br>Select the <strong>geometry</strong> of your annotation, and <strong>click</strong> on the scene to add points. <strong>Right-click</strong> to end the shape.</p>',\n when: {\n show: displayProgress,\n },\n });\n\n analyzingTour.addStep({\n attachTo: {\n element: '#annotations-fieldset',\n on: 'right',\n },\n beforeShowPromise: () => loadPanel('toolbar-annotations', '#annotations-fieldset'),\n buttons: buttonsOptions,\n id: 'annotations',\n text: 'You can download your annotations as GeoJSON files. You can also upload your own by dragging them into this panel.',\n when: {\n show: displayProgress,\n },\n });\n\n if (hasExperimentalFeature('measurements')) {\n analyzingTour.addStep({\n attachTo: {\n element: '#panel-container',\n on: 'right',\n },\n beforeShowPromise: () => loadPanel('toolbar-measures', '#measures-fieldset'),\n buttons: buttonsOptions,\n id: 'measurements',\n text: 'You can add <strong>measurements</strong> to easily get distances betwween objects.<br>Once started, moving the mouse will display the measure. <strong>Click</strong> to save the measurement. <strong>Right-click</strong> to end.',\n when: {\n show: displayProgress,\n },\n });\n }\n\n analyzingTour.addStep({\n attachTo: {\n element: '#panel-container',\n on: 'right',\n },\n beforeShowPromise: () => loadPanel('toolbar-analysis', '#panel-container .card'),\n buttons: [{ action: (): void => Shepherd.activeTour?.complete(), text: 'Done!' }],\n id: 'analysis',\n text: \"In the <strong>Analysis</strong> panel you'll find some advanced analysis tools.\",\n when: {\n show: displayProgress,\n },\n });\n\n const markSkiptour = (): void => {\n const url = new URL(document.URL);\n url.searchParams.delete('tourStep');\n url.searchParams.set('tour', 'none');\n window.history.replaceState({}, '', url.toString());\n };\n\n const markTour = (current: TourEvent): void => {\n const url = new URL(document.URL);\n let tourName = 'main';\n if (current.tour.id.startsWith('navigating')) {\n tourName = 'navigating';\n } else if (current.tour.id.startsWith('analyzing')) {\n tourName = 'analyzing';\n }\n url.searchParams.set('tour', tourName);\n url.searchParams.set('tourStep', current.step.id);\n window.history.replaceState({}, '', url.toString());\n };\n\n mainTour.on('cancel', markSkiptour);\n mainTour.on('complete', markSkiptour);\n mainTour.on('show', markTour);\n\n navigatingTour.on('cancel', markSkiptour);\n navigatingTour.on('complete', markSkiptour);\n navigatingTour.on('show', markTour);\n\n analyzingTour.on('cancel', markSkiptour);\n analyzingTour.on('complete', markSkiptour);\n analyzingTour.on('show', markTour);\n\n return { analyzingTour, mainTour, navigatingTour };\n }\n\n private getTours(): Tours {\n if (!this._tours) {\n this._tours = this.buildTours();\n }\n return this._tours;\n }\n\n private restart(): void {\n const { mainTour } = this.getTours();\n mainTour.show(0);\n }\n\n private start(): void {\n if (!this._context) {\n throw new Error('module is not initialized');\n }\n\n const { analyzingTour, mainTour, navigatingTour } = this.getTours();\n this._camera = this._context.view.getCameraController();\n\n const url = new URL(document.URL);\n const tour = url.searchParams.get('tour') ?? 'main';\n if (tour !== 'none') {\n const tourStep = url.searchParams.get('tourStep') ?? 0;\n if (tour === 'navigating') {\n navigatingTour.show(tourStep);\n } else if (tour === 'analyzing') {\n analyzingTour.show(tourStep);\n } else {\n mainTour.show(tourStep);\n }\n }\n }\n}\n"],"names":["props","__props","x","ref","_a","y","_b","z","_c","emits","__emit","picker","Picker","isPicking","emitCoordinates","Coordinates","nonNull","pickCoordinate","instance","onMouseMove","e","p","_d","onClick","setX","v","setY","setZ","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_toDisplayString","_hoisted_3","_cache","event","_createBlock","ButtonWithIcon","useCrossSectionStore","defineStore","orientation","shallowRef","cursorManager","center","Vector3","enable","showHelper","setEnabled","setOrientation","setCenter","setShowHelper","setInstance","setCursorManager","store","onCenterUpdated","_createVNode","SwitchToggle","_unref","_hoisted_5","CoordinateInput","CrossSectionHelper","Object3D","plane","Mesh","PlaneGeometry","MeshBasicMaterial","arrow","ArrowHelper","CrossSectionManager","context","__publicField","defaultCrs","config","pivot","pivotLocal","after","name","show","clippingPlanes","radians","MathUtils","cos","sin","normal","distance","Plane","entity","isEntity3D","CrossSectionAnalysis","CrossSection","getUrl","dataset","predicate","DownloadDataset","uri","fragments","filename","Fetcher","res","blob","Download","message","useFloodingPlaneStore","height","getHeight","setHeight","_hoisted_4","FloodingPlaneObject","width","FloodingPlaneManager","extent","dims","FloodingPlaneAnalysis","FloodingPlane","latLonDd","CoordinatesSearchProvider","query","results","lat","lon","result","CoordinatesSearch","validationRegex","BanSearchProvider","f","point","alticode","r","HttpError","coordinates","url","c","i","FrenchBanGeocoder","tempMatrix","Matrix4","materials","IFCRELDEFINESBYPROPERTIES","IFCRELDEFINESBYTYPE","IFCRELASSOCIATESMATERIAL","IFCRELCONTAINEDINSPATIALSTRUCTURE","IFCRELASSOCIATESCLASSIFICATION","IFCRELASSIGNSTOGROUP","IFCPROPERTYSET","IFCELEMENTQUANTITY","setEntities","relationsToProcess","isIFCPickResult","obj","isObject","_IfcEntity","Entity3D","source","Group","Components","SimpleScene","SimpleRenderer","SimpleCamera","SimpleRaycaster","fragID","fragment","selection","ids","bbox","selected","highlight","box","ymin","zmin","ymax","zmax","expressID","properties","objectRawProperties","id","IfcPropertiesUtils","psetPropsIds","psetPropId","psetProperties","qsetQuantityIds","quantityId","key","qsetProperties","value","mesh","itemId","idNum","group","keys","fragKey","idsNum","canvasCoords","options","pickedResult","blockId","itemProperties","FragmentBoundingBox","data","FragmentManager","FragmentClassifier","fragmentIfcLoader","FragmentIfcLoader","buffer","position","coordinationMatrix","fillObject3DUserData","itemID","composites","compositeID","toCompositeID","subFragment","relation","relationID","relatedIDs","relationEntity","groupSystemNames","systems","groups","currentSystemName","systemGroups","filter","found","treeItemName","children","fragmentID","fragmentParent","instanceID","IfcEntity","IfcEntityInspector","EntityInspector","parentGui","target","highlighted","cameraStore","useCameraStore","clippingBoxModule","useModuleStore","moduleId","clipTo","zoomTo","classificationElement","IconList","IconListButton","ListLabelButton","_normalizeClass","_Fragment","item","index","_component_IfcSubtree","datasets","useDatasetStore","isPreloaded","refAndWatch","getClassificationRoot","ifcEntity","getIfcEntity","_renderList","IfcSubtree","pick","loader","attributeExtractor","pickResult","attributesGroups","feature","attributes","ifcProperties","nullValue","IfcCategoryMap","_e","_f","_g","_h","parentName","_i","entityBuilder","cfg","at","getCoordinates","IFCLoader","IfcPropertyView","EntityPanel","map","altitudeRanges","getZoomFromAltitude","altitude","alt","zoom","onMounted","Map","TileLayer","OSM","View","fromLonLat","lastPosition","updateView","latlon","view","collapsed","onUnmounted","OpenLayersMinimap","OpenLayersMinimapComponent","_PlyMesh","colors","face","Color","PlyMesh","PlyEntity","geometry","PLYThreeLoader","material","MeshLambertMaterial","DoubleSide","build","getAttributesFromPlyObject","PLYLoader","hideIfcSpace","evt","PostProcessEntities","processing","PointCloud","PotreeSource","PotreeLoader","TourModule","camera","mainTour","Shepherd","navigatingTour","analyzingTour","buttonsOptions","displayProgress","currentStep","currentStepElement","content","steps","progress","progressbar","loadPanel","panelId","waitSelector","resolve","link","observer","nbEvents","hasExperimentalFeature","markSkiptour","markTour","current","tourName","tour","tourStep"],"mappings":"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"}