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

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 (499) hide show
  1. package/README.md +10 -10
  2. package/dist/assets/piero.css +2 -2
  3. package/dist/index.cjs.js +6 -9
  4. package/dist/index.cjs.js.map +1 -1
  5. package/dist/index.d.ts +1 -1
  6. package/dist/index.es.js +3090 -6878
  7. package/dist/index.es.js.map +1 -1
  8. package/dist/modules.cjs.js +1 -1
  9. package/dist/modules.cjs.js.map +1 -1
  10. package/dist/modules.d.ts +1 -1
  11. package/dist/modules.es.js +1598 -893
  12. package/dist/modules.es.js.map +1 -1
  13. package/dist/{src → packages/piero/src}/App.vue.d.ts +1 -0
  14. package/dist/packages/piero/src/App.vue.d.ts.map +1 -0
  15. package/dist/packages/piero/src/PieroApplication.d.ts +5 -0
  16. package/dist/packages/piero/src/PieroApplication.d.ts.map +1 -0
  17. package/dist/{src/api/AnalysisApi.d.ts → packages/piero/src/api/analysis.d.ts} +5 -3
  18. package/dist/packages/piero/src/api/analysis.d.ts.map +1 -0
  19. package/dist/packages/piero/src/api/bookmarks.d.ts +16 -0
  20. package/dist/packages/piero/src/api/bookmarks.d.ts.map +1 -0
  21. package/dist/{src/api/DatasetApi.d.ts → packages/piero/src/api/dataset.d.ts} +55 -19
  22. package/dist/packages/piero/src/api/dataset.d.ts.map +1 -0
  23. package/dist/packages/piero/src/api/http.d.ts +32 -0
  24. package/dist/packages/piero/src/api/http.d.ts.map +1 -0
  25. package/dist/packages/piero/src/api/index.d.ts +9 -0
  26. package/dist/packages/piero/src/api/index.d.ts.map +1 -0
  27. package/dist/packages/piero/src/api/notifications.d.ts +52 -0
  28. package/dist/packages/piero/src/api/notifications.d.ts.map +1 -0
  29. package/dist/{src/api/SearchApi.d.ts → packages/piero/src/api/search.d.ts} +2 -0
  30. package/dist/packages/piero/src/api/search.d.ts.map +1 -0
  31. package/dist/packages/piero/src/api/view.d.ts +31 -0
  32. package/dist/packages/piero/src/api/view.d.ts.map +1 -0
  33. package/dist/{src/api/WidgetApi.d.ts → packages/piero/src/api/widgets.d.ts} +9 -6
  34. package/dist/packages/piero/src/api/widgets.d.ts.map +1 -0
  35. package/dist/{src → packages/piero/src}/components/AlertToast.vue.d.ts +1 -0
  36. package/dist/packages/piero/src/components/AlertToast.vue.d.ts.map +1 -0
  37. package/dist/{src → packages/piero/src}/components/AttributeGroup.vue.d.ts +1 -0
  38. package/dist/packages/piero/src/components/AttributeGroup.vue.d.ts.map +1 -0
  39. package/dist/{src → packages/piero/src}/components/AttributeItem.vue.d.ts +1 -0
  40. package/dist/packages/piero/src/components/AttributeItem.vue.d.ts.map +1 -0
  41. package/dist/{src → packages/piero/src}/components/AttributePanel.vue.d.ts +1 -0
  42. package/dist/packages/piero/src/components/AttributePanel.vue.d.ts.map +1 -0
  43. package/dist/packages/piero/src/components/CheckboxToggle.vue.d.ts +26 -0
  44. package/dist/packages/piero/src/components/CheckboxToggle.vue.d.ts.map +1 -0
  45. package/dist/{src → packages/piero/src}/components/ColorFragment.vue.d.ts +1 -0
  46. package/dist/packages/piero/src/components/ColorFragment.vue.d.ts.map +1 -0
  47. package/dist/{src → packages/piero/src}/components/Configuration.d.ts +2 -1
  48. package/dist/packages/piero/src/components/Configuration.d.ts.map +1 -0
  49. package/dist/{src → packages/piero/src}/components/CoordinateFragment.vue.d.ts +1 -0
  50. package/dist/packages/piero/src/components/CoordinateFragment.vue.d.ts.map +1 -0
  51. package/dist/{src → packages/piero/src}/components/CoordinateInput.vue.d.ts +1 -0
  52. package/dist/packages/piero/src/components/CoordinateInput.vue.d.ts.map +1 -0
  53. package/dist/{src → packages/piero/src}/components/DropdownView.vue.d.ts +1 -0
  54. package/dist/packages/piero/src/components/DropdownView.vue.d.ts.map +1 -0
  55. package/dist/{src → packages/piero/src}/components/LinkFragment.vue.d.ts +1 -0
  56. package/dist/packages/piero/src/components/LinkFragment.vue.d.ts.map +1 -0
  57. package/dist/{src → packages/piero/src}/components/LoadingScreen.vue.d.ts +1 -0
  58. package/dist/packages/piero/src/components/LoadingScreen.vue.d.ts.map +1 -0
  59. package/dist/{src → packages/piero/src}/components/MainView.vue.d.ts +1 -0
  60. package/dist/packages/piero/src/components/MainView.vue.d.ts.map +1 -0
  61. package/dist/{src → packages/piero/src}/components/ModalOverlay.vue.d.ts +1 -0
  62. package/dist/packages/piero/src/components/ModalOverlay.vue.d.ts.map +1 -0
  63. package/dist/{src → packages/piero/src}/components/NavigationButtons.vue.d.ts +1 -0
  64. package/dist/packages/piero/src/components/NavigationButtons.vue.d.ts.map +1 -0
  65. package/dist/{src → packages/piero/src}/components/PanelContainer.vue.d.ts +1 -0
  66. package/dist/packages/piero/src/components/PanelContainer.vue.d.ts.map +1 -0
  67. package/dist/{src → packages/piero/src}/components/ProgressBar.vue.d.ts +1 -0
  68. package/dist/packages/piero/src/components/ProgressBar.vue.d.ts.map +1 -0
  69. package/dist/{src → packages/piero/src}/components/SearchOverlay.vue.d.ts +2 -1
  70. package/dist/packages/piero/src/components/SearchOverlay.vue.d.ts.map +1 -0
  71. package/dist/{src → packages/piero/src}/components/SpinnerControl.vue.d.ts +1 -0
  72. package/dist/packages/piero/src/components/SpinnerControl.vue.d.ts.map +1 -0
  73. package/dist/{src/components/atoms/ListLabel.vue.d.ts → packages/piero/src/components/StatusBar.vue.d.ts} +5 -1
  74. package/dist/packages/piero/src/components/StatusBar.vue.d.ts.map +1 -0
  75. package/dist/{src → packages/piero/src}/components/SwitchToggle.vue.d.ts +1 -0
  76. package/dist/packages/piero/src/components/SwitchToggle.vue.d.ts.map +1 -0
  77. package/dist/{src → packages/piero/src}/components/VisibilityControl.vue.d.ts +1 -0
  78. package/dist/packages/piero/src/components/VisibilityControl.vue.d.ts.map +1 -0
  79. package/dist/{src → packages/piero/src}/components/atoms/ButtonArea.vue.d.ts +1 -0
  80. package/dist/packages/piero/src/components/atoms/ButtonArea.vue.d.ts.map +1 -0
  81. package/dist/{src → packages/piero/src}/components/atoms/ButtonWithIcon.vue.d.ts +1 -0
  82. package/dist/packages/piero/src/components/atoms/ButtonWithIcon.vue.d.ts.map +1 -0
  83. package/dist/{src/components/atoms/SectionCollapsible.vue.d.ts → packages/piero/src/components/atoms/CompactList.vue.d.ts} +5 -14
  84. package/dist/packages/piero/src/components/atoms/CompactList.vue.d.ts.map +1 -0
  85. package/dist/{src → packages/piero/src}/components/atoms/Icon.vue.d.ts +1 -0
  86. package/dist/packages/piero/src/components/atoms/Icon.vue.d.ts.map +1 -0
  87. package/dist/{src → packages/piero/src}/components/atoms/IconList.vue.d.ts +1 -0
  88. package/dist/packages/piero/src/components/atoms/IconList.vue.d.ts.map +1 -0
  89. package/dist/{src → packages/piero/src}/components/atoms/IconListButton.vue.d.ts +1 -0
  90. package/dist/packages/piero/src/components/atoms/IconListButton.vue.d.ts.map +1 -0
  91. package/dist/{src → packages/piero/src}/components/atoms/ImportButton.vue.d.ts +1 -0
  92. package/dist/packages/piero/src/components/atoms/ImportButton.vue.d.ts.map +1 -0
  93. package/dist/{src → packages/piero/src}/components/atoms/ListLabelButton.vue.d.ts +1 -0
  94. package/dist/packages/piero/src/components/atoms/ListLabelButton.vue.d.ts.map +1 -0
  95. package/dist/packages/piero/src/components/atoms/Slider.vue.d.ts +15 -0
  96. package/dist/packages/piero/src/components/atoms/Slider.vue.d.ts.map +1 -0
  97. package/dist/{src → packages/piero/src}/components/panels/AboutPanel.vue.d.ts +1 -0
  98. package/dist/packages/piero/src/components/panels/AboutPanel.vue.d.ts.map +1 -0
  99. package/dist/packages/piero/src/components/panels/AnalysisPanel.vue.d.ts +3 -0
  100. package/dist/packages/piero/src/components/panels/AnalysisPanel.vue.d.ts.map +1 -0
  101. package/dist/{src → packages/piero/src}/components/panels/AnnotationItem.vue.d.ts +1 -0
  102. package/dist/packages/piero/src/components/panels/AnnotationItem.vue.d.ts.map +1 -0
  103. package/dist/{src → packages/piero/src}/components/panels/AnnotationPanel.vue.d.ts +1 -0
  104. package/dist/packages/piero/src/components/panels/AnnotationPanel.vue.d.ts.map +1 -0
  105. package/dist/{src → packages/piero/src}/components/panels/BookmarkItem.vue.d.ts +3 -2
  106. package/dist/packages/piero/src/components/panels/BookmarkItem.vue.d.ts.map +1 -0
  107. package/dist/{src → packages/piero/src}/components/panels/BookmarkPanel.vue.d.ts +1 -0
  108. package/dist/packages/piero/src/components/panels/BookmarkPanel.vue.d.ts.map +1 -0
  109. package/dist/packages/piero/src/components/panels/DatagroupItem.vue.d.ts +15 -0
  110. package/dist/packages/piero/src/components/panels/DatagroupItem.vue.d.ts.map +1 -0
  111. package/dist/packages/piero/src/components/panels/DatasetItem.vue.d.ts +15 -0
  112. package/dist/packages/piero/src/components/panels/DatasetItem.vue.d.ts.map +1 -0
  113. package/dist/packages/piero/src/components/panels/DatasetOrGroupItem.vue.d.ts +15 -0
  114. package/dist/packages/piero/src/components/panels/DatasetOrGroupItem.vue.d.ts.map +1 -0
  115. package/dist/{src/components/panels/AnalysisPanel.vue.d.ts → packages/piero/src/components/panels/DatasetPanel.vue.d.ts} +1 -0
  116. package/dist/packages/piero/src/components/panels/DatasetPanel.vue.d.ts.map +1 -0
  117. package/dist/{src/components/OpacitySlider.vue.d.ts → packages/piero/src/components/panels/DatasetParameters.vue.d.ts} +6 -5
  118. package/dist/packages/piero/src/components/panels/DatasetParameters.vue.d.ts.map +1 -0
  119. package/dist/{src → packages/piero/src}/components/panels/EmptyIndicator.vue.d.ts +1 -0
  120. package/dist/packages/piero/src/components/panels/EmptyIndicator.vue.d.ts.map +1 -0
  121. package/dist/{src → packages/piero/src}/components/panels/MeasurementItem.vue.d.ts +1 -0
  122. package/dist/packages/piero/src/components/panels/MeasurementItem.vue.d.ts.map +1 -0
  123. package/dist/{src → packages/piero/src}/components/panels/MeasurementPanel.vue.d.ts +1 -0
  124. package/dist/packages/piero/src/components/panels/MeasurementPanel.vue.d.ts.map +1 -0
  125. package/dist/{src → packages/piero/src}/components/panels/ShareBookmarkModal.vue.d.ts +1 -0
  126. package/dist/packages/piero/src/components/panels/ShareBookmarkModal.vue.d.ts.map +1 -0
  127. package/dist/{src → packages/piero/src}/components/panels/analysis/ToolWrapper.vue.d.ts +1 -0
  128. package/dist/packages/piero/src/components/panels/analysis/ToolWrapper.vue.d.ts.map +1 -0
  129. package/dist/{src → packages/piero/src}/components/toolbar/ToolBar.vue.d.ts +1 -0
  130. package/dist/packages/piero/src/components/toolbar/ToolBar.vue.d.ts.map +1 -0
  131. package/dist/{src → packages/piero/src}/components/toolbar/ToolbarButton.vue.d.ts +1 -0
  132. package/dist/packages/piero/src/components/toolbar/ToolbarButton.vue.d.ts.map +1 -0
  133. package/dist/packages/piero/src/configuration/ImageFormat.d.ts +4 -0
  134. package/dist/packages/piero/src/configuration/ImageFormat.d.ts.map +1 -0
  135. package/dist/packages/piero/src/configuration/annotation.d.ts +25 -0
  136. package/dist/packages/piero/src/configuration/annotation.d.ts.map +1 -0
  137. package/dist/packages/piero/src/configuration/basemap.d.ts +7 -0
  138. package/dist/packages/piero/src/configuration/basemap.d.ts.map +1 -0
  139. package/dist/packages/piero/src/configuration/bookmark.d.ts +10 -0
  140. package/dist/packages/piero/src/configuration/bookmark.d.ts.map +1 -0
  141. package/dist/packages/piero/src/configuration/colormap.d.ts +10 -0
  142. package/dist/packages/piero/src/configuration/colormap.d.ts.map +1 -0
  143. package/dist/packages/piero/src/configuration/configuration.d.ts +32 -0
  144. package/dist/packages/piero/src/configuration/configuration.d.ts.map +1 -0
  145. package/dist/packages/piero/src/configuration/configuration.test.d.ts +2 -0
  146. package/dist/packages/piero/src/configuration/configuration.test.d.ts.map +1 -0
  147. package/dist/packages/piero/src/configuration/coordinate.d.ts +23 -0
  148. package/dist/packages/piero/src/configuration/coordinate.d.ts.map +1 -0
  149. package/dist/packages/piero/src/configuration/crs.d.ts +11 -0
  150. package/dist/packages/piero/src/configuration/crs.d.ts.map +1 -0
  151. package/dist/packages/piero/src/configuration/dataset.d.ts +56 -0
  152. package/dist/packages/piero/src/configuration/dataset.d.ts.map +1 -0
  153. package/dist/packages/piero/src/configuration/defaultConfig.d.ts +8 -0
  154. package/dist/packages/piero/src/configuration/defaultConfig.d.ts.map +1 -0
  155. package/dist/packages/piero/src/configuration/extent.d.ts +15 -0
  156. package/dist/packages/piero/src/configuration/extent.d.ts.map +1 -0
  157. package/dist/packages/piero/src/configuration/index.d.ts +18 -0
  158. package/dist/packages/piero/src/configuration/index.d.ts.map +1 -0
  159. package/dist/packages/piero/src/configuration/layer.d.ts +27 -0
  160. package/dist/packages/piero/src/configuration/layer.d.ts.map +1 -0
  161. package/dist/packages/piero/src/configuration/lookAt.d.ts +13 -0
  162. package/dist/packages/piero/src/configuration/lookAt.d.ts.map +1 -0
  163. package/dist/packages/piero/src/configuration/module.d.ts +6 -0
  164. package/dist/packages/piero/src/configuration/module.d.ts.map +1 -0
  165. package/dist/packages/piero/src/configuration/orientation.d.ts +4 -0
  166. package/dist/packages/piero/src/configuration/orientation.d.ts.map +1 -0
  167. package/dist/packages/piero/src/configuration/scene.d.ts +12 -0
  168. package/dist/packages/piero/src/configuration/scene.d.ts.map +1 -0
  169. package/dist/packages/piero/src/configuration/style.d.ts +7 -0
  170. package/dist/packages/piero/src/configuration/style.d.ts.map +1 -0
  171. package/dist/packages/piero/src/configuration/units.d.ts +6 -0
  172. package/dist/packages/piero/src/configuration/units.d.ts.map +1 -0
  173. package/dist/packages/piero/src/configuration/url.d.ts +4 -0
  174. package/dist/packages/piero/src/configuration/url.d.ts.map +1 -0
  175. package/dist/packages/piero/src/configurationLoader.d.ts +7 -0
  176. package/dist/packages/piero/src/configurationLoader.d.ts.map +1 -0
  177. package/dist/{src → packages/piero/src}/constants.d.ts +1 -0
  178. package/dist/packages/piero/src/constants.d.ts.map +1 -0
  179. package/dist/{src → packages/piero/src}/context.d.ts +27 -18
  180. package/dist/packages/piero/src/context.d.ts.map +1 -0
  181. package/dist/packages/piero/src/createPieroApp.d.ts +30 -0
  182. package/dist/packages/piero/src/createPieroApp.d.ts.map +1 -0
  183. package/dist/{src → packages/piero/src}/events.d.ts +3 -1
  184. package/dist/packages/piero/src/events.d.ts.map +1 -0
  185. package/dist/{src → packages/piero/src}/giro3d/CameraControlsInspector.d.ts +1 -0
  186. package/dist/packages/piero/src/giro3d/CameraControlsInspector.d.ts.map +1 -0
  187. package/dist/packages/piero/src/giro3d/DatasetBuilder.d.ts +17 -0
  188. package/dist/packages/piero/src/giro3d/DatasetBuilder.d.ts.map +1 -0
  189. package/dist/{src → packages/piero/src}/giro3d/Measure3D.d.ts +1 -0
  190. package/dist/packages/piero/src/giro3d/Measure3D.d.ts.map +1 -0
  191. package/dist/packages/piero/src/index.d.ts +15 -0
  192. package/dist/packages/piero/src/index.d.ts.map +1 -0
  193. package/dist/{src → packages/piero/src}/loaders/loader.d.ts +3 -9
  194. package/dist/packages/piero/src/loaders/loader.d.ts.map +1 -0
  195. package/dist/packages/piero/src/loaders/loader.test.d.ts +2 -0
  196. package/dist/packages/piero/src/loaders/loader.test.d.ts.map +1 -0
  197. package/dist/{src → packages/piero/src}/loaders/userData.d.ts +1 -0
  198. package/dist/packages/piero/src/loaders/userData.d.ts.map +1 -0
  199. package/dist/{src → packages/piero/src}/module.d.ts +6 -1
  200. package/dist/packages/piero/src/module.d.ts.map +1 -0
  201. package/dist/packages/piero/src/modules/analysis/ClippingBox.d.ts +19 -0
  202. package/dist/packages/piero/src/modules/analysis/ClippingBox.d.ts.map +1 -0
  203. package/dist/packages/piero/src/modules/analysis/CrossSection.d.ts +12 -0
  204. package/dist/packages/piero/src/modules/analysis/CrossSection.d.ts.map +1 -0
  205. package/dist/packages/piero/src/modules/analysis/FloodingPlane.d.ts +12 -0
  206. package/dist/packages/piero/src/modules/analysis/FloodingPlane.d.ts.map +1 -0
  207. package/dist/{src/modules/clippingBoxAnalysis → packages/piero/src/modules/analysis/clippingBox}/ClippingBox.vue.d.ts +1 -0
  208. package/dist/packages/piero/src/modules/analysis/clippingBox/ClippingBox.vue.d.ts.map +1 -0
  209. package/dist/{src/modules/clippingBoxAnalysis → packages/piero/src/modules/analysis/clippingBox}/ClippingBoxManager.d.ts +4 -3
  210. package/dist/packages/piero/src/modules/analysis/clippingBox/ClippingBoxManager.d.ts.map +1 -0
  211. package/dist/packages/piero/src/modules/analysis/clippingBox/store.d.ts +2269 -0
  212. package/dist/packages/piero/src/modules/analysis/clippingBox/store.d.ts.map +1 -0
  213. package/dist/{src/modules/crossSectionAnalysis → packages/piero/src/modules/analysis/crossSection}/CrossSection.vue.d.ts +1 -0
  214. package/dist/packages/piero/src/modules/analysis/crossSection/CrossSection.vue.d.ts.map +1 -0
  215. package/dist/packages/piero/src/modules/analysis/crossSection/CrossSectionHelper.d.ts +5 -0
  216. package/dist/packages/piero/src/modules/analysis/crossSection/CrossSectionHelper.d.ts.map +1 -0
  217. package/dist/{src/modules/crossSectionAnalysis → packages/piero/src/modules/analysis/crossSection}/CrossSectionManager.d.ts +2 -1
  218. package/dist/packages/piero/src/modules/analysis/crossSection/CrossSectionManager.d.ts.map +1 -0
  219. package/dist/packages/piero/src/modules/analysis/crossSection/store.d.ts +543 -0
  220. package/dist/packages/piero/src/modules/analysis/crossSection/store.d.ts.map +1 -0
  221. package/dist/{src/modules/floodingPlaneAnalysis → packages/piero/src/modules/analysis/floodingPlane}/FloodingPlane.vue.d.ts +1 -0
  222. package/dist/packages/piero/src/modules/analysis/floodingPlane/FloodingPlane.vue.d.ts.map +1 -0
  223. package/dist/{src/modules/floodingPlaneAnalysis → packages/piero/src/modules/analysis/floodingPlane}/FloodingPlaneManager.d.ts +2 -1
  224. package/dist/packages/piero/src/modules/analysis/floodingPlane/FloodingPlaneManager.d.ts.map +1 -0
  225. package/dist/{src/modules/floodingPlaneAnalysis → packages/piero/src/modules/analysis/floodingPlane}/FloodingPlaneObject.d.ts +2 -1
  226. package/dist/packages/piero/src/modules/analysis/floodingPlane/FloodingPlaneObject.d.ts.map +1 -0
  227. package/dist/{src/modules/floodingPlaneAnalysis → packages/piero/src/modules/analysis/floodingPlane}/store.d.ts +1 -0
  228. package/dist/packages/piero/src/modules/analysis/floodingPlane/store.d.ts.map +1 -0
  229. package/dist/packages/piero/src/modules/analysis/index.d.ts +9 -0
  230. package/dist/packages/piero/src/modules/analysis/index.d.ts.map +1 -0
  231. package/dist/packages/piero/src/modules/index.d.ts +17 -0
  232. package/dist/packages/piero/src/modules/index.d.ts.map +1 -0
  233. package/dist/packages/piero/src/modules/loaders/BDTopoLoader.d.ts +11 -0
  234. package/dist/packages/piero/src/modules/loaders/BDTopoLoader.d.ts.map +1 -0
  235. package/dist/packages/piero/src/modules/loaders/GPXLoader.d.ts +28 -0
  236. package/dist/packages/piero/src/modules/loaders/GPXLoader.d.ts.map +1 -0
  237. package/dist/packages/piero/src/modules/loaders/GeoJSONLoader.d.ts +28 -0
  238. package/dist/packages/piero/src/modules/loaders/GeoJSONLoader.d.ts.map +1 -0
  239. package/dist/packages/piero/src/modules/loaders/GeoTIFFLoader.d.ts +11 -0
  240. package/dist/packages/piero/src/modules/loaders/GeoTIFFLoader.d.ts.map +1 -0
  241. package/dist/packages/piero/src/modules/loaders/IFCLoader.d.ts +11 -0
  242. package/dist/packages/piero/src/modules/loaders/IFCLoader.d.ts.map +1 -0
  243. package/dist/packages/piero/src/modules/loaders/KMLLoader.d.ts +28 -0
  244. package/dist/packages/piero/src/modules/loaders/KMLLoader.d.ts.map +1 -0
  245. package/dist/packages/piero/src/modules/loaders/LASLoader.d.ts +29 -0
  246. package/dist/packages/piero/src/modules/loaders/LASLoader.d.ts.map +1 -0
  247. package/dist/packages/piero/src/modules/loaders/MapboxLoader.d.ts +11 -0
  248. package/dist/packages/piero/src/modules/loaders/MapboxLoader.d.ts.map +1 -0
  249. package/dist/packages/piero/src/modules/loaders/OSMLoader.d.ts +11 -0
  250. package/dist/packages/piero/src/modules/loaders/OSMLoader.d.ts.map +1 -0
  251. package/dist/packages/piero/src/modules/loaders/PotreeLoader.d.ts +11 -0
  252. package/dist/packages/piero/src/modules/loaders/PotreeLoader.d.ts.map +1 -0
  253. package/dist/packages/piero/src/modules/loaders/TMSLoader.d.ts +27 -0
  254. package/dist/packages/piero/src/modules/loaders/TMSLoader.d.ts.map +1 -0
  255. package/dist/packages/piero/src/modules/loaders/Tiles3DLoader.d.ts +11 -0
  256. package/dist/packages/piero/src/modules/loaders/Tiles3DLoader.d.ts.map +1 -0
  257. package/dist/packages/piero/src/modules/loaders/WMSLoader.d.ts +29 -0
  258. package/dist/packages/piero/src/modules/loaders/WMSLoader.d.ts.map +1 -0
  259. package/dist/packages/piero/src/modules/loaders/WMTSLoader.d.ts +29 -0
  260. package/dist/packages/piero/src/modules/loaders/WMTSLoader.d.ts.map +1 -0
  261. package/dist/{src/giro3d/entities/FeatureCollectionEntity.d.ts → packages/piero/src/modules/loaders/bdtopo/BDTopoEntity.d.ts} +7 -9
  262. package/dist/packages/piero/src/modules/loaders/bdtopo/BDTopoEntity.d.ts.map +1 -0
  263. package/dist/{src/modules → packages/piero/src/modules/loaders}/ifc/IfcEntity.d.ts +6 -3
  264. package/dist/packages/piero/src/modules/loaders/ifc/IfcEntity.d.ts.map +1 -0
  265. package/dist/{src/modules → packages/piero/src/modules/loaders}/ifc/IfcEntityInspector.d.ts +1 -0
  266. package/dist/packages/piero/src/modules/loaders/ifc/IfcEntityInspector.d.ts.map +1 -0
  267. package/dist/{src/modules → packages/piero/src/modules/loaders}/ifc/IfcPropertyView.vue.d.ts +2 -1
  268. package/dist/packages/piero/src/modules/loaders/ifc/IfcPropertyView.vue.d.ts.map +1 -0
  269. package/dist/{src/modules → packages/piero/src/modules/loaders}/ifc/IfcSubtree.vue.d.ts +1 -0
  270. package/dist/packages/piero/src/modules/loaders/ifc/IfcSubtree.vue.d.ts.map +1 -0
  271. package/dist/packages/piero/src/modules/loaders/index.d.ts +20 -0
  272. package/dist/packages/piero/src/modules/loaders/index.d.ts.map +1 -0
  273. package/dist/packages/piero/src/modules/misc/Attribution.d.ts +8 -0
  274. package/dist/packages/piero/src/modules/misc/Attribution.d.ts.map +1 -0
  275. package/dist/packages/piero/src/modules/misc/AttributionWidget.vue.d.ts +4 -0
  276. package/dist/packages/piero/src/modules/misc/AttributionWidget.vue.d.ts.map +1 -0
  277. package/dist/{src/modules → packages/piero/src/modules/misc}/DownloadDataset.d.ts +3 -2
  278. package/dist/packages/piero/src/modules/misc/DownloadDataset.d.ts.map +1 -0
  279. package/dist/packages/piero/src/modules/misc/Graticule.d.ts +8 -0
  280. package/dist/packages/piero/src/modules/misc/Graticule.d.ts.map +1 -0
  281. package/dist/{src/modules → packages/piero/src/modules/misc}/OpenLayersMinimap.d.ts +3 -2
  282. package/dist/packages/piero/src/modules/misc/OpenLayersMinimap.d.ts.map +1 -0
  283. package/dist/{src/modules/minimap → packages/piero/src/modules/misc}/OpenLayersMinimapComponent.vue.d.ts +1 -0
  284. package/dist/packages/piero/src/modules/misc/OpenLayersMinimapComponent.vue.d.ts.map +1 -0
  285. package/dist/{src/modules → packages/piero/src/modules/misc}/PostProcessEntities.d.ts +3 -2
  286. package/dist/packages/piero/src/modules/misc/PostProcessEntities.d.ts.map +1 -0
  287. package/dist/{src/modules → packages/piero/src/modules/misc}/Tour.d.ts +4 -3
  288. package/dist/packages/piero/src/modules/misc/Tour.d.ts.map +1 -0
  289. package/dist/packages/piero/src/modules/misc/index.d.ts +12 -0
  290. package/dist/packages/piero/src/modules/misc/index.d.ts.map +1 -0
  291. package/dist/{src/modules/geocoding → packages/piero/src/modules/search}/CoordinatesSearch.d.ts +2 -1
  292. package/dist/packages/piero/src/modules/search/CoordinatesSearch.d.ts.map +1 -0
  293. package/dist/{src/modules/geocoding → packages/piero/src/modules/search}/FrenchBanGeocoder.d.ts +2 -1
  294. package/dist/packages/piero/src/modules/search/FrenchBanGeocoder.d.ts.map +1 -0
  295. package/dist/packages/piero/src/modules/search/PhotonGeocoder.d.ts +11 -0
  296. package/dist/packages/piero/src/modules/search/PhotonGeocoder.d.ts.map +1 -0
  297. package/dist/packages/piero/src/modules/search/index.d.ts +9 -0
  298. package/dist/packages/piero/src/modules/search/index.d.ts.map +1 -0
  299. package/dist/{src → packages/piero/src}/providers/Alticoding.d.ts +1 -0
  300. package/dist/packages/piero/src/providers/Alticoding.d.ts.map +1 -0
  301. package/dist/{src → packages/piero/src}/providers/IgnProvider.d.ts +1 -0
  302. package/dist/packages/piero/src/providers/IgnProvider.d.ts.map +1 -0
  303. package/dist/{src → packages/piero/src}/services/AnnotationManager.d.ts +9 -2
  304. package/dist/packages/piero/src/services/AnnotationManager.d.ts.map +1 -0
  305. package/dist/{src → packages/piero/src}/services/CameraController.d.ts +2 -1
  306. package/dist/packages/piero/src/services/CameraController.d.ts.map +1 -0
  307. package/dist/{src → packages/piero/src}/services/DatasetManager.d.ts +4 -3
  308. package/dist/packages/piero/src/services/DatasetManager.d.ts.map +1 -0
  309. package/dist/{src → packages/piero/src}/services/Giro3DManager.d.ts +2 -1
  310. package/dist/packages/piero/src/services/Giro3DManager.d.ts.map +1 -0
  311. package/dist/{src → packages/piero/src}/services/Highlighter.d.ts +1 -0
  312. package/dist/packages/piero/src/services/Highlighter.d.ts.map +1 -0
  313. package/dist/packages/piero/src/services/LayerManager.d.ts +24 -0
  314. package/dist/packages/piero/src/services/LayerManager.d.ts.map +1 -0
  315. package/dist/{src → packages/piero/src}/services/MeasureTool.d.ts +2 -1
  316. package/dist/packages/piero/src/services/MeasureTool.d.ts.map +1 -0
  317. package/dist/{src → packages/piero/src}/services/MeasurementManager.d.ts +2 -1
  318. package/dist/packages/piero/src/services/MeasurementManager.d.ts.map +1 -0
  319. package/dist/{src → packages/piero/src}/services/SceneCursorManager.d.ts +1 -0
  320. package/dist/packages/piero/src/services/SceneCursorManager.d.ts.map +1 -0
  321. package/dist/{src/services/Picker.d.ts → packages/piero/src/services/picking.d.ts} +1 -0
  322. package/dist/packages/piero/src/services/picking.d.ts.map +1 -0
  323. package/dist/{src → packages/piero/src}/stores/analysis.d.ts +2 -1
  324. package/dist/packages/piero/src/stores/analysis.d.ts.map +1 -0
  325. package/dist/{src → packages/piero/src}/stores/annotations.d.ts +1 -0
  326. package/dist/packages/piero/src/stores/annotations.d.ts.map +1 -0
  327. package/dist/packages/piero/src/stores/basemap.d.ts +18 -0
  328. package/dist/packages/piero/src/stores/basemap.d.ts.map +1 -0
  329. package/dist/{src → packages/piero/src}/stores/bookmarks.d.ts +2 -1
  330. package/dist/packages/piero/src/stores/bookmarks.d.ts.map +1 -0
  331. package/dist/{src → packages/piero/src}/stores/camera.d.ts +1 -0
  332. package/dist/packages/piero/src/stores/camera.d.ts.map +1 -0
  333. package/dist/{src → packages/piero/src}/stores/datasets.d.ts +27 -16
  334. package/dist/packages/piero/src/stores/datasets.d.ts.map +1 -0
  335. package/dist/{src → packages/piero/src}/stores/giro3d.d.ts +7 -5
  336. package/dist/packages/piero/src/stores/giro3d.d.ts.map +1 -0
  337. package/dist/{src → packages/piero/src}/stores/measurement.d.ts +1 -0
  338. package/dist/packages/piero/src/stores/measurement.d.ts.map +1 -0
  339. package/dist/{src → packages/piero/src}/stores/modules.d.ts +1 -0
  340. package/dist/packages/piero/src/stores/modules.d.ts.map +1 -0
  341. package/dist/packages/piero/src/stores/modules.test.d.ts +2 -0
  342. package/dist/packages/piero/src/stores/modules.test.d.ts.map +1 -0
  343. package/dist/{src → packages/piero/src}/stores/notifications.d.ts +2 -1
  344. package/dist/packages/piero/src/stores/notifications.d.ts.map +1 -0
  345. package/dist/{src → packages/piero/src}/stores/search.d.ts +6 -2
  346. package/dist/packages/piero/src/stores/search.d.ts.map +1 -0
  347. package/dist/{src → packages/piero/src}/stores/widgets.d.ts +2 -1
  348. package/dist/packages/piero/src/stores/widgets.d.ts.map +1 -0
  349. package/dist/{src → packages/piero/src}/types/Annotation.d.ts +5 -2
  350. package/dist/packages/piero/src/types/Annotation.d.ts.map +1 -0
  351. package/dist/{src → packages/piero/src}/types/AnnotationMode.d.ts +1 -0
  352. package/dist/packages/piero/src/types/AnnotationMode.d.ts.map +1 -0
  353. package/dist/{src → packages/piero/src}/types/Bookmark.d.ts +1 -0
  354. package/dist/packages/piero/src/types/Bookmark.d.ts.map +1 -0
  355. package/dist/{src → packages/piero/src}/types/CameraPosition.d.ts +4 -0
  356. package/dist/packages/piero/src/types/CameraPosition.d.ts.map +1 -0
  357. package/dist/packages/piero/src/types/Dataset.d.ts +81 -0
  358. package/dist/packages/piero/src/types/Dataset.d.ts.map +1 -0
  359. package/dist/{src → packages/piero/src}/types/Feature.d.ts +1 -0
  360. package/dist/packages/piero/src/types/Feature.d.ts.map +1 -0
  361. package/dist/{src → packages/piero/src}/types/Measure.d.ts +1 -0
  362. package/dist/packages/piero/src/types/Measure.d.ts.map +1 -0
  363. package/dist/{src → packages/piero/src}/types/MeasurementMode.d.ts +1 -0
  364. package/dist/packages/piero/src/types/MeasurementMode.d.ts.map +1 -0
  365. package/dist/{src → packages/piero/src}/types/Named.d.ts +1 -0
  366. package/dist/packages/piero/src/types/Named.d.ts.map +1 -0
  367. package/dist/{src → packages/piero/src}/types/NavigationMode.d.ts +1 -0
  368. package/dist/packages/piero/src/types/NavigationMode.d.ts.map +1 -0
  369. package/dist/{src → packages/piero/src}/types/OLGeometry.d.ts +1 -0
  370. package/dist/packages/piero/src/types/OLGeometry.d.ts.map +1 -0
  371. package/dist/{src → packages/piero/src}/types/Viewbox.d.ts +1 -0
  372. package/dist/packages/piero/src/types/Viewbox.d.ts.map +1 -0
  373. package/dist/packages/piero/src/types/index.d.ts +1 -0
  374. package/dist/packages/piero/src/types/index.d.ts.map +1 -0
  375. package/dist/{src → packages/piero/src}/types/utilities.d.ts +1 -0
  376. package/dist/packages/piero/src/types/utilities.d.ts.map +1 -0
  377. package/dist/{src → packages/piero/src}/utils/Components.d.ts +1 -0
  378. package/dist/packages/piero/src/utils/Components.d.ts.map +1 -0
  379. package/dist/packages/piero/src/utils/Configuration.d.ts +12 -0
  380. package/dist/packages/piero/src/utils/Configuration.d.ts.map +1 -0
  381. package/dist/{src → packages/piero/src}/utils/Download.d.ts +2 -1
  382. package/dist/packages/piero/src/utils/Download.d.ts.map +1 -0
  383. package/dist/{src → packages/piero/src}/utils/Fetcher.d.ts +2 -20
  384. package/dist/packages/piero/src/utils/Fetcher.d.ts.map +1 -0
  385. package/dist/{src → packages/piero/src}/utils/Measure.d.ts +1 -0
  386. package/dist/packages/piero/src/utils/Measure.d.ts.map +1 -0
  387. package/dist/{src → packages/piero/src}/utils/Projections.d.ts +3 -2
  388. package/dist/packages/piero/src/utils/Projections.d.ts.map +1 -0
  389. package/dist/{src → packages/piero/src}/utils/Types.d.ts +1 -0
  390. package/dist/packages/piero/src/utils/Types.d.ts.map +1 -0
  391. package/dist/{src/utils/OLFeatures.d.ts → packages/piero/src/utils/features.d.ts} +1 -0
  392. package/dist/packages/piero/src/utils/features.d.ts.map +1 -0
  393. package/dist/packages/piero/src/utils/style.d.ts +4 -0
  394. package/dist/packages/piero/src/utils/style.d.ts.map +1 -0
  395. package/dist/userData.cjs.js +6 -0
  396. package/dist/userData.cjs.js.map +1 -0
  397. package/dist/{Components.es.js → userData.es.js} +2283 -3131
  398. package/dist/userData.es.js.map +1 -0
  399. package/package.json +9 -5
  400. package/dist/Components.cjs.js +0 -7
  401. package/dist/Components.cjs.js.map +0 -1
  402. package/dist/Components.es.js.map +0 -1
  403. package/dist/src/api/BookmarkApi.d.ts +0 -6
  404. package/dist/src/api/NotificationApi.d.ts +0 -10
  405. package/dist/src/api/ViewApi.d.ts +0 -10
  406. package/dist/src/api/index.d.ts +0 -5
  407. package/dist/src/components/StatusBar.vue.d.ts +0 -10
  408. package/dist/src/components/atoms/CompactList.vue.d.ts +0 -17
  409. package/dist/src/components/panels/BasemapItem.vue.d.ts +0 -17
  410. package/dist/src/components/panels/DatagroupItem.vue.d.ts +0 -18
  411. package/dist/src/components/panels/DatasetItem.vue.d.ts +0 -18
  412. package/dist/src/components/panels/DatasetOrGroupItem.vue.d.ts +0 -16
  413. package/dist/src/components/panels/DatasetPanel.vue.d.ts +0 -2
  414. package/dist/src/components/panels/OverlayItem.vue.d.ts +0 -19
  415. package/dist/src/config-loader.d.ts +0 -7
  416. package/dist/src/createPieroApp.d.ts +0 -31
  417. package/dist/src/giro3d/EntityBuilder.d.ts +0 -21
  418. package/dist/src/giro3d/Graticule.d.ts +0 -20
  419. package/dist/src/giro3d/Grid.d.ts +0 -11
  420. package/dist/src/giro3d/LayerBuilder.d.ts +0 -46
  421. package/dist/src/giro3d/Plane.d.ts +0 -11
  422. package/dist/src/giro3d/Skybox.d.ts +0 -6
  423. package/dist/src/giro3d/entities/PointCloudEntity.d.ts +0 -45
  424. package/dist/src/giro3d/entities/TiledPointCloudEntity.d.ts +0 -13
  425. package/dist/src/giro3d/entities/Tiles3dEntity.d.ts +0 -11
  426. package/dist/src/giro3d/entities/VectorLabelsEntity.d.ts +0 -48
  427. package/dist/src/giro3d/entities/VectorMeshEntity.d.ts +0 -97
  428. package/dist/src/giro3d/entities/VectorShapeEntity.d.ts +0 -8
  429. package/dist/src/giro3d/entities/flatPointCloud.d.ts +0 -2
  430. package/dist/src/giro3d/entities/tiledIfc.d.ts +0 -2
  431. package/dist/src/giro3d/entities/vector.d.ts +0 -2
  432. package/dist/src/giro3d/sources/GeopackageSource.d.ts +0 -20
  433. package/dist/src/giro3d/sources/ShapefileSource.d.ts +0 -20
  434. package/dist/src/giro3d/sources/mixins.d.ts +0 -60
  435. package/dist/src/index.d.ts +0 -18
  436. package/dist/src/loaders/csv.d.ts +0 -3
  437. package/dist/src/loaders/las.d.ts +0 -3
  438. package/dist/src/loaders/loader.test.d.ts +0 -1
  439. package/dist/src/loaders/vector.d.ts +0 -4
  440. package/dist/src/modules/ClippingBoxAnalysis.d.ts +0 -18
  441. package/dist/src/modules/CrossSectionAnalysis.d.ts +0 -11
  442. package/dist/src/modules/FloodingPlaneAnalysis.d.ts +0 -11
  443. package/dist/src/modules/IFCLoader.d.ts +0 -10
  444. package/dist/src/modules/PLYLoader.d.ts +0 -10
  445. package/dist/src/modules/PotreeLoader.d.ts +0 -10
  446. package/dist/src/modules/clippingBoxAnalysis/store.d.ts +0 -2268
  447. package/dist/src/modules/crossSectionAnalysis/CrossSectionHelper.d.ts +0 -4
  448. package/dist/src/modules/crossSectionAnalysis/store.d.ts +0 -542
  449. package/dist/src/modules/index.d.ts +0 -13
  450. package/dist/src/modules/ply/PlyEntity.d.ts +0 -33
  451. package/dist/src/services/LayerManager.d.ts +0 -37
  452. package/dist/src/stores/layers.d.ts +0 -40
  453. package/dist/src/stores/modules.test.d.ts +0 -1
  454. package/dist/src/types/BaseLayer.d.ts +0 -30
  455. package/dist/src/types/Configuration.d.ts +0 -106
  456. package/dist/src/types/Dataset.d.ts +0 -78
  457. package/dist/src/types/IFCTypes.d.ts +0 -5
  458. package/dist/src/types/LayerObject.d.ts +0 -20
  459. package/dist/src/types/Notification.d.ts +0 -8
  460. package/dist/src/types/Overlay.d.ts +0 -24
  461. package/dist/src/types/VectorStyle.d.ts +0 -31
  462. package/dist/src/types/configuration/analysis.d.ts +0 -26
  463. package/dist/src/types/configuration/bookmark.d.ts +0 -16
  464. package/dist/src/types/configuration/camera.d.ts +0 -19
  465. package/dist/src/types/configuration/color.d.ts +0 -18
  466. package/dist/src/types/configuration/datasets/cityjson.d.ts +0 -9
  467. package/dist/src/types/configuration/datasets/core.d.ts +0 -49
  468. package/dist/src/types/configuration/datasets/featureCollection.d.ts +0 -6
  469. package/dist/src/types/configuration/datasets/ifc.d.ts +0 -10
  470. package/dist/src/types/configuration/datasets/index.d.ts +0 -27
  471. package/dist/src/types/configuration/datasets/layer.d.ts +0 -43
  472. package/dist/src/types/configuration/datasets/ply.d.ts +0 -10
  473. package/dist/src/types/configuration/datasets/pointCloud.d.ts +0 -12
  474. package/dist/src/types/configuration/datasets/potreePointCloud.d.ts +0 -10
  475. package/dist/src/types/configuration/datasets/tiledIfc.d.ts +0 -9
  476. package/dist/src/types/configuration/datasets/tiledPointCloud.d.ts +0 -9
  477. package/dist/src/types/configuration/datasets/vector.d.ts +0 -34
  478. package/dist/src/types/configuration/features.d.ts +0 -2
  479. package/dist/src/types/configuration/geographic.d.ts +0 -51
  480. package/dist/src/types/configuration/layers/core.d.ts +0 -50
  481. package/dist/src/types/configuration/layers/index.d.ts +0 -51
  482. package/dist/src/types/configuration/sources/bingMaps.d.ts +0 -5
  483. package/dist/src/types/configuration/sources/core/baseConfig.d.ts +0 -70
  484. package/dist/src/types/configuration/sources/core/tiled.d.ts +0 -19
  485. package/dist/src/types/configuration/sources/core/vector.d.ts +0 -13
  486. package/dist/src/types/configuration/sources/core/vectorTile.d.ts +0 -8
  487. package/dist/src/types/configuration/sources/customVector.d.ts +0 -7
  488. package/dist/src/types/configuration/sources/customVectorTile.d.ts +0 -8
  489. package/dist/src/types/configuration/sources/geojson.d.ts +0 -5
  490. package/dist/src/types/configuration/sources/geotiff.d.ts +0 -8
  491. package/dist/src/types/configuration/sources/gpx.d.ts +0 -5
  492. package/dist/src/types/configuration/sources/kml.d.ts +0 -5
  493. package/dist/src/types/configuration/sources/mvt.d.ts +0 -10
  494. package/dist/src/types/configuration/sources/osm.d.ts +0 -5
  495. package/dist/src/types/configuration/sources/stadiaMaps.d.ts +0 -5
  496. package/dist/src/types/configuration/sources/wms.d.ts +0 -15
  497. package/dist/src/types/configuration/sources/wmts.d.ts +0 -15
  498. package/dist/src/types/configuration/sources/xyz.d.ts +0 -9
  499. package/dist/src/utils/Configuration.d.ts +0 -15
