@collabdt/core 0.0.51 → 0.0.54

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 (1000) hide show
  1. package/NOTICE +1021 -0
  2. package/README.md +32 -4
  3. package/dist/core/components/AppSidebarContent.d.ts.map +1 -1
  4. package/dist/core/components/AppSidebarContent.js.map +1 -1
  5. package/dist/core/components/ConfirmDialog.d.ts.map +1 -1
  6. package/dist/core/components/ConfirmDialog.js.map +1 -1
  7. package/dist/core/components/DataTableSkeleton.d.ts.map +1 -1
  8. package/dist/core/components/DataTableSkeleton.js.map +1 -1
  9. package/dist/core/components/LanguageSwitch.d.ts.map +1 -1
  10. package/dist/core/components/LanguageSwitch.js.map +1 -1
  11. package/dist/core/components/Logo.d.ts.map +1 -1
  12. package/dist/core/components/Logo.js.map +1 -1
  13. package/dist/core/components/Toolbar.d.ts.map +1 -1
  14. package/dist/core/components/Toolbar.js.map +1 -1
  15. package/dist/core/components/ToolbarBody.d.ts.map +1 -1
  16. package/dist/core/components/ToolbarBody.js.map +1 -1
  17. package/dist/core/components/ToolbarSubmenu.d.ts.map +1 -1
  18. package/dist/core/components/ToolbarSubmenu.js.map +1 -1
  19. package/dist/core/components/TopNavigationBar.d.ts.map +1 -1
  20. package/dist/core/components/TopNavigationBar.js.map +1 -1
  21. package/dist/core/components/authentication/AuthPage.d.ts.map +1 -1
  22. package/dist/core/components/authentication/AuthPage.js.map +1 -1
  23. package/dist/core/components/authentication/ForgotPassword.d.ts.map +1 -1
  24. package/dist/core/components/authentication/ForgotPassword.js.map +1 -1
  25. package/dist/core/components/authentication/PasswordError.d.ts.map +1 -1
  26. package/dist/core/components/authentication/PasswordError.js.map +1 -1
  27. package/dist/core/components/authentication/Signin.d.ts.map +1 -1
  28. package/dist/core/components/authentication/Signin.js.map +1 -1
  29. package/dist/core/components/authentication/SigninEmail.d.ts.map +1 -1
  30. package/dist/core/components/authentication/SigninEmail.js.map +1 -1
  31. package/dist/core/components/authentication/Signup.d.ts.map +1 -1
  32. package/dist/core/components/authentication/Signup.js.map +1 -1
  33. package/dist/core/components/authentication/VerifyEmail.d.ts.map +1 -1
  34. package/dist/core/components/authentication/VerifyEmail.js.map +1 -1
  35. package/dist/core/components/authentication/index.d.ts.map +1 -1
  36. package/dist/core/components/authentication/index.js.map +1 -1
  37. package/dist/core/components/index.d.ts.map +1 -1
  38. package/dist/core/components/index.js.map +1 -1
  39. package/dist/core/components/instance-not-found/index.d.ts.map +1 -1
  40. package/dist/core/components/instance-not-found/index.js.map +1 -1
  41. package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.d.ts.map +1 -1
  42. package/dist/core/components/instance-not-found/src/OrganizationNotFoundSection.js.map +1 -1
  43. package/dist/core/components/organizationConfig/index.d.ts.map +1 -1
  44. package/dist/core/components/organizationConfig/index.js.map +1 -1
  45. package/dist/core/components/organizationConfig/src/organizationConfigContent.d.ts.map +1 -1
  46. package/dist/core/components/organizationConfig/src/organizationConfigContent.js.map +1 -1
  47. package/dist/core/components/settings/index.d.ts.map +1 -1
  48. package/dist/core/components/settings/index.js.map +1 -1
  49. package/dist/core/components/settings/src/AccountSettingsPanel.d.ts.map +1 -1
  50. package/dist/core/components/settings/src/AccountSettingsPanel.js.map +1 -1
  51. package/dist/core/components/settings/src/ChangePassword.d.ts.map +1 -1
  52. package/dist/core/components/settings/src/ChangePassword.js.map +1 -1
  53. package/dist/core/components/settings/src/OrganizationSettingsPanel.d.ts.map +1 -1
  54. package/dist/core/components/settings/src/OrganizationSettingsPanel.js.map +1 -1
  55. package/dist/core/components/settings/src/OrganizationSkeleton.d.ts.map +1 -1
  56. package/dist/core/components/settings/src/OrganizationSkeleton.js.map +1 -1
  57. package/dist/core/components/settings/src/SettingsContent.d.ts.map +1 -1
  58. package/dist/core/components/settings/src/SettingsContent.js.map +1 -1
  59. package/dist/core/components/settings/src/SettingsHeader.d.ts.map +1 -1
  60. package/dist/core/components/settings/src/SettingsHeader.js.map +1 -1
  61. package/dist/core/components/settings/src/SettingsSidebar.d.ts.map +1 -1
  62. package/dist/core/components/settings/src/SettingsSidebar.js.map +1 -1
  63. package/dist/core/components/settings/src/SettingsSkeleton.d.ts.map +1 -1
  64. package/dist/core/components/settings/src/SettingsSkeleton.js.map +1 -1
  65. package/dist/core/components/settings/src/UsersSettingsPanel.d.ts.map +1 -1
  66. package/dist/core/components/settings/src/UsersSettingsPanel.js.map +1 -1
  67. package/dist/core/components/settings/src/types.d.ts.map +1 -1
  68. package/dist/core/components/ui/Accordion.d.ts.map +1 -1
  69. package/dist/core/components/ui/Accordion.js.map +1 -1
  70. package/dist/core/components/ui/AddItemDialog.d.ts.map +1 -1
  71. package/dist/core/components/ui/AddItemDialog.js.map +1 -1
  72. package/dist/core/components/ui/AlertDialog.d.ts.map +1 -1
  73. package/dist/core/components/ui/AlertDialog.js.map +1 -1
  74. package/dist/core/components/ui/AnimatedBackground.d.ts.map +1 -1
  75. package/dist/core/components/ui/AnimatedBackground.js.map +1 -1
  76. package/dist/core/components/ui/AppSidebar.d.ts.map +1 -1
  77. package/dist/core/components/ui/AppSidebar.js.map +1 -1
  78. package/dist/core/components/ui/Avatar.d.ts.map +1 -1
  79. package/dist/core/components/ui/Avatar.js.map +1 -1
  80. package/dist/core/components/ui/Badge.d.ts.map +1 -1
  81. package/dist/core/components/ui/Badge.js.map +1 -1
  82. package/dist/core/components/ui/Breadcrumb.d.ts.map +1 -1
  83. package/dist/core/components/ui/Breadcrumb.js.map +1 -1
  84. package/dist/core/components/ui/Button.d.ts.map +1 -1
  85. package/dist/core/components/ui/Button.js.map +1 -1
  86. package/dist/core/components/ui/Calendar.d.ts.map +1 -1
  87. package/dist/core/components/ui/Calendar.js.map +1 -1
  88. package/dist/core/components/ui/Card.d.ts.map +1 -1
  89. package/dist/core/components/ui/Card.js.map +1 -1
  90. package/dist/core/components/ui/Checkbox.d.ts.map +1 -1
  91. package/dist/core/components/ui/Checkbox.js.map +1 -1
  92. package/dist/core/components/ui/CollapsibleSection.d.ts.map +1 -1
  93. package/dist/core/components/ui/CollapsibleSection.js.map +1 -1
  94. package/dist/core/components/ui/ColorCircle.d.ts.map +1 -1
  95. package/dist/core/components/ui/ColorCircle.js.map +1 -1
  96. package/dist/core/components/ui/Command.d.ts.map +1 -1
  97. package/dist/core/components/ui/Command.js.map +1 -1
  98. package/dist/core/components/ui/Comments/CollapsibleCommentItem.d.ts.map +1 -1
  99. package/dist/core/components/ui/Comments/CollapsibleCommentItem.js.map +1 -1
  100. package/dist/core/components/ui/Comments/Comment.d.ts.map +1 -1
  101. package/dist/core/components/ui/Comments/Comment.js.map +1 -1
  102. package/dist/core/components/ui/Comments/CommentInput.d.ts.map +1 -1
  103. package/dist/core/components/ui/Comments/CommentInput.js.map +1 -1
  104. package/dist/core/components/ui/Comments/CommentsSection.d.ts.map +1 -1
  105. package/dist/core/components/ui/Comments/CommentsSection.js.map +1 -1
  106. package/dist/core/components/ui/Comments/commentUtils.d.ts.map +1 -1
  107. package/dist/core/components/ui/Comments/commentUtils.js.map +1 -1
  108. package/dist/core/components/ui/Countdown.d.ts.map +1 -1
  109. package/dist/core/components/ui/Countdown.js.map +1 -1
  110. package/dist/core/components/ui/DataTable.d.ts.map +1 -1
  111. package/dist/core/components/ui/DataTable.js.map +1 -1
  112. package/dist/core/components/ui/DatePicker.d.ts.map +1 -1
  113. package/dist/core/components/ui/DatePicker.js.map +1 -1
  114. package/dist/core/components/ui/DescriptionList.d.ts.map +1 -1
  115. package/dist/core/components/ui/DescriptionList.js.map +1 -1
  116. package/dist/core/components/ui/Dialog.d.ts.map +1 -1
  117. package/dist/core/components/ui/Dialog.js.map +1 -1
  118. package/dist/core/components/ui/DropdownMenu.d.ts.map +1 -1
  119. package/dist/core/components/ui/DropdownMenu.js.map +1 -1
  120. package/dist/core/components/ui/ExportData.d.ts.map +1 -1
  121. package/dist/core/components/ui/ExportData.js.map +1 -1
  122. package/dist/core/components/ui/FilesManager/index.d.ts.map +1 -1
  123. package/dist/core/components/ui/FilesManager/index.js.map +1 -1
  124. package/dist/core/components/ui/FilesManager/src/FileItemComponent.d.ts.map +1 -1
  125. package/dist/core/components/ui/FilesManager/src/FileItemComponent.js.map +1 -1
  126. package/dist/core/components/ui/FilesManager/src/FileMarker.d.ts.map +1 -1
  127. package/dist/core/components/ui/FilesManager/src/FileMarker.js.map +1 -1
  128. package/dist/core/components/ui/FilesManager/src/ViewerContextMenu.d.ts.map +1 -1
  129. package/dist/core/components/ui/FilesManager/src/ViewerContextMenu.js.map +1 -1
  130. package/dist/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.d.ts.map +1 -1
  131. package/dist/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.js.map +1 -1
  132. package/dist/core/components/ui/FilesManager/src/downloadUtils.d.ts.map +1 -1
  133. package/dist/core/components/ui/FilesManager/src/downloadUtils.js.map +1 -1
  134. package/dist/core/components/ui/FilesManager/src/useCommonFileUpload.d.ts.map +1 -1
  135. package/dist/core/components/ui/FilesManager/src/useCommonFileUpload.js.map +1 -1
  136. package/dist/core/components/ui/FilesManager/src/useFileActions.d.ts.map +1 -1
  137. package/dist/core/components/ui/FilesManager/src/useFileActions.js.map +1 -1
  138. package/dist/core/components/ui/FilesManager/src/useFileDeleteHandler.d.ts.map +1 -1
  139. package/dist/core/components/ui/FilesManager/src/useFileDeleteHandler.js.map +1 -1
  140. package/dist/core/components/ui/FilesManager/src/useFileUploadHandler.d.ts.map +1 -1
  141. package/dist/core/components/ui/FilesManager/src/useFileUploadHandler.js.map +1 -1
  142. package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.d.ts.map +1 -1
  143. package/dist/core/components/ui/FilesManager/src/useFileUploadWithProgress.js.map +1 -1
  144. package/dist/core/components/ui/Footer.d.ts.map +1 -1
  145. package/dist/core/components/ui/Footer.js.map +1 -1
  146. package/dist/core/components/ui/GenericTool.d.ts.map +1 -1
  147. package/dist/core/components/ui/GenericTool.js.map +1 -1
  148. package/dist/core/components/ui/Icons/BcfIcon.d.ts.map +1 -1
  149. package/dist/core/components/ui/Icons/BcfIcon.js.map +1 -1
  150. package/dist/core/components/ui/Icons/CdtIcon.d.ts.map +1 -1
  151. package/dist/core/components/ui/Icons/CdtIcon.js.map +1 -1
  152. package/dist/core/components/ui/Icons/FloorPlanIcon.d.ts.map +1 -1
  153. package/dist/core/components/ui/Icons/FloorPlanIcon.js.map +1 -1
  154. package/dist/core/components/ui/Icons/GoogleIcon.d.ts.map +1 -1
  155. package/dist/core/components/ui/Icons/GoogleIcon.js.map +1 -1
  156. package/dist/core/components/ui/Icons/IdsIcon.d.ts.map +1 -1
  157. package/dist/core/components/ui/Icons/IdsIcon.js.map +1 -1
  158. package/dist/core/components/ui/Icons/IfcIcon.d.ts.map +1 -1
  159. package/dist/core/components/ui/Icons/IfcIcon.js.map +1 -1
  160. package/dist/core/components/ui/Icons/index.d.ts.map +1 -1
  161. package/dist/core/components/ui/Icons/index.js.map +1 -1
  162. package/dist/core/components/ui/InfoSidebar/Container.d.ts.map +1 -1
  163. package/dist/core/components/ui/InfoSidebar/Container.js.map +1 -1
  164. package/dist/core/components/ui/InfoSidebar/Header.d.ts.map +1 -1
  165. package/dist/core/components/ui/InfoSidebar/Header.js.map +1 -1
  166. package/dist/core/components/ui/InfoSidebar/index.d.ts.map +1 -1
  167. package/dist/core/components/ui/InfoSidebar/index.js.map +1 -1
  168. package/dist/core/components/ui/Input.d.ts.map +1 -1
  169. package/dist/core/components/ui/Input.js.map +1 -1
  170. package/dist/core/components/ui/Label.d.ts.map +1 -1
  171. package/dist/core/components/ui/Label.js.map +1 -1
  172. package/dist/core/components/ui/LanguageToggle.d.ts.map +1 -1
  173. package/dist/core/components/ui/LanguageToggle.js.map +1 -1
  174. package/dist/core/components/ui/LoadingSpinner.d.ts.map +1 -1
  175. package/dist/core/components/ui/LoadingSpinner.js.map +1 -1
  176. package/dist/core/components/ui/Menubar.d.ts.map +1 -1
  177. package/dist/core/components/ui/Menubar.js.map +1 -1
  178. package/dist/core/components/ui/NavUser.d.ts.map +1 -1
  179. package/dist/core/components/ui/NavUser.js.map +1 -1
  180. package/dist/core/components/ui/Navbar.d.ts.map +1 -1
  181. package/dist/core/components/ui/Navbar.js.map +1 -1
  182. package/dist/core/components/ui/Popover.d.ts.map +1 -1
  183. package/dist/core/components/ui/Popover.js.map +1 -1
  184. package/dist/core/components/ui/Progress.d.ts.map +1 -1
  185. package/dist/core/components/ui/Progress.js.map +1 -1
  186. package/dist/core/components/ui/ScrollArea.d.ts.map +1 -1
  187. package/dist/core/components/ui/ScrollArea.js.map +1 -1
  188. package/dist/core/components/ui/SearchInput.d.ts.map +1 -1
  189. package/dist/core/components/ui/SearchInput.js.map +1 -1
  190. package/dist/core/components/ui/Select.d.ts.map +1 -1
  191. package/dist/core/components/ui/Select.js.map +1 -1
  192. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
  193. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
  194. package/dist/core/components/ui/Sensors/Sensor.d.ts.map +1 -1
  195. package/dist/core/components/ui/Sensors/Sensor.js.map +1 -1
  196. package/dist/core/components/ui/Sensors/SensorChart.d.ts.map +1 -1
  197. package/dist/core/components/ui/Sensors/SensorChart.js.map +1 -1
  198. package/dist/core/components/ui/Sensors/SensorInput.d.ts.map +1 -1
  199. package/dist/core/components/ui/Sensors/SensorInput.js.map +1 -1
  200. package/dist/core/components/ui/Sensors/SensorTagsSection.d.ts.map +1 -1
  201. package/dist/core/components/ui/Sensors/SensorTagsSection.js.map +1 -1
  202. package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
  203. package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
  204. package/dist/core/components/ui/Sensors/SensorsSectionSkeleton.d.ts.map +1 -1
  205. package/dist/core/components/ui/Sensors/SensorsSectionSkeleton.js.map +1 -1
  206. package/dist/core/components/ui/Sensors/sensorUtils.d.ts.map +1 -1
  207. package/dist/core/components/ui/Sensors/sensorUtils.js.map +1 -1
  208. package/dist/core/components/ui/Separator.d.ts.map +1 -1
  209. package/dist/core/components/ui/Separator.js.map +1 -1
  210. package/dist/core/components/ui/SettingsButton.d.ts.map +1 -1
  211. package/dist/core/components/ui/SettingsButton.js.map +1 -1
  212. package/dist/core/components/ui/ShareFeature/QRCodeWithLink.d.ts.map +1 -1
  213. package/dist/core/components/ui/ShareFeature/QRCodeWithLink.js.map +1 -1
  214. package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.d.ts.map +1 -1
  215. package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.js.map +1 -1
  216. package/dist/core/components/ui/ShareFeature/index.d.ts.map +1 -1
  217. package/dist/core/components/ui/ShareFeature/index.js.map +1 -1
  218. package/dist/core/components/ui/Sheet.d.ts.map +1 -1
  219. package/dist/core/components/ui/Sheet.js.map +1 -1
  220. package/dist/core/components/ui/Sidebar.d.ts.map +1 -1
  221. package/dist/core/components/ui/Sidebar.js.map +1 -1
  222. package/dist/core/components/ui/Skeleton.d.ts.map +1 -1
  223. package/dist/core/components/ui/Skeleton.js.map +1 -1
  224. package/dist/core/components/ui/Slider.d.ts.map +1 -1
  225. package/dist/core/components/ui/Slider.js.map +1 -1
  226. package/dist/core/components/ui/Sonner.d.ts.map +1 -1
  227. package/dist/core/components/ui/Sonner.js.map +1 -1
  228. package/dist/core/components/ui/Switch.d.ts.map +1 -1
  229. package/dist/core/components/ui/Switch.js.map +1 -1
  230. package/dist/core/components/ui/Table.d.ts.map +1 -1
  231. package/dist/core/components/ui/Table.js.map +1 -1
  232. package/dist/core/components/ui/Tabs.d.ts.map +1 -1
  233. package/dist/core/components/ui/Tabs.js.map +1 -1
  234. package/dist/core/components/ui/Textarea.d.ts.map +1 -1
  235. package/dist/core/components/ui/Textarea.js.map +1 -1
  236. package/dist/core/components/ui/Toggle.d.ts.map +1 -1
  237. package/dist/core/components/ui/Toggle.js.map +1 -1
  238. package/dist/core/components/ui/ToggleGroup.d.ts.map +1 -1
  239. package/dist/core/components/ui/ToggleGroup.js.map +1 -1
  240. package/dist/core/components/ui/ToolbarButton.d.ts.map +1 -1
  241. package/dist/core/components/ui/ToolbarButton.js.map +1 -1
  242. package/dist/core/components/ui/Tooltip.d.ts.map +1 -1
  243. package/dist/core/components/ui/Tooltip.js.map +1 -1
  244. package/dist/core/components/ui/UserAvatar.d.ts.map +1 -1
  245. package/dist/core/components/ui/UserAvatar.js.map +1 -1
  246. package/dist/core/components/ui/chart.d.ts.map +1 -1
  247. package/dist/core/components/ui/chart.js.map +1 -1
  248. package/dist/core/components/ui/downloadUtils.d.ts.map +1 -1
  249. package/dist/core/components/ui/downloadUtils.js.map +1 -1
  250. package/dist/core/components/ui/index.d.ts.map +1 -1
  251. package/dist/core/components/ui/index.js.map +1 -1
  252. package/dist/core/components/ui/openPopupWindow.d.ts.map +1 -1
  253. package/dist/core/components/ui/openPopupWindow.js.map +1 -1
  254. package/dist/core/components/ui/openPopupWindowLCA.d.ts.map +1 -1
  255. package/dist/core/components/ui/openPopupWindowLCA.js.map +1 -1
  256. package/dist/core/components/ui/stats.d.ts.map +1 -1
  257. package/dist/core/components/ui/stats.js.map +1 -1
  258. package/dist/core/components/ui/uploadFile.d.ts.map +1 -1
  259. package/dist/core/components/ui/uploadFile.js.map +1 -1
  260. package/dist/core/components/viewers/Data/DataMenu.d.ts.map +1 -1
  261. package/dist/core/components/viewers/Data/DataMenu.js.map +1 -1
  262. package/dist/core/components/viewers/Data/FilterButtons.d.ts.map +1 -1
  263. package/dist/core/components/viewers/Data/FilterButtons.js.map +1 -1
  264. package/dist/core/components/viewers/Data/HeaderButtons.d.ts.map +1 -1
  265. package/dist/core/components/viewers/Data/HeaderButtons.js.map +1 -1
  266. package/dist/core/components/viewers/Data/MoreOptions.d.ts.map +1 -1
  267. package/dist/core/components/viewers/Data/MoreOptions.js.map +1 -1
  268. package/dist/core/components/viewers/Data/advancedFilter/Filters.d.ts.map +1 -1
  269. package/dist/core/components/viewers/Data/advancedFilter/Filters.js.map +1 -1
  270. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.d.ts.map +1 -1
  271. package/dist/core/components/viewers/Data/advancedFilter/FiltersDialog.js.map +1 -1
  272. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.d.ts.map +1 -1
  273. package/dist/core/components/viewers/Data/buildingDetails/AddBuilding.js.map +1 -1
  274. package/dist/core/components/viewers/Data/buildingDetails/BuildingDetails.d.ts.map +1 -1
  275. package/dist/core/components/viewers/Data/buildingDetails/BuildingDetails.js.map +1 -1
  276. package/dist/core/components/viewers/Data/buildingDetails/BuildingsMoreOptions.d.ts.map +1 -1
  277. package/dist/core/components/viewers/Data/buildingDetails/BuildingsMoreOptions.js.map +1 -1
  278. package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.d.ts.map +1 -1
  279. package/dist/core/components/viewers/Data/buildingDetails/FieldRenderer.js.map +1 -1
  280. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.d.ts.map +1 -1
  281. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js.map +1 -1
  282. package/dist/core/components/viewers/Data/buildingDetails/buildingSchemaTemplate.d.ts.map +1 -1
  283. package/dist/core/components/viewers/Data/buildingDetails/buildingSchemaTemplate.js.map +1 -1
  284. package/dist/core/components/viewers/Data/details/AttachedFiles.d.ts.map +1 -1
  285. package/dist/core/components/viewers/Data/details/AttachedFiles.js.map +1 -1
  286. package/dist/core/components/viewers/Data/details/CheckboxGroup.d.ts.map +1 -1
  287. package/dist/core/components/viewers/Data/details/CheckboxGroup.js.map +1 -1
  288. package/dist/core/components/viewers/Data/details/DetailActions.d.ts.map +1 -1
  289. package/dist/core/components/viewers/Data/details/DetailActions.js.map +1 -1
  290. package/dist/core/components/viewers/Data/details/DetailHeader.d.ts.map +1 -1
  291. package/dist/core/components/viewers/Data/details/DetailHeader.js.map +1 -1
  292. package/dist/core/components/viewers/Data/details/EnergySourcesGrid.d.ts.map +1 -1
  293. package/dist/core/components/viewers/Data/details/EnergySourcesGrid.js.map +1 -1
  294. package/dist/core/components/viewers/Data/details/FieldValue.d.ts.map +1 -1
  295. package/dist/core/components/viewers/Data/details/FieldValue.js.map +1 -1
  296. package/dist/core/components/viewers/Data/details/FileUpload.d.ts.map +1 -1
  297. package/dist/core/components/viewers/Data/details/FileUpload.js.map +1 -1
  298. package/dist/core/components/viewers/Data/details/FilterFiles.d.ts.map +1 -1
  299. package/dist/core/components/viewers/Data/details/FilterFiles.js.map +1 -1
  300. package/dist/core/components/viewers/Data/details/TabSidebar.d.ts.map +1 -1
  301. package/dist/core/components/viewers/Data/details/TabSidebar.js.map +1 -1
  302. package/dist/core/components/viewers/Data/details/UnitsGrid.d.ts.map +1 -1
  303. package/dist/core/components/viewers/Data/details/UnitsGrid.js.map +1 -1
  304. package/dist/core/components/viewers/Data/details/getAttachmentFileName.d.ts.map +1 -1
  305. package/dist/core/components/viewers/Data/details/getAttachmentFileName.js.map +1 -1
  306. package/dist/core/components/viewers/Data/files/DatatableFileAdder.d.ts.map +1 -1
  307. package/dist/core/components/viewers/Data/files/DatatableFileAdder.js.map +1 -1
  308. package/dist/core/components/viewers/Data/files/FileDetails.d.ts.map +1 -1
  309. package/dist/core/components/viewers/Data/files/FileDetails.js.map +1 -1
  310. package/dist/core/components/viewers/Data/files/FileMoreOptions.d.ts.map +1 -1
  311. package/dist/core/components/viewers/Data/files/FileMoreOptions.js.map +1 -1
  312. package/dist/core/components/viewers/Data/files/FilePreview.d.ts.map +1 -1
  313. package/dist/core/components/viewers/Data/files/FilePreview.js.map +1 -1
  314. package/dist/core/components/viewers/Data/files/utils/fuzzySearch.d.ts.map +1 -1
  315. package/dist/core/components/viewers/Data/files/utils/fuzzySearch.js.map +1 -1
  316. package/dist/core/components/viewers/Data/infrastructureDetails/AddInfrastructure.d.ts.map +1 -1
  317. package/dist/core/components/viewers/Data/infrastructureDetails/AddInfrastructure.js.map +1 -1
  318. package/dist/core/components/viewers/Data/infrastructureDetails/FieldRenderer.d.ts.map +1 -1
  319. package/dist/core/components/viewers/Data/infrastructureDetails/FieldRenderer.js.map +1 -1
  320. package/dist/core/components/viewers/Data/infrastructureDetails/InfrastructureDetails.d.ts.map +1 -1
  321. package/dist/core/components/viewers/Data/infrastructureDetails/InfrastructureDetails.js.map +1 -1
  322. package/dist/core/components/viewers/Data/siteDetails/AddSite.d.ts.map +1 -1
  323. package/dist/core/components/viewers/Data/siteDetails/AddSite.js.map +1 -1
  324. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.d.ts.map +1 -1
  325. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js.map +1 -1
  326. package/dist/core/components/viewers/Data/siteDetails/FieldRenderer.d.ts.map +1 -1
  327. package/dist/core/components/viewers/Data/siteDetails/FieldRenderer.js.map +1 -1
  328. package/dist/core/components/viewers/Data/siteDetails/SiteDetails.d.ts.map +1 -1
  329. package/dist/core/components/viewers/Data/siteDetails/SiteDetails.js.map +1 -1
  330. package/dist/core/components/viewers/Data/userDetails/AddUser.d.ts.map +1 -1
  331. package/dist/core/components/viewers/Data/userDetails/AddUser.js.map +1 -1
  332. package/dist/core/components/viewers/Data/userDetails/UserDetails.d.ts.map +1 -1
  333. package/dist/core/components/viewers/Data/userDetails/UserDetails.js.map +1 -1
  334. package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.d.ts.map +1 -1
  335. package/dist/core/components/viewers/Data/userDetails/UserMoreOptions.js.map +1 -1
  336. package/dist/core/components/viewers/Data/utils/Columns.d.ts.map +1 -1
  337. package/dist/core/components/viewers/Data/utils/Columns.js.map +1 -1
  338. package/dist/core/components/viewers/Data/utils/Headers.d.ts.map +1 -1
  339. package/dist/core/components/viewers/Data/utils/Headers.js.map +1 -1
  340. package/dist/core/components/viewers/Data/utils/convertDate.d.ts.map +1 -1
  341. package/dist/core/components/viewers/Data/utils/convertDate.js.map +1 -1
  342. package/dist/core/components/viewers/Data/utils/csvUtils.d.ts.map +1 -1
  343. package/dist/core/components/viewers/Data/utils/csvUtils.js.map +1 -1
  344. package/dist/core/components/viewers/Data/utils/filterHelper.d.ts.map +1 -1
  345. package/dist/core/components/viewers/Data/utils/filterHelper.js.map +1 -1
  346. package/dist/core/components/viewers/Data/utils/positionParser.d.ts.map +1 -1
  347. package/dist/core/components/viewers/Data/utils/positionParser.js.map +1 -1
  348. package/dist/core/components/viewers/Data/utils/useViewerData.d.ts.map +1 -1
  349. package/dist/core/components/viewers/Data/utils/useViewerData.js.map +1 -1
  350. package/dist/core/components/viewers/Data/utils/viewerConfig.d.ts.map +1 -1
  351. package/dist/core/components/viewers/Data/utils/viewerConfig.js.map +1 -1
  352. package/dist/core/components/viewers/Viewer.d.ts.map +1 -1
  353. package/dist/core/components/viewers/Viewer.js.map +1 -1
  354. package/dist/core/components/viewers/bim/BimToolbar.d.ts.map +1 -1
  355. package/dist/core/components/viewers/bim/BimToolbar.js.map +1 -1
  356. package/dist/core/components/viewers/bim/BimViewer.d.ts.map +1 -1
  357. package/dist/core/components/viewers/bim/BimViewer.js.map +1 -1
  358. package/dist/core/components/viewers/bim/src/BCFTopicsManager.d.ts.map +1 -1
  359. package/dist/core/components/viewers/bim/src/BCFTopicsManager.js.map +1 -1
  360. package/dist/core/components/viewers/bim/src/BIMManager/index.d.ts.map +1 -1
  361. package/dist/core/components/viewers/bim/src/BIMManager/index.js.map +1 -1
  362. package/dist/core/components/viewers/bim/src/BimLoadingState/index.d.ts.map +1 -1
  363. package/dist/core/components/viewers/bim/src/BimLoadingState/index.js.map +1 -1
  364. package/dist/core/components/viewers/bim/src/BimMeasurements/LenghtMeasurement.d.ts.map +1 -1
  365. package/dist/core/components/viewers/bim/src/BimMeasurements/LenghtMeasurement.js.map +1 -1
  366. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/index.d.ts.map +1 -1
  367. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/index.js.map +1 -1
  368. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CollapsibleTopicItem.d.ts.map +1 -1
  369. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CollapsibleTopicItem.js.map +1 -1
  370. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CreateTopicDialog.d.ts.map +1 -1
  371. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/CreateTopicDialog.js.map +1 -1
  372. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.d.ts.map +1 -1
  373. package/dist/core/components/viewers/bim/src/BimSidebar/src/CommunicationTab/src/TopicsSection.js.map +1 -1
  374. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/index.d.ts.map +1 -1
  375. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/index.js.map +1 -1
  376. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  377. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  378. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  379. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  380. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/index.d.ts.map +1 -1
  381. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/index.js.map +1 -1
  382. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/ElevationsSection.d.ts.map +1 -1
  383. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/ElevationsSection.js.map +1 -1
  384. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.d.ts.map +1 -1
  385. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.js.map +1 -1
  386. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/SpatialStructureSection.d.ts.map +1 -1
  387. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/SpatialStructureSection.js.map +1 -1
  388. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.d.ts.map +1 -1
  389. package/dist/core/components/viewers/bim/src/BimSidebar/src/SensorsTab/index.js.map +1 -1
  390. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/index.d.ts.map +1 -1
  391. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/index.js.map +1 -1
  392. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/GridManagement.d.ts.map +1 -1
  393. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/GridManagement.js.map +1 -1
  394. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/LightingManagement.d.ts.map +1 -1
  395. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/LightingManagement.js.map +1 -1
  396. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/RenderMode.d.ts.map +1 -1
  397. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/RenderMode.js.map +1 -1
  398. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/ToggleProjection.d.ts.map +1 -1
  399. package/dist/core/components/viewers/bim/src/BimSidebar/src/SettingsTab/src/ToggleProjection.js.map +1 -1
  400. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.d.ts.map +1 -1
  401. package/dist/core/components/viewers/bim/src/BimSidebar/src/TabSelector.js.map +1 -1
  402. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.d.ts.map +1 -1
  403. package/dist/core/components/viewers/bim/src/BimSidebar/src/index.js.map +1 -1
  404. package/dist/core/components/viewers/bim/src/CameraProjection.d.ts.map +1 -1
  405. package/dist/core/components/viewers/bim/src/CameraProjection.js.map +1 -1
  406. package/dist/core/components/viewers/bim/src/ClippingPlane.d.ts.map +1 -1
  407. package/dist/core/components/viewers/bim/src/ClippingPlane.js.map +1 -1
  408. package/dist/core/components/viewers/bim/src/CurrentCamera.d.ts.map +1 -1
  409. package/dist/core/components/viewers/bim/src/CurrentCamera.js.map +1 -1
  410. package/dist/core/components/viewers/bim/src/CurrentWorld.d.ts.map +1 -1
  411. package/dist/core/components/viewers/bim/src/CurrentWorld.js.map +1 -1
  412. package/dist/core/components/viewers/bim/src/Cursor.d.ts.map +1 -1
  413. package/dist/core/components/viewers/bim/src/Cursor.js.map +1 -1
  414. package/dist/core/components/viewers/bim/src/DXFLoader/index.d.ts.map +1 -1
  415. package/dist/core/components/viewers/bim/src/DXFLoader/index.js.map +1 -1
  416. package/dist/core/components/viewers/bim/src/ElevationsTool/index.d.ts.map +1 -1
  417. package/dist/core/components/viewers/bim/src/ElevationsTool/index.js.map +1 -1
  418. package/dist/core/components/viewers/bim/src/ElevationsTool/src/ElevationProjector.d.ts.map +1 -1
  419. package/dist/core/components/viewers/bim/src/ElevationsTool/src/ElevationProjector.js.map +1 -1
  420. package/dist/core/components/viewers/bim/src/ElevationsTool/src/types.d.ts.map +1 -1
  421. package/dist/core/components/viewers/bim/src/ElevationsTool/src/types.js.map +1 -1
  422. package/dist/core/components/viewers/bim/src/FitCamera.d.ts.map +1 -1
  423. package/dist/core/components/viewers/bim/src/FitCamera.js.map +1 -1
  424. package/dist/core/components/viewers/bim/src/FloorplanTool/index.d.ts.map +1 -1
  425. package/dist/core/components/viewers/bim/src/FloorplanTool/index.js.map +1 -1
  426. package/dist/core/components/viewers/bim/src/FloorplanTool/src/FloorplanRenderer.d.ts.map +1 -1
  427. package/dist/core/components/viewers/bim/src/FloorplanTool/src/FloorplanRenderer.js.map +1 -1
  428. package/dist/core/components/viewers/bim/src/FloorplanTool/src/StoreyProjector.d.ts.map +1 -1
  429. package/dist/core/components/viewers/bim/src/FloorplanTool/src/StoreyProjector.js.map +1 -1
  430. package/dist/core/components/viewers/bim/src/FloorplanTool/src/types.d.ts.map +1 -1
  431. package/dist/core/components/viewers/bim/src/FloorplanTool/src/types.js.map +1 -1
  432. package/dist/core/components/viewers/bim/src/FloorplanTool/src/utils.d.ts.map +1 -1
  433. package/dist/core/components/viewers/bim/src/FloorplanTool/src/utils.js.map +1 -1
  434. package/dist/core/components/viewers/bim/src/GhostMode.d.ts.map +1 -1
  435. package/dist/core/components/viewers/bim/src/GhostMode.js.map +1 -1
  436. package/dist/core/components/viewers/bim/src/Highlighter/index.d.ts.map +1 -1
  437. package/dist/core/components/viewers/bim/src/Highlighter/index.js.map +1 -1
  438. package/dist/core/components/viewers/bim/src/IDSManager/index.d.ts.map +1 -1
  439. package/dist/core/components/viewers/bim/src/IDSManager/index.js.map +1 -1
  440. package/dist/core/components/viewers/bim/src/IDSManager/src/IDSLegend.d.ts.map +1 -1
  441. package/dist/core/components/viewers/bim/src/IDSManager/src/IDSLegend.js.map +1 -1
  442. package/dist/core/components/viewers/bim/src/IfcToFragments.d.ts.map +1 -1
  443. package/dist/core/components/viewers/bim/src/IfcToFragments.js.map +1 -1
  444. package/dist/core/components/viewers/bim/src/LoadIfcAsFragments.d.ts.map +1 -1
  445. package/dist/core/components/viewers/bim/src/LoadIfcAsFragments.js.map +1 -1
  446. package/dist/core/components/viewers/bim/src/LoadModels.d.ts.map +1 -1
  447. package/dist/core/components/viewers/bim/src/LoadModels.js.map +1 -1
  448. package/dist/core/components/viewers/bim/src/ModelManager/index.d.ts.map +1 -1
  449. package/dist/core/components/viewers/bim/src/ModelManager/index.js.map +1 -1
  450. package/dist/core/components/viewers/bim/src/SimpleBimViewer.d.ts.map +1 -1
  451. package/dist/core/components/viewers/bim/src/SimpleBimViewer.js.map +1 -1
  452. package/dist/core/components/viewers/bim/src/SpatialStructure.d.ts.map +1 -1
  453. package/dist/core/components/viewers/bim/src/SpatialStructure.js.map +1 -1
  454. package/dist/core/components/viewers/bim/src/ViewportGizmo.d.ts.map +1 -1
  455. package/dist/core/components/viewers/bim/src/ViewportGizmo.js.map +1 -1
  456. package/dist/core/components/viewers/bim/src/lib/CameraController.d.ts.map +1 -1
  457. package/dist/core/components/viewers/bim/src/lib/CameraController.js.map +1 -1
  458. package/dist/core/components/viewers/bim/src/lib/CategoryHighlighter.d.ts.map +1 -1
  459. package/dist/core/components/viewers/bim/src/lib/CategoryHighlighter.js.map +1 -1
  460. package/dist/core/components/viewers/bim/src/lib/ChromeController.d.ts.map +1 -1
  461. package/dist/core/components/viewers/bim/src/lib/ChromeController.js.map +1 -1
  462. package/dist/core/components/viewers/bim/src/lib/ClipController.d.ts.map +1 -1
  463. package/dist/core/components/viewers/bim/src/lib/ClipController.js.map +1 -1
  464. package/dist/core/components/viewers/bim/src/lib/GridController.d.ts.map +1 -1
  465. package/dist/core/components/viewers/bim/src/lib/GridController.js.map +1 -1
  466. package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.d.ts.map +1 -1
  467. package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.js.map +1 -1
  468. package/dist/core/components/viewers/bim/src/lib/ViewModeCoordinator.d.ts.map +1 -1
  469. package/dist/core/components/viewers/bim/src/lib/ViewModeCoordinator.js.map +1 -1
  470. package/dist/core/components/viewers/bim/src/lib/ViewSectionList.d.ts.map +1 -1
  471. package/dist/core/components/viewers/bim/src/lib/ViewSectionList.js.map +1 -1
  472. package/dist/core/components/viewers/bim/src/lib/drawingLayers.d.ts.map +1 -1
  473. package/dist/core/components/viewers/bim/src/lib/drawingLayers.js.map +1 -1
  474. package/dist/core/components/viewers/bim/src/lib/drawingProjection.d.ts.map +1 -1
  475. package/dist/core/components/viewers/bim/src/lib/drawingProjection.js.map +1 -1
  476. package/dist/core/components/viewers/bim/src/lib/exportDrawingToDxf.d.ts.map +1 -1
  477. package/dist/core/components/viewers/bim/src/lib/exportDrawingToDxf.js.map +1 -1
  478. package/dist/core/components/viewers/bim/src/lib/safeRun.d.ts.map +1 -1
  479. package/dist/core/components/viewers/bim/src/lib/safeRun.js.map +1 -1
  480. package/dist/core/components/viewers/bim/src/lib/useBuildingName.d.ts.map +1 -1
  481. package/dist/core/components/viewers/bim/src/lib/useBuildingName.js.map +1 -1
  482. package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.d.ts.map +1 -1
  483. package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.js.map +1 -1
  484. package/dist/core/components/viewers/bim/src/lib/viewSection.d.ts.map +1 -1
  485. package/dist/core/components/viewers/bim/src/lib/viewSection.js.map +1 -1
  486. package/dist/core/components/viewers/bim/src/propertiesMenu/index.d.ts.map +1 -1
  487. package/dist/core/components/viewers/bim/src/propertiesMenu/index.js.map +1 -1
  488. package/dist/core/components/viewers/bim/src/propertiesMenu/src/ElementList.d.ts.map +1 -1
  489. package/dist/core/components/viewers/bim/src/propertiesMenu/src/ElementList.js.map +1 -1
  490. package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertiesMenuHeader.d.ts.map +1 -1
  491. package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertiesMenuHeader.js.map +1 -1
  492. package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertyGroup.d.ts.map +1 -1
  493. package/dist/core/components/viewers/bim/src/propertiesMenu/src/PropertyGroup.js.map +1 -1
  494. package/dist/core/components/viewers/bim/src/propertiesMenu/src/useElementProperties.d.ts.map +1 -1
  495. package/dist/core/components/viewers/bim/src/propertiesMenu/src/useElementProperties.js.map +1 -1
  496. package/dist/core/components/viewers/bim/src/propertiesMenu/src/utils.d.ts.map +1 -1
  497. package/dist/core/components/viewers/bim/src/propertiesMenu/src/utils.js.map +1 -1
  498. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts.map +1 -1
  499. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js.map +1 -1
  500. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.d.ts.map +1 -1
  501. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.js.map +1 -1
  502. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddFile.d.ts.map +1 -1
  503. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddFile.js.map +1 -1
  504. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddSensor.d.ts.map +1 -1
  505. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddSensor.js.map +1 -1
  506. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddToBimToolbar.d.ts.map +1 -1
  507. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddToBimToolbar.js.map +1 -1
  508. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.d.ts.map +1 -1
  509. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimComment.js.map +1 -1
  510. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.d.ts.map +1 -1
  511. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js.map +1 -1
  512. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.d.ts.map +1 -1
  513. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.js.map +1 -1
  514. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.d.ts.map +1 -1
  515. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.js.map +1 -1
  516. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.d.ts.map +1 -1
  517. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.js.map +1 -1
  518. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/index.d.ts.map +1 -1
  519. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/index.js.map +1 -1
  520. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/markerUtils.d.ts.map +1 -1
  521. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/markerUtils.js.map +1 -1
  522. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.d.ts.map +1 -1
  523. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/renderCSS2DMarkers.js.map +1 -1
  524. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.d.ts.map +1 -1
  525. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useCommentMarkers.js.map +1 -1
  526. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.d.ts.map +1 -1
  527. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.js.map +1 -1
  528. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.d.ts.map +1 -1
  529. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useSensorMarkers.js.map +1 -1
  530. package/dist/core/components/viewers/bim/src/tools/BIMSearchTool.d.ts.map +1 -1
  531. package/dist/core/components/viewers/bim/src/tools/BIMSearchTool.js.map +1 -1
  532. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.d.ts.map +1 -1
  533. package/dist/core/components/viewers/bim/src/tools/ClippingTool/ClippingTool.js.map +1 -1
  534. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.d.ts.map +1 -1
  535. package/dist/core/components/viewers/bim/src/tools/ExplodeByLevelTool.js.map +1 -1
  536. package/dist/core/components/viewers/bim/src/tools/FitCameraTool.d.ts.map +1 -1
  537. package/dist/core/components/viewers/bim/src/tools/FitCameraTool.js.map +1 -1
  538. package/dist/core/components/viewers/bim/src/tools/InspectBimTool.d.ts.map +1 -1
  539. package/dist/core/components/viewers/bim/src/tools/InspectBimTool.js.map +1 -1
  540. package/dist/core/components/viewers/bim/src/tools/bimToolbar.d.ts.map +1 -1
  541. package/dist/core/components/viewers/bim/src/tools/bimToolbar.js.map +1 -1
  542. package/dist/core/components/viewers/bim/src/tools/measureBimTool.d.ts.map +1 -1
  543. package/dist/core/components/viewers/bim/src/tools/measureBimTool.js.map +1 -1
  544. package/dist/core/components/viewers/bim/src/tools/selectionBimTool.d.ts.map +1 -1
  545. package/dist/core/components/viewers/bim/src/tools/selectionBimTool.js.map +1 -1
  546. package/dist/core/components/viewers/bim/src/tools/shareBimTool.d.ts.map +1 -1
  547. package/dist/core/components/viewers/bim/src/tools/shareBimTool.js.map +1 -1
  548. package/dist/core/components/viewers/bim/utils/GizmoController.d.ts.map +1 -1
  549. package/dist/core/components/viewers/bim/utils/GizmoController.js.map +1 -1
  550. package/dist/core/components/viewers/bim/utils/setCameraLookAt.d.ts.map +1 -1
  551. package/dist/core/components/viewers/bim/utils/setCameraLookAt.js.map +1 -1
  552. package/dist/core/components/viewers/index.d.ts.map +1 -1
  553. package/dist/core/components/viewers/index.js.map +1 -1
  554. package/dist/core/components/viewers/map/MapViewer.d.ts.map +1 -1
  555. package/dist/core/components/viewers/map/MapViewer.js.map +1 -1
  556. package/dist/core/components/viewers/map/datasets/AddPortalDialog.d.ts.map +1 -1
  557. package/dist/core/components/viewers/map/datasets/AddPortalDialog.js.map +1 -1
  558. package/dist/core/components/viewers/map/datasets/DatasetDetails.d.ts.map +1 -1
  559. package/dist/core/components/viewers/map/datasets/DatasetDetails.js.map +1 -1
  560. package/dist/core/components/viewers/map/datasets/DatasetManager/index.d.ts.map +1 -1
  561. package/dist/core/components/viewers/map/datasets/DatasetManager/index.js.map +1 -1
  562. package/dist/core/components/viewers/map/datasets/DatasetManager/src/FieldsTable.d.ts.map +1 -1
  563. package/dist/core/components/viewers/map/datasets/DatasetManager/src/FieldsTable.js.map +1 -1
  564. package/dist/core/components/viewers/map/datasets/DatasetSkeleton.d.ts.map +1 -1
  565. package/dist/core/components/viewers/map/datasets/DatasetSkeleton.js.map +1 -1
  566. package/dist/core/components/viewers/map/datasets/Filters.d.ts.map +1 -1
  567. package/dist/core/components/viewers/map/datasets/Filters.js.map +1 -1
  568. package/dist/core/components/viewers/map/datasets/NestedFilter.d.ts.map +1 -1
  569. package/dist/core/components/viewers/map/datasets/NestedFilter.js.map +1 -1
  570. package/dist/core/components/viewers/map/datasets/RowActions.d.ts.map +1 -1
  571. package/dist/core/components/viewers/map/datasets/RowActions.js.map +1 -1
  572. package/dist/core/components/viewers/map/datasets/data.d.ts.map +1 -1
  573. package/dist/core/components/viewers/map/datasets/data.js.map +1 -1
  574. package/dist/core/components/viewers/map/datasets/index.d.ts.map +1 -1
  575. package/dist/core/components/viewers/map/datasets/index.js.map +1 -1
  576. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.d.ts.map +1 -1
  577. package/dist/core/components/viewers/map/datasets/src/arcGISDatasets.js.map +1 -1
  578. package/dist/core/components/viewers/map/datasets/src/arcgisFetch.d.ts.map +1 -1
  579. package/dist/core/components/viewers/map/datasets/src/arcgisFetch.js.map +1 -1
  580. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.d.ts.map +1 -1
  581. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.js.map +1 -1
  582. package/dist/core/components/viewers/map/datasets/src/cache.d.ts.map +1 -1
  583. package/dist/core/components/viewers/map/datasets/src/cache.js.map +1 -1
  584. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.d.ts.map +1 -1
  585. package/dist/core/components/viewers/map/datasets/src/ckanDatasets.js.map +1 -1
  586. package/dist/core/components/viewers/map/datasets/src/geojsonFile.d.ts.map +1 -1
  587. package/dist/core/components/viewers/map/datasets/src/geojsonFile.js.map +1 -1
  588. package/dist/core/components/viewers/map/datasets/src/localDatasets.d.ts.map +1 -1
  589. package/dist/core/components/viewers/map/datasets/src/localDatasets.js.map +1 -1
  590. package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts.map +1 -1
  591. package/dist/core/components/viewers/map/datasets/src/minioDatasets.js.map +1 -1
  592. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.d.ts.map +1 -1
  593. package/dist/core/components/viewers/map/datasets/src/opendatasoftDatasets.js.map +1 -1
  594. package/dist/core/components/viewers/map/datasets/src/publishedTiles.d.ts.map +1 -1
  595. package/dist/core/components/viewers/map/datasets/src/publishedTiles.js.map +1 -1
  596. package/dist/core/components/viewers/map/datasets/src/socrataDatasets.d.ts.map +1 -1
  597. package/dist/core/components/viewers/map/datasets/src/socrataDatasets.js.map +1 -1
  598. package/dist/core/components/viewers/map/datasets/src/urlSources.d.ts.map +1 -1
  599. package/dist/core/components/viewers/map/datasets/src/urlSources.js.map +1 -1
  600. package/dist/core/components/viewers/map/datasets/src/useDatasetsForPortals.d.ts.map +1 -1
  601. package/dist/core/components/viewers/map/datasets/src/useDatasetsForPortals.js.map +1 -1
  602. package/dist/core/components/viewers/map/datasets/src/useFastDatasetCache.d.ts.map +1 -1
  603. package/dist/core/components/viewers/map/datasets/src/useFastDatasetCache.js.map +1 -1
  604. package/dist/core/components/viewers/map/datasets/src/wmsTime.d.ts +0 -8
  605. package/dist/core/components/viewers/map/datasets/src/wmsTime.d.ts.map +1 -1
  606. package/dist/core/components/viewers/map/datasets/src/wmsTime.js.map +1 -1
  607. package/dist/core/components/viewers/map/datasets/utils.d.ts.map +1 -1
  608. package/dist/core/components/viewers/map/datasets/utils.js.map +1 -1
  609. package/dist/core/components/viewers/map/legends/MapLegendHost.d.ts.map +1 -1
  610. package/dist/core/components/viewers/map/legends/MapLegendHost.js.map +1 -1
  611. package/dist/core/components/viewers/map/src/Geocoder.d.ts.map +1 -1
  612. package/dist/core/components/viewers/map/src/Geocoder.js.map +1 -1
  613. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/index.d.ts.map +1 -1
  614. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/index.js.map +1 -1
  615. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/index.d.ts.map +1 -1
  616. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/index.js.map +1 -1
  617. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.d.ts.map +1 -1
  618. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/DatabaseBuildingPopover/src/BuildingsTools.js.map +1 -1
  619. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.d.ts.map +1 -1
  620. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js.map +1 -1
  621. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.d.ts.map +1 -1
  622. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/OpenDataFeaturePopover.js.map +1 -1
  623. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/PopoverSkeleton.d.ts.map +1 -1
  624. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/PopoverSkeleton.js.map +1 -1
  625. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
  626. package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
  627. package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.d.ts.map +1 -1
  628. package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.js.map +1 -1
  629. package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/index.d.ts.map +1 -1
  630. package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/index.js.map +1 -1
  631. package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/src/databaseBuildings.d.ts.map +1 -1
  632. package/dist/core/components/viewers/map/src/MapLayers/src/BuildingLayers/src/databaseBuildings.js.map +1 -1
  633. package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.d.ts.map +1 -1
  634. package/dist/core/components/viewers/map/src/MapLayers/src/CommentLayer/index.js.map +1 -1
  635. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.d.ts.map +1 -1
  636. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.js.map +1 -1
  637. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.d.ts.map +1 -1
  638. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js.map +1 -1
  639. package/dist/core/components/viewers/map/src/MapLayers/src/EditPosition.d.ts.map +1 -1
  640. package/dist/core/components/viewers/map/src/MapLayers/src/EditPosition.js.map +1 -1
  641. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.d.ts.map +1 -1
  642. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.js.map +1 -1
  643. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileIcon.d.ts.map +1 -1
  644. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileIcon.js.map +1 -1
  645. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileManagerRow.d.ts.map +1 -1
  646. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/FileManagerRow.js.map +1 -1
  647. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.d.ts.map +1 -1
  648. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileManager.js.map +1 -1
  649. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileMarker.d.ts.map +1 -1
  650. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/components/MapFileMarker.js.map +1 -1
  651. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/index.d.ts.map +1 -1
  652. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/index.js.map +1 -1
  653. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.d.ts.map +1 -1
  654. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.js.map +1 -1
  655. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/openFileInPopUpWindow.d.ts.map +1 -1
  656. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/openFileInPopUpWindow.js.map +1 -1
  657. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.d.ts.map +1 -1
  658. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.js.map +1 -1
  659. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.d.ts.map +1 -1
  660. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.js.map +1 -1
  661. package/dist/core/components/viewers/map/src/MapLayers/src/PlaceOnMap.d.ts.map +1 -1
  662. package/dist/core/components/viewers/map/src/MapLayers/src/PlaceOnMap.js.map +1 -1
  663. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.d.ts.map +1 -1
  664. package/dist/core/components/viewers/map/src/MapLayers/src/SensorsLayer/index.js.map +1 -1
  665. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/index.d.ts.map +1 -1
  666. package/dist/core/components/viewers/map/src/MapLayers/src/SiteLayer/index.js.map +1 -1
  667. package/dist/core/components/viewers/map/src/MapLayers/src/disposeThreeScene.d.ts.map +1 -1
  668. package/dist/core/components/viewers/map/src/MapLayers/src/disposeThreeScene.js.map +1 -1
  669. package/dist/core/components/viewers/map/src/MapLayers/src/mapLayersUtils.d.ts.map +1 -1
  670. package/dist/core/components/viewers/map/src/MapLayers/src/mapLayersUtils.js.map +1 -1
  671. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.d.ts.map +1 -1
  672. package/dist/core/components/viewers/map/src/MapSidebar/TabSelector.js.map +1 -1
  673. package/dist/core/components/viewers/map/src/MapSidebar/index.d.ts.map +1 -1
  674. package/dist/core/components/viewers/map/src/MapSidebar/index.js.map +1 -1
  675. package/dist/core/components/viewers/map/src/MapSidebar/src/CommunicationTab/index.d.ts.map +1 -1
  676. package/dist/core/components/viewers/map/src/MapSidebar/src/CommunicationTab/index.js.map +1 -1
  677. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/index.d.ts.map +1 -1
  678. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/index.js.map +1 -1
  679. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  680. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  681. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  682. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  683. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.d.ts.map +1 -1
  684. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/index.js.map +1 -1
  685. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AppliedDatasetsSection.d.ts.map +1 -1
  686. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AppliedDatasetsSection.js.map +1 -1
  687. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AvailableDatasetsSection.d.ts.map +1 -1
  688. package/dist/core/components/viewers/map/src/MapSidebar/src/LayersTab/src/AvailableDatasetsSection.js.map +1 -1
  689. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.d.ts.map +1 -1
  690. package/dist/core/components/viewers/map/src/MapSidebar/src/SensorsTab/index.js.map +1 -1
  691. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.d.ts.map +1 -1
  692. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/index.js.map +1 -1
  693. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.d.ts.map +1 -1
  694. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/LocationSettings.js.map +1 -1
  695. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapCustomization.d.ts.map +1 -1
  696. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapCustomization.js.map +1 -1
  697. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapProjection.d.ts.map +1 -1
  698. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/MapProjection.js.map +1 -1
  699. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.d.ts.map +1 -1
  700. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js.map +1 -1
  701. package/dist/core/components/viewers/map/src/SimpleMap.d.ts.map +1 -1
  702. package/dist/core/components/viewers/map/src/SimpleMap.js.map +1 -1
  703. package/dist/core/components/viewers/map/src/compare/AddItem.d.ts.map +1 -1
  704. package/dist/core/components/viewers/map/src/compare/AddItem.js.map +1 -1
  705. package/dist/core/components/viewers/map/src/compare/CompareDialog.d.ts.map +1 -1
  706. package/dist/core/components/viewers/map/src/compare/CompareDialog.js.map +1 -1
  707. package/dist/core/components/viewers/map/src/compare/description-list.d.ts.map +1 -1
  708. package/dist/core/components/viewers/map/src/compare/description-list.js.map +1 -1
  709. package/dist/core/components/viewers/map/src/compare/index.d.ts.map +1 -1
  710. package/dist/core/components/viewers/map/src/compare/index.js.map +1 -1
  711. package/dist/core/components/viewers/map/src/tools/AddTools/AddDataset/DatasetAdder.d.ts.map +1 -1
  712. package/dist/core/components/viewers/map/src/tools/AddTools/AddDataset/DatasetAdder.js.map +1 -1
  713. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/FileAdder.d.ts.map +1 -1
  714. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/FileAdder.js.map +1 -1
  715. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/ProgressBar.d.ts.map +1 -1
  716. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/ProgressBar.js.map +1 -1
  717. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.d.ts.map +1 -1
  718. package/dist/core/components/viewers/map/src/tools/AddTools/AddFile/utils/uploadToPresignedURLS.js.map +1 -1
  719. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.d.ts.map +1 -1
  720. package/dist/core/components/viewers/map/src/tools/AddTools/AddSite/SiteAdder.js.map +1 -1
  721. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.d.ts.map +1 -1
  722. package/dist/core/components/viewers/map/src/tools/AddTools/AddToMap.js.map +1 -1
  723. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.d.ts.map +1 -1
  724. package/dist/core/components/viewers/map/src/tools/DatasetMapTool.js.map +1 -1
  725. package/dist/core/components/viewers/map/src/tools/mapTools.d.ts.map +1 -1
  726. package/dist/core/components/viewers/map/src/tools/mapTools.js.map +1 -1
  727. package/dist/core/components/viewers/map/src/tools/measureMapTool.d.ts.map +1 -1
  728. package/dist/core/components/viewers/map/src/tools/measureMapTool.js.map +1 -1
  729. package/dist/core/components/viewers/map/src/tools/shareMapTool.d.ts.map +1 -1
  730. package/dist/core/components/viewers/map/src/tools/shareMapTool.js.map +1 -1
  731. package/dist/core/components/viewers/map/utils/ClusterManager.d.ts.map +1 -1
  732. package/dist/core/components/viewers/map/utils/ClusterManager.js.map +1 -1
  733. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.d.ts.map +1 -1
  734. package/dist/core/components/viewers/map/utils/MapEventManager/MapClickManager.js.map +1 -1
  735. package/dist/core/components/viewers/map/utils/MapEventManager/MapHoverManager.d.ts.map +1 -1
  736. package/dist/core/components/viewers/map/utils/MapEventManager/MapHoverManager.js.map +1 -1
  737. package/dist/core/components/viewers/map/utils/MarkerManager.d.ts.map +1 -1
  738. package/dist/core/components/viewers/map/utils/MarkerManager.js.map +1 -1
  739. package/dist/core/components/viewers/map/utils/dateName.d.ts.map +1 -1
  740. package/dist/core/components/viewers/map/utils/dateName.js.map +1 -1
  741. package/dist/core/components/viewers/map/utils/extractCoordinates.d.ts.map +1 -1
  742. package/dist/core/components/viewers/map/utils/extractCoordinates.js.map +1 -1
  743. package/dist/core/components/viewers/map/utils/fitBuildingsBounds.d.ts.map +1 -1
  744. package/dist/core/components/viewers/map/utils/fitBuildingsBounds.js.map +1 -1
  745. package/dist/core/components/viewers/map/utils/fitGeojsonBounds.d.ts.map +1 -1
  746. package/dist/core/components/viewers/map/utils/fitGeojsonBounds.js.map +1 -1
  747. package/dist/core/components/viewers/map/utils/flyToEach.d.ts.map +1 -1
  748. package/dist/core/components/viewers/map/utils/flyToEach.js.map +1 -1
  749. package/dist/core/components/viewers/map/utils/geocoder.d.ts.map +1 -1
  750. package/dist/core/components/viewers/map/utils/geocoder.js.map +1 -1
  751. package/dist/core/components/viewers/map/utils/geocoding/adapters.d.ts.map +1 -1
  752. package/dist/core/components/viewers/map/utils/geocoding/adapters.js.map +1 -1
  753. package/dist/core/components/viewers/map/utils/geocoding/config.d.ts.map +1 -1
  754. package/dist/core/components/viewers/map/utils/geocoding/config.js.map +1 -1
  755. package/dist/core/components/viewers/map/utils/geocoding/index.d.ts.map +1 -1
  756. package/dist/core/components/viewers/map/utils/geocoding/index.js.map +1 -1
  757. package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts.map +1 -1
  758. package/dist/core/components/viewers/map/utils/geocoding/osm.js.map +1 -1
  759. package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts.map +1 -1
  760. package/dist/core/components/viewers/map/utils/geocoding/pelias.js.map +1 -1
  761. package/dist/core/components/viewers/map/utils/getOsmIdFromMartin.d.ts.map +1 -1
  762. package/dist/core/components/viewers/map/utils/getOsmIdFromMartin.js.map +1 -1
  763. package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.d.ts.map +1 -1
  764. package/dist/core/components/viewers/map/utils/getOsmIdbyCoordinates.js.map +1 -1
  765. package/dist/core/components/viewers/map/utils/mapStyleCatalog.d.ts.map +1 -1
  766. package/dist/core/components/viewers/map/utils/mapStyleCatalog.js.map +1 -1
  767. package/dist/core/components/viewers/map/utils/stringToColour.d.ts.map +1 -1
  768. package/dist/core/components/viewers/map/utils/stringToColour.js.map +1 -1
  769. package/dist/core/components/viewers/map/utils/toggleBimToMap.d.ts.map +1 -1
  770. package/dist/core/components/viewers/map/utils/toggleBimToMap.js.map +1 -1
  771. package/dist/core/components/viewers/map/utils/updateBuildingOsmId.d.ts.map +1 -1
  772. package/dist/core/components/viewers/map/utils/updateBuildingOsmId.js.map +1 -1
  773. package/dist/core/components/viewers/map/utils/validateBounds.d.ts.map +1 -1
  774. package/dist/core/components/viewers/map/utils/validateBounds.js.map +1 -1
  775. package/dist/core/components/viewers/pointcloud/PointCloudToolbar.d.ts.map +1 -1
  776. package/dist/core/components/viewers/pointcloud/PointCloudToolbar.js.map +1 -1
  777. package/dist/core/components/viewers/pointcloud/PointCloudViewer.d.ts.map +1 -1
  778. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js.map +1 -1
  779. package/dist/core/components/viewers/pointcloud/define.d.ts.map +1 -1
  780. package/dist/core/components/viewers/pointcloud/define.js.map +1 -1
  781. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.d.ts.map +1 -1
  782. package/dist/core/components/viewers/pointcloud/src/PointCloudLoadingState/index.js.map +1 -1
  783. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.d.ts.map +1 -1
  784. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudManagementTable.js.map +1 -1
  785. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.d.ts.map +1 -1
  786. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudTable.js.map +1 -1
  787. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.d.ts.map +1 -1
  788. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudUploadPanel.js.map +1 -1
  789. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/TabSelector.d.ts.map +1 -1
  790. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/TabSelector.js.map +1 -1
  791. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.d.ts.map +1 -1
  792. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/index.js.map +1 -1
  793. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.d.ts.map +1 -1
  794. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js.map +1 -1
  795. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  796. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  797. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts.map +1 -1
  798. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js.map +1 -1
  799. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/index.d.ts.map +1 -1
  800. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/index.js.map +1 -1
  801. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/CameraSettings.d.ts.map +1 -1
  802. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/CameraSettings.js.map +1 -1
  803. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/GridManagement.d.ts.map +1 -1
  804. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/GridManagement.js.map +1 -1
  805. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/PerformanceSettings.d.ts.map +1 -1
  806. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/SettingsTab/src/PerformanceSettings.js.map +1 -1
  807. package/dist/core/components/viewers/pointcloud/src/ViewportGizmo.d.ts.map +1 -1
  808. package/dist/core/components/viewers/pointcloud/src/ViewportGizmo.js.map +1 -1
  809. package/dist/core/components/viewers/pointcloud/src/tools/ClippingTools/ClippingTool.d.ts.map +1 -1
  810. package/dist/core/components/viewers/pointcloud/src/tools/ClippingTools/ClippingTool.js.map +1 -1
  811. package/dist/core/components/viewers/pointcloud/src/tools/FitToScreen.d.ts.map +1 -1
  812. package/dist/core/components/viewers/pointcloud/src/tools/FitToScreen.js.map +1 -1
  813. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AngleMeasurement.d.ts.map +1 -1
  814. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AngleMeasurement.js.map +1 -1
  815. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AreaMeasurement.d.ts.map +1 -1
  816. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/AreaMeasurement.js.map +1 -1
  817. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/LineMeasurement.d.ts.map +1 -1
  818. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/LineMeasurement.js.map +1 -1
  819. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/MeasurePointCloudTool.d.ts.map +1 -1
  820. package/dist/core/components/viewers/pointcloud/src/tools/MeasureTools/MeasurePointCloudTool.js.map +1 -1
  821. package/dist/core/components/viewers/pointcloud/src/tools/PCSearchTool.d.ts.map +1 -1
  822. package/dist/core/components/viewers/pointcloud/src/tools/PCSearchTool.js.map +1 -1
  823. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.d.ts.map +1 -1
  824. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.js.map +1 -1
  825. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PerformanceSettingTools.d.ts.map +1 -1
  826. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PerformanceSettingTools.js.map +1 -1
  827. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PointBudgetTool.d.ts.map +1 -1
  828. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/PointBudgetTool.js.map +1 -1
  829. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/ShowOctreeBoxTool.d.ts.map +1 -1
  830. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/ShowOctreeBoxTool.js.map +1 -1
  831. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/SplatQualitySelection.d.ts.map +1 -1
  832. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/SplatQualitySelection.js.map +1 -1
  833. package/dist/core/components/viewers/pointcloud/src/tools/SetCameraOption.d.ts.map +1 -1
  834. package/dist/core/components/viewers/pointcloud/src/tools/SetCameraOption.js.map +1 -1
  835. package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/index.d.ts.map +1 -1
  836. package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/index.js.map +1 -1
  837. package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/src/getCameraPosition.d.ts.map +1 -1
  838. package/dist/core/components/viewers/pointcloud/src/tools/SharePointCloudTool/src/getCameraPosition.js.map +1 -1
  839. package/dist/core/components/viewers/pointcloud/src/tools/index.d.ts.map +1 -1
  840. package/dist/core/components/viewers/pointcloud/src/tools/index.js.map +1 -1
  841. package/dist/core/components/viewers/pointcloud/src/tools/pointcloudToolbarTools.d.ts.map +1 -1
  842. package/dist/core/components/viewers/pointcloud/src/tools/pointcloudToolbarTools.js.map +1 -1
  843. package/dist/core/components/viewers/pointcloud/utils/potreeLoader.d.ts.map +1 -1
  844. package/dist/core/components/viewers/pointcloud/utils/potreeLoader.js.map +1 -1
  845. package/dist/core/components/viewers/pointcloud/utils/restoreCameraFromUrl.d.ts.map +1 -1
  846. package/dist/core/components/viewers/pointcloud/utils/restoreCameraFromUrl.js.map +1 -1
  847. package/dist/core/components/viewers/useCoordinateSystem.d.ts.map +1 -1
  848. package/dist/core/components/viewers/useCoordinateSystem.js.map +1 -1
  849. package/dist/core/hooks/buildings/buildings.d.ts.map +1 -1
  850. package/dist/core/hooks/buildings/buildings.js.map +1 -1
  851. package/dist/core/hooks/buildings/createBuildingHooks.d.ts.map +1 -1
  852. package/dist/core/hooks/buildings/createBuildingHooks.js.map +1 -1
  853. package/dist/core/hooks/comments/comments.d.ts.map +1 -1
  854. package/dist/core/hooks/comments/comments.js.map +1 -1
  855. package/dist/core/hooks/comments/createCommentHooks.d.ts.map +1 -1
  856. package/dist/core/hooks/comments/createCommentHooks.js.map +1 -1
  857. package/dist/core/hooks/files/createFileHooks.d.ts.map +1 -1
  858. package/dist/core/hooks/files/createFileHooks.js.map +1 -1
  859. package/dist/core/hooks/files/files.d.ts.map +1 -1
  860. package/dist/core/hooks/files/files.js.map +1 -1
  861. package/dist/core/hooks/index.d.ts.map +1 -1
  862. package/dist/core/hooks/index.js.map +1 -1
  863. package/dist/core/hooks/infrastructures/createInfrastructureHooks.d.ts.map +1 -1
  864. package/dist/core/hooks/infrastructures/createInfrastructureHooks.js.map +1 -1
  865. package/dist/core/hooks/infrastructures/infrastructures.d.ts.map +1 -1
  866. package/dist/core/hooks/infrastructures/infrastructures.js.map +1 -1
  867. package/dist/core/hooks/openDataPortals/createOpenDataPortalHooks.d.ts.map +1 -1
  868. package/dist/core/hooks/openDataPortals/createOpenDataPortalHooks.js.map +1 -1
  869. package/dist/core/hooks/openDataPortals/openDataPortals.d.ts.map +1 -1
  870. package/dist/core/hooks/openDataPortals/openDataPortals.js.map +1 -1
  871. package/dist/core/hooks/organizations/createOrganizationHooks.d.ts.map +1 -1
  872. package/dist/core/hooks/organizations/createOrganizationHooks.js.map +1 -1
  873. package/dist/core/hooks/organizations/organizations.d.ts.map +1 -1
  874. package/dist/core/hooks/organizations/organizations.js.map +1 -1
  875. package/dist/core/hooks/ports/apiAdapter.d.ts.map +1 -1
  876. package/dist/core/hooks/provider.d.ts.map +1 -1
  877. package/dist/core/hooks/provider.js.map +1 -1
  878. package/dist/core/hooks/sensorTypes/createSensorTypeHooks.d.ts.map +1 -1
  879. package/dist/core/hooks/sensorTypes/createSensorTypeHooks.js.map +1 -1
  880. package/dist/core/hooks/sensorTypes/sensorTypes.d.ts.map +1 -1
  881. package/dist/core/hooks/sensorTypes/sensorTypes.js.map +1 -1
  882. package/dist/core/hooks/sensors/createSensorHooks.d.ts.map +1 -1
  883. package/dist/core/hooks/sensors/createSensorHooks.js.map +1 -1
  884. package/dist/core/hooks/sensors/sensors.d.ts.map +1 -1
  885. package/dist/core/hooks/sensors/sensors.js.map +1 -1
  886. package/dist/core/hooks/sites/createSiteHooks.d.ts.map +1 -1
  887. package/dist/core/hooks/sites/createSiteHooks.js.map +1 -1
  888. package/dist/core/hooks/sites/sites.d.ts.map +1 -1
  889. package/dist/core/hooks/sites/sites.js.map +1 -1
  890. package/dist/core/hooks/ui/use-mobile.d.ts.map +1 -1
  891. package/dist/core/hooks/ui/use-mobile.js.map +1 -1
  892. package/dist/core/hooks/users/createUserHooks.d.ts.map +1 -1
  893. package/dist/core/hooks/users/createUserHooks.js.map +1 -1
  894. package/dist/core/hooks/users/users.d.ts.map +1 -1
  895. package/dist/core/hooks/users/users.js.map +1 -1
  896. package/dist/core/index.d.ts.map +1 -1
  897. package/dist/core/index.js.map +1 -1
  898. package/dist/core/plugins/host/context.d.ts.map +1 -1
  899. package/dist/core/plugins/host/context.js.map +1 -1
  900. package/dist/core/plugins/host/errors.d.ts.map +1 -1
  901. package/dist/core/plugins/host/errors.js.map +1 -1
  902. package/dist/core/plugins/host/host.d.ts.map +1 -1
  903. package/dist/core/plugins/host/host.js.map +1 -1
  904. package/dist/core/plugins/host/provider.d.ts.map +1 -1
  905. package/dist/core/plugins/host/provider.js.map +1 -1
  906. package/dist/core/plugins/host/registry.d.ts.map +1 -1
  907. package/dist/core/plugins/host/registry.js.map +1 -1
  908. package/dist/core/plugins/installed.d.ts.map +1 -1
  909. package/dist/core/plugins/installed.js.map +1 -1
  910. package/dist/core/plugins/sdk/components.d.ts.map +1 -1
  911. package/dist/core/plugins/sdk/components.js.map +1 -1
  912. package/dist/core/plugins/sdk/index.d.ts.map +1 -1
  913. package/dist/core/plugins/sdk/index.js.map +1 -1
  914. package/dist/core/plugins/sdk/types.d.ts.map +1 -1
  915. package/dist/core/plugins/sdk/types.js.map +1 -1
  916. package/dist/core/store/ActionMap.d.ts.map +1 -1
  917. package/dist/core/store/AppConfig/context.d.ts.map +1 -1
  918. package/dist/core/store/AppConfig/context.js.map +1 -1
  919. package/dist/core/store/AppConfig/reducer.d.ts.map +1 -1
  920. package/dist/core/store/AppConfig/reducer.js.map +1 -1
  921. package/dist/core/store/BIM/context.d.ts.map +1 -1
  922. package/dist/core/store/BIM/context.js.map +1 -1
  923. package/dist/core/store/BIM/reducer.d.ts.map +1 -1
  924. package/dist/core/store/BIM/reducer.js.map +1 -1
  925. package/dist/core/store/Buildings/context.d.ts.map +1 -1
  926. package/dist/core/store/Buildings/context.js.map +1 -1
  927. package/dist/core/store/Buildings/reducer.d.ts.map +1 -1
  928. package/dist/core/store/Buildings/reducer.js.map +1 -1
  929. package/dist/core/store/CombineProviders.d.ts.map +1 -1
  930. package/dist/core/store/CombineProviders.js.map +1 -1
  931. package/dist/core/store/Content/context.d.ts.map +1 -1
  932. package/dist/core/store/Content/context.js.map +1 -1
  933. package/dist/core/store/Datasets/context.d.ts.map +1 -1
  934. package/dist/core/store/Datasets/context.js.map +1 -1
  935. package/dist/core/store/Datasets/reducer.d.ts.map +1 -1
  936. package/dist/core/store/Datasets/reducer.js.map +1 -1
  937. package/dist/core/store/Files/context.d.ts.map +1 -1
  938. package/dist/core/store/Files/context.js.map +1 -1
  939. package/dist/core/store/Files/reducer.d.ts.map +1 -1
  940. package/dist/core/store/Files/reducer.js.map +1 -1
  941. package/dist/core/store/Map/context.d.ts.map +1 -1
  942. package/dist/core/store/Map/context.js.map +1 -1
  943. package/dist/core/store/Map/reducer.d.ts.map +1 -1
  944. package/dist/core/store/Map/reducer.js.map +1 -1
  945. package/dist/core/store/Menus/context.d.ts.map +1 -1
  946. package/dist/core/store/Menus/context.js.map +1 -1
  947. package/dist/core/store/Menus/reducer.d.ts.map +1 -1
  948. package/dist/core/store/Menus/reducer.js.map +1 -1
  949. package/dist/core/store/Permissions/context.d.ts.map +1 -1
  950. package/dist/core/store/Permissions/context.js.map +1 -1
  951. package/dist/core/store/PointCloud/context.d.ts.map +1 -1
  952. package/dist/core/store/PointCloud/context.js.map +1 -1
  953. package/dist/core/store/PointCloud/reducer.d.ts.map +1 -1
  954. package/dist/core/store/PointCloud/reducer.js.map +1 -1
  955. package/dist/core/store/Tools/context.d.ts.map +1 -1
  956. package/dist/core/store/Tools/context.js.map +1 -1
  957. package/dist/core/store/Tools/reducer.d.ts.map +1 -1
  958. package/dist/core/store/Tools/reducer.js.map +1 -1
  959. package/dist/core/store/index.d.ts.map +1 -1
  960. package/dist/core/store/index.js.map +1 -1
  961. package/dist/core/styles/tailwindMerge.d.ts.map +1 -1
  962. package/dist/core/styles/tailwindMerge.js.map +1 -1
  963. package/dist/core/types/bim.d.ts.map +1 -1
  964. package/dist/core/types/datasetTypes.d.ts.map +1 -1
  965. package/dist/core/types/dbTypes.d.ts.map +1 -1
  966. package/dist/core/types/dbTypes.js.map +1 -1
  967. package/dist/core/types/files.d.ts.map +1 -1
  968. package/dist/core/types/global.d.ts.map +1 -1
  969. package/dist/core/types/global.js.map +1 -1
  970. package/dist/core/types/index.d.ts.map +1 -1
  971. package/dist/core/types/index.js.map +1 -1
  972. package/dist/core/types/map.d.ts.map +1 -1
  973. package/dist/core/types/martinTypes.d.ts.map +1 -1
  974. package/dist/core/types/martinTypes.js.map +1 -1
  975. package/dist/core/types/next-auth.d.ts.map +1 -1
  976. package/dist/core/types/tools.d.ts.map +1 -1
  977. package/dist/core/types/users.d.ts.map +1 -1
  978. package/dist/core/utils/acceptedFiles.d.ts.map +1 -1
  979. package/dist/core/utils/acceptedFiles.js.map +1 -1
  980. package/dist/core/utils/errorHandler.d.ts.map +1 -1
  981. package/dist/core/utils/errorHandler.js.map +1 -1
  982. package/dist/core/utils/getFileIcon.d.ts.map +1 -1
  983. package/dist/core/utils/getFileIcon.js.map +1 -1
  984. package/dist/core/utils/imageUtils.d.ts.map +1 -1
  985. package/dist/core/utils/imageUtils.js.map +1 -1
  986. package/dist/core/utils/index.d.ts.map +1 -1
  987. package/dist/core/utils/index.js.map +1 -1
  988. package/dist/core/utils/markerUtils.d.ts.map +1 -1
  989. package/dist/core/utils/markerUtils.js.map +1 -1
  990. package/dist/core/utils/memcache.d.ts.map +1 -1
  991. package/dist/core/utils/memcache.js.map +1 -1
  992. package/dist/core/utils/roles.d.ts.map +1 -1
  993. package/dist/core/utils/roles.js.map +1 -1
  994. package/dist/core/utils/timeUtils.d.ts.map +1 -1
  995. package/dist/core/utils/timeUtils.js.map +1 -1
  996. package/dist/core/utils/utils.d.ts.map +1 -1
  997. package/dist/core/utils/utils.js.map +1 -1
  998. package/dist/index.d.ts.map +1 -1
  999. package/dist/index.js.map +1 -1
  1000. package/package.json +6 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/ElevationsTool/index.ts"],"sourcesContent":["import * as OBC from '@thatopen/components'\r\nimport * as OBF from '@thatopen/components-front'\r\nimport * as THREE from 'three'\r\nimport { CurrentWorld } from '../CurrentWorld'\r\nimport { CameraController } from '../lib/CameraController'\r\nimport { CategoryHighlighter, StageEmitter } from '../lib/CategoryHighlighter'\r\nimport { ChromeController } from '../lib/ChromeController'\r\nimport { ClipController } from '../lib/ClipController'\r\nimport { disposeDrawing } from '../lib/drawingProjection'\r\nimport { GridController } from '../lib/GridController'\r\nimport { safeRun, safeRunAsync } from '../lib/safeRun'\r\nimport { stagePercent } from '../lib/viewSection'\r\nimport { ViewModeCoordinator } from '../lib/ViewModeCoordinator'\r\nimport { ElevationProjector } from './src/ElevationProjector'\r\nimport {\r\n ELEVATION_STAGE_PERCENT,\r\n ELEVATIONS_TOOL_UUID,\r\n ElevationEntry,\r\n ElevationLoadingStage,\r\n ElevationLoadingState,\r\n} from './src/types'\r\n\r\nexport type {\r\n ElevationEntry,\r\n ElevationLoadingStage,\r\n ElevationLoadingState,\r\n} from './src/types'\r\n\r\nexport function getElevationStagePercent(\r\n stage: ElevationLoadingStage | undefined,\r\n): number {\r\n return stagePercent(stage, ELEVATION_STAGE_PERCENT)\r\n}\r\n\r\nconst SLOT_SECTION = 'elevation:section'\r\n\r\n/**\r\n * Elevation drawings (N/S/E/W) per loaded model, built on the same\r\n * DrawingEditor + TechnicalDrawings pipeline as FloorplanTool. Activate\r\n * runs in stages — init → resolve → cull → project → done — so the\r\n * sidebar can show a progress bar and the user gets immediate camera\r\n * framing while the slow projection runs in the background.\r\n *\r\n * The model itself is hidden during the elevation view so projected lines\r\n * from front and back of the building both read clearly. Style each IFC\r\n * class via the per-class drawing layers (visibility + color in the\r\n * sidebar).\r\n */\r\nexport class ElevationsTool extends OBC.Component {\r\n static uuid = ELEVATIONS_TOOL_UUID\r\n\r\n enabled = false\r\n\r\n readonly onElevationsChanged = new OBC.Event<ElevationEntry[]>()\r\n readonly onActiveChanged = new OBC.Event<ElevationEntry | null>()\r\n readonly onLoadingStateChanged = new OBC.Event<ElevationLoadingState>()\r\n /** Fires whenever an entry's layer metadata changes (toggle / color). */\r\n readonly onLayersChanged = new OBC.Event<ElevationEntry>()\r\n\r\n private _entries = new Map<string, ElevationEntry>()\r\n private _activeId: string | null = null\r\n private _activateSeq = 0\r\n\r\n private projector: ElevationProjector\r\n private highlighter: CategoryHighlighter\r\n private camera: CameraController\r\n private chrome: ChromeController\r\n private clip: ClipController\r\n private grid: GridController\r\n\r\n constructor(components: OBC.Components) {\r\n super(components)\r\n components.add(ElevationsTool.uuid, this)\r\n\r\n this.projector = new ElevationProjector(components)\r\n this.camera = new CameraController(components)\r\n this.chrome = new ChromeController(components)\r\n this.clip = new ClipController(components)\r\n this.grid = new GridController(components)\r\n // No face-fill groups: the cull pass hides the whole model, then the\r\n // line projection paints on top of an empty scene. Filling front faces\r\n // (the previous behaviour) was occluding back-of-building elements,\r\n // which the user wanted to see in elevation. Only the projected lines\r\n // remain visible — the per-IFC-class drawing layers are how the user\r\n // styles them.\r\n this.highlighter = new CategoryHighlighter(components, {\r\n groups: [],\r\n })\r\n\r\n const fragments = components.get(OBC.FragmentsManager)\r\n fragments.core.onModelLoaded.add((model) => {\r\n void this.generate(model.modelId)\r\n })\r\n }\r\n\r\n get elevations(): ElevationEntry[] {\r\n return [...this._entries.values()]\r\n }\r\n\r\n get activeId(): string | null {\r\n return this._activeId\r\n }\r\n\r\n get activeElevation(): ElevationEntry | null {\r\n if (!this._activeId) return null\r\n return this._entries.get(this._activeId) ?? null\r\n }\r\n\r\n /** Inject the world grid (typically `bimState.bim.grid`). Without this\r\n * the tool falls back to looking it up via `OBC.Grids`. */\r\n setGrid(grid: any | null) {\r\n this.grid.setGrid(grid)\r\n }\r\n\r\n /** Toggle visibility of a single per-class layer on an entry's drawing. */\r\n setLayerVisible(entryId: string, className: string, visible: boolean) {\r\n const entry = this._entries.get(entryId)\r\n if (!entry?.drawing || !entry.drawing.layers.has(className)) return\r\n entry.drawing.layers.setVisibility(className, visible)\r\n const meta = entry.layers.find((l) => l.className === className)\r\n if (meta) meta.visible = visible\r\n this._requestUpdate()\r\n this.onLayersChanged.trigger(entry)\r\n }\r\n\r\n /** Update the color (hex int, e.g. 0xff0000) of a per-class layer. */\r\n setLayerColor(entryId: string, className: string, color: number) {\r\n const entry = this._entries.get(entryId)\r\n if (!entry?.drawing || !entry.drawing.layers.has(className)) return\r\n entry.drawing.layers.setColor(className, color)\r\n const meta = entry.layers.find((l) => l.className === className)\r\n if (meta) meta.color = color\r\n this._requestUpdate()\r\n this.onLayersChanged.trigger(entry)\r\n }\r\n\r\n private _requestUpdate() {\r\n try {\r\n const fragments = this.components.get(OBC.FragmentsManager)\r\n fragments.core.update(true)\r\n } catch {\r\n // FragmentsManager not initialized yet — no-op.\r\n }\r\n }\r\n\r\n /** Build the four elevation entries for a freshly loaded model. */\r\n async generate(modelId: string): Promise<ElevationEntry[]> {\r\n const fragments = this.components.get(OBC.FragmentsManager)\r\n const model = fragments.list.get(modelId)\r\n if (!model) return []\r\n const sourceWorld = this.components.get(CurrentWorld).world\r\n if (!sourceWorld) return []\r\n\r\n this._emit({ isLoading: true, stage: 'readingModel' })\r\n try {\r\n this.disposeEntriesForModel(modelId)\r\n await this.projector.ensureEditorReady()\r\n\r\n const created = this.projector.buildEntries(modelId, model.box)\r\n for (const entry of created) this._entries.set(entry.id, entry)\r\n\r\n this.onElevationsChanged.trigger(this.elevations)\r\n return created\r\n } finally {\r\n this._emit({ isLoading: false })\r\n }\r\n }\r\n\r\n /**\r\n * Activate an elevation: chrome + section clip + camera frame applied\r\n * synchronously for instant feedback, then face-highlighting and line\r\n * projection run in parallel with stage events.\r\n */\r\n async activate(id: string) {\r\n const entry = this._entries.get(id)\r\n if (!entry) return\r\n if (this._activeId === id) return\r\n\r\n const sourceWorld = this.components.get(CurrentWorld).world\r\n if (!sourceWorld) return\r\n\r\n const seq = ++this._activateSeq\r\n const wasActive = this._activeId !== null\r\n\r\n this._emit({ isLoading: true, stage: 'init' })\r\n\r\n // Mutual exclusion: deactivate any other view tool before claiming.\r\n await this._tryClaimCoordinator()\r\n if (seq !== this._activateSeq) return\r\n\r\n try {\r\n // ----- Phase 1: synchronous chrome + clip + camera (instant) -----\r\n if (!wasActive) {\r\n this.chrome.applyLighting()\r\n // Lock to side-on (polar = π/2 = horizontal).\r\n this.camera.lock(Math.PI / 2)\r\n this.chrome.setCursor()\r\n this.chrome.disableHighlighter()\r\n this.chrome.hideGizmo()\r\n }\r\n\r\n // Section clip just behind the drawing plane so we don't see the\r\n // far side of the building bleeding through.\r\n const clipNormal = entry.viewDirection.clone().negate()\r\n const clipPoint = entry.position.clone().addScaledVector(clipNormal, -0.05)\r\n this.clip.set(SLOT_SECTION, clipNormal, clipPoint)\r\n\r\n safeRun(() => this.grid.hide(), 'hideGrid')\r\n\r\n // Hide previously visible drawings so they don't bleed through.\r\n for (const other of this._entries.values()) {\r\n if (other.drawing && other.id !== entry.id) {\r\n other.drawing.three.visible = false\r\n }\r\n }\r\n\r\n this._frameCamera(entry)\r\n\r\n this._activeId = id\r\n this.onActiveChanged.trigger(entry)\r\n\r\n // ----- Phase 2: parallel render + project (slow) -----\r\n const renderPromise = this.highlighter.apply(\r\n entry.id,\r\n async () => ({ modelId: entry.modelId, filterIds: null }),\r\n ((stage: string) => {\r\n if (seq !== this._activateSeq) return\r\n this._emit({\r\n isLoading: true,\r\n stage: stage as ElevationLoadingStage,\r\n })\r\n }) as StageEmitter,\r\n )\r\n const projectPromise = this.projector.project(entry)\r\n\r\n renderPromise\r\n .then(() => {\r\n if (seq !== this._activateSeq) return\r\n this._emit({ isLoading: true, stage: 'project' })\r\n })\r\n .catch(() => {})\r\n\r\n await Promise.all([renderPromise, projectPromise])\r\n if (seq !== this._activateSeq) return\r\n\r\n const editor = this.components.get(OBF.DrawingEditor)\r\n editor.activeDrawing = entry.drawing\r\n if (entry.drawing) entry.drawing.three.visible = true\r\n\r\n this._emit({ isLoading: false, stage: 'done' })\r\n } catch (error) {\r\n console.warn('[ElevationsTool] activate failed:', error)\r\n this._emit({ isLoading: false })\r\n }\r\n }\r\n\r\n /** Robust exit. Each cleanup step runs independently so a failure in one\r\n * cannot strand the camera, lighting, or clip state. */\r\n async deactivate() {\r\n if (!this._activeId) return\r\n\r\n this._activeId = null\r\n this.onActiveChanged.trigger(null)\r\n\r\n safeRun(() => {\r\n const editor = this.components.get(OBF.DrawingEditor)\r\n editor.activeDrawing = null\r\n }, 'clear active drawing')\r\n\r\n for (const entry of this._entries.values()) {\r\n if (entry.drawing) {\r\n safeRun(() => {\r\n entry.drawing!.three.visible = false\r\n }, 'hide drawing')\r\n }\r\n }\r\n\r\n safeRun(() => this.clip.removeAll(), 'removeClips')\r\n safeRun(() => this.grid.restore(), 'showGrid')\r\n safeRun(() => this.camera.unlock(), 'unlockCamera')\r\n safeRun(() => this.chrome.restoreCursor(), 'restoreCursor')\r\n safeRun(() => this.chrome.restoreHighlighter(), 'restoreHighlighter')\r\n safeRun(() => this.chrome.showGizmo(), 'showGizmo')\r\n safeRun(() => this.chrome.removeLighting(), 'removeLighting')\r\n\r\n await safeRunAsync(\r\n () => this.highlighter.restore(),\r\n 'restoreModelRendering',\r\n )\r\n\r\n safeRun(() => this._releaseCoordinator(), 'releaseCoordinator')\r\n }\r\n\r\n disposeEntriesForModel(modelId: string) {\r\n let touched = false\r\n for (const [id, entry] of this._entries) {\r\n if (entry.modelId !== modelId) continue\r\n if (this._activeId === id) void this.deactivate()\r\n disposeDrawing(this.components, entry.drawing)\r\n this._entries.delete(id)\r\n this.highlighter.invalidateForEntry(id)\r\n touched = true\r\n }\r\n this.highlighter.invalidateForModel(modelId)\r\n if (touched) this.onElevationsChanged.trigger(this.elevations)\r\n }\r\n\r\n dispose() {\r\n void this.deactivate()\r\n for (const entry of this._entries.values()) {\r\n disposeDrawing(this.components, entry.drawing)\r\n }\r\n this._entries.clear()\r\n this.onElevationsChanged.trigger([])\r\n }\r\n\r\n private _frameCamera(entry: ElevationEntry) {\r\n const center = new THREE.Vector3()\r\n const size = new THREE.Vector3()\r\n entry.modelBox.getCenter(center)\r\n entry.modelBox.getSize(size)\r\n const span = Math.max(size.x, size.y, size.z, 10)\r\n this.camera.frame(center, entry.viewDirection, span)\r\n }\r\n\r\n private _emit(state: ElevationLoadingState) {\r\n this.onLoadingStateChanged.trigger(state)\r\n }\r\n\r\n /** Mutual-exclusion claim. If FloorplanTool (or any other view tool)\r\n * was active, the coordinator awaits its deactivate() first. */\r\n private async _tryClaimCoordinator() {\r\n try {\r\n const coordinator = this.components.get(ViewModeCoordinator)\r\n await coordinator.claim(this)\r\n } catch {\r\n // ViewModeCoordinator not registered in this viewer — ignore.\r\n }\r\n }\r\n\r\n private _releaseCoordinator() {\r\n try {\r\n this.components.get(ViewModeCoordinator).release(this)\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/ElevationsTool/index.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as OBC from '@thatopen/components'\r\nimport * as OBF from '@thatopen/components-front'\r\nimport * as THREE from 'three'\r\nimport { CurrentWorld } from '../CurrentWorld'\r\nimport { CameraController } from '../lib/CameraController'\r\nimport { CategoryHighlighter, StageEmitter } from '../lib/CategoryHighlighter'\r\nimport { ChromeController } from '../lib/ChromeController'\r\nimport { ClipController } from '../lib/ClipController'\r\nimport { disposeDrawing } from '../lib/drawingProjection'\r\nimport { GridController } from '../lib/GridController'\r\nimport { safeRun, safeRunAsync } from '../lib/safeRun'\r\nimport { stagePercent } from '../lib/viewSection'\r\nimport { ViewModeCoordinator } from '../lib/ViewModeCoordinator'\r\nimport { ElevationProjector } from './src/ElevationProjector'\r\nimport {\r\n ELEVATION_STAGE_PERCENT,\r\n ELEVATIONS_TOOL_UUID,\r\n ElevationEntry,\r\n ElevationLoadingStage,\r\n ElevationLoadingState,\r\n} from './src/types'\r\n\r\nexport type {\r\n ElevationEntry,\r\n ElevationLoadingStage,\r\n ElevationLoadingState,\r\n} from './src/types'\r\n\r\nexport function getElevationStagePercent(\r\n stage: ElevationLoadingStage | undefined,\r\n): number {\r\n return stagePercent(stage, ELEVATION_STAGE_PERCENT)\r\n}\r\n\r\nconst SLOT_SECTION = 'elevation:section'\r\n\r\n/**\r\n * Elevation drawings (N/S/E/W) per loaded model, built on the same\r\n * DrawingEditor + TechnicalDrawings pipeline as FloorplanTool. Activate\r\n * runs in stages — init → resolve → cull → project → done — so the\r\n * sidebar can show a progress bar and the user gets immediate camera\r\n * framing while the slow projection runs in the background.\r\n *\r\n * The model itself is hidden during the elevation view so projected lines\r\n * from front and back of the building both read clearly. Style each IFC\r\n * class via the per-class drawing layers (visibility + color in the\r\n * sidebar).\r\n */\r\nexport class ElevationsTool extends OBC.Component {\r\n static uuid = ELEVATIONS_TOOL_UUID\r\n\r\n enabled = false\r\n\r\n readonly onElevationsChanged = new OBC.Event<ElevationEntry[]>()\r\n readonly onActiveChanged = new OBC.Event<ElevationEntry | null>()\r\n readonly onLoadingStateChanged = new OBC.Event<ElevationLoadingState>()\r\n /** Fires whenever an entry's layer metadata changes (toggle / color). */\r\n readonly onLayersChanged = new OBC.Event<ElevationEntry>()\r\n\r\n private _entries = new Map<string, ElevationEntry>()\r\n private _activeId: string | null = null\r\n private _activateSeq = 0\r\n\r\n private projector: ElevationProjector\r\n private highlighter: CategoryHighlighter\r\n private camera: CameraController\r\n private chrome: ChromeController\r\n private clip: ClipController\r\n private grid: GridController\r\n\r\n constructor(components: OBC.Components) {\r\n super(components)\r\n components.add(ElevationsTool.uuid, this)\r\n\r\n this.projector = new ElevationProjector(components)\r\n this.camera = new CameraController(components)\r\n this.chrome = new ChromeController(components)\r\n this.clip = new ClipController(components)\r\n this.grid = new GridController(components)\r\n // No face-fill groups: the cull pass hides the whole model, then the\r\n // line projection paints on top of an empty scene. Filling front faces\r\n // (the previous behaviour) was occluding back-of-building elements,\r\n // which the user wanted to see in elevation. Only the projected lines\r\n // remain visible — the per-IFC-class drawing layers are how the user\r\n // styles them.\r\n this.highlighter = new CategoryHighlighter(components, {\r\n groups: [],\r\n })\r\n\r\n const fragments = components.get(OBC.FragmentsManager)\r\n fragments.core.onModelLoaded.add((model) => {\r\n void this.generate(model.modelId)\r\n })\r\n }\r\n\r\n get elevations(): ElevationEntry[] {\r\n return [...this._entries.values()]\r\n }\r\n\r\n get activeId(): string | null {\r\n return this._activeId\r\n }\r\n\r\n get activeElevation(): ElevationEntry | null {\r\n if (!this._activeId) return null\r\n return this._entries.get(this._activeId) ?? null\r\n }\r\n\r\n /** Inject the world grid (typically `bimState.bim.grid`). Without this\r\n * the tool falls back to looking it up via `OBC.Grids`. */\r\n setGrid(grid: any | null) {\r\n this.grid.setGrid(grid)\r\n }\r\n\r\n /** Toggle visibility of a single per-class layer on an entry's drawing. */\r\n setLayerVisible(entryId: string, className: string, visible: boolean) {\r\n const entry = this._entries.get(entryId)\r\n if (!entry?.drawing || !entry.drawing.layers.has(className)) return\r\n entry.drawing.layers.setVisibility(className, visible)\r\n const meta = entry.layers.find((l) => l.className === className)\r\n if (meta) meta.visible = visible\r\n this._requestUpdate()\r\n this.onLayersChanged.trigger(entry)\r\n }\r\n\r\n /** Update the color (hex int, e.g. 0xff0000) of a per-class layer. */\r\n setLayerColor(entryId: string, className: string, color: number) {\r\n const entry = this._entries.get(entryId)\r\n if (!entry?.drawing || !entry.drawing.layers.has(className)) return\r\n entry.drawing.layers.setColor(className, color)\r\n const meta = entry.layers.find((l) => l.className === className)\r\n if (meta) meta.color = color\r\n this._requestUpdate()\r\n this.onLayersChanged.trigger(entry)\r\n }\r\n\r\n private _requestUpdate() {\r\n try {\r\n const fragments = this.components.get(OBC.FragmentsManager)\r\n fragments.core.update(true)\r\n } catch {\r\n // FragmentsManager not initialized yet — no-op.\r\n }\r\n }\r\n\r\n /** Build the four elevation entries for a freshly loaded model. */\r\n async generate(modelId: string): Promise<ElevationEntry[]> {\r\n const fragments = this.components.get(OBC.FragmentsManager)\r\n const model = fragments.list.get(modelId)\r\n if (!model) return []\r\n const sourceWorld = this.components.get(CurrentWorld).world\r\n if (!sourceWorld) return []\r\n\r\n this._emit({ isLoading: true, stage: 'readingModel' })\r\n try {\r\n this.disposeEntriesForModel(modelId)\r\n await this.projector.ensureEditorReady()\r\n\r\n const created = this.projector.buildEntries(modelId, model.box)\r\n for (const entry of created) this._entries.set(entry.id, entry)\r\n\r\n this.onElevationsChanged.trigger(this.elevations)\r\n return created\r\n } finally {\r\n this._emit({ isLoading: false })\r\n }\r\n }\r\n\r\n /**\r\n * Activate an elevation: chrome + section clip + camera frame applied\r\n * synchronously for instant feedback, then face-highlighting and line\r\n * projection run in parallel with stage events.\r\n */\r\n async activate(id: string) {\r\n const entry = this._entries.get(id)\r\n if (!entry) return\r\n if (this._activeId === id) return\r\n\r\n const sourceWorld = this.components.get(CurrentWorld).world\r\n if (!sourceWorld) return\r\n\r\n const seq = ++this._activateSeq\r\n const wasActive = this._activeId !== null\r\n\r\n this._emit({ isLoading: true, stage: 'init' })\r\n\r\n // Mutual exclusion: deactivate any other view tool before claiming.\r\n await this._tryClaimCoordinator()\r\n if (seq !== this._activateSeq) return\r\n\r\n try {\r\n // ----- Phase 1: synchronous chrome + clip + camera (instant) -----\r\n if (!wasActive) {\r\n this.chrome.applyLighting()\r\n // Lock to side-on (polar = π/2 = horizontal).\r\n this.camera.lock(Math.PI / 2)\r\n this.chrome.setCursor()\r\n this.chrome.disableHighlighter()\r\n this.chrome.hideGizmo()\r\n }\r\n\r\n // Section clip just behind the drawing plane so we don't see the\r\n // far side of the building bleeding through.\r\n const clipNormal = entry.viewDirection.clone().negate()\r\n const clipPoint = entry.position.clone().addScaledVector(clipNormal, -0.05)\r\n this.clip.set(SLOT_SECTION, clipNormal, clipPoint)\r\n\r\n safeRun(() => this.grid.hide(), 'hideGrid')\r\n\r\n // Hide previously visible drawings so they don't bleed through.\r\n for (const other of this._entries.values()) {\r\n if (other.drawing && other.id !== entry.id) {\r\n other.drawing.three.visible = false\r\n }\r\n }\r\n\r\n this._frameCamera(entry)\r\n\r\n this._activeId = id\r\n this.onActiveChanged.trigger(entry)\r\n\r\n // ----- Phase 2: parallel render + project (slow) -----\r\n const renderPromise = this.highlighter.apply(\r\n entry.id,\r\n async () => ({ modelId: entry.modelId, filterIds: null }),\r\n ((stage: string) => {\r\n if (seq !== this._activateSeq) return\r\n this._emit({\r\n isLoading: true,\r\n stage: stage as ElevationLoadingStage,\r\n })\r\n }) as StageEmitter,\r\n )\r\n const projectPromise = this.projector.project(entry)\r\n\r\n renderPromise\r\n .then(() => {\r\n if (seq !== this._activateSeq) return\r\n this._emit({ isLoading: true, stage: 'project' })\r\n })\r\n .catch(() => {})\r\n\r\n await Promise.all([renderPromise, projectPromise])\r\n if (seq !== this._activateSeq) return\r\n\r\n const editor = this.components.get(OBF.DrawingEditor)\r\n editor.activeDrawing = entry.drawing\r\n if (entry.drawing) entry.drawing.three.visible = true\r\n\r\n this._emit({ isLoading: false, stage: 'done' })\r\n } catch (error) {\r\n console.warn('[ElevationsTool] activate failed:', error)\r\n this._emit({ isLoading: false })\r\n }\r\n }\r\n\r\n /** Robust exit. Each cleanup step runs independently so a failure in one\r\n * cannot strand the camera, lighting, or clip state. */\r\n async deactivate() {\r\n if (!this._activeId) return\r\n\r\n this._activeId = null\r\n this.onActiveChanged.trigger(null)\r\n\r\n safeRun(() => {\r\n const editor = this.components.get(OBF.DrawingEditor)\r\n editor.activeDrawing = null\r\n }, 'clear active drawing')\r\n\r\n for (const entry of this._entries.values()) {\r\n if (entry.drawing) {\r\n safeRun(() => {\r\n entry.drawing!.three.visible = false\r\n }, 'hide drawing')\r\n }\r\n }\r\n\r\n safeRun(() => this.clip.removeAll(), 'removeClips')\r\n safeRun(() => this.grid.restore(), 'showGrid')\r\n safeRun(() => this.camera.unlock(), 'unlockCamera')\r\n safeRun(() => this.chrome.restoreCursor(), 'restoreCursor')\r\n safeRun(() => this.chrome.restoreHighlighter(), 'restoreHighlighter')\r\n safeRun(() => this.chrome.showGizmo(), 'showGizmo')\r\n safeRun(() => this.chrome.removeLighting(), 'removeLighting')\r\n\r\n await safeRunAsync(\r\n () => this.highlighter.restore(),\r\n 'restoreModelRendering',\r\n )\r\n\r\n safeRun(() => this._releaseCoordinator(), 'releaseCoordinator')\r\n }\r\n\r\n disposeEntriesForModel(modelId: string) {\r\n let touched = false\r\n for (const [id, entry] of this._entries) {\r\n if (entry.modelId !== modelId) continue\r\n if (this._activeId === id) void this.deactivate()\r\n disposeDrawing(this.components, entry.drawing)\r\n this._entries.delete(id)\r\n this.highlighter.invalidateForEntry(id)\r\n touched = true\r\n }\r\n this.highlighter.invalidateForModel(modelId)\r\n if (touched) this.onElevationsChanged.trigger(this.elevations)\r\n }\r\n\r\n dispose() {\r\n void this.deactivate()\r\n for (const entry of this._entries.values()) {\r\n disposeDrawing(this.components, entry.drawing)\r\n }\r\n this._entries.clear()\r\n this.onElevationsChanged.trigger([])\r\n }\r\n\r\n private _frameCamera(entry: ElevationEntry) {\r\n const center = new THREE.Vector3()\r\n const size = new THREE.Vector3()\r\n entry.modelBox.getCenter(center)\r\n entry.modelBox.getSize(size)\r\n const span = Math.max(size.x, size.y, size.z, 10)\r\n this.camera.frame(center, entry.viewDirection, span)\r\n }\r\n\r\n private _emit(state: ElevationLoadingState) {\r\n this.onLoadingStateChanged.trigger(state)\r\n }\r\n\r\n /** Mutual-exclusion claim. If FloorplanTool (or any other view tool)\r\n * was active, the coordinator awaits its deactivate() first. */\r\n private async _tryClaimCoordinator() {\r\n try {\r\n const coordinator = this.components.get(ViewModeCoordinator)\r\n await coordinator.claim(this)\r\n } catch {\r\n // ViewModeCoordinator not registered in this viewer — ignore.\r\n }\r\n }\r\n\r\n private _releaseCoordinator() {\r\n try {\r\n this.components.get(ViewModeCoordinator).release(this)\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"ElevationProjector.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/bim/src/ElevationsTool/src/ElevationProjector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAE3C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAS9B,OAAO,EAEL,cAAc,EACf,MAAM,SAAS,CAAA;AAiBhB;;;;;GAKG;AACH,qBAAa,kBAAkB;IAGjB,OAAO,CAAC,UAAU;IAF9B,OAAO,CAAC,YAAY,CAAoB;gBAEpB,UAAU,EAAE,GAAG,CAAC,UAAU;IAI9C,iBAAiB;IAIjB;;oBAEgB;IAChB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,GAAG,cAAc,EAAE;IA0DrE;+EAC2E;IACrE,OAAO,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAiDpD"}
1
+ {"version":3,"file":"ElevationProjector.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/bim/src/ElevationsTool/src/ElevationProjector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAE3C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAS9B,OAAO,EAEL,cAAc,EACf,MAAM,SAAS,CAAA;AAiBhB;;;;;GAKG;AACH,qBAAa,kBAAkB;IAGjB,OAAO,CAAC,UAAU;IAF9B,OAAO,CAAC,YAAY,CAAoB;gBAEpB,UAAU,EAAE,GAAG,CAAC,UAAU;IAI9C,iBAAiB;IAIjB;;oBAEgB;IAChB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,GAAG,cAAc,EAAE;IA0DrE;+EAC2E;IACrE,OAAO,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAiDpD"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../src/core/components/viewers/bim/src/ElevationsTool/src/ElevationProjector.ts"],"sourcesContent":["import * as OBC from '@thatopen/components'\r\nimport * as OBF from '@thatopen/components-front'\r\nimport * as THREE from 'three'\r\nimport {\r\n addItemsProjectionByClassOccluded,\r\n createDrawing,\r\n disableProjectorWebGPU,\r\n DrawingEditorReady,\r\n getItemIdsByClass,\r\n patchModelGeometryRepresentationIds,\r\n} from '../../lib/drawingProjection'\r\nimport {\r\n ElevationDirection,\r\n ElevationEntry,\r\n} from './types'\r\n\r\n/** Margin (m) added to the drawing plane offset and to the viewport so\r\n * the building silhouette doesn't get clipped at the edges. */\r\nconst ELEVATION_PLANE_OFFSET = 2\r\nconst ELEVATION_VIEWPORT_PADDING = 1\r\n\r\nconst DIRECTION_VIEW_VECTOR: Record<ElevationDirection, THREE.Vector3> = {\r\n // North elevation: camera north of the building, looking south.\r\n north: new THREE.Vector3(0, 0, -1),\r\n south: new THREE.Vector3(0, 0, 1),\r\n east: new THREE.Vector3(-1, 0, 0),\r\n west: new THREE.Vector3(1, 0, 0),\r\n}\r\n\r\nconst DIRECTIONS: ElevationDirection[] = ['north', 'south', 'east', 'west']\r\n\r\n/**\r\n * Builds and projects elevation drawings (N / S / E / W) for each loaded\r\n * model using the same TechnicalDrawing + DrawingEditor pipeline as\r\n * FloorplanTool's StoreyProjector. Each entry gets its own drawing,\r\n * lazily projected on first activation.\r\n */\r\nexport class ElevationProjector {\r\n private _editorReady: DrawingEditorReady\r\n\r\n constructor(private components: OBC.Components) {\r\n this._editorReady = new DrawingEditorReady(components)\r\n }\r\n\r\n ensureEditorReady() {\r\n return this._editorReady.ensure()\r\n }\r\n\r\n /** Generate four entries (N/S/E/W) for the given model from its\r\n * bounding box. Drawings are NOT projected yet — that's lazy on first\r\n * activate. */\r\n buildEntries(modelId: string, modelBox: THREE.Box3): ElevationEntry[] {\r\n if (modelBox.isEmpty()) return []\r\n\r\n const center = new THREE.Vector3()\r\n modelBox.getCenter(center)\r\n const size = new THREE.Vector3()\r\n modelBox.getSize(size)\r\n const halfX = size.x / 2 + ELEVATION_VIEWPORT_PADDING\r\n const halfY = size.y / 2 + ELEVATION_VIEWPORT_PADDING\r\n const halfZ = size.z / 2 + ELEVATION_VIEWPORT_PADDING\r\n\r\n return DIRECTIONS.map((direction) => {\r\n const view = DIRECTION_VIEW_VECTOR[direction]\r\n // Place the drawing plane just OUTSIDE the model along -view (i.e.\r\n // on the camera side) so far-plane is positive into the building.\r\n const offsetMag =\r\n Math.abs(view.x) * (size.x / 2) +\r\n Math.abs(view.y) * (size.y / 2) +\r\n Math.abs(view.z) * (size.z / 2) +\r\n ELEVATION_PLANE_OFFSET\r\n const position = center\r\n .clone()\r\n .sub(view.clone().multiplyScalar(offsetMag))\r\n\r\n // 2D viewport: in the plane perpendicular to `view`. For N/S that's\r\n // X (horizontal) × Y (vertical); for E/W that's Z (horizontal) × Y.\r\n const horizontalIsX = direction === 'north' || direction === 'south'\r\n const horizontalHalf = horizontalIsX ? halfX : halfZ\r\n const verticalHalf = halfY\r\n\r\n // Building depth captured by the projection (one full depth + margin).\r\n const depth =\r\n Math.abs(view.x) * size.x +\r\n Math.abs(view.y) * size.y +\r\n Math.abs(view.z) * size.z\r\n const far = depth + 2 * ELEVATION_PLANE_OFFSET\r\n\r\n return {\r\n id: `${modelId}::elev::${direction}`,\r\n direction,\r\n modelId,\r\n position,\r\n viewDirection: view.clone(),\r\n viewport: {\r\n left: -horizontalHalf,\r\n right: horizontalHalf,\r\n top: verticalHalf,\r\n bottom: -verticalHalf,\r\n },\r\n far,\r\n modelBox: modelBox.clone(),\r\n drawing: null,\r\n projected: false,\r\n layers: [],\r\n }\r\n })\r\n }\r\n\r\n /** Lazy projection. After the first call for a given entry, the drawing\r\n * is cached on the entry itself so subsequent activations are instant. */\r\n async project(entry: ElevationEntry): Promise<void> {\r\n if (entry.drawing && entry.projected) return\r\n\r\n const fragments = this.components.get(OBC.FragmentsManager)\r\n const model = fragments.list.get(entry.modelId)\r\n if (!model) return\r\n\r\n const drawing = createDrawing(this.components, {\r\n orientation: entry.viewDirection.clone(),\r\n position: entry.position.clone(),\r\n far: entry.far,\r\n viewport: {\r\n ...entry.viewport,\r\n scale: 100,\r\n name: `Elevation - ${entry.direction}`,\r\n },\r\n })\r\n if (!drawing) return\r\n\r\n const editor = this.components.get(OBF.DrawingEditor)\r\n editor.activeDrawing = drawing\r\n\r\n disableProjectorWebGPU(this.components)\r\n patchModelGeometryRepresentationIds(model)\r\n\r\n const ids: number[] = await model.getItemsIdsWithGeometry()\r\n if (ids.length === 0) {\r\n entry.drawing = drawing\r\n entry.projected = true\r\n entry.layers = []\r\n return\r\n }\r\n\r\n const idFilter = new Set(ids)\r\n const itemIdsByClass = await getItemIdsByClass(model, idFilter)\r\n // Single-pass projection so the visibility culler sees the whole scene\r\n // and back-of-building edges that are occluded by something in front\r\n // get classified as hidden (and dropped). Per-class projection would\r\n // compute occlusion only within each class, leaving back walls visible.\r\n const layers = await addItemsProjectionByClassOccluded(\r\n drawing,\r\n this.components,\r\n entry.modelId,\r\n itemIdsByClass,\r\n )\r\n entry.drawing = drawing\r\n entry.projected = true\r\n entry.layers = layers\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,YAAY,SAAS;AACrB,YAAY,SAAS;AACrB,YAAY,WAAW;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAQP,MAAM,yBAAyB;AAC/B,MAAM,6BAA6B;AAEnC,MAAM,wBAAmE;AAAA;AAAA,EAEvE,OAAO,IAAI,MAAM,QAAQ,GAAG,GAAG,EAAE;AAAA,EACjC,OAAO,IAAI,MAAM,QAAQ,GAAG,GAAG,CAAC;AAAA,EAChC,MAAM,IAAI,MAAM,QAAQ,IAAI,GAAG,CAAC;AAAA,EAChC,MAAM,IAAI,MAAM,QAAQ,GAAG,GAAG,CAAC;AACjC;AAEA,MAAM,aAAmC,CAAC,SAAS,SAAS,QAAQ,MAAM;AAQnE,MAAM,mBAAmB;AAAA,EAG9B,YAAoB,YAA4B;AAA5B;AAClB,SAAK,eAAe,IAAI,mBAAmB,UAAU;AAAA,EACvD;AAAA,EAEA,oBAAoB;AAClB,WAAO,KAAK,aAAa,OAAO;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAAiB,UAAwC;AACpE,QAAI,SAAS,QAAQ,EAAG,QAAO,CAAC;AAEhC,UAAM,SAAS,IAAI,MAAM,QAAQ;AACjC,aAAS,UAAU,MAAM;AACzB,UAAM,OAAO,IAAI,MAAM,QAAQ;AAC/B,aAAS,QAAQ,IAAI;AACrB,UAAM,QAAQ,KAAK,IAAI,IAAI;AAC3B,UAAM,QAAQ,KAAK,IAAI,IAAI;AAC3B,UAAM,QAAQ,KAAK,IAAI,IAAI;AAE3B,WAAO,WAAW,IAAI,CAAC,cAAc;AACnC,YAAM,OAAO,sBAAsB,SAAS;AAG5C,YAAM,YACJ,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,KAC7B,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,KAC7B,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,KAC7B;AACF,YAAM,WAAW,OACd,MAAM,EACN,IAAI,KAAK,MAAM,EAAE,eAAe,SAAS,CAAC;AAI7C,YAAM,gBAAgB,cAAc,WAAW,cAAc;AAC7D,YAAM,iBAAiB,gBAAgB,QAAQ;AAC/C,YAAM,eAAe;AAGrB,YAAM,QACJ,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,IACxB,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,IACxB,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK;AAC1B,YAAM,MAAM,QAAQ,IAAI;AAExB,aAAO;AAAA,QACL,IAAI,GAAG,OAAO,WAAW,SAAS;AAAA,QAClC;AAAA,QACA;AAAA,QACA;AAAA,QACA,eAAe,KAAK,MAAM;AAAA,QAC1B,UAAU;AAAA,UACR,MAAM,CAAC;AAAA,UACP,OAAO;AAAA,UACP,KAAK;AAAA,UACL,QAAQ,CAAC;AAAA,QACX;AAAA,QACA;AAAA,QACA,UAAU,SAAS,MAAM;AAAA,QACzB,SAAS;AAAA,QACT,WAAW;AAAA,QACX,QAAQ,CAAC;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA,EAIA,MAAM,QAAQ,OAAsC;AAClD,QAAI,MAAM,WAAW,MAAM,UAAW;AAEtC,UAAM,YAAY,KAAK,WAAW,IAAI,IAAI,gBAAgB;AAC1D,UAAM,QAAQ,UAAU,KAAK,IAAI,MAAM,OAAO;AAC9C,QAAI,CAAC,MAAO;AAEZ,UAAM,UAAU,cAAc,KAAK,YAAY;AAAA,MAC7C,aAAa,MAAM,cAAc,MAAM;AAAA,MACvC,UAAU,MAAM,SAAS,MAAM;AAAA,MAC/B,KAAK,MAAM;AAAA,MACX,UAAU,iCACL,MAAM,WADD;AAAA,QAER,OAAO;AAAA,QACP,MAAM,eAAe,MAAM,SAAS;AAAA,MACtC;AAAA,IACF,CAAC;AACD,QAAI,CAAC,QAAS;AAEd,UAAM,SAAS,KAAK,WAAW,IAAI,IAAI,aAAa;AACpD,WAAO,gBAAgB;AAEvB,2BAAuB,KAAK,UAAU;AACtC,wCAAoC,KAAK;AAEzC,UAAM,MAAgB,MAAM,MAAM,wBAAwB;AAC1D,QAAI,IAAI,WAAW,GAAG;AACpB,YAAM,UAAU;AAChB,YAAM,YAAY;AAClB,YAAM,SAAS,CAAC;AAChB;AAAA,IACF;AAEA,UAAM,WAAW,IAAI,IAAI,GAAG;AAC5B,UAAM,iBAAiB,MAAM,kBAAkB,OAAO,QAAQ;AAK9D,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,KAAK;AAAA,MACL,MAAM;AAAA,MACN;AAAA,IACF;AACA,UAAM,UAAU;AAChB,UAAM,YAAY;AAClB,UAAM,SAAS;AAAA,EACjB;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../src/core/components/viewers/bim/src/ElevationsTool/src/ElevationProjector.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as OBC from '@thatopen/components'\r\nimport * as OBF from '@thatopen/components-front'\r\nimport * as THREE from 'three'\r\nimport {\r\n addItemsProjectionByClassOccluded,\r\n createDrawing,\r\n disableProjectorWebGPU,\r\n DrawingEditorReady,\r\n getItemIdsByClass,\r\n patchModelGeometryRepresentationIds,\r\n} from '../../lib/drawingProjection'\r\nimport {\r\n ElevationDirection,\r\n ElevationEntry,\r\n} from './types'\r\n\r\n/** Margin (m) added to the drawing plane offset and to the viewport so\r\n * the building silhouette doesn't get clipped at the edges. */\r\nconst ELEVATION_PLANE_OFFSET = 2\r\nconst ELEVATION_VIEWPORT_PADDING = 1\r\n\r\nconst DIRECTION_VIEW_VECTOR: Record<ElevationDirection, THREE.Vector3> = {\r\n // North elevation: camera north of the building, looking south.\r\n north: new THREE.Vector3(0, 0, -1),\r\n south: new THREE.Vector3(0, 0, 1),\r\n east: new THREE.Vector3(-1, 0, 0),\r\n west: new THREE.Vector3(1, 0, 0),\r\n}\r\n\r\nconst DIRECTIONS: ElevationDirection[] = ['north', 'south', 'east', 'west']\r\n\r\n/**\r\n * Builds and projects elevation drawings (N / S / E / W) for each loaded\r\n * model using the same TechnicalDrawing + DrawingEditor pipeline as\r\n * FloorplanTool's StoreyProjector. Each entry gets its own drawing,\r\n * lazily projected on first activation.\r\n */\r\nexport class ElevationProjector {\r\n private _editorReady: DrawingEditorReady\r\n\r\n constructor(private components: OBC.Components) {\r\n this._editorReady = new DrawingEditorReady(components)\r\n }\r\n\r\n ensureEditorReady() {\r\n return this._editorReady.ensure()\r\n }\r\n\r\n /** Generate four entries (N/S/E/W) for the given model from its\r\n * bounding box. Drawings are NOT projected yet — that's lazy on first\r\n * activate. */\r\n buildEntries(modelId: string, modelBox: THREE.Box3): ElevationEntry[] {\r\n if (modelBox.isEmpty()) return []\r\n\r\n const center = new THREE.Vector3()\r\n modelBox.getCenter(center)\r\n const size = new THREE.Vector3()\r\n modelBox.getSize(size)\r\n const halfX = size.x / 2 + ELEVATION_VIEWPORT_PADDING\r\n const halfY = size.y / 2 + ELEVATION_VIEWPORT_PADDING\r\n const halfZ = size.z / 2 + ELEVATION_VIEWPORT_PADDING\r\n\r\n return DIRECTIONS.map((direction) => {\r\n const view = DIRECTION_VIEW_VECTOR[direction]\r\n // Place the drawing plane just OUTSIDE the model along -view (i.e.\r\n // on the camera side) so far-plane is positive into the building.\r\n const offsetMag =\r\n Math.abs(view.x) * (size.x / 2) +\r\n Math.abs(view.y) * (size.y / 2) +\r\n Math.abs(view.z) * (size.z / 2) +\r\n ELEVATION_PLANE_OFFSET\r\n const position = center\r\n .clone()\r\n .sub(view.clone().multiplyScalar(offsetMag))\r\n\r\n // 2D viewport: in the plane perpendicular to `view`. For N/S that's\r\n // X (horizontal) × Y (vertical); for E/W that's Z (horizontal) × Y.\r\n const horizontalIsX = direction === 'north' || direction === 'south'\r\n const horizontalHalf = horizontalIsX ? halfX : halfZ\r\n const verticalHalf = halfY\r\n\r\n // Building depth captured by the projection (one full depth + margin).\r\n const depth =\r\n Math.abs(view.x) * size.x +\r\n Math.abs(view.y) * size.y +\r\n Math.abs(view.z) * size.z\r\n const far = depth + 2 * ELEVATION_PLANE_OFFSET\r\n\r\n return {\r\n id: `${modelId}::elev::${direction}`,\r\n direction,\r\n modelId,\r\n position,\r\n viewDirection: view.clone(),\r\n viewport: {\r\n left: -horizontalHalf,\r\n right: horizontalHalf,\r\n top: verticalHalf,\r\n bottom: -verticalHalf,\r\n },\r\n far,\r\n modelBox: modelBox.clone(),\r\n drawing: null,\r\n projected: false,\r\n layers: [],\r\n }\r\n })\r\n }\r\n\r\n /** Lazy projection. After the first call for a given entry, the drawing\r\n * is cached on the entry itself so subsequent activations are instant. */\r\n async project(entry: ElevationEntry): Promise<void> {\r\n if (entry.drawing && entry.projected) return\r\n\r\n const fragments = this.components.get(OBC.FragmentsManager)\r\n const model = fragments.list.get(entry.modelId)\r\n if (!model) return\r\n\r\n const drawing = createDrawing(this.components, {\r\n orientation: entry.viewDirection.clone(),\r\n position: entry.position.clone(),\r\n far: entry.far,\r\n viewport: {\r\n ...entry.viewport,\r\n scale: 100,\r\n name: `Elevation - ${entry.direction}`,\r\n },\r\n })\r\n if (!drawing) return\r\n\r\n const editor = this.components.get(OBF.DrawingEditor)\r\n editor.activeDrawing = drawing\r\n\r\n disableProjectorWebGPU(this.components)\r\n patchModelGeometryRepresentationIds(model)\r\n\r\n const ids: number[] = await model.getItemsIdsWithGeometry()\r\n if (ids.length === 0) {\r\n entry.drawing = drawing\r\n entry.projected = true\r\n entry.layers = []\r\n return\r\n }\r\n\r\n const idFilter = new Set(ids)\r\n const itemIdsByClass = await getItemIdsByClass(model, idFilter)\r\n // Single-pass projection so the visibility culler sees the whole scene\r\n // and back-of-building edges that are occluded by something in front\r\n // get classified as hidden (and dropped). Per-class projection would\r\n // compute occlusion only within each class, leaving back walls visible.\r\n const layers = await addItemsProjectionByClassOccluded(\r\n drawing,\r\n this.components,\r\n entry.modelId,\r\n itemIdsByClass,\r\n )\r\n entry.drawing = drawing\r\n entry.projected = true\r\n entry.layers = layers\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/bim/src/ElevationsTool/src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAEpE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,yEAAyE;IACzE,SAAS,EAAE,kBAAkB,CAAA;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,6DAA6D;IAC7D,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAA;IACvB,wDAAwD;IACxD,aAAa,EAAE,KAAK,CAAC,OAAO,CAAA;IAC5B,kEAAkE;IAClE,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACtE,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAA;IACX,oCAAoC;IACpC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAA;IACpB,OAAO,EAAE,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAA;IACpC,SAAS,EAAE,OAAO,CAAA;IAClB;kEAC8D;IAC9D,MAAM,EAAE,gBAAgB,EAAE,CAAA;CAC3B;AAED,eAAO,MAAM,oBAAoB,EAC/B,sCAA+C,CAAA;AAEjD,MAAM,MAAM,qBAAqB,GAC7B,MAAM,GACN,cAAc,GACd,SAAS,GACT,MAAM,GACN,WAAW,GACX,SAAS,GACT,MAAM,CAAA;AAEV,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,qBAAqB,CAAC,CAAA;AAE3E,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAQzE,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/bim/src/ElevationsTool/src/types.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAEpE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,yEAAyE;IACzE,SAAS,EAAE,kBAAkB,CAAA;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,6DAA6D;IAC7D,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAA;IACvB,wDAAwD;IACxD,aAAa,EAAE,KAAK,CAAC,OAAO,CAAA;IAC5B,kEAAkE;IAClE,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACtE,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAA;IACX,oCAAoC;IACpC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAA;IACpB,OAAO,EAAE,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAA;IACpC,SAAS,EAAE,OAAO,CAAA;IAClB;kEAC8D;IAC9D,MAAM,EAAE,gBAAgB,EAAE,CAAA;CAC3B;AAED,eAAO,MAAM,oBAAoB,EAC/B,sCAA+C,CAAA;AAEjD,MAAM,MAAM,qBAAqB,GAC7B,MAAM,GACN,cAAc,GACd,SAAS,GACT,MAAM,GACN,WAAW,GACX,SAAS,GACT,MAAM,CAAA;AAEV,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,qBAAqB,CAAC,CAAA;AAE3E,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAQzE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../src/core/components/viewers/bim/src/ElevationsTool/src/types.ts"],"sourcesContent":["import * as OBC from '@thatopen/components'\r\nimport * as THREE from 'three'\r\nimport { DrawingLayerInfo } from '../../lib/drawingLayers'\r\nimport { ViewLoadingState } from '../../lib/viewSection'\r\n\r\nexport type ElevationDirection = 'north' | 'south' | 'east' | 'west'\r\n\r\nexport interface ElevationEntry {\r\n id: string\r\n /** north / south / east / west — used as a translation key by the UI. */\r\n direction: ElevationDirection\r\n modelId: string\r\n /** World position of the drawing plane (camera position). */\r\n position: THREE.Vector3\r\n /** Camera view direction — drawing.orientTo() value. */\r\n viewDirection: THREE.Vector3\r\n /** 2D viewport bounds for the drawing (left/right/top/bottom). */\r\n viewport: { left: number; right: number; top: number; bottom: number }\r\n /** Depth captured by the projection. */\r\n far: number\r\n /** Box used to frame the camera. */\r\n modelBox: THREE.Box3\r\n drawing: OBC.TechnicalDrawing | null\r\n projected: boolean\r\n /** Per-IFC-class layer metadata, populated after projection. The sidebar\r\n * uses this to render visibility toggles + color pickers. */\r\n layers: DrawingLayerInfo[]\r\n}\r\n\r\nexport const ELEVATIONS_TOOL_UUID =\r\n '8e2c4d1a-9b5f-4a3c-8d2e-7f6c9b1a0e3d' as const\r\n\r\nexport type ElevationLoadingStage =\r\n | 'init'\r\n | 'readingModel'\r\n | 'resolve'\r\n | 'cull'\r\n | 'switching'\r\n | 'project'\r\n | 'done'\r\n\r\nexport type ElevationLoadingState = ViewLoadingState<ElevationLoadingStage>\r\n\r\nexport const ELEVATION_STAGE_PERCENT: Record<ElevationLoadingStage, number> = {\r\n init: 5,\r\n readingModel: 10,\r\n resolve: 25,\r\n cull: 50,\r\n switching: 50,\r\n project: 90,\r\n done: 100,\r\n}\r\n"],"mappings":"AA6BO,MAAM,uBACX;AAaK,MAAM,0BAAiE;AAAA,EAC5E,MAAM;AAAA,EACN,cAAc;AAAA,EACd,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,MAAM;AACR;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../src/core/components/viewers/bim/src/ElevationsTool/src/types.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as OBC from '@thatopen/components'\r\nimport * as THREE from 'three'\r\nimport { DrawingLayerInfo } from '../../lib/drawingLayers'\r\nimport { ViewLoadingState } from '../../lib/viewSection'\r\n\r\nexport type ElevationDirection = 'north' | 'south' | 'east' | 'west'\r\n\r\nexport interface ElevationEntry {\r\n id: string\r\n /** north / south / east / west — used as a translation key by the UI. */\r\n direction: ElevationDirection\r\n modelId: string\r\n /** World position of the drawing plane (camera position). */\r\n position: THREE.Vector3\r\n /** Camera view direction — drawing.orientTo() value. */\r\n viewDirection: THREE.Vector3\r\n /** 2D viewport bounds for the drawing (left/right/top/bottom). */\r\n viewport: { left: number; right: number; top: number; bottom: number }\r\n /** Depth captured by the projection. */\r\n far: number\r\n /** Box used to frame the camera. */\r\n modelBox: THREE.Box3\r\n drawing: OBC.TechnicalDrawing | null\r\n projected: boolean\r\n /** Per-IFC-class layer metadata, populated after projection. The sidebar\r\n * uses this to render visibility toggles + color pickers. */\r\n layers: DrawingLayerInfo[]\r\n}\r\n\r\nexport const ELEVATIONS_TOOL_UUID =\r\n '8e2c4d1a-9b5f-4a3c-8d2e-7f6c9b1a0e3d' as const\r\n\r\nexport type ElevationLoadingStage =\r\n | 'init'\r\n | 'readingModel'\r\n | 'resolve'\r\n | 'cull'\r\n | 'switching'\r\n | 'project'\r\n | 'done'\r\n\r\nexport type ElevationLoadingState = ViewLoadingState<ElevationLoadingStage>\r\n\r\nexport const ELEVATION_STAGE_PERCENT: Record<ElevationLoadingStage, number> = {\r\n init: 5,\r\n readingModel: 10,\r\n resolve: 25,\r\n cull: 50,\r\n switching: 50,\r\n project: 90,\r\n done: 100,\r\n}\r\n"],"mappings":"AAgCO,MAAM,uBACX;AAaK,MAAM,0BAAiE;AAAA,EAC5E,MAAM;AAAA,EACN,cAAc;AAAA,EACd,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,MAAM;AACR;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"FitCamera.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/bim/src/FitCamera.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAE3C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,qBAAa,SAAU,SAAQ,GAAG,CAAC,SAAS;IAC1C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,sCAAsC,CAAS;IAEtE,OAAO,UAAQ;IAEf,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAO;IAE9B,MAAM,EAAE,GAAG,CAAC,sBAAsB,GAAG,IAAI,CAAO;IAEhD,SAAS,EAAE,GAAG,CAAO;gBAET,UAAU,EAAE,GAAG,CAAC,UAAU;IAahC,GAAG;IAqBT,OAAO,CAAC,uBAAuB;YA0BjB,UAAU;IAelB,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAE,OAAc;IAQlD,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE;CAejD"}
1
+ {"version":3,"file":"FitCamera.d.ts","sourceRoot":"","sources":["../../../../../../src/core/components/viewers/bim/src/FitCamera.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAE3C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,qBAAa,SAAU,SAAQ,GAAG,CAAC,SAAS;IAC1C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,sCAAsC,CAAS;IAEtE,OAAO,UAAQ;IAEf,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAO;IAE9B,MAAM,EAAE,GAAG,CAAC,sBAAsB,GAAG,IAAI,CAAO;IAEhD,SAAS,EAAE,GAAG,CAAO;gBAET,UAAU,EAAE,GAAG,CAAC,UAAU;IAahC,GAAG;IAqBT,OAAO,CAAC,uBAAuB;YA0BjB,UAAU;IAelB,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAE,OAAc;IAQlD,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE;CAejD"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/core/components/viewers/bim/src/FitCamera.ts"],"sourcesContent":["import * as OBC from '@thatopen/components'\r\nimport { CurrentWorld } from './CurrentWorld'\r\nimport * as THREE from 'three'\r\n\r\nexport class FitCamera extends OBC.Component {\r\n static readonly uuid = 'abcf3535-1841-456d-a500-91809848d8ef' as const\r\n\r\n enabled = false\r\n\r\n world: OBC.World | null = null\r\n\r\n camera: OBC.OrthoPerspectiveCamera | null = null\r\n\r\n fragments: any = null\r\n\r\n constructor(components: OBC.Components) {\r\n super(components)\r\n components.add(FitCamera.uuid, this)\r\n this.world = components.get(CurrentWorld).world\r\n this.fragments = components.get(OBC.FragmentsManager)\r\n if (this.world) {\r\n this.camera = this.world.camera as OBC.OrthoPerspectiveCamera\r\n }\r\n else {\r\n throw new Error('World is not initialized.')\r\n }\r\n }\r\n\r\n async fit() {\r\n if (!this.world || !this.camera) {\r\n throw new Error('World or camera is not initialized.')\r\n }\r\n\r\n if (this.fragments) {\r\n const boundingBox = this.getFragmentsBoundingBox()\r\n if (boundingBox && !boundingBox.isEmpty()) {\r\n await this.fitToBox(boundingBox, true)\r\n return\r\n }\r\n }\r\n\r\n if (this.world.meshes && this.world.meshes.size > 0 && this.world.meshes.size > 0) {\r\n this.camera.fit(this.world.meshes)\r\n }\r\n else {\r\n await this.fitToScene()\r\n }\r\n }\r\n\r\n private getFragmentsBoundingBox(): THREE.Box3 | null {\r\n if (!this.fragments || !this.fragments.groups) {\r\n return null\r\n }\r\n\r\n const boundingBox = new THREE.Box3()\r\n let hasGeometry = false\r\n\r\n try {\r\n const groups = this.fragments.groups\r\n const groupsIterable = groups instanceof Map ? groups.values() : Object.values(groups)\r\n\r\n for (const group of groupsIterable) {\r\n if (group && group.boundingBox && !group.boundingBox.isEmpty()) {\r\n boundingBox.union(group.boundingBox)\r\n hasGeometry = true\r\n }\r\n }\r\n }\r\n catch {\r\n return null\r\n }\r\n\r\n return hasGeometry ? boundingBox : null\r\n }\r\n\r\n private async fitToScene() {\r\n if (!this.world?.scene?.three) return\r\n\r\n const objects: THREE.Object3D[] = []\r\n this.world.scene.three.traverse((child) => {\r\n if (child.type === 'Mesh' && child.visible) {\r\n objects.push(child)\r\n }\r\n })\r\n\r\n if (objects.length > 0) {\r\n await this.fitToSelection(objects)\r\n }\r\n }\r\n\r\n async fitToBox(box: THREE.Box3, animated: boolean = true) {\r\n if (!this.world?.camera?.controls) {\r\n throw new Error('Camera controls not available.')\r\n }\r\n\r\n await this.world.camera.controls.fitToBox(box, animated)\r\n }\r\n\r\n async fitToSelection(selection: THREE.Object3D[]) {\r\n if (selection.length === 0) {\r\n return\r\n }\r\n\r\n const boundingBox = new THREE.Box3()\r\n for (const object of selection) {\r\n const objectBox = new THREE.Box3().setFromObject(object)\r\n boundingBox.union(objectBox)\r\n }\r\n\r\n if (!boundingBox.isEmpty()) {\r\n await this.fitToBox(boundingBox, true)\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../src/core/components/viewers/bim/src/FitCamera.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as OBC from '@thatopen/components'\r\nimport { CurrentWorld } from './CurrentWorld'\r\nimport * as THREE from 'three'\r\n\r\nexport class FitCamera extends OBC.Component {\r\n static readonly uuid = 'abcf3535-1841-456d-a500-91809848d8ef' as const\r\n\r\n enabled = false\r\n\r\n world: OBC.World | null = null\r\n\r\n camera: OBC.OrthoPerspectiveCamera | null = null\r\n\r\n fragments: any = null\r\n\r\n constructor(components: OBC.Components) {\r\n super(components)\r\n components.add(FitCamera.uuid, this)\r\n this.world = components.get(CurrentWorld).world\r\n this.fragments = components.get(OBC.FragmentsManager)\r\n if (this.world) {\r\n this.camera = this.world.camera as OBC.OrthoPerspectiveCamera\r\n }\r\n else {\r\n throw new Error('World is not initialized.')\r\n }\r\n }\r\n\r\n async fit() {\r\n if (!this.world || !this.camera) {\r\n throw new Error('World or camera is not initialized.')\r\n }\r\n\r\n if (this.fragments) {\r\n const boundingBox = this.getFragmentsBoundingBox()\r\n if (boundingBox && !boundingBox.isEmpty()) {\r\n await this.fitToBox(boundingBox, true)\r\n return\r\n }\r\n }\r\n\r\n if (this.world.meshes && this.world.meshes.size > 0 && this.world.meshes.size > 0) {\r\n this.camera.fit(this.world.meshes)\r\n }\r\n else {\r\n await this.fitToScene()\r\n }\r\n }\r\n\r\n private getFragmentsBoundingBox(): THREE.Box3 | null {\r\n if (!this.fragments || !this.fragments.groups) {\r\n return null\r\n }\r\n\r\n const boundingBox = new THREE.Box3()\r\n let hasGeometry = false\r\n\r\n try {\r\n const groups = this.fragments.groups\r\n const groupsIterable = groups instanceof Map ? groups.values() : Object.values(groups)\r\n\r\n for (const group of groupsIterable) {\r\n if (group && group.boundingBox && !group.boundingBox.isEmpty()) {\r\n boundingBox.union(group.boundingBox)\r\n hasGeometry = true\r\n }\r\n }\r\n }\r\n catch {\r\n return null\r\n }\r\n\r\n return hasGeometry ? boundingBox : null\r\n }\r\n\r\n private async fitToScene() {\r\n if (!this.world?.scene?.three) return\r\n\r\n const objects: THREE.Object3D[] = []\r\n this.world.scene.three.traverse((child) => {\r\n if (child.type === 'Mesh' && child.visible) {\r\n objects.push(child)\r\n }\r\n })\r\n\r\n if (objects.length > 0) {\r\n await this.fitToSelection(objects)\r\n }\r\n }\r\n\r\n async fitToBox(box: THREE.Box3, animated: boolean = true) {\r\n if (!this.world?.camera?.controls) {\r\n throw new Error('Camera controls not available.')\r\n }\r\n\r\n await this.world.camera.controls.fitToBox(box, animated)\r\n }\r\n\r\n async fitToSelection(selection: THREE.Object3D[]) {\r\n if (selection.length === 0) {\r\n return\r\n }\r\n\r\n const boundingBox = new THREE.Box3()\r\n for (const object of selection) {\r\n const objectBox = new THREE.Box3().setFromObject(object)\r\n boundingBox.union(objectBox)\r\n }\r\n\r\n if (!boundingBox.isEmpty()) {\r\n await this.fitToBox(boundingBox, true)\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/FloorplanTool/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/FloorplanTool/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/FloorplanTool/index.ts"],"sourcesContent":["import * as OBC from '@thatopen/components'\r\nimport * as OBF from '@thatopen/components-front'\r\nimport * as THREE from 'three'\r\nimport { CurrentWorld } from '../CurrentWorld'\r\nimport { CameraController } from '../lib/CameraController'\r\nimport { ChromeController } from '../lib/ChromeController'\r\nimport { ClipController } from '../lib/ClipController'\r\nimport { CUT_CLASSES, FILL_CLASSES } from '../lib/drawingLayers'\r\nimport { disposeDrawing } from '../lib/drawingProjection'\r\nimport { GridController } from '../lib/GridController'\r\nimport { safeRun, safeRunAsync } from '../lib/safeRun'\r\nimport { stagePercent, ViewLoadingState } from '../lib/viewSection'\r\nimport { ViewModeCoordinator } from '../lib/ViewModeCoordinator'\r\nimport { FloorplanRenderer, RenderStage } from './src/FloorplanRenderer'\r\nimport { StoreyProjector } from './src/StoreyProjector'\r\nimport { CUT_COLOR, FILL_COLOR, FloorplanEntry, FLOORPLAN_TOOL_UUID } from './src/types'\r\nimport { normalizeElevation } from './src/utils'\r\n\r\nconst SLOT_SECTION = 'floorplan:section'\r\nconst SLOT_LOWER = 'floorplan:lower'\r\n\r\nexport type { FloorplanEntry } from './src/types'\r\n\r\nexport type FloorplanLoadingStage =\r\n | 'init'\r\n | 'readingStoreys'\r\n | RenderStage\r\n | 'project'\r\n | 'done'\r\n\r\nexport type FloorplanLoadingState = ViewLoadingState<FloorplanLoadingStage>\r\n\r\nconst STAGE_PERCENT: Record<FloorplanLoadingStage, number> = {\r\n init: 5,\r\n readingStoreys: 10,\r\n resolve: 20,\r\n cull: 35,\r\n switching: 35,\r\n cut: 55,\r\n fill: 75,\r\n project: 90,\r\n done: 100,\r\n}\r\n\r\nexport function getFloorplanStagePercent(\r\n stage: FloorplanLoadingStage | undefined,\r\n): number {\r\n return stagePercent(stage, STAGE_PERCENT)\r\n}\r\n\r\nexport class FloorplanTool extends OBC.Component {\r\n static uuid = FLOORPLAN_TOOL_UUID\r\n\r\n enabled = false\r\n\r\n readonly onDrawingsChanged = new OBC.Event<FloorplanEntry[]>()\r\n readonly onActiveDrawingChanged = new OBC.Event<FloorplanEntry | null>()\r\n readonly onGenerationStateChanged = new OBC.Event<FloorplanLoadingState>()\r\n /** Fires whenever an entry's layer metadata changes (toggle / color). */\r\n readonly onLayersChanged = new OBC.Event<FloorplanEntry>()\r\n /** Fires when the building's true-north angle (in degrees) is updated. */\r\n readonly onNorthAngleChanged = new OBC.Event<number>()\r\n /** Fires when line-pick mode toggles on/off. */\r\n readonly onPickingNorthChanged = new OBC.Event<boolean>()\r\n\r\n private _entries = new Map<string, FloorplanEntry>()\r\n private _activeId: string | null = null\r\n /** Sequence guard: when activate() is called multiple times in quick\r\n * succession (e.g. user clicks two storeys), only the last call applies\r\n * its final state. Prior calls bail out at await boundaries. */\r\n private _activateSeq = 0\r\n /** True-north rotation in degrees (clockwise from default screen-up).\r\n * Persists across storey switches but resets to 0 on tool dispose. */\r\n private _northAngle = 0\r\n /** True while the user is drawing the two-point north line. */\r\n private _pickingNorth = false\r\n private _pickHandler: ((e: MouseEvent) => void) | null = null\r\n private _moveHandler: ((e: MouseEvent) => void) | null = null\r\n private _keyHandler: ((e: KeyboardEvent) => void) | null = null\r\n /** First clicked point of the north line, in drawing-local space (Y=0).\r\n * Null until the user places the first point. */\r\n private _drawStart: THREE.Vector3 | null = null\r\n /** Cached snap targets — projected-geometry vertices flattened as\r\n * [x0,z0, x1,z1, …] in drawing-local space. Rebuilt each time draw mode\r\n * starts so it reflects the active storey's lines. */\r\n private _snapVerts: Float32Array | null = null\r\n /** Rubber-band preview line + cursor snap marker, parented to the active\r\n * drawing so they inherit its world transform. */\r\n private _previewLine: THREE.Line | null = null\r\n private _snapMarker: THREE.LineSegments | null = null\r\n /** Canvas cursor before draw mode swapped in the crosshair — typically the\r\n * floorplan-mode \"grab\" hand. Restored (not cleared) on exit so panning\r\n * keeps the hand; only leaving floorplan mode reverts to the default. */\r\n private _savedPickCursor: string | null = null\r\n\r\n private projector: StoreyProjector\r\n private renderer: FloorplanRenderer\r\n private camera: CameraController\r\n private chrome: ChromeController\r\n private clip: ClipController\r\n private grid: GridController\r\n\r\n constructor(components: OBC.Components) {\r\n super(components)\r\n components.add(FloorplanTool.uuid, this)\r\n\r\n this.projector = new StoreyProjector(components)\r\n this.renderer = new FloorplanRenderer(components, this.projector)\r\n this.camera = new CameraController(components)\r\n this.chrome = new ChromeController(components)\r\n this.clip = new ClipController(components)\r\n this.grid = new GridController(components)\r\n\r\n const fragments = components.get(OBC.FragmentsManager)\r\n fragments.core.onModelLoaded.add((model) => {\r\n void this.generate(model.modelId)\r\n })\r\n }\r\n\r\n get drawings(): FloorplanEntry[] {\r\n return Array.from(this._entries.values()).sort(\r\n (a, b) => a.elevation - b.elevation,\r\n )\r\n }\r\n\r\n get activeDrawingId() {\r\n return this._activeId\r\n }\r\n\r\n get activeDrawing(): FloorplanEntry | null {\r\n return this._activeId ? this._entries.get(this._activeId) ?? null : null\r\n }\r\n\r\n /** Inject the world grid (typically `bimState.bim.grid`). Without this\r\n * the tool falls back to looking it up via `OBC.Grids`. */\r\n setGrid(grid: any | null) {\r\n this.grid.setGrid(grid)\r\n }\r\n\r\n /** Toggle visibility of a single per-class layer on an entry's drawing. */\r\n setLayerVisible(entryId: string, className: string, visible: boolean) {\r\n const entry = this._entries.get(entryId)\r\n if (!entry?.drawing || !entry.drawing.layers.has(className)) return\r\n entry.drawing.layers.setVisibility(className, visible)\r\n const meta = entry.layers.find((l) => l.className === className)\r\n if (meta) meta.visible = visible\r\n this._requestUpdate()\r\n this.onLayersChanged.trigger(entry)\r\n }\r\n\r\n /** Update the color (hex int, e.g. 0xff0000) of a per-class layer. Updates\r\n * both the projected-line color in the drawing AND the 3D highlight\r\n * color for FILL (slabs / roofs) and CUT (walls / columns / curtain-\r\n * walls) classes — so changing the IFCSLAB color repaints both its\r\n * outline and its solid fill underneath. */\r\n async setLayerColor(entryId: string, className: string, color: number) {\r\n const entry = this._entries.get(entryId)\r\n if (!entry?.drawing || !entry.drawing.layers.has(className)) return\r\n entry.drawing.layers.setColor(className, color)\r\n const meta = entry.layers.find((l) => l.className === className)\r\n if (meta) meta.color = color\r\n\r\n if (FILL_CLASSES.has(className) || CUT_CLASSES.has(className)) {\r\n await this._updateClassHighlight(entry, className, color)\r\n }\r\n\r\n this._requestUpdate()\r\n this.onLayersChanged.trigger(entry)\r\n }\r\n\r\n /** Prepend Fill / Cut group-color rows to entry.layers so the sidebar\r\n * shows group-level color pickers at the top of the layer list. Idempotent\r\n * — removes any existing group entries before re-inserting. */\r\n private _injectGroupColorLayers(entry: FloorplanEntry) {\r\n // Read current group colors from the renderer config so subsequent\r\n // setFillGroupColor / setCutGroupColor calls are reflected immediately.\r\n const groups = (this.renderer as any)._highlighter?.config?.groups ?? []\r\n const cutColor: number = (groups[0]?.color as number | undefined) ?? CUT_COLOR\r\n const fillColor: number = (groups[1]?.color as number | undefined) ?? FILL_COLOR\r\n const filtered = entry.layers.filter(\r\n (l) => l.className !== 'DrawingLayers.fill' && l.className !== 'DrawingLayers.cut',\r\n )\r\n entry.layers = [\r\n {\r\n className: 'DrawingLayers.cut',\r\n layerName: 'DrawingLayers.cut',\r\n visible: true,\r\n color: cutColor,\r\n itemCount: 0,\r\n displayKey: 'DrawingLayers.cut',\r\n },\r\n {\r\n className: 'DrawingLayers.fill',\r\n layerName: 'DrawingLayers.fill',\r\n visible: true,\r\n color: fillColor,\r\n itemCount: 0,\r\n displayKey: 'DrawingLayers.fill',\r\n },\r\n ...filtered,\r\n ]\r\n }\r\n\r\n /** Re-apply the 3D highlight (mesh fill color) for a single IFC class on\r\n * the active model, scoped to the active storey. Called after the user\r\n * edits a layer color in the sidebar so the 3D underlay stays in sync\r\n * with the line color. */\r\n private async _updateClassHighlight(\r\n entry: FloorplanEntry,\r\n className: string,\r\n color: number,\r\n ) {\r\n const fragments = this.components.get(OBC.FragmentsManager)\r\n const model = fragments.list.get(entry.modelId) as any\r\n if (!model) return\r\n\r\n // Match this specific class only (no partial-match regex).\r\n const map = await model.getItemsOfCategories([\r\n new RegExp(`^${className}$`),\r\n ])\r\n let ids = Object.values(map).flat() as number[]\r\n\r\n // Restrict to the active storey so changes don't leak into other floors.\r\n try {\r\n const storeyIds = await this.projector.getCachedStoreyIds(\r\n entry.modelId,\r\n entry.storeyLocalId,\r\n model,\r\n )\r\n if (storeyIds.length > 0) {\r\n const set = new Set(storeyIds)\r\n ids = ids.filter((id) => set.has(id))\r\n }\r\n } catch {\r\n // best-effort — fall through with unfiltered ids\r\n }\r\n\r\n if (ids.length === 0) return\r\n try {\r\n await model.highlight(ids, {\r\n color: new THREE.Color(color),\r\n opacity: 1,\r\n transparent: false,\r\n renderedFaces: 1,\r\n preserveOriginalMaterial: false,\r\n })\r\n fragments.core.update(true)\r\n } catch (error) {\r\n console.warn(\r\n `[FloorplanTool] 3D highlight update failed for ${className}:`,\r\n error,\r\n )\r\n }\r\n }\r\n\r\n /** Change the 3D fill color for ALL fill-group items (slabs / roofs) on\r\n * the active entry. Updates the layer metadata so the sidebar swatch\r\n * reflects the change immediately. */\r\n async setFillGroupColor(entryId: string, color: number) {\r\n const entry = this._entries.get(entryId)\r\n if (!entry) return\r\n await this.renderer.setFillColor(entryId, color)\r\n const meta = entry.layers.find((l) => l.className === 'DrawingLayers.fill')\r\n if (meta) meta.color = color\r\n this.onLayersChanged.trigger(entry)\r\n }\r\n\r\n /** Change the 3D cut color for ALL cut-group items (walls / columns /\r\n * curtain walls) on the active entry. */\r\n async setCutGroupColor(entryId: string, color: number) {\r\n const entry = this._entries.get(entryId)\r\n if (!entry) return\r\n await this.renderer.setCutColor(entryId, color)\r\n const meta = entry.layers.find((l) => l.className === 'DrawingLayers.cut')\r\n if (meta) meta.color = color\r\n this.onLayersChanged.trigger(entry)\r\n }\r\n\r\n /** Current true-north rotation (degrees, clockwise from default up). */\r\n get northAngle(): number {\r\n return this._northAngle\r\n }\r\n\r\n /** True while the line-pick mode is awaiting a click on the drawing. */\r\n get isPickingNorth(): boolean {\r\n return this._pickingNorth\r\n }\r\n\r\n /** Set the true-north rotation. Normalised to [0, 360). Applied to the\r\n * camera azimuth immediately if a floorplan is currently active so the\r\n * view re-orients. */\r\n setNorthAngle(degrees: number) {\r\n const normalized = ((degrees % 360) + 360) % 360\r\n if (this._northAngle === normalized) return\r\n this._northAngle = normalized\r\n this.onNorthAngleChanged.trigger(normalized)\r\n if (this._activeId) this._applyNorthToCamera()\r\n }\r\n\r\n /** Enter two-point draw mode. The user clicks two points on the active\r\n * floorplan (each snapped to the nearest projected-geometry vertex); the\r\n * bearing of the segment between them becomes the new true-north angle.\r\n * A rubber-band preview + snap marker track the cursor; Esc cancels.\r\n * No-op if no floorplan is active. */\r\n startPickNorth() {\r\n if (this._pickingNorth || !this._activeId) return\r\n const entry = this.activeDrawing\r\n const world = this.components.get(CurrentWorld).world\r\n if (!entry?.drawing || !world?.renderer) return\r\n const canvas = world.renderer.three.domElement\r\n\r\n this._drawStart = null\r\n this._snapVerts = this._collectSnapVertices(entry)\r\n\r\n this._pickHandler = (e: MouseEvent) => this._onPickClick(e)\r\n this._moveHandler = (e: MouseEvent) => this._onPickMove(e)\r\n this._keyHandler = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') this.cancelPickNorth()\r\n }\r\n canvas.addEventListener('click', this._pickHandler)\r\n canvas.addEventListener('mousemove', this._moveHandler)\r\n window.addEventListener('keydown', this._keyHandler)\r\n this._savedPickCursor = canvas.style.cursor\r\n canvas.style.cursor = 'crosshair'\r\n this._pickingNorth = true\r\n this.onPickingNorthChanged.trigger(true)\r\n }\r\n\r\n /** Exit draw mode without applying any rotation. Tears down the canvas\r\n * listeners and removes the rubber-band preview. */\r\n cancelPickNorth() {\r\n if (!this._pickingNorth) return\r\n const world = this.components.get(CurrentWorld).world\r\n const canvas = world?.renderer?.three.domElement ?? null\r\n if (canvas) {\r\n if (this._pickHandler) canvas.removeEventListener('click', this._pickHandler)\r\n if (this._moveHandler) canvas.removeEventListener('mousemove', this._moveHandler)\r\n // Restore the floorplan-mode cursor (the grab hand), not the OS default\r\n // — that only comes back when the tool deactivates.\r\n canvas.style.cursor = this._savedPickCursor ?? 'grab'\r\n }\r\n this._savedPickCursor = null\r\n if (this._keyHandler) window.removeEventListener('keydown', this._keyHandler)\r\n this._pickHandler = null\r\n this._moveHandler = null\r\n this._keyHandler = null\r\n this._drawStart = null\r\n this._snapVerts = null\r\n this._clearPreview()\r\n this._pickingNorth = false\r\n this.onPickingNorthChanged.trigger(false)\r\n }\r\n\r\n /** Click handler for draw mode. First click places the start point; the\r\n * second rotates the view so the drawn segment becomes parallel to the\r\n * screen X-axis (horizontal). Both points lie on the drawing's horizontal\r\n * plane (Y=0), so only the in-plane direction matters. */\r\n private _onPickClick(event: MouseEvent) {\r\n const entry = this.activeDrawing\r\n if (!entry?.drawing) return\r\n const local = this._eventToLocalPoint(event, entry)\r\n if (!local) return\r\n const point = this._snap(local)\r\n\r\n if (!this._drawStart) {\r\n this._drawStart = point\r\n this._updatePreview(entry, point)\r\n this._requestUpdate()\r\n return\r\n }\r\n\r\n // Ignore a degenerate (near-zero-length) segment so a stray double-click\r\n // can't set a bogus angle.\r\n const dx = point.x - this._drawStart.x\r\n const dz = point.z - this._drawStart.z\r\n if (dx * dx + dz * dz < 1e-6) return\r\n\r\n // Resolve the segment in WORLD space (the drawing has its own orientTo\r\n // rotation, so a drawing-local bearing wouldn't match the world-space\r\n // camera azimuth), then rotate the view to lay it on the X-axis.\r\n const drawing = entry.drawing\r\n drawing.three.updateWorldMatrix(true, false)\r\n const aWorld = drawing.three.localToWorld(this._drawStart.clone())\r\n const bWorld = drawing.three.localToWorld(point.clone())\r\n const azimuthDeg = this._azimuthToAlignLineToX(aWorld, bWorld)\r\n if (azimuthDeg !== null) this.setNorthAngle(azimuthDeg)\r\n this.cancelPickNorth()\r\n }\r\n\r\n /** Camera azimuth (degrees) that rotates the top-down view so the world\r\n * segment a→b lands parallel to the screen X-axis (horizontal).\r\n *\r\n * Derivation: with the standard Y-up spherical convention camera-controls\r\n * uses, the camera's screen-right world direction has angle ρ = −θ + C\r\n * (θ = azimuth). We measure ρ₀ and θ₀ from the live camera so C cancels —\r\n * making the result independent of the drawing's orientation and the\r\n * controls' up-space. We then solve ρ(θ) = λ (the segment's world angle),\r\n * giving θ = ρ₀ + θ₀ − λ. Returns null if the controls are unavailable. */\r\n private _azimuthToAlignLineToX(\r\n aWorld: THREE.Vector3,\r\n bWorld: THREE.Vector3,\r\n ): number | null {\r\n const world = this.components.get(CurrentWorld).world\r\n const cam = world?.camera?.three as THREE.Camera | undefined\r\n const controls = world?.camera?.controls as any\r\n if (!cam || typeof controls?.azimuthAngle !== 'number') return null\r\n\r\n const lx = bWorld.x - aWorld.x\r\n const lz = bWorld.z - aWorld.z\r\n if (lx * lx + lz * lz < 1e-12) return null\r\n const lambda = Math.atan2(lz, lx)\r\n\r\n // Screen-right = camera local +X axis = first column of matrixWorld.\r\n cam.updateMatrixWorld()\r\n const e = cam.matrixWorld.elements\r\n const rho0 = Math.atan2(e[2], e[0])\r\n const theta0 = controls.azimuthAngle as number\r\n\r\n return ((rho0 + theta0 - lambda) * 180) / Math.PI\r\n }\r\n\r\n /** Mousemove handler for draw mode — keeps the snap marker (and, after the\r\n * first click, the rubber-band line) glued to the cursor's snapped point. */\r\n private _onPickMove(event: MouseEvent) {\r\n const entry = this.activeDrawing\r\n if (!entry?.drawing) return\r\n const local = this._eventToLocalPoint(event, entry)\r\n if (!local) return\r\n this._updatePreview(entry, this._snap(local))\r\n this._requestUpdate()\r\n }\r\n\r\n /** Convert a canvas mouse event into a point on the drawing plane, in\r\n * drawing-local space (XZ plane, Y=0). Casts a ray from the active camera,\r\n * transforms it into the drawing's local frame, and intersects Y=0. */\r\n private _eventToLocalPoint(\r\n event: MouseEvent,\r\n entry: FloorplanEntry,\r\n ): THREE.Vector3 | null {\r\n const world = this.components.get(CurrentWorld).world\r\n if (!world?.renderer || !world.camera || !entry.drawing) return null\r\n const canvas = world.renderer.three.domElement\r\n const rect = canvas.getBoundingClientRect()\r\n const x = ((event.clientX - rect.left) / rect.width) * 2 - 1\r\n const y = -((event.clientY - rect.top) / rect.height) * 2 + 1\r\n const raycaster = new THREE.Raycaster()\r\n raycaster.setFromCamera(\r\n new THREE.Vector2(x, y),\r\n world.camera.three as THREE.Camera,\r\n )\r\n const drawing = entry.drawing\r\n drawing.three.updateWorldMatrix(true, false)\r\n const inv = new THREE.Matrix4().copy(drawing.three.matrixWorld).invert()\r\n const origin = raycaster.ray.origin.clone().applyMatrix4(inv)\r\n const dir = raycaster.ray.direction.clone().transformDirection(inv)\r\n if (Math.abs(dir.y) < 1e-9) return null\r\n const t = -origin.y / dir.y\r\n if (!Number.isFinite(t)) return null\r\n return new THREE.Vector3(\r\n origin.x + dir.x * t,\r\n 0,\r\n origin.z + dir.z * t,\r\n )\r\n }\r\n\r\n /** Snap a drawing-local point to the nearest projected-geometry vertex\r\n * within the snap radius; returns the point unchanged if none is close. */\r\n private _snap(local: THREE.Vector3): THREE.Vector3 {\r\n const verts = this._snapVerts\r\n if (!verts) return local\r\n const radius = this._snapRadiusLocal()\r\n let best = -1\r\n let bestD2 = radius * radius\r\n for (let i = 0; i < verts.length; i += 2) {\r\n const dx = verts[i] - local.x\r\n const dz = verts[i + 1] - local.z\r\n const d2 = dx * dx + dz * dz\r\n if (d2 < bestD2) {\r\n bestD2 = d2\r\n best = i\r\n }\r\n }\r\n if (best < 0) return local\r\n return new THREE.Vector3(verts[best], 0, verts[best + 1])\r\n }\r\n\r\n /** Snap radius in drawing-local units (= world units; the drawing is\r\n * unscaled), derived from a fixed ~12 px tolerance at the current ortho\r\n * zoom so it feels consistent as the user zooms. */\r\n private _snapRadiusLocal(): number {\r\n const SNAP_PX = 12\r\n const FALLBACK = 0.5\r\n const world = this.components.get(CurrentWorld).world\r\n const cam = world?.camera?.three as any\r\n const canvas = world?.renderer?.three.domElement\r\n if (!cam?.isOrthographicCamera || !canvas) return FALLBACK\r\n const worldWidth = (cam.right - cam.left) / (cam.zoom || 1)\r\n const worldPerPixel = worldWidth / Math.max(1, canvas.clientWidth)\r\n return worldPerPixel * SNAP_PX || FALLBACK\r\n }\r\n\r\n /** Flatten every visible projected line vertex into drawing-local [x,z]\r\n * pairs for endpoint snapping. Each vertex is transformed through its\r\n * owning object's world matrix into the drawing's local frame, so it\r\n * works regardless of how layers nest the `LineSegments`. */\r\n private _collectSnapVertices(entry: FloorplanEntry): Float32Array | null {\r\n const drawing = entry.drawing\r\n if (!drawing) return null\r\n drawing.three.updateWorldMatrix(true, true)\r\n const inv = new THREE.Matrix4().copy(drawing.three.matrixWorld).invert()\r\n const v = new THREE.Vector3()\r\n const out: number[] = []\r\n drawing.three.traverse((child: THREE.Object3D) => {\r\n if (!(child instanceof THREE.LineSegments) || !child.visible) return\r\n if (child.userData?.isDimension) return\r\n const pos = child.geometry?.attributes?.position as\r\n | THREE.BufferAttribute\r\n | undefined\r\n if (!pos) return\r\n for (let i = 0; i < pos.count; i++) {\r\n v.set(pos.getX(i), pos.getY(i), pos.getZ(i))\r\n .applyMatrix4(child.matrixWorld)\r\n .applyMatrix4(inv)\r\n out.push(v.x, v.z)\r\n }\r\n })\r\n return out.length ? new Float32Array(out) : null\r\n }\r\n\r\n /** Update (creating on first use) the cursor snap marker and, once the\r\n * first point is placed, the rubber-band line from start → cursor. Both\r\n * live in drawing-local space, Y=0. */\r\n private _updatePreview(entry: FloorplanEntry, current: THREE.Vector3) {\r\n const drawing = entry.drawing\r\n if (!drawing) return\r\n const COLOR = 0x2563eb\r\n\r\n if (!this._snapMarker) {\r\n // Unit-armed cross scaled to the snap radius so it reads as the\r\n // current snap tolerance.\r\n const geom = new THREE.BufferGeometry()\r\n geom.setAttribute(\r\n 'position',\r\n new THREE.Float32BufferAttribute(\r\n new Float32Array([-1, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 1]),\r\n 3,\r\n ),\r\n )\r\n this._snapMarker = new THREE.LineSegments(\r\n geom,\r\n new THREE.LineBasicMaterial({ color: COLOR }),\r\n )\r\n this._snapMarker.renderOrder = 999\r\n drawing.three.add(this._snapMarker)\r\n }\r\n const arm = this._snapRadiusLocal()\r\n this._snapMarker.scale.setScalar(arm)\r\n this._snapMarker.position.set(current.x, 0, current.z)\r\n this._snapMarker.visible = true\r\n\r\n if (!this._drawStart) {\r\n if (this._previewLine) this._previewLine.visible = false\r\n return\r\n }\r\n if (!this._previewLine) {\r\n const geom = new THREE.BufferGeometry()\r\n geom.setAttribute(\r\n 'position',\r\n new THREE.Float32BufferAttribute(new Float32Array(6), 3),\r\n )\r\n this._previewLine = new THREE.Line(\r\n geom,\r\n new THREE.LineBasicMaterial({ color: COLOR }),\r\n )\r\n this._previewLine.renderOrder = 999\r\n drawing.three.add(this._previewLine)\r\n }\r\n const pos = this._previewLine.geometry.attributes\r\n .position as THREE.BufferAttribute\r\n pos.setXYZ(0, this._drawStart.x, 0, this._drawStart.z)\r\n pos.setXYZ(1, current.x, 0, current.z)\r\n pos.needsUpdate = true\r\n this._previewLine.visible = true\r\n }\r\n\r\n /** Remove + dispose the preview line and snap marker. Uses each object's\r\n * own parent so it stays correct even when called from deactivate(),\r\n * where `_activeId` is already null. */\r\n private _clearPreview() {\r\n if (this._previewLine) {\r\n this._previewLine.parent?.remove(this._previewLine)\r\n this._previewLine.geometry.dispose()\r\n const m = this._previewLine.material\r\n if (!Array.isArray(m)) m.dispose()\r\n this._previewLine = null\r\n }\r\n if (this._snapMarker) {\r\n this._snapMarker.parent?.remove(this._snapMarker)\r\n this._snapMarker.geometry.dispose()\r\n const m = this._snapMarker.material\r\n if (!Array.isArray(m)) m.dispose()\r\n this._snapMarker = null\r\n }\r\n this._requestUpdate()\r\n }\r\n\r\n /** Push `_northAngle` into the camera-controls azimuth so the view\r\n * rotates around the active floor's centre. Called on every activate\r\n * and whenever the angle changes while a floorplan is active. */\r\n private _applyNorthToCamera() {\r\n const world = this.components.get(CurrentWorld).world\r\n if (!world?.camera?.controls) return\r\n const controls = world.camera.controls as any\r\n const radians = (this._northAngle * Math.PI) / 180\r\n if (typeof controls.rotateAzimuthTo === 'function') {\r\n void controls.rotateAzimuthTo(radians, true)\r\n } else {\r\n controls.azimuthAngle = radians\r\n }\r\n }\r\n\r\n /** Force a render update so layer visibility/color changes paint\r\n * immediately even when the camera is at rest. */\r\n private _requestUpdate() {\r\n try {\r\n const fragments = this.components.get(OBC.FragmentsManager)\r\n fragments.core.update(true)\r\n } catch {\r\n // FragmentsManager not initialized yet — no-op.\r\n }\r\n }\r\n\r\n /** Build one entry per IFC storey. Drawings are projected lazily on\r\n * first activation. */\r\n async generate(modelId: string): Promise<FloorplanEntry[]> {\r\n const fragments = this.components.get(OBC.FragmentsManager)\r\n const model = fragments.list.get(modelId)\r\n if (!model) return []\r\n\r\n const sourceWorld = this.components.get(CurrentWorld).world\r\n if (!sourceWorld) return []\r\n\r\n this._emit({ isLoading: true, stage: 'readingStoreys' })\r\n\r\n try {\r\n this.disposeEntriesForModel(modelId)\r\n await this.projector.ensureEditorReady()\r\n\r\n const storeyIds = Object.values(\r\n await model.getItemsOfCategories([/BUILDINGSTOREY/]),\r\n ).flat()\r\n if (storeyIds.length === 0) return []\r\n\r\n const storeysData = await model.getItemsData(storeyIds)\r\n const [, coordHeight] = await model.getCoordinates()\r\n const box = model.box\r\n const minY = box.min.y\r\n const maxY = box.max.y\r\n\r\n const created: FloorplanEntry[] = []\r\n\r\n // storeysData is parallel to storeyIds — preserve the mapping so each\r\n // entry remembers its storey's localId for later per-storey queries.\r\n for (let i = 0; i < storeysData.length; i++) {\r\n const storey = storeysData[i]\r\n const storeyLocalId = storeyIds[i]\r\n if (!('value' in storey.Name && 'value' in storey.Elevation)) continue\r\n\r\n const name = String(storey.Name.value)\r\n const rawElev = Number(storey.Elevation.value)\r\n const elevation = normalizeElevation(rawElev, coordHeight, minY, maxY)\r\n\r\n const entry: FloorplanEntry = {\r\n id: `${modelId}::${name}`,\r\n name,\r\n elevation,\r\n storeyLocalId,\r\n modelId,\r\n drawing: null,\r\n projected: false,\r\n layers: [],\r\n }\r\n this._entries.set(entry.id, entry)\r\n created.push(entry)\r\n }\r\n\r\n this.onDrawingsChanged.trigger(this.drawings)\r\n return created\r\n } finally {\r\n this._emit({ isLoading: false })\r\n }\r\n }\r\n\r\n /**\r\n * Activate a floorplan with progressive feedback. Camera, lighting and\r\n * clip planes are applied synchronously so the user gets an immediate\r\n * top-down framing. The slow steps — fill/cut highlighting and line\r\n * projection — run in parallel and emit stage events as each phase\r\n * completes, so a loading bar can advance through `init → resolve → cull\r\n * → fill → cut → project → done`.\r\n */\r\n async activate(id: string) {\r\n const entry = this._entries.get(id)\r\n if (!entry) return\r\n if (this._activeId === id) return\r\n\r\n const sourceWorld = this.components.get(CurrentWorld).world\r\n if (!sourceWorld) return\r\n\r\n const seq = ++this._activateSeq\r\n const wasActive = this._activeId !== null\r\n\r\n this._emit({ isLoading: true, stage: 'init' })\r\n\r\n // Mutual exclusion: deactivate any other view tool before claiming.\r\n await this._tryClaimCoordinator()\r\n if (seq !== this._activateSeq) return\r\n\r\n try {\r\n // ----- Phase 1: synchronous chrome + clip + camera (instant feedback)\r\n if (!wasActive) {\r\n this.chrome.applyLighting()\r\n this.chrome.applyDrawingBackground()\r\n // Lock to top-down (polar = 0).\r\n this.camera.lock(0)\r\n this.chrome.setCursor()\r\n this.chrome.disableHighlighter()\r\n this.chrome.hideGizmo()\r\n }\r\n\r\n // Section clip just above the drawing plane. StoreyProjector positions\r\n // the drawing at elevation + 1.5; clip normal is -Y so anything above\r\n // 1.55 is hidden but the drawing's own lines survive.\r\n this.clip.set(\r\n SLOT_SECTION,\r\n new THREE.Vector3(0, -1, 0),\r\n new THREE.Vector3(0, entry.elevation + 1.5 + 0.05, 0),\r\n )\r\n safeRun(() => this._applyLowerClip(entry), 'applyLower')\r\n safeRun(() => this.grid.hide(), 'hideGrid')\r\n\r\n // Hide previously visible drawings synchronously so they don't bleed\r\n // through while the new one is being projected.\r\n for (const other of this._entries.values()) {\r\n if (other.drawing && other.id !== entry.id) {\r\n other.drawing.three.visible = false\r\n }\r\n }\r\n\r\n this._frameCamera(entry)\r\n\r\n // Mark active immediately so the React UI shows Exit and the user can\r\n // bail out at any point during loading.\r\n this._activeId = id\r\n this.onActiveDrawingChanged.trigger(entry)\r\n\r\n // ----- Phase 2: parallel render + project (slow) -----\r\n const renderPromise = this.renderer.apply(entry, (stage) => {\r\n if (seq !== this._activateSeq) return\r\n this._emit({ isLoading: true, stage })\r\n })\r\n\r\n // Project once render-stage events have started flowing — this lets\r\n // the bar progress through resolve/cull/fill/cut while line generation\r\n // runs in the background. Once render completes we flip to 'project'.\r\n const projectPromise = this.projector.project(entry)\r\n\r\n renderPromise\r\n .then(() => {\r\n if (seq !== this._activateSeq) return\r\n this._emit({ isLoading: true, stage: 'project' })\r\n })\r\n .catch(() => {})\r\n\r\n await Promise.all([renderPromise, projectPromise])\r\n if (seq !== this._activateSeq) return\r\n\r\n // Drawing visible + editor swap (fast, post-projection).\r\n const editor = this.components.get(OBF.DrawingEditor)\r\n editor.activeDrawing = entry.drawing\r\n if (entry.drawing) {\r\n entry.drawing.three.visible = true\r\n }\r\n\r\n // Prepend Fill / Cut group-color controls so the sidebar shows them\r\n // at the top of the layers list.\r\n this._injectGroupColorLayers(entry)\r\n\r\n this._emit({ isLoading: false, stage: 'done' })\r\n } catch (error) {\r\n console.warn('[FloorplanTool] activate failed:', error)\r\n this._emit({ isLoading: false })\r\n }\r\n }\r\n\r\n /**\r\n * Exit floorplan mode. Each cleanup step is independently guarded so a\r\n * failure in one (e.g. resetHighlight on a huge model) cannot strand\r\n * camera, clip, or gizmo state.\r\n */\r\n async deactivate() {\r\n if (!this._activeId) return\r\n\r\n // Reset active state immediately so the React UI hides Exit and double\r\n // calls become no-ops.\r\n this._activeId = null\r\n this.onActiveDrawingChanged.trigger(null)\r\n\r\n // Drop any in-flight north-pick listener so the canvas stops\r\n // intercepting clicks once the floorplan is closed.\r\n safeRun(() => this.cancelPickNorth(), 'cancelPickNorth')\r\n\r\n // Clear editor + drawing visibility (synchronous, fast).\r\n safeRun(() => {\r\n const editor = this.components.get(OBF.DrawingEditor)\r\n editor.activeDrawing = null\r\n }, 'clear active drawing')\r\n for (const entry of this._entries.values()) {\r\n if (entry.drawing) {\r\n safeRun(() => {\r\n entry.drawing!.three.visible = false\r\n }, 'hide drawing')\r\n }\r\n }\r\n\r\n // Restore user-facing state FIRST so input feels responsive even if\r\n // model-render restoration takes a beat.\r\n safeRun(() => this.clip.removeAll(), 'removeClips')\r\n safeRun(() => this.grid.restore(), 'showGrid')\r\n safeRun(() => this.camera.unlock(), 'unlockCamera')\r\n safeRun(() => this.chrome.restoreCursor(), 'restoreCursor')\r\n safeRun(() => this.chrome.restoreHighlighter(), 'restoreHighlighter')\r\n safeRun(() => this.chrome.showGizmo(), 'showGizmo')\r\n safeRun(() => this.chrome.removeLighting(), 'removeLighting')\r\n safeRun(() => this.chrome.restoreBackground(), 'restoreBackground')\r\n\r\n // Slow async step last. Awaited so callers can chain on it, but failures\r\n // can't undo the synchronous restores above.\r\n await safeRunAsync(() => this.renderer.restore(), 'restoreModelRendering')\r\n\r\n safeRun(() => this._releaseCoordinator(), 'releaseCoordinator')\r\n }\r\n\r\n disposeEntriesForModel(modelId: string) {\r\n let touched = false\r\n for (const [id, entry] of this._entries) {\r\n if (entry.modelId !== modelId) continue\r\n if (this._activeId === id) void this.deactivate()\r\n disposeDrawing(this.components, entry.drawing)\r\n this._entries.delete(id)\r\n this.renderer.invalidateForEntry(id)\r\n touched = true\r\n }\r\n this.renderer.invalidateForModel(modelId)\r\n this.projector.invalidateForModel(modelId)\r\n if (touched) this.onDrawingsChanged.trigger(this.drawings)\r\n }\r\n\r\n dispose() {\r\n void this.deactivate()\r\n for (const entry of this._entries.values()) {\r\n disposeDrawing(this.components, entry.drawing)\r\n }\r\n this._entries.clear()\r\n this.onDrawingsChanged.trigger([])\r\n }\r\n\r\n private _emit(state: FloorplanLoadingState) {\r\n this.onGenerationStateChanged.trigger(state)\r\n }\r\n\r\n /** Mutual-exclusion claim. If ElevationsTool (or any other view tool)\r\n * was active, the coordinator awaits its deactivate() first. */\r\n private async _tryClaimCoordinator() {\r\n try {\r\n const coordinator = this.components.get(ViewModeCoordinator)\r\n await coordinator.claim(this)\r\n } catch {\r\n // ViewModeCoordinator not registered in this viewer — ignore.\r\n }\r\n }\r\n\r\n private _releaseCoordinator() {\r\n try {\r\n this.components.get(ViewModeCoordinator).release(this)\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n\r\n /** Lower clip plane sits just under the active floor's slab (normal +Y),\r\n * so ceiling fixtures / lights / equipment of the storey below never\r\n * bleed into the projection or the 3D underlay. */\r\n private _applyLowerClip(entry: FloorplanEntry) {\r\n const cutY = entry.elevation - 0.5\r\n this.clip.set(\r\n SLOT_LOWER,\r\n new THREE.Vector3(0, 1, 0),\r\n new THREE.Vector3(0, cutY, 0),\r\n )\r\n }\r\n\r\n /** Frame the camera over the active floor in orthographic top-down,\r\n * then re-apply the building's true-north rotation so storey switches\r\n * preserve the user's chosen orientation. */\r\n private _frameCamera(entry: FloorplanEntry) {\r\n const fragments = this.components.get(OBC.FragmentsManager)\r\n const model = fragments.list.get(entry.modelId)\r\n if (!model) return\r\n const center = new THREE.Vector3()\r\n const size = new THREE.Vector3()\r\n model.box.getCenter(center)\r\n model.box.getSize(size)\r\n const span = Math.max(size.x, size.z, 10)\r\n const target = new THREE.Vector3(\r\n center.x,\r\n entry.elevation + 1.2,\r\n center.z,\r\n )\r\n this.camera.frame(target, new THREE.Vector3(0, -1, 0), span)\r\n this._applyNorthToCamera()\r\n }\r\n\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/FloorplanTool/index.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as OBC from '@thatopen/components'\r\nimport * as OBF from '@thatopen/components-front'\r\nimport * as THREE from 'three'\r\nimport { CurrentWorld } from '../CurrentWorld'\r\nimport { CameraController } from '../lib/CameraController'\r\nimport { ChromeController } from '../lib/ChromeController'\r\nimport { ClipController } from '../lib/ClipController'\r\nimport { CUT_CLASSES, FILL_CLASSES } from '../lib/drawingLayers'\r\nimport { disposeDrawing } from '../lib/drawingProjection'\r\nimport { GridController } from '../lib/GridController'\r\nimport { safeRun, safeRunAsync } from '../lib/safeRun'\r\nimport { stagePercent, ViewLoadingState } from '../lib/viewSection'\r\nimport { ViewModeCoordinator } from '../lib/ViewModeCoordinator'\r\nimport { FloorplanRenderer, RenderStage } from './src/FloorplanRenderer'\r\nimport { StoreyProjector } from './src/StoreyProjector'\r\nimport { CUT_COLOR, FILL_COLOR, FloorplanEntry, FLOORPLAN_TOOL_UUID } from './src/types'\r\nimport { normalizeElevation } from './src/utils'\r\n\r\nconst SLOT_SECTION = 'floorplan:section'\r\nconst SLOT_LOWER = 'floorplan:lower'\r\n\r\nexport type { FloorplanEntry } from './src/types'\r\n\r\nexport type FloorplanLoadingStage =\r\n | 'init'\r\n | 'readingStoreys'\r\n | RenderStage\r\n | 'project'\r\n | 'done'\r\n\r\nexport type FloorplanLoadingState = ViewLoadingState<FloorplanLoadingStage>\r\n\r\nconst STAGE_PERCENT: Record<FloorplanLoadingStage, number> = {\r\n init: 5,\r\n readingStoreys: 10,\r\n resolve: 20,\r\n cull: 35,\r\n switching: 35,\r\n cut: 55,\r\n fill: 75,\r\n project: 90,\r\n done: 100,\r\n}\r\n\r\nexport function getFloorplanStagePercent(\r\n stage: FloorplanLoadingStage | undefined,\r\n): number {\r\n return stagePercent(stage, STAGE_PERCENT)\r\n}\r\n\r\nexport class FloorplanTool extends OBC.Component {\r\n static uuid = FLOORPLAN_TOOL_UUID\r\n\r\n enabled = false\r\n\r\n readonly onDrawingsChanged = new OBC.Event<FloorplanEntry[]>()\r\n readonly onActiveDrawingChanged = new OBC.Event<FloorplanEntry | null>()\r\n readonly onGenerationStateChanged = new OBC.Event<FloorplanLoadingState>()\r\n /** Fires whenever an entry's layer metadata changes (toggle / color). */\r\n readonly onLayersChanged = new OBC.Event<FloorplanEntry>()\r\n /** Fires when the building's true-north angle (in degrees) is updated. */\r\n readonly onNorthAngleChanged = new OBC.Event<number>()\r\n /** Fires when line-pick mode toggles on/off. */\r\n readonly onPickingNorthChanged = new OBC.Event<boolean>()\r\n\r\n private _entries = new Map<string, FloorplanEntry>()\r\n private _activeId: string | null = null\r\n /** Sequence guard: when activate() is called multiple times in quick\r\n * succession (e.g. user clicks two storeys), only the last call applies\r\n * its final state. Prior calls bail out at await boundaries. */\r\n private _activateSeq = 0\r\n /** True-north rotation in degrees (clockwise from default screen-up).\r\n * Persists across storey switches but resets to 0 on tool dispose. */\r\n private _northAngle = 0\r\n /** True while the user is drawing the two-point north line. */\r\n private _pickingNorth = false\r\n private _pickHandler: ((e: MouseEvent) => void) | null = null\r\n private _moveHandler: ((e: MouseEvent) => void) | null = null\r\n private _keyHandler: ((e: KeyboardEvent) => void) | null = null\r\n /** First clicked point of the north line, in drawing-local space (Y=0).\r\n * Null until the user places the first point. */\r\n private _drawStart: THREE.Vector3 | null = null\r\n /** Cached snap targets — projected-geometry vertices flattened as\r\n * [x0,z0, x1,z1, …] in drawing-local space. Rebuilt each time draw mode\r\n * starts so it reflects the active storey's lines. */\r\n private _snapVerts: Float32Array | null = null\r\n /** Rubber-band preview line + cursor snap marker, parented to the active\r\n * drawing so they inherit its world transform. */\r\n private _previewLine: THREE.Line | null = null\r\n private _snapMarker: THREE.LineSegments | null = null\r\n /** Canvas cursor before draw mode swapped in the crosshair — typically the\r\n * floorplan-mode \"grab\" hand. Restored (not cleared) on exit so panning\r\n * keeps the hand; only leaving floorplan mode reverts to the default. */\r\n private _savedPickCursor: string | null = null\r\n\r\n private projector: StoreyProjector\r\n private renderer: FloorplanRenderer\r\n private camera: CameraController\r\n private chrome: ChromeController\r\n private clip: ClipController\r\n private grid: GridController\r\n\r\n constructor(components: OBC.Components) {\r\n super(components)\r\n components.add(FloorplanTool.uuid, this)\r\n\r\n this.projector = new StoreyProjector(components)\r\n this.renderer = new FloorplanRenderer(components, this.projector)\r\n this.camera = new CameraController(components)\r\n this.chrome = new ChromeController(components)\r\n this.clip = new ClipController(components)\r\n this.grid = new GridController(components)\r\n\r\n const fragments = components.get(OBC.FragmentsManager)\r\n fragments.core.onModelLoaded.add((model) => {\r\n void this.generate(model.modelId)\r\n })\r\n }\r\n\r\n get drawings(): FloorplanEntry[] {\r\n return Array.from(this._entries.values()).sort(\r\n (a, b) => a.elevation - b.elevation,\r\n )\r\n }\r\n\r\n get activeDrawingId() {\r\n return this._activeId\r\n }\r\n\r\n get activeDrawing(): FloorplanEntry | null {\r\n return this._activeId ? this._entries.get(this._activeId) ?? null : null\r\n }\r\n\r\n /** Inject the world grid (typically `bimState.bim.grid`). Without this\r\n * the tool falls back to looking it up via `OBC.Grids`. */\r\n setGrid(grid: any | null) {\r\n this.grid.setGrid(grid)\r\n }\r\n\r\n /** Toggle visibility of a single per-class layer on an entry's drawing. */\r\n setLayerVisible(entryId: string, className: string, visible: boolean) {\r\n const entry = this._entries.get(entryId)\r\n if (!entry?.drawing || !entry.drawing.layers.has(className)) return\r\n entry.drawing.layers.setVisibility(className, visible)\r\n const meta = entry.layers.find((l) => l.className === className)\r\n if (meta) meta.visible = visible\r\n this._requestUpdate()\r\n this.onLayersChanged.trigger(entry)\r\n }\r\n\r\n /** Update the color (hex int, e.g. 0xff0000) of a per-class layer. Updates\r\n * both the projected-line color in the drawing AND the 3D highlight\r\n * color for FILL (slabs / roofs) and CUT (walls / columns / curtain-\r\n * walls) classes — so changing the IFCSLAB color repaints both its\r\n * outline and its solid fill underneath. */\r\n async setLayerColor(entryId: string, className: string, color: number) {\r\n const entry = this._entries.get(entryId)\r\n if (!entry?.drawing || !entry.drawing.layers.has(className)) return\r\n entry.drawing.layers.setColor(className, color)\r\n const meta = entry.layers.find((l) => l.className === className)\r\n if (meta) meta.color = color\r\n\r\n if (FILL_CLASSES.has(className) || CUT_CLASSES.has(className)) {\r\n await this._updateClassHighlight(entry, className, color)\r\n }\r\n\r\n this._requestUpdate()\r\n this.onLayersChanged.trigger(entry)\r\n }\r\n\r\n /** Prepend Fill / Cut group-color rows to entry.layers so the sidebar\r\n * shows group-level color pickers at the top of the layer list. Idempotent\r\n * — removes any existing group entries before re-inserting. */\r\n private _injectGroupColorLayers(entry: FloorplanEntry) {\r\n // Read current group colors from the renderer config so subsequent\r\n // setFillGroupColor / setCutGroupColor calls are reflected immediately.\r\n const groups = (this.renderer as any)._highlighter?.config?.groups ?? []\r\n const cutColor: number = (groups[0]?.color as number | undefined) ?? CUT_COLOR\r\n const fillColor: number = (groups[1]?.color as number | undefined) ?? FILL_COLOR\r\n const filtered = entry.layers.filter(\r\n (l) => l.className !== 'DrawingLayers.fill' && l.className !== 'DrawingLayers.cut',\r\n )\r\n entry.layers = [\r\n {\r\n className: 'DrawingLayers.cut',\r\n layerName: 'DrawingLayers.cut',\r\n visible: true,\r\n color: cutColor,\r\n itemCount: 0,\r\n displayKey: 'DrawingLayers.cut',\r\n },\r\n {\r\n className: 'DrawingLayers.fill',\r\n layerName: 'DrawingLayers.fill',\r\n visible: true,\r\n color: fillColor,\r\n itemCount: 0,\r\n displayKey: 'DrawingLayers.fill',\r\n },\r\n ...filtered,\r\n ]\r\n }\r\n\r\n /** Re-apply the 3D highlight (mesh fill color) for a single IFC class on\r\n * the active model, scoped to the active storey. Called after the user\r\n * edits a layer color in the sidebar so the 3D underlay stays in sync\r\n * with the line color. */\r\n private async _updateClassHighlight(\r\n entry: FloorplanEntry,\r\n className: string,\r\n color: number,\r\n ) {\r\n const fragments = this.components.get(OBC.FragmentsManager)\r\n const model = fragments.list.get(entry.modelId) as any\r\n if (!model) return\r\n\r\n // Match this specific class only (no partial-match regex).\r\n const map = await model.getItemsOfCategories([\r\n new RegExp(`^${className}$`),\r\n ])\r\n let ids = Object.values(map).flat() as number[]\r\n\r\n // Restrict to the active storey so changes don't leak into other floors.\r\n try {\r\n const storeyIds = await this.projector.getCachedStoreyIds(\r\n entry.modelId,\r\n entry.storeyLocalId,\r\n model,\r\n )\r\n if (storeyIds.length > 0) {\r\n const set = new Set(storeyIds)\r\n ids = ids.filter((id) => set.has(id))\r\n }\r\n } catch {\r\n // best-effort — fall through with unfiltered ids\r\n }\r\n\r\n if (ids.length === 0) return\r\n try {\r\n await model.highlight(ids, {\r\n color: new THREE.Color(color),\r\n opacity: 1,\r\n transparent: false,\r\n renderedFaces: 1,\r\n preserveOriginalMaterial: false,\r\n })\r\n fragments.core.update(true)\r\n } catch (error) {\r\n console.warn(\r\n `[FloorplanTool] 3D highlight update failed for ${className}:`,\r\n error,\r\n )\r\n }\r\n }\r\n\r\n /** Change the 3D fill color for ALL fill-group items (slabs / roofs) on\r\n * the active entry. Updates the layer metadata so the sidebar swatch\r\n * reflects the change immediately. */\r\n async setFillGroupColor(entryId: string, color: number) {\r\n const entry = this._entries.get(entryId)\r\n if (!entry) return\r\n await this.renderer.setFillColor(entryId, color)\r\n const meta = entry.layers.find((l) => l.className === 'DrawingLayers.fill')\r\n if (meta) meta.color = color\r\n this.onLayersChanged.trigger(entry)\r\n }\r\n\r\n /** Change the 3D cut color for ALL cut-group items (walls / columns /\r\n * curtain walls) on the active entry. */\r\n async setCutGroupColor(entryId: string, color: number) {\r\n const entry = this._entries.get(entryId)\r\n if (!entry) return\r\n await this.renderer.setCutColor(entryId, color)\r\n const meta = entry.layers.find((l) => l.className === 'DrawingLayers.cut')\r\n if (meta) meta.color = color\r\n this.onLayersChanged.trigger(entry)\r\n }\r\n\r\n /** Current true-north rotation (degrees, clockwise from default up). */\r\n get northAngle(): number {\r\n return this._northAngle\r\n }\r\n\r\n /** True while the line-pick mode is awaiting a click on the drawing. */\r\n get isPickingNorth(): boolean {\r\n return this._pickingNorth\r\n }\r\n\r\n /** Set the true-north rotation. Normalised to [0, 360). Applied to the\r\n * camera azimuth immediately if a floorplan is currently active so the\r\n * view re-orients. */\r\n setNorthAngle(degrees: number) {\r\n const normalized = ((degrees % 360) + 360) % 360\r\n if (this._northAngle === normalized) return\r\n this._northAngle = normalized\r\n this.onNorthAngleChanged.trigger(normalized)\r\n if (this._activeId) this._applyNorthToCamera()\r\n }\r\n\r\n /** Enter two-point draw mode. The user clicks two points on the active\r\n * floorplan (each snapped to the nearest projected-geometry vertex); the\r\n * bearing of the segment between them becomes the new true-north angle.\r\n * A rubber-band preview + snap marker track the cursor; Esc cancels.\r\n * No-op if no floorplan is active. */\r\n startPickNorth() {\r\n if (this._pickingNorth || !this._activeId) return\r\n const entry = this.activeDrawing\r\n const world = this.components.get(CurrentWorld).world\r\n if (!entry?.drawing || !world?.renderer) return\r\n const canvas = world.renderer.three.domElement\r\n\r\n this._drawStart = null\r\n this._snapVerts = this._collectSnapVertices(entry)\r\n\r\n this._pickHandler = (e: MouseEvent) => this._onPickClick(e)\r\n this._moveHandler = (e: MouseEvent) => this._onPickMove(e)\r\n this._keyHandler = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') this.cancelPickNorth()\r\n }\r\n canvas.addEventListener('click', this._pickHandler)\r\n canvas.addEventListener('mousemove', this._moveHandler)\r\n window.addEventListener('keydown', this._keyHandler)\r\n this._savedPickCursor = canvas.style.cursor\r\n canvas.style.cursor = 'crosshair'\r\n this._pickingNorth = true\r\n this.onPickingNorthChanged.trigger(true)\r\n }\r\n\r\n /** Exit draw mode without applying any rotation. Tears down the canvas\r\n * listeners and removes the rubber-band preview. */\r\n cancelPickNorth() {\r\n if (!this._pickingNorth) return\r\n const world = this.components.get(CurrentWorld).world\r\n const canvas = world?.renderer?.three.domElement ?? null\r\n if (canvas) {\r\n if (this._pickHandler) canvas.removeEventListener('click', this._pickHandler)\r\n if (this._moveHandler) canvas.removeEventListener('mousemove', this._moveHandler)\r\n // Restore the floorplan-mode cursor (the grab hand), not the OS default\r\n // — that only comes back when the tool deactivates.\r\n canvas.style.cursor = this._savedPickCursor ?? 'grab'\r\n }\r\n this._savedPickCursor = null\r\n if (this._keyHandler) window.removeEventListener('keydown', this._keyHandler)\r\n this._pickHandler = null\r\n this._moveHandler = null\r\n this._keyHandler = null\r\n this._drawStart = null\r\n this._snapVerts = null\r\n this._clearPreview()\r\n this._pickingNorth = false\r\n this.onPickingNorthChanged.trigger(false)\r\n }\r\n\r\n /** Click handler for draw mode. First click places the start point; the\r\n * second rotates the view so the drawn segment becomes parallel to the\r\n * screen X-axis (horizontal). Both points lie on the drawing's horizontal\r\n * plane (Y=0), so only the in-plane direction matters. */\r\n private _onPickClick(event: MouseEvent) {\r\n const entry = this.activeDrawing\r\n if (!entry?.drawing) return\r\n const local = this._eventToLocalPoint(event, entry)\r\n if (!local) return\r\n const point = this._snap(local)\r\n\r\n if (!this._drawStart) {\r\n this._drawStart = point\r\n this._updatePreview(entry, point)\r\n this._requestUpdate()\r\n return\r\n }\r\n\r\n // Ignore a degenerate (near-zero-length) segment so a stray double-click\r\n // can't set a bogus angle.\r\n const dx = point.x - this._drawStart.x\r\n const dz = point.z - this._drawStart.z\r\n if (dx * dx + dz * dz < 1e-6) return\r\n\r\n // Resolve the segment in WORLD space (the drawing has its own orientTo\r\n // rotation, so a drawing-local bearing wouldn't match the world-space\r\n // camera azimuth), then rotate the view to lay it on the X-axis.\r\n const drawing = entry.drawing\r\n drawing.three.updateWorldMatrix(true, false)\r\n const aWorld = drawing.three.localToWorld(this._drawStart.clone())\r\n const bWorld = drawing.three.localToWorld(point.clone())\r\n const azimuthDeg = this._azimuthToAlignLineToX(aWorld, bWorld)\r\n if (azimuthDeg !== null) this.setNorthAngle(azimuthDeg)\r\n this.cancelPickNorth()\r\n }\r\n\r\n /** Camera azimuth (degrees) that rotates the top-down view so the world\r\n * segment a→b lands parallel to the screen X-axis (horizontal).\r\n *\r\n * Derivation: with the standard Y-up spherical convention camera-controls\r\n * uses, the camera's screen-right world direction has angle ρ = −θ + C\r\n * (θ = azimuth). We measure ρ₀ and θ₀ from the live camera so C cancels —\r\n * making the result independent of the drawing's orientation and the\r\n * controls' up-space. We then solve ρ(θ) = λ (the segment's world angle),\r\n * giving θ = ρ₀ + θ₀ − λ. Returns null if the controls are unavailable. */\r\n private _azimuthToAlignLineToX(\r\n aWorld: THREE.Vector3,\r\n bWorld: THREE.Vector3,\r\n ): number | null {\r\n const world = this.components.get(CurrentWorld).world\r\n const cam = world?.camera?.three as THREE.Camera | undefined\r\n const controls = world?.camera?.controls as any\r\n if (!cam || typeof controls?.azimuthAngle !== 'number') return null\r\n\r\n const lx = bWorld.x - aWorld.x\r\n const lz = bWorld.z - aWorld.z\r\n if (lx * lx + lz * lz < 1e-12) return null\r\n const lambda = Math.atan2(lz, lx)\r\n\r\n // Screen-right = camera local +X axis = first column of matrixWorld.\r\n cam.updateMatrixWorld()\r\n const e = cam.matrixWorld.elements\r\n const rho0 = Math.atan2(e[2], e[0])\r\n const theta0 = controls.azimuthAngle as number\r\n\r\n return ((rho0 + theta0 - lambda) * 180) / Math.PI\r\n }\r\n\r\n /** Mousemove handler for draw mode — keeps the snap marker (and, after the\r\n * first click, the rubber-band line) glued to the cursor's snapped point. */\r\n private _onPickMove(event: MouseEvent) {\r\n const entry = this.activeDrawing\r\n if (!entry?.drawing) return\r\n const local = this._eventToLocalPoint(event, entry)\r\n if (!local) return\r\n this._updatePreview(entry, this._snap(local))\r\n this._requestUpdate()\r\n }\r\n\r\n /** Convert a canvas mouse event into a point on the drawing plane, in\r\n * drawing-local space (XZ plane, Y=0). Casts a ray from the active camera,\r\n * transforms it into the drawing's local frame, and intersects Y=0. */\r\n private _eventToLocalPoint(\r\n event: MouseEvent,\r\n entry: FloorplanEntry,\r\n ): THREE.Vector3 | null {\r\n const world = this.components.get(CurrentWorld).world\r\n if (!world?.renderer || !world.camera || !entry.drawing) return null\r\n const canvas = world.renderer.three.domElement\r\n const rect = canvas.getBoundingClientRect()\r\n const x = ((event.clientX - rect.left) / rect.width) * 2 - 1\r\n const y = -((event.clientY - rect.top) / rect.height) * 2 + 1\r\n const raycaster = new THREE.Raycaster()\r\n raycaster.setFromCamera(\r\n new THREE.Vector2(x, y),\r\n world.camera.three as THREE.Camera,\r\n )\r\n const drawing = entry.drawing\r\n drawing.three.updateWorldMatrix(true, false)\r\n const inv = new THREE.Matrix4().copy(drawing.three.matrixWorld).invert()\r\n const origin = raycaster.ray.origin.clone().applyMatrix4(inv)\r\n const dir = raycaster.ray.direction.clone().transformDirection(inv)\r\n if (Math.abs(dir.y) < 1e-9) return null\r\n const t = -origin.y / dir.y\r\n if (!Number.isFinite(t)) return null\r\n return new THREE.Vector3(\r\n origin.x + dir.x * t,\r\n 0,\r\n origin.z + dir.z * t,\r\n )\r\n }\r\n\r\n /** Snap a drawing-local point to the nearest projected-geometry vertex\r\n * within the snap radius; returns the point unchanged if none is close. */\r\n private _snap(local: THREE.Vector3): THREE.Vector3 {\r\n const verts = this._snapVerts\r\n if (!verts) return local\r\n const radius = this._snapRadiusLocal()\r\n let best = -1\r\n let bestD2 = radius * radius\r\n for (let i = 0; i < verts.length; i += 2) {\r\n const dx = verts[i] - local.x\r\n const dz = verts[i + 1] - local.z\r\n const d2 = dx * dx + dz * dz\r\n if (d2 < bestD2) {\r\n bestD2 = d2\r\n best = i\r\n }\r\n }\r\n if (best < 0) return local\r\n return new THREE.Vector3(verts[best], 0, verts[best + 1])\r\n }\r\n\r\n /** Snap radius in drawing-local units (= world units; the drawing is\r\n * unscaled), derived from a fixed ~12 px tolerance at the current ortho\r\n * zoom so it feels consistent as the user zooms. */\r\n private _snapRadiusLocal(): number {\r\n const SNAP_PX = 12\r\n const FALLBACK = 0.5\r\n const world = this.components.get(CurrentWorld).world\r\n const cam = world?.camera?.three as any\r\n const canvas = world?.renderer?.three.domElement\r\n if (!cam?.isOrthographicCamera || !canvas) return FALLBACK\r\n const worldWidth = (cam.right - cam.left) / (cam.zoom || 1)\r\n const worldPerPixel = worldWidth / Math.max(1, canvas.clientWidth)\r\n return worldPerPixel * SNAP_PX || FALLBACK\r\n }\r\n\r\n /** Flatten every visible projected line vertex into drawing-local [x,z]\r\n * pairs for endpoint snapping. Each vertex is transformed through its\r\n * owning object's world matrix into the drawing's local frame, so it\r\n * works regardless of how layers nest the `LineSegments`. */\r\n private _collectSnapVertices(entry: FloorplanEntry): Float32Array | null {\r\n const drawing = entry.drawing\r\n if (!drawing) return null\r\n drawing.three.updateWorldMatrix(true, true)\r\n const inv = new THREE.Matrix4().copy(drawing.three.matrixWorld).invert()\r\n const v = new THREE.Vector3()\r\n const out: number[] = []\r\n drawing.three.traverse((child: THREE.Object3D) => {\r\n if (!(child instanceof THREE.LineSegments) || !child.visible) return\r\n if (child.userData?.isDimension) return\r\n const pos = child.geometry?.attributes?.position as\r\n | THREE.BufferAttribute\r\n | undefined\r\n if (!pos) return\r\n for (let i = 0; i < pos.count; i++) {\r\n v.set(pos.getX(i), pos.getY(i), pos.getZ(i))\r\n .applyMatrix4(child.matrixWorld)\r\n .applyMatrix4(inv)\r\n out.push(v.x, v.z)\r\n }\r\n })\r\n return out.length ? new Float32Array(out) : null\r\n }\r\n\r\n /** Update (creating on first use) the cursor snap marker and, once the\r\n * first point is placed, the rubber-band line from start → cursor. Both\r\n * live in drawing-local space, Y=0. */\r\n private _updatePreview(entry: FloorplanEntry, current: THREE.Vector3) {\r\n const drawing = entry.drawing\r\n if (!drawing) return\r\n const COLOR = 0x2563eb\r\n\r\n if (!this._snapMarker) {\r\n // Unit-armed cross scaled to the snap radius so it reads as the\r\n // current snap tolerance.\r\n const geom = new THREE.BufferGeometry()\r\n geom.setAttribute(\r\n 'position',\r\n new THREE.Float32BufferAttribute(\r\n new Float32Array([-1, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 1]),\r\n 3,\r\n ),\r\n )\r\n this._snapMarker = new THREE.LineSegments(\r\n geom,\r\n new THREE.LineBasicMaterial({ color: COLOR }),\r\n )\r\n this._snapMarker.renderOrder = 999\r\n drawing.three.add(this._snapMarker)\r\n }\r\n const arm = this._snapRadiusLocal()\r\n this._snapMarker.scale.setScalar(arm)\r\n this._snapMarker.position.set(current.x, 0, current.z)\r\n this._snapMarker.visible = true\r\n\r\n if (!this._drawStart) {\r\n if (this._previewLine) this._previewLine.visible = false\r\n return\r\n }\r\n if (!this._previewLine) {\r\n const geom = new THREE.BufferGeometry()\r\n geom.setAttribute(\r\n 'position',\r\n new THREE.Float32BufferAttribute(new Float32Array(6), 3),\r\n )\r\n this._previewLine = new THREE.Line(\r\n geom,\r\n new THREE.LineBasicMaterial({ color: COLOR }),\r\n )\r\n this._previewLine.renderOrder = 999\r\n drawing.three.add(this._previewLine)\r\n }\r\n const pos = this._previewLine.geometry.attributes\r\n .position as THREE.BufferAttribute\r\n pos.setXYZ(0, this._drawStart.x, 0, this._drawStart.z)\r\n pos.setXYZ(1, current.x, 0, current.z)\r\n pos.needsUpdate = true\r\n this._previewLine.visible = true\r\n }\r\n\r\n /** Remove + dispose the preview line and snap marker. Uses each object's\r\n * own parent so it stays correct even when called from deactivate(),\r\n * where `_activeId` is already null. */\r\n private _clearPreview() {\r\n if (this._previewLine) {\r\n this._previewLine.parent?.remove(this._previewLine)\r\n this._previewLine.geometry.dispose()\r\n const m = this._previewLine.material\r\n if (!Array.isArray(m)) m.dispose()\r\n this._previewLine = null\r\n }\r\n if (this._snapMarker) {\r\n this._snapMarker.parent?.remove(this._snapMarker)\r\n this._snapMarker.geometry.dispose()\r\n const m = this._snapMarker.material\r\n if (!Array.isArray(m)) m.dispose()\r\n this._snapMarker = null\r\n }\r\n this._requestUpdate()\r\n }\r\n\r\n /** Push `_northAngle` into the camera-controls azimuth so the view\r\n * rotates around the active floor's centre. Called on every activate\r\n * and whenever the angle changes while a floorplan is active. */\r\n private _applyNorthToCamera() {\r\n const world = this.components.get(CurrentWorld).world\r\n if (!world?.camera?.controls) return\r\n const controls = world.camera.controls as any\r\n const radians = (this._northAngle * Math.PI) / 180\r\n if (typeof controls.rotateAzimuthTo === 'function') {\r\n void controls.rotateAzimuthTo(radians, true)\r\n } else {\r\n controls.azimuthAngle = radians\r\n }\r\n }\r\n\r\n /** Force a render update so layer visibility/color changes paint\r\n * immediately even when the camera is at rest. */\r\n private _requestUpdate() {\r\n try {\r\n const fragments = this.components.get(OBC.FragmentsManager)\r\n fragments.core.update(true)\r\n } catch {\r\n // FragmentsManager not initialized yet — no-op.\r\n }\r\n }\r\n\r\n /** Build one entry per IFC storey. Drawings are projected lazily on\r\n * first activation. */\r\n async generate(modelId: string): Promise<FloorplanEntry[]> {\r\n const fragments = this.components.get(OBC.FragmentsManager)\r\n const model = fragments.list.get(modelId)\r\n if (!model) return []\r\n\r\n const sourceWorld = this.components.get(CurrentWorld).world\r\n if (!sourceWorld) return []\r\n\r\n this._emit({ isLoading: true, stage: 'readingStoreys' })\r\n\r\n try {\r\n this.disposeEntriesForModel(modelId)\r\n await this.projector.ensureEditorReady()\r\n\r\n const storeyIds = Object.values(\r\n await model.getItemsOfCategories([/BUILDINGSTOREY/]),\r\n ).flat()\r\n if (storeyIds.length === 0) return []\r\n\r\n const storeysData = await model.getItemsData(storeyIds)\r\n const [, coordHeight] = await model.getCoordinates()\r\n const box = model.box\r\n const minY = box.min.y\r\n const maxY = box.max.y\r\n\r\n const created: FloorplanEntry[] = []\r\n\r\n // storeysData is parallel to storeyIds — preserve the mapping so each\r\n // entry remembers its storey's localId for later per-storey queries.\r\n for (let i = 0; i < storeysData.length; i++) {\r\n const storey = storeysData[i]\r\n const storeyLocalId = storeyIds[i]\r\n if (!('value' in storey.Name && 'value' in storey.Elevation)) continue\r\n\r\n const name = String(storey.Name.value)\r\n const rawElev = Number(storey.Elevation.value)\r\n const elevation = normalizeElevation(rawElev, coordHeight, minY, maxY)\r\n\r\n const entry: FloorplanEntry = {\r\n id: `${modelId}::${name}`,\r\n name,\r\n elevation,\r\n storeyLocalId,\r\n modelId,\r\n drawing: null,\r\n projected: false,\r\n layers: [],\r\n }\r\n this._entries.set(entry.id, entry)\r\n created.push(entry)\r\n }\r\n\r\n this.onDrawingsChanged.trigger(this.drawings)\r\n return created\r\n } finally {\r\n this._emit({ isLoading: false })\r\n }\r\n }\r\n\r\n /**\r\n * Activate a floorplan with progressive feedback. Camera, lighting and\r\n * clip planes are applied synchronously so the user gets an immediate\r\n * top-down framing. The slow steps — fill/cut highlighting and line\r\n * projection — run in parallel and emit stage events as each phase\r\n * completes, so a loading bar can advance through `init → resolve → cull\r\n * → fill → cut → project → done`.\r\n */\r\n async activate(id: string) {\r\n const entry = this._entries.get(id)\r\n if (!entry) return\r\n if (this._activeId === id) return\r\n\r\n const sourceWorld = this.components.get(CurrentWorld).world\r\n if (!sourceWorld) return\r\n\r\n const seq = ++this._activateSeq\r\n const wasActive = this._activeId !== null\r\n\r\n this._emit({ isLoading: true, stage: 'init' })\r\n\r\n // Mutual exclusion: deactivate any other view tool before claiming.\r\n await this._tryClaimCoordinator()\r\n if (seq !== this._activateSeq) return\r\n\r\n try {\r\n // ----- Phase 1: synchronous chrome + clip + camera (instant feedback)\r\n if (!wasActive) {\r\n this.chrome.applyLighting()\r\n this.chrome.applyDrawingBackground()\r\n // Lock to top-down (polar = 0).\r\n this.camera.lock(0)\r\n this.chrome.setCursor()\r\n this.chrome.disableHighlighter()\r\n this.chrome.hideGizmo()\r\n }\r\n\r\n // Section clip just above the drawing plane. StoreyProjector positions\r\n // the drawing at elevation + 1.5; clip normal is -Y so anything above\r\n // 1.55 is hidden but the drawing's own lines survive.\r\n this.clip.set(\r\n SLOT_SECTION,\r\n new THREE.Vector3(0, -1, 0),\r\n new THREE.Vector3(0, entry.elevation + 1.5 + 0.05, 0),\r\n )\r\n safeRun(() => this._applyLowerClip(entry), 'applyLower')\r\n safeRun(() => this.grid.hide(), 'hideGrid')\r\n\r\n // Hide previously visible drawings synchronously so they don't bleed\r\n // through while the new one is being projected.\r\n for (const other of this._entries.values()) {\r\n if (other.drawing && other.id !== entry.id) {\r\n other.drawing.three.visible = false\r\n }\r\n }\r\n\r\n this._frameCamera(entry)\r\n\r\n // Mark active immediately so the React UI shows Exit and the user can\r\n // bail out at any point during loading.\r\n this._activeId = id\r\n this.onActiveDrawingChanged.trigger(entry)\r\n\r\n // ----- Phase 2: parallel render + project (slow) -----\r\n const renderPromise = this.renderer.apply(entry, (stage) => {\r\n if (seq !== this._activateSeq) return\r\n this._emit({ isLoading: true, stage })\r\n })\r\n\r\n // Project once render-stage events have started flowing — this lets\r\n // the bar progress through resolve/cull/fill/cut while line generation\r\n // runs in the background. Once render completes we flip to 'project'.\r\n const projectPromise = this.projector.project(entry)\r\n\r\n renderPromise\r\n .then(() => {\r\n if (seq !== this._activateSeq) return\r\n this._emit({ isLoading: true, stage: 'project' })\r\n })\r\n .catch(() => {})\r\n\r\n await Promise.all([renderPromise, projectPromise])\r\n if (seq !== this._activateSeq) return\r\n\r\n // Drawing visible + editor swap (fast, post-projection).\r\n const editor = this.components.get(OBF.DrawingEditor)\r\n editor.activeDrawing = entry.drawing\r\n if (entry.drawing) {\r\n entry.drawing.three.visible = true\r\n }\r\n\r\n // Prepend Fill / Cut group-color controls so the sidebar shows them\r\n // at the top of the layers list.\r\n this._injectGroupColorLayers(entry)\r\n\r\n this._emit({ isLoading: false, stage: 'done' })\r\n } catch (error) {\r\n console.warn('[FloorplanTool] activate failed:', error)\r\n this._emit({ isLoading: false })\r\n }\r\n }\r\n\r\n /**\r\n * Exit floorplan mode. Each cleanup step is independently guarded so a\r\n * failure in one (e.g. resetHighlight on a huge model) cannot strand\r\n * camera, clip, or gizmo state.\r\n */\r\n async deactivate() {\r\n if (!this._activeId) return\r\n\r\n // Reset active state immediately so the React UI hides Exit and double\r\n // calls become no-ops.\r\n this._activeId = null\r\n this.onActiveDrawingChanged.trigger(null)\r\n\r\n // Drop any in-flight north-pick listener so the canvas stops\r\n // intercepting clicks once the floorplan is closed.\r\n safeRun(() => this.cancelPickNorth(), 'cancelPickNorth')\r\n\r\n // Clear editor + drawing visibility (synchronous, fast).\r\n safeRun(() => {\r\n const editor = this.components.get(OBF.DrawingEditor)\r\n editor.activeDrawing = null\r\n }, 'clear active drawing')\r\n for (const entry of this._entries.values()) {\r\n if (entry.drawing) {\r\n safeRun(() => {\r\n entry.drawing!.three.visible = false\r\n }, 'hide drawing')\r\n }\r\n }\r\n\r\n // Restore user-facing state FIRST so input feels responsive even if\r\n // model-render restoration takes a beat.\r\n safeRun(() => this.clip.removeAll(), 'removeClips')\r\n safeRun(() => this.grid.restore(), 'showGrid')\r\n safeRun(() => this.camera.unlock(), 'unlockCamera')\r\n safeRun(() => this.chrome.restoreCursor(), 'restoreCursor')\r\n safeRun(() => this.chrome.restoreHighlighter(), 'restoreHighlighter')\r\n safeRun(() => this.chrome.showGizmo(), 'showGizmo')\r\n safeRun(() => this.chrome.removeLighting(), 'removeLighting')\r\n safeRun(() => this.chrome.restoreBackground(), 'restoreBackground')\r\n\r\n // Slow async step last. Awaited so callers can chain on it, but failures\r\n // can't undo the synchronous restores above.\r\n await safeRunAsync(() => this.renderer.restore(), 'restoreModelRendering')\r\n\r\n safeRun(() => this._releaseCoordinator(), 'releaseCoordinator')\r\n }\r\n\r\n disposeEntriesForModel(modelId: string) {\r\n let touched = false\r\n for (const [id, entry] of this._entries) {\r\n if (entry.modelId !== modelId) continue\r\n if (this._activeId === id) void this.deactivate()\r\n disposeDrawing(this.components, entry.drawing)\r\n this._entries.delete(id)\r\n this.renderer.invalidateForEntry(id)\r\n touched = true\r\n }\r\n this.renderer.invalidateForModel(modelId)\r\n this.projector.invalidateForModel(modelId)\r\n if (touched) this.onDrawingsChanged.trigger(this.drawings)\r\n }\r\n\r\n dispose() {\r\n void this.deactivate()\r\n for (const entry of this._entries.values()) {\r\n disposeDrawing(this.components, entry.drawing)\r\n }\r\n this._entries.clear()\r\n this.onDrawingsChanged.trigger([])\r\n }\r\n\r\n private _emit(state: FloorplanLoadingState) {\r\n this.onGenerationStateChanged.trigger(state)\r\n }\r\n\r\n /** Mutual-exclusion claim. If ElevationsTool (or any other view tool)\r\n * was active, the coordinator awaits its deactivate() first. */\r\n private async _tryClaimCoordinator() {\r\n try {\r\n const coordinator = this.components.get(ViewModeCoordinator)\r\n await coordinator.claim(this)\r\n } catch {\r\n // ViewModeCoordinator not registered in this viewer — ignore.\r\n }\r\n }\r\n\r\n private _releaseCoordinator() {\r\n try {\r\n this.components.get(ViewModeCoordinator).release(this)\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n\r\n /** Lower clip plane sits just under the active floor's slab (normal +Y),\r\n * so ceiling fixtures / lights / equipment of the storey below never\r\n * bleed into the projection or the 3D underlay. */\r\n private _applyLowerClip(entry: FloorplanEntry) {\r\n const cutY = entry.elevation - 0.5\r\n this.clip.set(\r\n SLOT_LOWER,\r\n new THREE.Vector3(0, 1, 0),\r\n new THREE.Vector3(0, cutY, 0),\r\n )\r\n }\r\n\r\n /** Frame the camera over the active floor in orthographic top-down,\r\n * then re-apply the building's true-north rotation so storey switches\r\n * preserve the user's chosen orientation. */\r\n private _frameCamera(entry: FloorplanEntry) {\r\n const fragments = this.components.get(OBC.FragmentsManager)\r\n const model = fragments.list.get(entry.modelId)\r\n if (!model) return\r\n const center = new THREE.Vector3()\r\n const size = new THREE.Vector3()\r\n model.box.getCenter(center)\r\n model.box.getSize(size)\r\n const span = Math.max(size.x, size.z, 10)\r\n const target = new THREE.Vector3(\r\n center.x,\r\n entry.elevation + 1.2,\r\n center.z,\r\n )\r\n this.camera.frame(target, new THREE.Vector3(0, -1, 0), span)\r\n this._applyNorthToCamera()\r\n }\r\n\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"FloorplanRenderer.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/bim/src/FloorplanTool/src/FloorplanRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAM3C,OAAO,EAGL,cAAc,EAGf,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,KAAK,GAAG,MAAM,CAAA;AAE3E;;;;;;;;GAQG;AACH,qBAAa,iBAAiB;IAK1B,OAAO,CAAC,SAAS;IAJnB,OAAO,CAAC,YAAY,CAAqB;gBAGvC,UAAU,EAAE,GAAG,CAAC,UAAU,EAClB,SAAS,EAAE,eAAe;IAkB9B,KAAK,CACT,KAAK,EAAE,cAAc,EACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI;IAwBxC;mFAC+E;IAC/E,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAI3C,6DAA6D;IAC7D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAI5C,OAAO;IAIP,kBAAkB,CAAC,OAAO,EAAE,MAAM;IAIlC,kBAAkB,CAAC,OAAO,EAAE,MAAM;CAGnC"}
1
+ {"version":3,"file":"FloorplanRenderer.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/bim/src/FloorplanTool/src/FloorplanRenderer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAM3C,OAAO,EAGL,cAAc,EAGf,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,KAAK,GAAG,MAAM,CAAA;AAE3E;;;;;;;;GAQG;AACH,qBAAa,iBAAiB;IAK1B,OAAO,CAAC,SAAS;IAJnB,OAAO,CAAC,YAAY,CAAqB;gBAGvC,UAAU,EAAE,GAAG,CAAC,UAAU,EAClB,SAAS,EAAE,eAAe;IAkB9B,KAAK,CACT,KAAK,EAAE,cAAc,EACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI;IAwBxC;mFAC+E;IAC/E,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAI3C,6DAA6D;IAC7D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAI5C,OAAO;IAIP,kBAAkB,CAAC,OAAO,EAAE,MAAM;IAIlC,kBAAkB,CAAC,OAAO,EAAE,MAAM;CAGnC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../src/core/components/viewers/bim/src/FloorplanTool/src/FloorplanRenderer.ts"],"sourcesContent":["import * as OBC from '@thatopen/components'\r\nimport {\r\n CategoryHighlighter,\r\n ResolveContext,\r\n StageEmitter,\r\n} from '../../lib/CategoryHighlighter'\r\nimport {\r\n CUT_COLOR,\r\n FILL_COLOR,\r\n FloorplanEntry,\r\n FLOORPLAN_CUT_CATEGORIES,\r\n FLOORPLAN_FILL_CATEGORIES,\r\n} from './types'\r\nimport { StoreyProjector } from './StoreyProjector'\r\n\r\nexport type RenderStage = 'resolve' | 'cull' | 'switching' | 'cut' | 'fill'\r\n\r\n/**\r\n * Floorplan-flavor wrapper around the generic CategoryHighlighter:\r\n * - \"cut\" stage paints walls / curtain-wall panels & mullions / columns\r\n * in dark gray.\r\n * - \"fill\" stage paints slabs / roofs white. Applied LAST so that an item\r\n * matched by both groups (e.g. an IFCSLAB encoded with a category that\r\n * overlaps the cut regex set) ends up white instead of gray.\r\n * Per-storey filtering via StoreyProjector's storey-id cache.\r\n */\r\nexport class FloorplanRenderer {\r\n private _highlighter: CategoryHighlighter\r\n\r\n constructor(\r\n components: OBC.Components,\r\n private projector: StoreyProjector,\r\n ) {\r\n this._highlighter = new CategoryHighlighter(components, {\r\n groups: [\r\n {\r\n categories: FLOORPLAN_CUT_CATEGORIES,\r\n color: CUT_COLOR,\r\n stage: 'cut',\r\n },\r\n {\r\n categories: FLOORPLAN_FILL_CATEGORIES,\r\n color: FILL_COLOR,\r\n stage: 'fill',\r\n },\r\n ],\r\n })\r\n }\r\n\r\n async apply(\r\n entry: FloorplanEntry,\r\n onStage?: (stage: RenderStage) => void,\r\n ) {\r\n const resolveCtx = async (\r\n modelId: string,\r\n model: any,\r\n ): Promise<ResolveContext> => {\r\n if (modelId !== entry.modelId) return { modelId }\r\n const storeyIds = await this.projector.getCachedStoreyIds(\r\n entry.modelId,\r\n entry.storeyLocalId,\r\n model,\r\n )\r\n return {\r\n modelId,\r\n filterIds: storeyIds.length > 0 ? new Set(storeyIds) : null,\r\n }\r\n }\r\n await this._highlighter.apply(\r\n entry.id,\r\n resolveCtx,\r\n onStage as StageEmitter,\r\n )\r\n }\r\n\r\n /** Repaint the CUT group (walls/columns/curtain walls) with a new color.\r\n * Updates both the cached highlight and the config for future activations. */\r\n setCutColor(entryKey: string, color: number) {\r\n return this._highlighter.reapplyGroupColor(entryKey, 0, color)\r\n }\r\n\r\n /** Repaint the FILL group (slabs/roofs) with a new color. */\r\n setFillColor(entryKey: string, color: number) {\r\n return this._highlighter.reapplyGroupColor(entryKey, 1, color)\r\n }\r\n\r\n restore() {\r\n return this._highlighter.restore()\r\n }\r\n\r\n invalidateForModel(modelId: string) {\r\n this._highlighter.invalidateForModel(modelId)\r\n }\r\n\r\n invalidateForEntry(entryId: string) {\r\n this._highlighter.invalidateForEntry(entryId)\r\n }\r\n}\r\n"],"mappings":"AACA;AAAA,EACE;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AAcA,MAAM,kBAAkB;AAAA,EAG7B,YACE,YACQ,WACR;AADQ;AAER,SAAK,eAAe,IAAI,oBAAoB,YAAY;AAAA,MACtD,QAAQ;AAAA,QACN;AAAA,UACE,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,QACA;AAAA,UACE,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MACJ,OACA,SACA;AACA,UAAM,aAAa,OACjB,SACA,UAC4B;AAC5B,UAAI,YAAY,MAAM,QAAS,QAAO,EAAE,QAAQ;AAChD,YAAM,YAAY,MAAM,KAAK,UAAU;AAAA,QACrC,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,MACF;AACA,aAAO;AAAA,QACL;AAAA,QACA,WAAW,UAAU,SAAS,IAAI,IAAI,IAAI,SAAS,IAAI;AAAA,MACzD;AAAA,IACF;AACA,UAAM,KAAK,aAAa;AAAA,MACtB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA,EAIA,YAAY,UAAkB,OAAe;AAC3C,WAAO,KAAK,aAAa,kBAAkB,UAAU,GAAG,KAAK;AAAA,EAC/D;AAAA;AAAA,EAGA,aAAa,UAAkB,OAAe;AAC5C,WAAO,KAAK,aAAa,kBAAkB,UAAU,GAAG,KAAK;AAAA,EAC/D;AAAA,EAEA,UAAU;AACR,WAAO,KAAK,aAAa,QAAQ;AAAA,EACnC;AAAA,EAEA,mBAAmB,SAAiB;AAClC,SAAK,aAAa,mBAAmB,OAAO;AAAA,EAC9C;AAAA,EAEA,mBAAmB,SAAiB;AAClC,SAAK,aAAa,mBAAmB,OAAO;AAAA,EAC9C;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../src/core/components/viewers/bim/src/FloorplanTool/src/FloorplanRenderer.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as OBC from '@thatopen/components'\r\nimport {\r\n CategoryHighlighter,\r\n ResolveContext,\r\n StageEmitter,\r\n} from '../../lib/CategoryHighlighter'\r\nimport {\r\n CUT_COLOR,\r\n FILL_COLOR,\r\n FloorplanEntry,\r\n FLOORPLAN_CUT_CATEGORIES,\r\n FLOORPLAN_FILL_CATEGORIES,\r\n} from './types'\r\nimport { StoreyProjector } from './StoreyProjector'\r\n\r\nexport type RenderStage = 'resolve' | 'cull' | 'switching' | 'cut' | 'fill'\r\n\r\n/**\r\n * Floorplan-flavor wrapper around the generic CategoryHighlighter:\r\n * - \"cut\" stage paints walls / curtain-wall panels & mullions / columns\r\n * in dark gray.\r\n * - \"fill\" stage paints slabs / roofs white. Applied LAST so that an item\r\n * matched by both groups (e.g. an IFCSLAB encoded with a category that\r\n * overlaps the cut regex set) ends up white instead of gray.\r\n * Per-storey filtering via StoreyProjector's storey-id cache.\r\n */\r\nexport class FloorplanRenderer {\r\n private _highlighter: CategoryHighlighter\r\n\r\n constructor(\r\n components: OBC.Components,\r\n private projector: StoreyProjector,\r\n ) {\r\n this._highlighter = new CategoryHighlighter(components, {\r\n groups: [\r\n {\r\n categories: FLOORPLAN_CUT_CATEGORIES,\r\n color: CUT_COLOR,\r\n stage: 'cut',\r\n },\r\n {\r\n categories: FLOORPLAN_FILL_CATEGORIES,\r\n color: FILL_COLOR,\r\n stage: 'fill',\r\n },\r\n ],\r\n })\r\n }\r\n\r\n async apply(\r\n entry: FloorplanEntry,\r\n onStage?: (stage: RenderStage) => void,\r\n ) {\r\n const resolveCtx = async (\r\n modelId: string,\r\n model: any,\r\n ): Promise<ResolveContext> => {\r\n if (modelId !== entry.modelId) return { modelId }\r\n const storeyIds = await this.projector.getCachedStoreyIds(\r\n entry.modelId,\r\n entry.storeyLocalId,\r\n model,\r\n )\r\n return {\r\n modelId,\r\n filterIds: storeyIds.length > 0 ? new Set(storeyIds) : null,\r\n }\r\n }\r\n await this._highlighter.apply(\r\n entry.id,\r\n resolveCtx,\r\n onStage as StageEmitter,\r\n )\r\n }\r\n\r\n /** Repaint the CUT group (walls/columns/curtain walls) with a new color.\r\n * Updates both the cached highlight and the config for future activations. */\r\n setCutColor(entryKey: string, color: number) {\r\n return this._highlighter.reapplyGroupColor(entryKey, 0, color)\r\n }\r\n\r\n /** Repaint the FILL group (slabs/roofs) with a new color. */\r\n setFillColor(entryKey: string, color: number) {\r\n return this._highlighter.reapplyGroupColor(entryKey, 1, color)\r\n }\r\n\r\n restore() {\r\n return this._highlighter.restore()\r\n }\r\n\r\n invalidateForModel(modelId: string) {\r\n this._highlighter.invalidateForModel(modelId)\r\n }\r\n\r\n invalidateForEntry(entryId: string) {\r\n this._highlighter.invalidateForEntry(entryId)\r\n }\r\n}\r\n"],"mappings":"AAIA;AAAA,EACE;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AAcA,MAAM,kBAAkB;AAAA,EAG7B,YACE,YACQ,WACR;AADQ;AAER,SAAK,eAAe,IAAI,oBAAoB,YAAY;AAAA,MACtD,QAAQ;AAAA,QACN;AAAA,UACE,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,QACA;AAAA,UACE,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MACJ,OACA,SACA;AACA,UAAM,aAAa,OACjB,SACA,UAC4B;AAC5B,UAAI,YAAY,MAAM,QAAS,QAAO,EAAE,QAAQ;AAChD,YAAM,YAAY,MAAM,KAAK,UAAU;AAAA,QACrC,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,MACF;AACA,aAAO;AAAA,QACL;AAAA,QACA,WAAW,UAAU,SAAS,IAAI,IAAI,IAAI,SAAS,IAAI;AAAA,MACzD;AAAA,IACF;AACA,UAAM,KAAK,aAAa;AAAA,MACtB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA,EAIA,YAAY,UAAkB,OAAe;AAC3C,WAAO,KAAK,aAAa,kBAAkB,UAAU,GAAG,KAAK;AAAA,EAC/D;AAAA;AAAA,EAGA,aAAa,UAAkB,OAAe;AAC5C,WAAO,KAAK,aAAa,kBAAkB,UAAU,GAAG,KAAK;AAAA,EAC/D;AAAA,EAEA,UAAU;AACR,WAAO,KAAK,aAAa,QAAQ;AAAA,EACnC;AAAA,EAEA,mBAAmB,SAAiB;AAClC,SAAK,aAAa,mBAAmB,OAAO;AAAA,EAC9C;AAAA,EAEA,mBAAmB,SAAiB;AAClC,SAAK,aAAa,mBAAmB,OAAO;AAAA,EAC9C;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"StoreyProjector.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/bim/src/FloorplanTool/src/StoreyProjector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAY3C,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAGxC;;;GAGG;AACH,qBAAa,eAAe;IAId,OAAO,CAAC,UAAU;IAH9B,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,cAAc,CAA8B;gBAEhC,UAAU,EAAE,GAAG,CAAC,UAAU;IAI9C,iBAAiB;IAIjB;+EAC2E;IACrE,OAAO,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA6F7C,kBAAkB,CACtB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,GAAG,GACT,OAAO,CAAC,MAAM,EAAE,CAAC;IASpB,kBAAkB,CAAC,OAAO,EAAE,MAAM;CAKnC"}
1
+ {"version":3,"file":"StoreyProjector.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/bim/src/FloorplanTool/src/StoreyProjector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAY3C,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAGxC;;;GAGG;AACH,qBAAa,eAAe;IAId,OAAO,CAAC,UAAU;IAH9B,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,cAAc,CAA8B;gBAEhC,UAAU,EAAE,GAAG,CAAC,UAAU;IAI9C,iBAAiB;IAIjB;+EAC2E;IACrE,OAAO,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA6F7C,kBAAkB,CACtB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,GAAG,GACT,OAAO,CAAC,MAAM,EAAE,CAAC;IASpB,kBAAkB,CAAC,OAAO,EAAE,MAAM;CAKnC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../src/core/components/viewers/bim/src/FloorplanTool/src/StoreyProjector.ts"],"sourcesContent":["import * as OBC from '@thatopen/components'\r\nimport * as OBF from '@thatopen/components-front'\r\nimport * as THREE from 'three'\r\nimport {\r\n addDoorSwingsToDrawing,\r\n addItemsProjectionByClass,\r\n createDrawing,\r\n disableProjectorWebGPU,\r\n DrawingEditorReady,\r\n getItemIdsByClass,\r\n patchModelGeometryRepresentationIds,\r\n} from '../../lib/drawingProjection'\r\nimport { FloorplanEntry } from './types'\r\nimport { getStoreyItemIds } from './utils'\r\n\r\n/**\r\n * Floorplan-flavor wrapper around the generic drawing primitives.\r\n * Owns: storey-id cache, lazy projection per FloorplanEntry, editor warmup.\r\n */\r\nexport class StoreyProjector {\r\n private _editorReady: DrawingEditorReady\r\n private _storeyIdCache = new Map<string, number[]>()\r\n\r\n constructor(private components: OBC.Components) {\r\n this._editorReady = new DrawingEditorReady(components)\r\n }\r\n\r\n ensureEditorReady() {\r\n return this._editorReady.ensure()\r\n }\r\n\r\n /** Lazy projection. After the first call for a given entry, the drawing\r\n * is cached on the entry itself so subsequent activations are instant. */\r\n async project(entry: FloorplanEntry): Promise<void> {\r\n if (entry.drawing && entry.projected) return\r\n\r\n const fragments = this.components.get(OBC.FragmentsManager)\r\n const model = fragments.list.get(entry.modelId)\r\n if (!model) return\r\n\r\n const center = new THREE.Vector3()\r\n model.box.getCenter(center)\r\n\r\n // Cut plane sits 1.5 m above the floor; capture 2 m downward → volume\r\n // spans [elevation - 0.5, elevation + 1.5]. Anything under the slab is\r\n // visually masked by the opaque white slab + lower clip plane.\r\n const drawing = createDrawing(this.components, {\r\n orientation: new THREE.Vector3(0, -1, 0),\r\n position: new THREE.Vector3(center.x, entry.elevation + 1.5, center.z),\r\n far: 3,\r\n viewport: {\r\n left: -25,\r\n right: 25,\r\n top: 15,\r\n bottom: -15,\r\n scale: 100,\r\n name: `Floor Plan - ${entry.name}`,\r\n },\r\n })\r\n if (!drawing) return\r\n\r\n // Make the drawing visible BEFORE projection starts so lines appear\r\n // class-by-class as `addItemsProjectionByClass` walks the IFC classes —\r\n // otherwise the render loop only sees the full result at the end.\r\n drawing.three.visible = true\r\n\r\n const editor = this.components.get(OBF.DrawingEditor)\r\n editor.activeDrawing = drawing\r\n\r\n disableProjectorWebGPU(this.components)\r\n patchModelGeometryRepresentationIds(model)\r\n\r\n const allIdsWithGeometry: number[] = await model.getItemsIdsWithGeometry()\r\n const geomSet = new Set(allIdsWithGeometry)\r\n const storeyIds = await this.getCachedStoreyIds(\r\n entry.modelId,\r\n entry.storeyLocalId,\r\n model,\r\n )\r\n const storeyIdSet = new Set(storeyIds)\r\n // Restrict the per-class projection to items that (a) have geometry and\r\n // (b) belong to this storey (when storey ids resolved at all).\r\n const filterFn =\r\n storeyIds.length > 0\r\n ? (id: number) => geomSet.has(id) && storeyIdSet.has(id)\r\n : (id: number) => geomSet.has(id)\r\n const idFilter = new Set<number>()\r\n for (const id of allIdsWithGeometry) if (filterFn(id)) idFilter.add(id)\r\n\r\n if (idFilter.size === 0) {\r\n entry.drawing = drawing\r\n entry.projected = true\r\n entry.layers = []\r\n return\r\n }\r\n\r\n const itemIdsByClass = await getItemIdsByClass(model, idFilter)\r\n const layers = await addItemsProjectionByClass(\r\n drawing,\r\n entry.modelId,\r\n itemIdsByClass,\r\n // The BIM viewer renders on camera events, not continuously — request\r\n // an explicit render after each class so the user sees lines pop in\r\n // as each IFC class finishes projecting.\r\n () => fragments.core.update(true),\r\n )\r\n // Iconic floor-plan swing arcs for doors. Best-effort: a model without\r\n // IFCDOOR items, or whose worker can't supply bboxes, falls through\r\n // silently. Runs after the main projection so the arcs sit on top.\r\n try {\r\n // const doorLayer = await addDoorSwingsToDrawing(\r\n // drawing,\r\n // model,\r\n // idFilter,\r\n // entry.elevation,\r\n // )\r\n // if (doorLayer) layers.push(doorLayer)\r\n fragments.core.update(true)\r\n } catch (error) {\r\n console.warn('[StoreyProjector] door swings skipped:', error)\r\n }\r\n entry.drawing = drawing\r\n entry.projected = true\r\n entry.layers = layers\r\n }\r\n\r\n async getCachedStoreyIds(\r\n modelId: string,\r\n storeyLocalId: number,\r\n model: any,\r\n ): Promise<number[]> {\r\n const key = `${modelId}::${storeyLocalId}`\r\n const cached = this._storeyIdCache.get(key)\r\n if (cached) return cached\r\n const ids = await getStoreyItemIds(model, storeyLocalId)\r\n this._storeyIdCache.set(key, ids)\r\n return ids\r\n }\r\n\r\n invalidateForModel(modelId: string) {\r\n for (const key of [...this._storeyIdCache.keys()]) {\r\n if (key.startsWith(`${modelId}::`)) this._storeyIdCache.delete(key)\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../src/core/components/viewers/bim/src/FloorplanTool/src/StoreyProjector.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as OBC from '@thatopen/components'\r\nimport * as OBF from '@thatopen/components-front'\r\nimport * as THREE from 'three'\r\nimport {\r\n addDoorSwingsToDrawing,\r\n addItemsProjectionByClass,\r\n createDrawing,\r\n disableProjectorWebGPU,\r\n DrawingEditorReady,\r\n getItemIdsByClass,\r\n patchModelGeometryRepresentationIds,\r\n} from '../../lib/drawingProjection'\r\nimport { FloorplanEntry } from './types'\r\nimport { getStoreyItemIds } from './utils'\r\n\r\n/**\r\n * Floorplan-flavor wrapper around the generic drawing primitives.\r\n * Owns: storey-id cache, lazy projection per FloorplanEntry, editor warmup.\r\n */\r\nexport class StoreyProjector {\r\n private _editorReady: DrawingEditorReady\r\n private _storeyIdCache = new Map<string, number[]>()\r\n\r\n constructor(private components: OBC.Components) {\r\n this._editorReady = new DrawingEditorReady(components)\r\n }\r\n\r\n ensureEditorReady() {\r\n return this._editorReady.ensure()\r\n }\r\n\r\n /** Lazy projection. After the first call for a given entry, the drawing\r\n * is cached on the entry itself so subsequent activations are instant. */\r\n async project(entry: FloorplanEntry): Promise<void> {\r\n if (entry.drawing && entry.projected) return\r\n\r\n const fragments = this.components.get(OBC.FragmentsManager)\r\n const model = fragments.list.get(entry.modelId)\r\n if (!model) return\r\n\r\n const center = new THREE.Vector3()\r\n model.box.getCenter(center)\r\n\r\n // Cut plane sits 1.5 m above the floor; capture 2 m downward → volume\r\n // spans [elevation - 0.5, elevation + 1.5]. Anything under the slab is\r\n // visually masked by the opaque white slab + lower clip plane.\r\n const drawing = createDrawing(this.components, {\r\n orientation: new THREE.Vector3(0, -1, 0),\r\n position: new THREE.Vector3(center.x, entry.elevation + 1.5, center.z),\r\n far: 3,\r\n viewport: {\r\n left: -25,\r\n right: 25,\r\n top: 15,\r\n bottom: -15,\r\n scale: 100,\r\n name: `Floor Plan - ${entry.name}`,\r\n },\r\n })\r\n if (!drawing) return\r\n\r\n // Make the drawing visible BEFORE projection starts so lines appear\r\n // class-by-class as `addItemsProjectionByClass` walks the IFC classes —\r\n // otherwise the render loop only sees the full result at the end.\r\n drawing.three.visible = true\r\n\r\n const editor = this.components.get(OBF.DrawingEditor)\r\n editor.activeDrawing = drawing\r\n\r\n disableProjectorWebGPU(this.components)\r\n patchModelGeometryRepresentationIds(model)\r\n\r\n const allIdsWithGeometry: number[] = await model.getItemsIdsWithGeometry()\r\n const geomSet = new Set(allIdsWithGeometry)\r\n const storeyIds = await this.getCachedStoreyIds(\r\n entry.modelId,\r\n entry.storeyLocalId,\r\n model,\r\n )\r\n const storeyIdSet = new Set(storeyIds)\r\n // Restrict the per-class projection to items that (a) have geometry and\r\n // (b) belong to this storey (when storey ids resolved at all).\r\n const filterFn =\r\n storeyIds.length > 0\r\n ? (id: number) => geomSet.has(id) && storeyIdSet.has(id)\r\n : (id: number) => geomSet.has(id)\r\n const idFilter = new Set<number>()\r\n for (const id of allIdsWithGeometry) if (filterFn(id)) idFilter.add(id)\r\n\r\n if (idFilter.size === 0) {\r\n entry.drawing = drawing\r\n entry.projected = true\r\n entry.layers = []\r\n return\r\n }\r\n\r\n const itemIdsByClass = await getItemIdsByClass(model, idFilter)\r\n const layers = await addItemsProjectionByClass(\r\n drawing,\r\n entry.modelId,\r\n itemIdsByClass,\r\n // The BIM viewer renders on camera events, not continuously — request\r\n // an explicit render after each class so the user sees lines pop in\r\n // as each IFC class finishes projecting.\r\n () => fragments.core.update(true),\r\n )\r\n // Iconic floor-plan swing arcs for doors. Best-effort: a model without\r\n // IFCDOOR items, or whose worker can't supply bboxes, falls through\r\n // silently. Runs after the main projection so the arcs sit on top.\r\n try {\r\n // const doorLayer = await addDoorSwingsToDrawing(\r\n // drawing,\r\n // model,\r\n // idFilter,\r\n // entry.elevation,\r\n // )\r\n // if (doorLayer) layers.push(doorLayer)\r\n fragments.core.update(true)\r\n } catch (error) {\r\n console.warn('[StoreyProjector] door swings skipped:', error)\r\n }\r\n entry.drawing = drawing\r\n entry.projected = true\r\n entry.layers = layers\r\n }\r\n\r\n async getCachedStoreyIds(\r\n modelId: string,\r\n storeyLocalId: number,\r\n model: any,\r\n ): Promise<number[]> {\r\n const key = `${modelId}::${storeyLocalId}`\r\n const cached = this._storeyIdCache.get(key)\r\n if (cached) return cached\r\n const ids = await getStoreyItemIds(model, storeyLocalId)\r\n this._storeyIdCache.set(key, ids)\r\n return ids\r\n }\r\n\r\n invalidateForModel(modelId: string) {\r\n for (const key of [...this._storeyIdCache.keys()]) {\r\n if (key.startsWith(`${modelId}::`)) this._storeyIdCache.delete(key)\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/bim/src/FloorplanTool/src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAE1D,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAA;IACpC,SAAS,EAAE,OAAO,CAAA;IAClB;kEAC8D;IAC9D,MAAM,EAAE,gBAAgB,EAAE,CAAA;CAC3B;AAED,eAAO,MAAM,mBAAmB,EAC9B,sCAA+C,CAAA;AAEjD,eAAO,MAAM,yBAAyB,UAIrC,CAAA;AACD,eAAO,MAAM,wBAAwB,UAUpC,CAAA;AACD,eAAO,MAAM,UAAU,WAAW,CAAA;AAClC,eAAO,MAAM,SAAS,UAAW,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/components/viewers/bim/src/FloorplanTool/src/types.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAE1D,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAA;IACpC,SAAS,EAAE,OAAO,CAAA;IAClB;kEAC8D;IAC9D,MAAM,EAAE,gBAAgB,EAAE,CAAA;CAC3B;AAED,eAAO,MAAM,mBAAmB,EAC9B,sCAA+C,CAAA;AAEjD,eAAO,MAAM,yBAAyB,UAIrC,CAAA;AACD,eAAO,MAAM,wBAAwB,UAUpC,CAAA;AACD,eAAO,MAAM,UAAU,WAAW,CAAA;AAClC,eAAO,MAAM,SAAS,UAAW,CAAA"}