@@ -1 +1 @@
1
- {"version":3,"file":"modules.cjs.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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"}
1
+ {"version":3,"file":"modules.cjs.js","sources":["../src/components/CoordinateInput.vue","../src/modules/analysis/crossSection/store.ts","../src/modules/analysis/crossSection/CrossSection.vue","../src/modules/analysis/crossSection/CrossSectionHelper.ts","../src/modules/analysis/crossSection/CrossSectionManager.ts","../src/modules/analysis/CrossSection.ts","../src/modules/analysis/floodingPlane/store.ts","../src/modules/analysis/floodingPlane/FloodingPlane.vue","../src/modules/analysis/floodingPlane/FloodingPlaneObject.ts","../src/modules/analysis/floodingPlane/FloodingPlaneManager.ts","../src/modules/analysis/FloodingPlane.ts","../src/modules/analysis/index.ts","../src/modules/loaders/bdtopo/BDTopoEntity.ts","../src/modules/loaders/BDTopoLoader.ts","../src/utils/style.ts","../src/modules/loaders/GeoJSONLoader.ts","../src/modules/loaders/GeoTIFFLoader.ts","../src/modules/loaders/GPXLoader.ts","../src/modules/loaders/ifc/IfcEntity.ts","../src/modules/loaders/ifc/IfcEntityInspector.ts","../src/modules/loaders/ifc/IfcSubtree.vue","../src/modules/loaders/ifc/IfcPropertyView.vue","../src/modules/loaders/IFCLoader.ts","../src/modules/loaders/KMLLoader.ts","../src/modules/loaders/LASLoader.ts","../src/modules/loaders/MapboxLoader.ts","../src/modules/loaders/OSMLoader.ts","../src/modules/loaders/PotreeLoader.ts","../src/modules/loaders/Tiles3DLoader.ts","../src/modules/loaders/TMSLoader.ts","../src/modules/loaders/WMSLoader.ts","../src/configuration/ImageFormat.ts","../src/modules/loaders/WMTSLoader.ts","../src/modules/loaders/index.ts","../src/modules/misc/AttributionWidget.vue","../src/modules/misc/Attribution.ts","../src/modules/misc/DownloadDataset.ts","../src/modules/misc/Graticule.ts","../src/modules/misc/OpenLayersMinimapComponent.vue","../src/modules/misc/OpenLayersMinimap.ts","../src/modules/misc/PostProcessEntities.ts","../src/modules/misc/Tour.ts","../src/modules/misc/index.ts","../src/modules/search/CoordinatesSearch.ts","../src/modules/search/FrenchBanGeocoder.ts","../src/modules/search/PhotonGeocoder.ts","../src/modules/search/index.ts","../src/modules/index.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/picking';\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 = this._instance.referenceCrs;\n\n this._store.setCursorManager(context.view.getSceneCursorManager());\n this._store.setInstance(context.view.getInstance());\n const pivot = this._store.center;\n const pivotLocal = new Coordinates(defaultCrs, pivot.x, pivot.y, 0);\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 CrossSectionComponent from './crossSection/CrossSection.vue';\nimport CrossSectionManager from './crossSection/CrossSectionManager';\n\n/**\n * An analysis module that displays a cross section.\n */\nexport default class CrossSection implements Module {\n public readonly id = 'builtin-analysis-cross-section';\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: CrossSectionComponent,\n icon: 'bi-circle-half',\n name: 'Cross section',\n });\n\n this._manager = new CrossSectionManager(context);\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=\"Show flooding plane\"\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 FloodingPlaneComponent from './floodingPlane/FloodingPlane.vue';\nimport FloodingPlaneManager from './floodingPlane/FloodingPlaneManager';\n\n/**\n * An analysis module that displays a flooding plane with variable altitude.\n */\nexport default class FloodingPlane implements Module {\n public readonly id = 'builtin-analysis-flooding-plane';\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: FloodingPlaneComponent,\n icon: 'bi-layers-half',\n name: 'Flooding plane',\n });\n\n this._manager = new FloodingPlaneManager(context);\n }\n}\n","/**\n * Modules for the analysis panel.\n *\n * @packageDocumentation\n */\n\nimport ClippingBox from './ClippingBox';\nimport CrossSection from './CrossSection';\nimport FloodingPlane from './FloodingPlane';\n\n/**\n * Contains all analysis modules.\n */\nconst all = [ClippingBox, CrossSection, FloodingPlane];\n\nexport { all, ClippingBox, CrossSection, FloodingPlane };\n","import type {\n FeatureElevationCallback,\n FeatureExtrusionOffsetCallback,\n FeatureStyle,\n FeatureStyleCallback,\n FillStyle,\n} from '@giro3d/giro3d/core/FeatureTypes';\nimport type Feature from 'ol/Feature';\n\nimport Extent from '@giro3d/giro3d/core/geographic/Extent';\nimport FeatureCollection from '@giro3d/giro3d/entities/FeatureCollection';\nimport { GeoJSON } from 'ol/format';\nimport { tile } from 'ol/loadingstrategy.js';\nimport VectorSource from 'ol/source/Vector';\nimport { createXYZ } from 'ol/tilegrid.js';\nimport { Color } from 'three';\n\nimport type { CrsName } from '@/configuration/crs';\n\nimport { fillObject3DUserData } from '@/loaders/userData';\n\n/** Options for the Giro3D FeatureCollection */\ntype FeatureCollectionConstructorOptions = ConstructorParameters<typeof FeatureCollection>[0];\n\n/** Options for {@link BDTopoEntity} */\nexport interface BDTopoEntityOptions\n extends Partial<\n Pick<FeatureCollectionConstructorOptions, 'extent' | 'ignoreZ' | 'maxLevel' | 'minLevel'>\n > {\n /**\n * Set the elevation of the features received from the source.\n * It can be a constant for every feature, or a callback.\n * The callback version is particularly useful to derive the elevation\n * from the properties of the feature.\n * Requires {@link _ignoreZ} to be `false`.\n */\n elevation?: FeatureElevationCallback | number;\n\n /**\n * If set, this will cause 2D features to be extruded of the corresponding amount.\n * If a single value is given, it will be used for all the vertices of every feature.\n * If an array is given, each extruded vertex will use the corresponding value.\n * If a callback is given, it allows to extrude each feature individually.\n */\n extrusionOffset?: FeatureExtrusionOffsetCallback | number;\n featureProjection: CrsName;\n /**\n * An style or a callback returning a style to style the individual features.\n * If an object is used, the informations it contains will be used to style every\n * feature the same way. If a function is provided, it will be called with the feature.\n * This allows to individually style each feature.\n */\n style?: FeatureStyle | FeatureStyleCallback;\n}\n\n/**\n * Entity for displaying 3D buildings\n */\nexport class BDTopoEntity extends FeatureCollection {\n public constructor(options: BDTopoEntityOptions) {\n const crs = options.featureProjection;\n\n const filename = 'BDTOPO_V3:batiment';\n\n const vectorSource = new VectorSource({\n format: new GeoJSON(),\n strategy: tile(createXYZ({ tileSize: 512 })),\n url: function url(bbox): string {\n return `${\n 'https://data.geopf.fr/wfs/ows' +\n '?SERVICE=WFS' +\n '&VERSION=2.0.0' +\n '&request=GetFeature' +\n `&typename=${filename}` +\n '&outputFormat=application/json' +\n `&SRSNAME=${crs}` +\n '&startIndex=0' +\n '&bbox='\n }${bbox.join(',')},${crs}`;\n },\n });\n const extent =\n options.extent ??\n new Extent('EPSG:2154', -111629.52, 1275028.84, 5976033.79, 7230161.64); // Cover France by default\n\n const extrusionOffset =\n options.extrusionOffset ??\n ((feature: Feature): number => {\n const properties = feature.getProperties();\n const buildingHeight = properties['hauteur'];\n const extrusionOffset = -buildingHeight;\n\n if (Number.isNaN(extrusionOffset)) {\n return 0;\n }\n return extrusionOffset;\n });\n\n const style =\n options.style ??\n ((feature: Feature): FeatureStyle => {\n const properties = feature.getProperties();\n let fillColor = '#FFFFFF';\n\n switch (properties.usage_1) {\n case 'Agricole':\n fillColor = '#96ff0d';\n break;\n case 'Commercial et services':\n fillColor = '#d8ffd4';\n break;\n case 'Industriel':\n fillColor = '#f0bb41';\n break;\n case 'Religieux':\n fillColor = '#41b5f0';\n break;\n case 'Résidentiel':\n fillColor = '#cec8be';\n break;\n case 'Sportif':\n fillColor = '#ff0d45';\n break;\n }\n\n const fill: FillStyle = {\n color: new Color(fillColor),\n shading: true,\n };\n\n return {\n fill: fill,\n stroke: {\n color: 'black',\n lineWidth: 2,\n },\n };\n });\n\n const parentOptions: ConstructorParameters<typeof FeatureCollection>[0] = {\n extent,\n extrusionOffset,\n maxLevel: options.maxLevel ?? 11,\n minLevel: options.minLevel ?? 11,\n source: vectorSource,\n style,\n };\n\n super(parentOptions);\n this.name = filename;\n fillObject3DUserData(this, { filename });\n }\n}\n","import type { DatasetBuilder } from '@/api/dataset';\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport { BDTopoEntity } from './bdtopo/BDTopoEntity';\n\nconst builder: DatasetBuilder = context => {\n const entity = new BDTopoEntity({\n featureProjection: context.instance.referenceCrs,\n });\n\n return Promise.resolve({\n entities: [entity],\n });\n};\n\n/**\n * Loads building meshes from the French BD TOPO provided by IGN.\n */\nexport default class BDTopoLoader implements Module {\n public readonly id = 'builtin-loader-bdtopo';\n public readonly name = 'BD TOPO®';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.datasets.registerDatasetType('bdtopo', {\n builder,\n icon: 'bi-buildings',\n name: 'BD TOPO®',\n });\n }\n}\n","import type { FlatStyle, Rule } from 'ol/style/flat';\nimport type { StyleLike } from 'ol/style/Style';\n\nimport { flatStylesToStyleFunction, rulesToStyleFunction } from 'ol/render/canvas/style';\n\nimport type { OpenLayersFlatStyleLike } from '@/configuration/style';\n\nexport function toOpenLayersStyle(input: OpenLayersFlatStyleLike): StyleLike {\n if (!Array.isArray(input)) {\n return flatStylesToStyleFunction([input]);\n } else if (input.length === 0) {\n return [];\n } else if ('style' in input[0]) {\n // It's a rule array\n return rulesToStyleFunction(input as Rule[]);\n } else {\n return flatStylesToStyleFunction(input as FlatStyle[]);\n }\n}\n","import type z from 'zod';\n\nimport ColorLayer from '@giro3d/giro3d/core/layer/ColorLayer';\nimport VectorSource from '@giro3d/giro3d/sources/VectorSource';\nimport GeoJSON from 'ol/format/GeoJSON';\n\nimport type { DatasetBuilder, DatasetBuildResult, LoadDatasetFromFile } from '@/api/dataset';\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport * as config from '@/configuration';\nimport { CrsName } from '@/configuration/crs';\nimport { OpenLayersFlatStyleLike } from '@/configuration/style';\nimport { toOpenLayersStyle } from '@/utils/style';\n\nconst DATASET_TYPE = 'geojson';\n\nexport const GeoJSONDataset = config.layer.Layer.extend({\n projection: CrsName.optional().default('EPSG:4326'),\n style: OpenLayersFlatStyleLike.optional(),\n url: config.url.Url,\n});\nexport type GeoJSONDataset = z.infer<typeof GeoJSONDataset>;\n\nconst builder: DatasetBuilder = context => {\n const dataset = GeoJSONDataset.parse(context.dataset);\n\n const layer = new ColorLayer({\n resolutionFactor: dataset.resolution,\n source: new VectorSource({\n data: {\n format: new GeoJSON(),\n url: dataset.url,\n },\n dataProjection: dataset.projection,\n style:\n dataset.style != null\n ? toOpenLayersStyle(dataset.style)\n : config.style.defaultVectorStyle,\n }),\n });\n\n const result: DatasetBuildResult = {\n layers: [layer],\n };\n\n return Promise.resolve(result);\n};\n\nconst loader: LoadDatasetFromFile = context => {\n const result = {\n layerType: 'color',\n name: context.filename,\n projection: 'EPSG:4326',\n resolution: 1,\n type: 'geojson',\n url: typeof context.file === 'string' ? context.file : URL.createObjectURL(context.file),\n visible: true,\n } satisfies GeoJSONDataset;\n\n return Promise.resolve(result);\n};\n\n/**\n * Add support for GeoJSON files.\n */\nexport default class GeoJSONLoader implements Module {\n public readonly id = 'builtin-loader-geojson';\n public readonly name = 'GeoJSON';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.datasets.registerDatasetType(DATASET_TYPE, {\n builder,\n fileExtensions: ['geojson', 'geo.json'],\n icon: 'fg-polygon-pt',\n loader,\n name: 'GeoJSON',\n });\n }\n}\n","import type z from 'zod';\n\nimport ColorLayer from '@giro3d/giro3d/core/layer/ColorLayer';\nimport ElevationLayer from '@giro3d/giro3d/core/layer/ElevationLayer';\nimport GeoTIFFSource from '@giro3d/giro3d/sources/GeoTIFFSource';\n\nimport type { DatasetBuilder } from '@/api/dataset';\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport * as config from '@/configuration';\nimport { CrsName } from '@/configuration/crs';\n\nconst GeoTIFFDataset = config.layer.Layer.extend({\n projection: CrsName,\n url: config.url.Url,\n});\ntype GeoTIFFDataset = z.infer<typeof GeoTIFFDataset>;\n\nconst builder: DatasetBuilder = context => {\n const dataset = GeoTIFFDataset.parse(context.dataset);\n\n const source = new GeoTIFFSource({\n crs: dataset.projection,\n url: dataset.url,\n });\n\n let layer: ColorLayer | ElevationLayer;\n\n switch (dataset.layerType) {\n case 'color':\n layer = new ColorLayer({ source });\n break;\n case 'elevation':\n layer = new ElevationLayer({ source });\n break;\n default:\n throw new Error(`unsupported layer type: ${dataset.layerType}`);\n }\n\n return Promise.resolve({\n layers: [layer],\n });\n};\n\n/**\n * Add support for GeoTIFF files.\n */\nexport default class GeoTIFFLoader implements Module {\n public readonly id = 'builtin-loader-geotiff';\n public readonly name = 'GeoTIFF';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.datasets.registerDatasetType('geotiff', {\n builder,\n icon: 'fg-layer-alt',\n name: 'GeoTIFF',\n });\n }\n}\n","import type z from 'zod';\n\nimport ColorLayer from '@giro3d/giro3d/core/layer/ColorLayer';\nimport VectorSource from '@giro3d/giro3d/sources/VectorSource';\nimport GPX from 'ol/format/GPX';\nimport { Fill, Stroke, Style } from 'ol/style';\n\nimport type { DatasetBuilder, DatasetBuildResult } from '@/api/dataset';\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport * as config from '@/configuration';\nimport { CrsName } from '@/configuration/crs';\nimport { OpenLayersFlatStyleLike } from '@/configuration/style';\nimport { toOpenLayersStyle } from '@/utils/style';\n\nconst DATASET_TYPE = 'gpx';\n\nexport const GPXDataset = config.layer.Layer.extend({\n projection: CrsName.optional().default('EPSG:3857'),\n style: OpenLayersFlatStyleLike.optional(),\n url: config.url.Url,\n});\nexport type GPXDataset = z.infer<typeof GPXDataset>;\n\nconst DEFAULT_STYLE: Style = new Style({\n fill: new Fill({\n color: 'rgba(72,147,131, 0.4)',\n }),\n stroke: new Stroke({\n color: 'rgba(81, 227, 196, 1)',\n width: 2,\n }),\n});\n\nconst builder: DatasetBuilder = context => {\n const dataset = GPXDataset.parse(context.dataset);\n\n const layer = new ColorLayer({\n resolutionFactor: dataset.resolution,\n source: new VectorSource({\n data: {\n format: new GPX(),\n url: dataset.url,\n },\n dataProjection: dataset.projection,\n style: dataset.style != null ? toOpenLayersStyle(dataset.style) : DEFAULT_STYLE,\n }),\n });\n\n const result: DatasetBuildResult = {\n layers: [layer],\n };\n\n return Promise.resolve(result);\n};\n\n/**\n * Add support for GPX files.\n */\nexport default class GPXLoader implements Module {\n public readonly id = 'builtin-loader-gpx';\n public readonly name = 'GPX';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.datasets.registerDatasetType(DATASET_TYPE, {\n builder,\n icon: 'fg-polygon-pt',\n name: 'GPX',\n });\n }\n}\n","import type Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport 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\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 {\n at: Coordinates | undefined;\n /** Name of the IFC */\n name: string;\n url: 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 ClippingBoxAnalysis from '@/modules/analysis/ClippingBox';\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 { moduleId } from '@/modules/analysis/ClippingBox';\n import { useCameraStore } from '@/stores/camera';\n import { useModuleStore } from '@/stores/modules';\n\n import type IfcEntity from './IfcEntity';\n import type { ClassificationItem } from './IfcEntity';\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 { useDatasetStore } from '@/stores/datasets';\n import { type Dataset, DatasetState } from '@/types/Dataset';\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 state = refAndWatch(props.dataset, 'state');\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 entities = datasets.getEntities(props.dataset);\n\n if (entities == null) {\n return null;\n }\n\n return entities[0] as IfcEntity;\n }\n</script>\n\n<template>\n <div v-if=\"state === DatasetState.Loaded\">\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';\nimport type z from 'zod';\n\nimport EntityPanel from '@giro3d/giro3d/gui/EntityPanel';\nimport { IfcCategoryMap } from 'openbim-components';\n\nimport type { DatasetBuilder, LoadDatasetFromFile } from '@/api/dataset';\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\nimport type { HighlightFn } from '@/services/Highlighter';\nimport type { AttributeExtractorFn } from '@/services/picking';\nimport type { Attribute, AttributesGroups } from '@/types/Feature';\n\nimport * as config from '@/configuration';\nimport { Coordinate } from '@/configuration/coordinate';\nimport { toGiro3DCoordinates } 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 IFCDataset = config.dataset.Dataset.extend({\n position: Coordinate.optional(),\n url: config.url.Url,\n});\ntype IFCDataset = z.infer<typeof IFCDataset>;\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 = context => {\n const result = {\n name: context.filename,\n type: 'ifc',\n url: typeof context.file === 'string' ? context.file : URL.createObjectURL(context.file),\n visible: true,\n } satisfies IFCDataset;\n\n return Promise.resolve(result);\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 builder: DatasetBuilder = context => {\n const { dataset, instance } = context;\n const ifcDataset = IFCDataset.parse(dataset);\n\n const at = ifcDataset.position\n ? toGiro3DCoordinates(ifcDataset.position, instance.referenceCrs).as(instance.referenceCrs)\n : undefined;\n\n const entity = new IfcEntity({\n at,\n name: dataset.name,\n url: ifcDataset.url,\n });\n\n return Promise.resolve({\n entities: [entity],\n });\n};\n\n/**\n * Add support for IFC (Industry Foundation Classes) files.\n */\nexport default class IFCLoader implements Module {\n public readonly id = 'builtin-loader-ifc';\n public readonly name = 'IFC';\n\n public async initialize(context: PieroContext): Promise<void> {\n context.datasets.registerDatasetType('ifc', {\n attributeExtractor,\n builder,\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 type z from 'zod';\n\nimport ColorLayer from '@giro3d/giro3d/core/layer/ColorLayer';\nimport VectorSource from '@giro3d/giro3d/sources/VectorSource';\nimport KML from 'ol/format/KML';\n\nimport type { DatasetBuilder, DatasetBuildResult, LoadDatasetFromFile } from '@/api/dataset';\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport * as config from '@/configuration';\nimport { CrsName } from '@/configuration/crs';\nimport { OpenLayersFlatStyleLike } from '@/configuration/style';\nimport { toOpenLayersStyle } from '@/utils/style';\n\nconst DATASET_TYPE = 'kml';\n\nexport const KMLDataset = config.layer.Layer.extend({\n projection: CrsName.optional().default('EPSG:4326'),\n style: OpenLayersFlatStyleLike.optional(),\n url: config.url.Url,\n});\nexport type KMLDataset = z.infer<typeof KMLDataset>;\n\nconst builder: DatasetBuilder = context => {\n const dataset = KMLDataset.parse(context.dataset);\n\n const layer = new ColorLayer({\n resolutionFactor: dataset.resolution,\n source: new VectorSource({\n data: {\n format: new KML({\n extractStyles: dataset.style == null,\n }),\n url: dataset.url,\n },\n dataProjection: dataset.projection,\n style:\n dataset.style != null\n ? toOpenLayersStyle(dataset.style)\n : config.style.defaultVectorStyle,\n }),\n });\n\n const result: DatasetBuildResult = {\n layers: [layer],\n };\n\n return Promise.resolve(result);\n};\n\nconst loader: LoadDatasetFromFile = context => {\n const result = {\n layerType: 'color',\n name: context.filename,\n projection: 'EPSG:4326',\n resolution: 1,\n type: 'kml',\n url: typeof context.file === 'string' ? context.file : URL.createObjectURL(context.file),\n visible: true,\n } satisfies KMLDataset;\n\n return Promise.resolve(result);\n};\n\n/**\n * Add support for KML (Keyhole Markup Language) files.\n */\nexport default class KMLLoader implements Module {\n public readonly id = 'builtin-loader-kml';\n public readonly name = 'KML';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.datasets.registerDatasetType(DATASET_TYPE, {\n builder,\n fileExtensions: ['kml'],\n icon: 'fg-polygon-pt',\n loader,\n name: 'KML',\n });\n }\n}\n","import PointCloud from '@giro3d/giro3d/entities/PointCloud';\nimport COPCSource from '@giro3d/giro3d/sources/COPCSource';\nimport LASSource from '@giro3d/giro3d/sources/LASSource';\nimport z from 'zod';\n\nimport type { DatasetBuilder, LoadDatasetFromFile } from '@/api/dataset';\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport * as config from '@/configuration';\nimport { ColorMap } from '@/configuration/colormap';\nimport { toGiro3DColorMap } from '@/utils/Configuration';\n\nconst Style = z.object({\n colorMap: ColorMap.default({ max: 100, min: 0, ramp: 'Greys' }),\n});\n\nexport const LASDataset = config.dataset.Dataset.extend({\n attribute: z.string().optional(),\n style: Style.optional(),\n url: config.url.Url,\n});\nexport type LASDataset = z.infer<typeof LASDataset>;\n\nconst lasBuilder: DatasetBuilder = context => {\n const dataset = LASDataset.parse(context.dataset);\n\n const entity = new PointCloud({\n source: new LASSource({\n url: dataset.url,\n }),\n });\n\n return Promise.resolve({\n entities: [entity],\n });\n};\n\nconst copcBuilder: DatasetBuilder = context => {\n const dataset = LASDataset.parse(context.dataset);\n\n const entity = new PointCloud({\n source: new COPCSource({\n url: dataset.url,\n }),\n });\n\n const activeAttribute = dataset.attribute;\n entity.addEventListener('initialized', () => {\n if (activeAttribute != null) {\n entity.setColoringMode('attribute');\n entity.setActiveAttribute(activeAttribute);\n }\n if (dataset.style?.colorMap != null) {\n entity.colorMap = toGiro3DColorMap(dataset.style.colorMap);\n }\n });\n\n return Promise.resolve({\n entities: [entity],\n });\n};\n\nconst loader: LoadDatasetFromFile = context => {\n const result: LASDataset = {\n name: context.filename,\n // TODO we currently cannot stream a COPC file from a file, it causes an error during decoding\n // (something like \"Error: Invalid EVLR header length (must be 60)\"),\n // so we have to use the less performant non-streamable LAS format for now.\n type: 'las',\n url: typeof context.file === 'string' ? context.file : URL.createObjectURL(context.file),\n visible: true,\n };\n\n return Promise.resolve(result);\n};\n\n/**\n * Add suport for LAS files, including COPC (Cloud-Optimized point cloud) files.\n */\nexport default class LASLoader implements Module {\n public readonly id = 'builtin-loader-las';\n public readonly name: string = 'LAS';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.datasets.registerDatasetType('las', {\n builder: lasBuilder,\n fileExtensions: ['laz', 'las'],\n icon: 'fg-multipoint',\n loader,\n name: 'LAS',\n });\n\n context.datasets.registerDatasetType('copc', {\n builder: copcBuilder,\n fileExtensions: ['copc.laz'],\n icon: 'fg-multipoint',\n loader,\n name: 'Cloud-Optimized Point Cloud (COPC)',\n });\n }\n}\n","import type { LayerOptions } from '@giro3d/giro3d/core/layer/Layer';\nimport type ImageFormat from '@giro3d/giro3d/formats/ImageFormat';\n\nimport ColorLayer from '@giro3d/giro3d/core/layer/ColorLayer';\nimport ElevationLayer from '@giro3d/giro3d/core/layer/ElevationLayer';\nimport MapboxTerrainFormat from '@giro3d/giro3d/formats/MapboxTerrainFormat';\nimport TiledImageSource from '@giro3d/giro3d/sources/TiledImageSource';\nimport { XYZ } from 'ol/source';\nimport z from 'zod';\n\nimport type { DatasetBuilder } from '@/api/dataset';\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport * as config from '@/configuration';\nimport { toGiro3DExtent } from '@/utils/Configuration';\n\nconst MapboxTileset = z.union([\n z.literal('mapbox.mapbox-terrain-dem-v1'),\n z.literal('mapbox.terrain-rgb'),\n z.literal('mapbox.satellite'),\n]);\ntype MapboxTileset = z.infer<typeof MapboxTileset>;\n\nconst MapboxLayer = config.layer.Layer.extend({\n tileset: MapboxTileset,\n token: z.string().nonempty(),\n});\ntype MapboxLayer = z.infer<typeof MapboxLayer>;\n\nconst imageFormats: Record<MapboxTileset, string> = {\n 'mapbox.mapbox-terrain-dem-v1': 'pngraw',\n 'mapbox.satellite': 'jpeg',\n 'mapbox.terrain-rgb': 'pngraw',\n};\n\nconst API_URL = 'https://api.mapbox.com/v4';\n\nconst builder: DatasetBuilder = context => {\n const dataset = MapboxLayer.parse(context.dataset);\n\n const format = imageFormats[dataset.tileset];\n\n let decoder: ImageFormat | undefined = undefined;\n\n switch (dataset.tileset) {\n case 'mapbox.mapbox-terrain-dem-v1':\n case 'mapbox.terrain-rgb':\n decoder = new MapboxTerrainFormat();\n break;\n }\n\n let layer: ColorLayer | ElevationLayer;\n\n const source = new TiledImageSource({\n format: decoder,\n source: new XYZ({\n url: `${API_URL}/${dataset.tileset}/{z}/{x}/{y}.${format}?access_token=${dataset.token}`,\n }),\n });\n\n const baseOptions: LayerOptions = {\n extent:\n dataset.extent != null\n ? toGiro3DExtent(dataset.extent, context.instance.referenceCrs)\n : undefined,\n resolutionFactor: dataset.resolution,\n source,\n };\n\n switch (dataset.layerType) {\n case 'color':\n layer = new ColorLayer(baseOptions);\n break;\n case 'elevation':\n layer = new ElevationLayer(baseOptions);\n break;\n }\n\n return Promise.resolve({\n layers: [layer],\n });\n};\n\n/**\n * Add support for Mapbox tilesets.\n */\nexport default class MapboxLoader implements Module {\n public readonly id: string = 'builtin-loader-mapbox';\n public readonly name = 'Mapbox';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.datasets.registerDatasetType('mapbox', {\n builder,\n icon: 'fg-layer-alt',\n name: 'Mapbox',\n });\n }\n}\n","import ColorLayer from '@giro3d/giro3d/core/layer/ColorLayer';\nimport TiledImageSource from '@giro3d/giro3d/sources/TiledImageSource';\nimport { OSM } from 'ol/source';\n\nimport type { DatasetBuilder, DatasetBuildResult } from '@/api/dataset';\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nconst builder: DatasetBuilder = () => {\n const layer = new ColorLayer({\n source: new TiledImageSource({\n source: new OSM(),\n }),\n });\n\n const result: DatasetBuildResult = {\n layers: [layer],\n };\n\n return Promise.resolve(result);\n};\n\n/**\n * Add support for the OpenStreetMap basemap.\n */\nexport default class OSMLoader implements Module {\n public readonly id = 'builtin-loader-osm';\n public readonly name = 'OSM basemap';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.datasets.registerDatasetType('osm', {\n builder,\n icon: 'fg-layer-alt',\n name: 'OpenStreetMap',\n });\n }\n}\n","import type z from 'zod';\n\nimport PointCloud from '@giro3d/giro3d/entities/PointCloud';\nimport PotreeSource from '@giro3d/giro3d/sources/PotreeSource';\n\nimport type { DatasetBuilder } from '@/api/dataset';\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport * as config from '@/configuration';\nimport { fillObject3DUserData } from '@/loaders/userData';\n\nconst PotreeDataset = config.dataset.Dataset.extend({\n url: config.url.Url,\n});\ntype PotreeDataset = z.infer<typeof PotreeDataset>;\n\nconst builder: DatasetBuilder = context => {\n const dataset = PotreeDataset.parse(context.dataset);\n\n const entity = new PointCloud({\n source: new PotreeSource({ url: `${dataset.url}` }),\n });\n\n fillObject3DUserData(entity, {\n filename: dataset.url,\n });\n\n return Promise.resolve({\n entities: [entity],\n });\n};\n\n/**\n * Add support for [Potree](https://potree.github.io/) datasets.\n */\nexport default class PotreeLoader implements Module {\n public readonly id = 'builtin-loader-potree';\n public readonly name = 'Potree';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.datasets.registerDatasetType('potree', {\n builder,\n icon: 'fg-multipoint',\n name: 'Potree Point Cloud',\n });\n }\n}\n","import type z from 'zod';\n\nimport Tiles3D from '@giro3d/giro3d/entities/Tiles3D';\n\nimport type { DatasetBuilder } from '@/api/dataset';\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport * as config from '@/configuration';\n\nconst Tiles3DDataset = config.dataset.Dataset.extend({\n url: config.url.Url,\n});\ntype Tiles3DDataset = z.infer<typeof Tiles3DDataset>;\n\nconst builder: DatasetBuilder = context => {\n const dataset = Tiles3DDataset.parse(context.dataset);\n\n const entity = new Tiles3D({\n url: dataset.url,\n });\n\n return Promise.resolve({\n entities: [entity],\n });\n};\n\n/**\n * Add support for the [3D Tiles](https://www.ogc.org/standards/3dtiles/) tilesets.\n */\nexport default class Tiles3DLoader implements Module {\n public readonly id = 'builtin-loader-3dtiles';\n public readonly name = '3D Tiles';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.datasets.registerDatasetType('3dtiles', {\n builder,\n icon: 'fg-3dtiles-file',\n name: '3D Tiles',\n });\n }\n}\n","import ColorLayer from '@giro3d/giro3d/core/layer/ColorLayer';\nimport TiledImageSource from '@giro3d/giro3d/sources/TiledImageSource';\nimport { XYZ } from 'ol/source';\nimport z from 'zod';\n\nimport type { DatasetBuilder, DatasetBuildResult } from '@/api/dataset';\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport * as config from '@/configuration';\nimport { CrsName } from '@/configuration/crs';\nimport { toGiro3DExtent } from '@/utils/Configuration';\n\nconst DATASET_TYPE = 'tms';\n\nexport const TMSDataset = config.layer.Layer.extend(\n z.object({\n projection: CrsName.optional().default('EPSG:3857'),\n url: config.url.Url,\n }).shape,\n);\nexport type TMSDataset = z.infer<typeof TMSDataset>;\n\nconst builder: DatasetBuilder = context => {\n const dataset = TMSDataset.parse(context.dataset);\n const layer = new ColorLayer({\n extent: dataset.extent\n ? toGiro3DExtent(dataset.extent, context.instance.referenceCrs).as(\n context.instance.referenceCrs,\n )\n : undefined,\n source: new TiledImageSource({\n source: new XYZ({\n projection: dataset.projection ?? 'EPSG:3857',\n url: dataset.url,\n }),\n }),\n });\n\n const result: DatasetBuildResult = {\n layers: [layer],\n };\n\n return Promise.resolve(result);\n};\n\n/**\n * Add support for TMS (Tile Map Service) tilesets.\n */\nexport default class TMSLoader implements Module {\n public readonly id = 'builtin-loader-tms';\n public readonly name = 'TMS';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.datasets.registerDatasetType(DATASET_TYPE, {\n builder,\n icon: 'fg-layer-alt',\n name: 'TMS',\n });\n }\n}\n","import ColorLayer from '@giro3d/giro3d/core/layer/ColorLayer';\nimport WmsSource from '@giro3d/giro3d/sources/WmsSource';\nimport z from 'zod';\n\nimport type { DatasetBuilder, DatasetBuildResult } from '@/api/dataset';\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport * as config from '@/configuration';\nimport { CrsName } from '@/configuration/crs';\n\nconst DATASET_TYPE = 'wms';\n\nexport const WMSDataset = config.layer.Layer.extend({\n format: z.string().nonempty().optional().default('image/jpeg'),\n layer: z.union([z.array(z.string().nonempty()), z.string().nonempty()]),\n projection: CrsName.optional().default('EPSG:3857'),\n url: config.url.Url,\n});\nexport type WMSDataset = z.infer<typeof WMSDataset>;\n\nconst builder: DatasetBuilder = context => {\n const dataset = WMSDataset.parse(context.dataset);\n\n const layer = new ColorLayer({\n resolutionFactor: dataset.resolution,\n source: new WmsSource({\n imageFormat: dataset.format,\n layer: Array.isArray(dataset.layer) ? dataset.layer : [dataset.layer],\n projection: dataset.projection ?? 'EPSG:3857',\n url: dataset.url,\n }),\n });\n\n const result: DatasetBuildResult = {\n layers: [layer],\n };\n\n return Promise.resolve(result);\n};\n\n/**\n * Add support for WMS (Web Map Service) layers.\n */\nexport default class WMSLoader implements Module {\n public readonly id = 'builtin-loader-wms';\n public readonly name = 'WMS';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.datasets.registerDatasetType(DATASET_TYPE, {\n builder: builder,\n icon: 'fg-layer-alt',\n name: 'WMS',\n });\n }\n}\n","import z from 'zod';\n\nexport const ImageFormat = z.string().nonempty();\nexport type ImageFormat = z.infer<typeof ImageFormat>;\nz.globalRegistry.add(ImageFormat, { id: 'ImageFormat' });\n","import type { LayerOptions } from '@giro3d/giro3d/core/layer/Layer';\nimport type Giro3DImageFormat from '@giro3d/giro3d/formats/ImageFormat';\n\nimport ColorLayer from '@giro3d/giro3d/core/layer/ColorLayer';\nimport ElevationLayer from '@giro3d/giro3d/core/layer/ElevationLayer';\nimport BilFormat from '@giro3d/giro3d/formats/BilFormat';\nimport WmtsSource from '@giro3d/giro3d/sources/WmtsSource';\nimport z from 'zod';\n\nimport type { DatasetBuilder, DatasetBuildResult } from '@/api/dataset';\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport * as config from '@/configuration';\nimport { CrsName } from '@/configuration/crs';\nimport { ImageFormat } from '@/configuration/ImageFormat';\nimport { toGiro3DExtent } from '@/utils/Configuration';\n\nconst DATASET_TYPE = 'wmts';\n\nexport const WMTSDataset = config.layer.Layer.extend({\n format: ImageFormat.optional().default('image/jpeg'),\n layer: z.string().nonempty().nonoptional(),\n projection: CrsName.optional().default('EPSG:3857'),\n url: config.url.Url,\n});\n\nfunction getDecoder(format: string): Giro3DImageFormat | undefined {\n if (format === 'image/x-bil;bits=32') {\n return new BilFormat();\n }\n return undefined;\n}\n\nexport type WMTSDataset = z.infer<typeof WMTSDataset>;\n\nconst builder: DatasetBuilder = async context => {\n const dataset = WMTSDataset.parse(context.dataset);\n\n const source = await WmtsSource.fromCapabilities(dataset.url, {\n format: getDecoder(dataset.format),\n imageFormat: dataset.format,\n layer: dataset.layer,\n noDataValue: dataset.nodata,\n });\n\n const options: LayerOptions = {\n extent:\n dataset.extent != null\n ? toGiro3DExtent(dataset.extent, context.instance.referenceCrs).as(\n context.instance.referenceCrs,\n )\n : undefined,\n noDataOptions:\n dataset.nodata != null\n ? {\n replaceNoData: true,\n }\n : undefined,\n resolutionFactor: dataset.resolution,\n source,\n };\n\n let layer: ColorLayer | ElevationLayer;\n\n // TODO mask layer ?\n switch (dataset.layerType) {\n case 'color':\n layer = new ColorLayer(options);\n break;\n case 'elevation':\n layer = new ElevationLayer(options);\n break;\n default:\n throw new Error(`unsupported layer type: ${dataset.layerType}`);\n }\n\n const result: DatasetBuildResult = {\n layers: [layer],\n };\n\n return Promise.resolve(result);\n};\n\n/**\n * Add support for WMTS (Web Map Tile Service) layers.\n */\nexport default class WMTSLoader implements Module {\n public readonly id = 'builtin-loader-wmts';\n public readonly name = 'WMTS';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.datasets.registerDatasetType(DATASET_TYPE, {\n builder,\n icon: 'fg-layer-alt',\n name: 'WMTS',\n });\n }\n}\n","/**\n * Modules that can load datasets.\n *\n * @packageDocumentation\n */\n\nimport BDTopoLoader from './BDTopoLoader';\nimport GeoJSONLoader from './GeoJSONLoader';\nimport GeoTIFFLoader from './GeoTIFFLoader';\nimport GPXLoader from './GPXLoader';\nimport IFCLoader from './IFCLoader';\nimport KMLLoader from './KMLLoader';\nimport LASLoader from './LASLoader';\nimport MapboxLoader from './MapboxLoader';\nimport OSMLoader from './OSMLoader';\nimport PotreeLoader from './PotreeLoader';\nimport Tiles3DLoader from './Tiles3DLoader';\nimport TMSLoader from './TMSLoader';\nimport WMSLoader from './WMSLoader';\nimport WMTSLoader from './WMTSLoader';\n\n/**\n * Contains all loader modules.\n */\nconst all = [\n GeoJSONLoader,\n GeoTIFFLoader,\n GPXLoader,\n IFCLoader,\n KMLLoader,\n LASLoader,\n OSMLoader,\n Tiles3DLoader,\n TMSLoader,\n WMSLoader,\n WMTSLoader,\n MapboxLoader,\n PotreeLoader,\n BDTopoLoader,\n];\n\nexport {\n all,\n BDTopoLoader,\n GeoJSONLoader,\n GeoTIFFLoader,\n GPXLoader,\n IFCLoader,\n KMLLoader,\n LASLoader,\n MapboxLoader,\n OSMLoader,\n PotreeLoader,\n Tiles3DLoader,\n TMSLoader,\n WMSLoader,\n WMTSLoader,\n};\n","<script setup lang=\"ts\">\n import { computed, ref } from 'vue';\n\n import type { WidgetProps } from '@/api/widgets';\n\n import ButtonWithIcon from '@/components/atoms/ButtonWithIcon.vue';\n import { useDatasetStore } from '@/stores/datasets';\n import { Datagroup, type Dataset, type DatasetOrGroup } from '@/types/Dataset';\n import { nonNull } from '@/utils/Types';\n\n // Even though we are not using them, it\n // is to conform to the expected widget interface.\n defineProps<WidgetProps>();\n\n const store = useDatasetStore();\n\n const attributions = computed(() => getAttributions(store.getVisibleDatasets()));\n\n function getAttributions(datasets: DatasetOrGroup[]): string[] {\n const attributions = datasets\n .filter(ds => ds.visible && !Datagroup.isGroup(ds) && ds.config.attribution != null)\n .map(ds => nonNull((ds as Dataset).config.attribution));\n\n const unique = new Set(attributions);\n\n return [...unique];\n }\n\n const showAttributions = ref(false);\n</script>\n\n<template>\n <div class=\"area\">\n <ButtonWithIcon\n title=\"Show attributions and copyrights\"\n icon=\"bi-info-lg\"\n class=\"btn-light button border\"\n @click=\"() => (showAttributions = !showAttributions)\"\n />\n\n <div v-if=\"showAttributions && attributions.length > 0\" class=\"list rounded text-muted\">\n <span v-bind:key=\"attribution\" v-for=\"attribution in attributions\">{{\n attribution\n }}</span>\n </div>\n </div>\n</template>\n\n<style scoped>\n .area {\n display: flex;\n position: absolute;\n bottom: 0;\n left: 0;\n margin: 5pt;\n width: auto;\n }\n\n .button {\n width: 20pt;\n height: 20pt;\n padding: 0;\n }\n\n .list {\n font-size: small;\n display: flex;\n background-color: rgba(255, 255, 255, 0.8);\n width: auto;\n padding: 3pt;\n padding-left: 5pt;\n margin-left: 4pt;\n height: auto;\n }\n\n span::after {\n content: ', ';\n margin-right: 2pt;\n }\n\n span:last-child::after {\n content: '';\n }\n</style>\n","import type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport AttributionWidget from './AttributionWidget.vue';\n\nexport default class Attribution implements Module {\n public readonly id = 'builtin-attribution';\n public readonly name = 'Attribution';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.widgets.addWidget({\n component: AttributionWidget,\n id: 'attribution',\n });\n }\n}\n","import z from 'zod';\n\nimport 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 try {\n z.url().parse(dataset.config.url);\n return dataset.config.url;\n } catch {\n return undefined;\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.push({\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.push({\n level: 'error',\n text: message,\n title: dataset.name,\n });\n });\n }\n}\n","import type Instance from '@giro3d/giro3d/core/Instance';\nimport type Map from '@giro3d/giro3d/entities/Map';\n\nimport { MathUtils, type Vector3 } from 'three';\n\nimport type { DatasetBuilder } from '@/api/dataset';\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nlet visible = false;\nlet opacity = 1;\n\nfunction getThickness(altitude: number): number {\n return MathUtils.clamp(altitude / 400, 1, +Infinity);\n}\n\nconst steps: { altitude: number; step: number }[] = [\n { altitude: 1000, step: 100 },\n { altitude: 2500, step: 200 },\n { altitude: 5000, step: 500 },\n { altitude: 20000, step: 1000 },\n { altitude: 50000, step: 2000 },\n { altitude: 100000, step: 10000 },\n { altitude: 200000, step: 20000 },\n { altitude: 400000, step: 40000 },\n { altitude: 250_000, step: 25_000 },\n { altitude: 500_000, step: 50_000 },\n { altitude: 1_000_000, step: 100_000 },\n { altitude: 2_000_000, step: 250_000 },\n { altitude: 5_000_000, step: 500_000 },\n { altitude: 10_000_000, step: 1_000_000 },\n { altitude: 30_000_000, step: 2_000_000 },\n { altitude: +Infinity, step: 4_000_000 },\n];\n\nfunction updateGraticule(\n map: Map,\n opacity: number,\n cameraPosition: Vector3,\n instance: Instance,\n): void {\n let shouldNotify = false;\n\n function updateIfDifferent<T, K extends keyof T, V extends T[K]>(\n target: T,\n key: K,\n value: V,\n ): void {\n if (target[key] !== value) {\n shouldNotify = true;\n target[key] = value;\n }\n }\n\n updateIfDifferent(map.graticule, 'enabled', visible);\n\n const z = cameraPosition.z;\n\n updateIfDifferent(map.graticule, 'thickness', getThickness(z));\n updateIfDifferent(map.graticule, 'opacity', opacity);\n\n for (const step of steps) {\n if (z <= step.altitude) {\n updateIfDifferent(map.graticule, 'xStep', step.step);\n updateIfDifferent(map.graticule, 'yStep', step.step);\n\n break;\n }\n }\n\n if (shouldNotify) {\n instance.notifyChange(map);\n }\n}\n\nconst builder: (pieroContext: PieroContext) => DatasetBuilder = pieroContext => {\n return context => {\n const instance = context.instance;\n const view = instance.view;\n visible = true;\n opacity = 1;\n\n const cameraPosition = view.camera.position.clone();\n const cameraRotation = view.camera.rotation.clone();\n\n const update = (): void => {\n const basemap = pieroContext.view.getBasemap();\n\n if (\n basemap.graticule.opacity !== opacity ||\n basemap.graticule.enabled !== visible ||\n !cameraPosition.equals(view.camera.position) ||\n !cameraRotation.equals(view.camera.rotation)\n ) {\n cameraPosition.copy(view.camera.position);\n cameraRotation.copy(view.camera.rotation);\n\n updateGraticule(basemap, opacity, cameraPosition, instance);\n }\n };\n\n pieroContext.events.addEventListener('dataset-opacity-changed', e => {\n const type = e.value.config.type;\n if (type === 'graticule') {\n opacity = e.value.opacity;\n update();\n }\n });\n\n pieroContext.events.addEventListener('dataset-visibility-changed', e => {\n const type = e.value.config.type;\n if (type === 'graticule') {\n visible = e.value.visible;\n update();\n }\n });\n\n instance.addEventListener('after-camera-update', () => {\n update();\n });\n\n update();\n\n return Promise.resolve({});\n };\n};\n\nexport default class Graticule implements Module {\n public readonly id = 'builtin-graticule';\n public readonly name = 'Graticule';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.datasets.registerDatasetType('graticule', {\n builder: builder(context),\n icon: 'fg-grid',\n name: 'Graticule',\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 [1_600_000, 3],\n [3_000_000, 1],\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 const layer = new TileLayer({\n source: new OSM(),\n });\n\n map.value = new Map({\n controls: [],\n layers: [layer],\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 let interval: NodeJS.Timeout | undefined = undefined;\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 let collapsed = false;\n\n const updateViewAfterDelay = (): void => {\n clearTimeout(interval);\n if (!collapsed) {\n interval = setTimeout(updateView, 200);\n }\n };\n\n props.context.events.addEventListener('updated', updateViewAfterDelay);\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\">\n <div class=\"crosshair position-absolute top-50 start-50 translate-middle\">\n <i class=\"bi bi-crosshair\"></i>\n </div>\n </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: 5px;\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 .crosshair {\n z-index: 999;\n opacity: 50%;\n }\n\n .minimap:hover {\n outline-color: #40ae80;\n outline-width: 3px;\n outline-style: solid;\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 './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 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 Shepherd from 'shepherd.js';\n\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\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 Tour 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 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 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","/**\n * Miscellaneous modules.\n *\n * @packageDocumentation\n */\n\nimport Attribution from './Attribution';\nimport DownloadDataset from './DownloadDataset';\nimport Graticule from './Graticule';\nimport OpenLayersMinimap from './OpenLayersMinimap';\nimport PostProcessEntities from './PostProcessEntities';\nimport Tour from './Tour';\n\n/**\n * Contains all miscellaneous modules.\n */\nconst all = [Attribution, DownloadDataset, Graticule, OpenLayersMinimap, PostProcessEntities, Tour];\n\nexport {\n all,\n Attribution,\n DownloadDataset,\n Graticule,\n OpenLayersMinimap,\n PostProcessEntities,\n Tour,\n};\n","import Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\n\nimport type { LocationSearchResult, SearchProvider, SearchResult } from '@/api/search';\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-search-coordinates';\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 { LocationSearchResult, SearchProvider } from '@/api/search';\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-search-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 { FeatureCollection, Point } from 'geojson';\n\nimport Coordinates from '@giro3d/giro3d/core/geographic/Coordinates';\nimport { HttpError } from '@giro3d/giro3d/utils/Fetcher';\n\nimport type { LocationSearchResult, SearchProvider } from '@/api/search';\nimport type { PieroContext } from '@/context';\nimport type { Module } from '@/module';\n\nimport Fetcher from '@/utils/Fetcher';\n\nconst validationRegex = /[a-z]{3}/;\n\ninterface PhotonProperties {\n city?: string;\n country?: string;\n countrycode?: string;\n county?: string;\n district?: string;\n housenumber?: string;\n label?: string;\n locality?: string;\n name?: string;\n osm_id: number;\n osm_key?: string;\n osm_type?: string;\n osm_value?: string;\n postcode?: string;\n state?: string;\n street?: string;\n type?: string;\n}\n\nclass PhotonSearchProvider implements SearchProvider<LocationSearchResult> {\n public readonly name = 'OpenStreetMap Photon';\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://photon.komoot.io/api/?q=${query}`,\n );\n\n const result: LocationSearchResult[] = data.features.map(f => {\n const props = f.properties as PhotonProperties;\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: formatLabel(props),\n provider: this,\n } satisfies LocationSearchResult;\n });\n\n return result;\n } catch (e) {\n if (e instanceof HttpError) {\n return [];\n }\n throw e;\n }\n }\n}\n\nfunction formatLabel(properties: PhotonProperties): string {\n if (properties.label != null) {\n return properties.label;\n }\n\n const items: string[] = [];\n\n if (properties.housenumber != null) {\n items.push(properties.housenumber);\n }\n\n if (properties.street != null) {\n items.push(properties.street);\n }\n\n if (properties.city != null) {\n items.push(properties.city);\n }\n\n if (properties.country != null) {\n items.push(properties.country);\n }\n\n if (properties.postcode != null) {\n items.push(properties.postcode);\n }\n\n return items.join(', ');\n}\n\n/**\n * Provides geocoding capabilities from the Photon geocoder.\n */\nexport default class PhotonGeocoder implements Module {\n public readonly id = 'builtin-search-photon';\n public readonly name = 'OpenStreetMap Photon';\n\n public initialize(context: PieroContext): Promise<void> | void {\n context.search.registerProvider(new PhotonSearchProvider());\n }\n}\n","/**\n * Search-related modules.\n *\n * @packageDocumentation\n */\n\nimport CoordinatesSearch from './CoordinatesSearch';\nimport FrenchBanGeocoder from './FrenchBanGeocoder';\nimport PhotonGeocoder from './PhotonGeocoder';\n\n/**\n * Contains all search-related modules.\n */\nconst all = [CoordinatesSearch, FrenchBanGeocoder, PhotonGeocoder];\n\nexport { all, CoordinatesSearch, FrenchBanGeocoder, PhotonGeocoder };\n","/**\n * Built-in modules\n *\n * These are the modules available when installing the `@giro3d/piero` package.\n *\n * @packageDocumentation\n */\n\nimport * as analysis from './analysis';\nimport * as loaders from './loaders';\nimport * as misc from './misc';\nimport * as search from './search';\n\n/**\n * Contains all the built-in modules.\n */\nconst all = [...analysis.all, ...loaders.all, ...misc.all, ...search.all];\n\nexport { all, analysis, loaders, misc, search };\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","pivot","pivotLocal","after","name","show","clippingPlanes","radians","MathUtils","cos","sin","normal","distance","Plane","entity","isEntity3D","CrossSection","CrossSectionComponent","useFloodingPlaneStore","height","getHeight","setHeight","_hoisted_4","FloodingPlaneObject","width","FloodingPlaneManager","extent","dims","FloodingPlane","FloodingPlaneComponent","all","ClippingBox","BDTopoEntity","FeatureCollection","options","crs","filename","vectorSource","VectorSource","GeoJSON","tile","createXYZ","bbox","Extent","extrusionOffset","feature","style","properties","fillColor","Color","parentOptions","fillObject3DUserData","builder","BDTopoLoader","toOpenLayersStyle","input","rulesToStyleFunction","flatStylesToStyleFunction","DATASET_TYPE","GeoJSONDataset","config.layer.Layer","CrsName","OpenLayersFlatStyleLike","config.url.Url","dataset","result","ColorLayer","config.style.defaultVectorStyle","loader","GeoJSONLoader","GeoTIFFDataset","source","GeoTIFFSource","layer","ElevationLayer","GeoTIFFLoader","GPXDataset","DEFAULT_STYLE","Style","Fill","Stroke","GPX","GPXLoader","tempMatrix","Matrix4","materials","IFCRELDEFINESBYPROPERTIES","IFCRELDEFINESBYTYPE","IFCRELASSOCIATESMATERIAL","IFCRELCONTAINEDINSPATIALSTRUCTURE","IFCRELASSOCIATESCLASSIFICATION","IFCRELASSIGNSTOGROUP","IFCPROPERTYSET","IFCELEMENTQUANTITY","setEntities","relationsToProcess","isIFCPickResult","obj","isObject","_IfcEntity","Entity3D","Group","Components","SimpleScene","SimpleRenderer","SimpleCamera","SimpleRaycaster","fragID","fragment","selection","ids","fragments","selected","highlight","box","ymin","zmin","ymax","zmax","expressID","objectRawProperties","id","IfcPropertiesUtils","psetPropsIds","psetPropId","psetProperties","qsetQuantityIds","quantityId","key","qsetProperties","value","mesh","itemId","idNum","group","keys","i","fragKey","idsNum","canvasCoords","pickedResult","blockId","itemProperties","FragmentBoundingBox","data","Fetcher","FragmentManager","FragmentClassifier","fragmentIfcLoader","FragmentIfcLoader","buffer","position","coordinationMatrix","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","IconList","IconListButton","ListLabelButton","_normalizeClass","_Fragment","item","index","_component_IfcSubtree","datasets","useDatasetStore","state","refAndWatch","getClassificationRoot","ifcEntity","getIfcEntity","entities","DatasetState","_renderList","IfcSubtree","IFCDataset","config.dataset.Dataset","Coordinate","pick","attributeExtractor","pickResult","attributesGroups","attributes","ifcProperties","nullValue","IfcCategoryMap","_e","_f","_g","_h","parentName","_i","ifcDataset","at","toGiro3DCoordinates","IFCLoader","IfcPropertyView","EntityPanel","KMLDataset","KML","KMLLoader","ColorMap","LASDataset","lasBuilder","PointCloud","LASSource","copcBuilder","COPCSource","activeAttribute","toGiro3DColorMap","LASLoader","MapboxTileset","MapboxLayer","imageFormats","API_URL","format","decoder","MapboxTerrainFormat","TiledImageSource","XYZ","baseOptions","toGiro3DExtent","MapboxLoader","OSM","OSMLoader","PotreeDataset","PotreeSource","PotreeLoader","Tiles3DDataset","Tiles3D","Tiles3DLoader","TMSDataset","TMSLoader","WMSDataset","WmsSource","WMSLoader","ImageFormat","WMTSDataset","getDecoder","BilFormat","WmtsSource","WMTSLoader","attributions","computed","getAttributions","ds","Datagroup","showAttributions","attribution","Attribution","AttributionWidget","getUrl","predicate","DownloadDataset","uri","res","blob","Download","message","visible","opacity","getThickness","altitude","steps","updateGraticule","map","cameraPosition","shouldNotify","updateIfDifferent","step","pieroContext","view","cameraRotation","update","basemap","Graticule","altitudeRanges","getZoomFromAltitude","alt","zoom","onMounted","TileLayer","Map","View","fromLonLat","lastPosition","interval","updateView","latlon","collapsed","updateViewAfterDelay","onUnmounted","OpenLayersMinimap","OpenLayersMinimapComponent","hideIfcSpace","evt","PostProcessEntities","processing","Tour","camera","mainTour","Shepherd","navigatingTour","analyzingTour","buttonsOptions","displayProgress","currentStep","currentStepElement","content","progress","progressbar","loadPanel","panelId","waitSelector","resolve","link","observer","nbEvents","markSkiptour","url","markTour","current","tourName","tour","tourStep","latLonDd","CoordinatesSearchProvider","query","results","lat","lon","CoordinatesSearch","validationRegex","BanSearchProvider","f","point","alticode","r","HttpError","coordinates","c","FrenchBanGeocoder","PhotonSearchProvider","formatLabel","items","PhotonGeocoder","analysis.all","loaders.all","misc.all","search.all"],"mappings":"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"}