@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,"file":"GridController.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/GridController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAG3C;;;;;;;;;;;;;GAaG;AACH,qBAAa,cAAc;IAIb,OAAO,CAAC,UAAU;IAH9B,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,aAAa,CAAuB;gBAExB,UAAU,EAAE,GAAG,CAAC,UAAU;IAE9C,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAIxB,IAAI;IASJ,OAAO;IAUP,OAAO,CAAC,YAAY;CAiBrB"}
1
+ {"version":3,"file":"GridController.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/GridController.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAG3C;;;;;;;;;;;;;GAaG;AACH,qBAAa,cAAc;IAIb,OAAO,CAAC,UAAU;IAH9B,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,aAAa,CAAuB;gBAExB,UAAU,EAAE,GAAG,CAAC,UAAU;IAE9C,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAIxB,IAAI;IASJ,OAAO;IAUP,OAAO,CAAC,YAAY;CAiBrB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/GridController.ts"],"sourcesContent":["import * as OBC from '@thatopen/components'\r\nimport { CurrentWorld } from '../CurrentWorld'\r\n\r\n/**\r\n * Hides the world grid while a drawing-based view tool is active.\r\n *\r\n * The grid is `transparent: true` (an infinite shader plane), so even when\r\n * positioned below the slab it can poke through via Z-fighting or because\r\n * the section clip doesn't always cull it. Floorplan/elevation drawings\r\n * are also conventionally rendered without a grid — so the cleanest fix\r\n * is to flip its visibility off and restore it on exit.\r\n *\r\n * Source priority for the grid reference:\r\n * 1. The instance injected via `setGrid(grid)` (typically from\r\n * `bimState.bim.grid`, which the BimViewer dispatches at startup).\r\n * 2. Fallback: `OBC.Grids.list.get(world.uuid)`.\r\n */\r\nexport class GridController {\r\n private _injected: any | null = null\r\n private _savedVisible: boolean | null = null\r\n\r\n constructor(private components: OBC.Components) {}\r\n\r\n setGrid(grid: any | null) {\r\n this._injected = grid ?? null\r\n }\r\n\r\n hide() {\r\n if (this._savedVisible !== null) return // already hidden\r\n const grid = this._resolveGrid()\r\n if (!grid) return\r\n this._savedVisible = grid.config?.visible ?? grid.three?.visible ?? true\r\n if (grid.config) grid.config.visible = false\r\n if (grid.three) grid.three.visible = false\r\n }\r\n\r\n restore() {\r\n if (this._savedVisible === null) return\r\n const grid = this._resolveGrid()\r\n const restoreTo = this._savedVisible\r\n this._savedVisible = null\r\n if (!grid) return\r\n if (grid.config) grid.config.visible = restoreTo\r\n if (grid.three) grid.three.visible = restoreTo\r\n }\r\n\r\n private _resolveGrid(): any | null {\r\n if (this._injected) return this._injected\r\n try {\r\n const grids = this.components.get(OBC.Grids)\r\n if (!grids?.list) return null\r\n const sourceWorld = this.components.get(CurrentWorld).world\r\n if (sourceWorld) {\r\n const byWorld = grids.list.get(sourceWorld.uuid)\r\n if (byWorld) return byWorld\r\n }\r\n // Fallback: any registered grid (typically a single one per session).\r\n for (const grid of grids.list.values()) return grid\r\n } catch {\r\n // Grids component not registered — no-op.\r\n }\r\n return null\r\n }\r\n}\r\n"],"mappings":"AAAA,YAAY,SAAS;AACrB,SAAS,oBAAoB;AAgBtB,MAAM,eAAe;AAAA,EAI1B,YAAoB,YAA4B;AAA5B;AAHpB,SAAQ,YAAwB;AAChC,SAAQ,gBAAgC;AAAA,EAES;AAAA,EAEjD,QAAQ,MAAkB;AACxB,SAAK,YAAY,sBAAQ;AAAA,EAC3B;AAAA,EAEA,OAAO;AA3BT;AA4BI,QAAI,KAAK,kBAAkB,KAAM;AACjC,UAAM,OAAO,KAAK,aAAa;AAC/B,QAAI,CAAC,KAAM;AACX,SAAK,iBAAgB,sBAAK,WAAL,mBAAa,YAAb,aAAwB,UAAK,UAAL,mBAAY,YAApC,YAA+C;AACpE,QAAI,KAAK,OAAQ,MAAK,OAAO,UAAU;AACvC,QAAI,KAAK,MAAO,MAAK,MAAM,UAAU;AAAA,EACvC;AAAA,EAEA,UAAU;AACR,QAAI,KAAK,kBAAkB,KAAM;AACjC,UAAM,OAAO,KAAK,aAAa;AAC/B,UAAM,YAAY,KAAK;AACvB,SAAK,gBAAgB;AACrB,QAAI,CAAC,KAAM;AACX,QAAI,KAAK,OAAQ,MAAK,OAAO,UAAU;AACvC,QAAI,KAAK,MAAO,MAAK,MAAM,UAAU;AAAA,EACvC;AAAA,EAEQ,eAA2B;AACjC,QAAI,KAAK,UAAW,QAAO,KAAK;AAChC,QAAI;AACF,YAAM,QAAQ,KAAK,WAAW,IAAI,IAAI,KAAK;AAC3C,UAAI,EAAC,+BAAO,MAAM,QAAO;AACzB,YAAM,cAAc,KAAK,WAAW,IAAI,YAAY,EAAE;AACtD,UAAI,aAAa;AACf,cAAM,UAAU,MAAM,KAAK,IAAI,YAAY,IAAI;AAC/C,YAAI,QAAS,QAAO;AAAA,MACtB;AAEA,iBAAW,QAAQ,MAAM,KAAK,OAAO,EAAG,QAAO;AAAA,IACjD,SAAQ;AAAA,IAER;AACA,WAAO;AAAA,EACT;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/GridController.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\n\r\n/**\r\n * Hides the world grid while a drawing-based view tool is active.\r\n *\r\n * The grid is `transparent: true` (an infinite shader plane), so even when\r\n * positioned below the slab it can poke through via Z-fighting or because\r\n * the section clip doesn't always cull it. Floorplan/elevation drawings\r\n * are also conventionally rendered without a grid — so the cleanest fix\r\n * is to flip its visibility off and restore it on exit.\r\n *\r\n * Source priority for the grid reference:\r\n * 1. The instance injected via `setGrid(grid)` (typically from\r\n * `bimState.bim.grid`, which the BimViewer dispatches at startup).\r\n * 2. Fallback: `OBC.Grids.list.get(world.uuid)`.\r\n */\r\nexport class GridController {\r\n private _injected: any | null = null\r\n private _savedVisible: boolean | null = null\r\n\r\n constructor(private components: OBC.Components) {}\r\n\r\n setGrid(grid: any | null) {\r\n this._injected = grid ?? null\r\n }\r\n\r\n hide() {\r\n if (this._savedVisible !== null) return // already hidden\r\n const grid = this._resolveGrid()\r\n if (!grid) return\r\n this._savedVisible = grid.config?.visible ?? grid.three?.visible ?? true\r\n if (grid.config) grid.config.visible = false\r\n if (grid.three) grid.three.visible = false\r\n }\r\n\r\n restore() {\r\n if (this._savedVisible === null) return\r\n const grid = this._resolveGrid()\r\n const restoreTo = this._savedVisible\r\n this._savedVisible = null\r\n if (!grid) return\r\n if (grid.config) grid.config.visible = restoreTo\r\n if (grid.three) grid.three.visible = restoreTo\r\n }\r\n\r\n private _resolveGrid(): any | null {\r\n if (this._injected) return this._injected\r\n try {\r\n const grids = this.components.get(OBC.Grids)\r\n if (!grids?.list) return null\r\n const sourceWorld = this.components.get(CurrentWorld).world\r\n if (sourceWorld) {\r\n const byWorld = grids.list.get(sourceWorld.uuid)\r\n if (byWorld) return byWorld\r\n }\r\n // Fallback: any registered grid (typically a single one per session).\r\n for (const grid of grids.list.values()) return grid\r\n } catch {\r\n // Grids component not registered — no-op.\r\n }\r\n return null\r\n }\r\n}\r\n"],"mappings":"AAGA,YAAY,SAAS;AACrB,SAAS,oBAAoB;AAgBtB,MAAM,eAAe;AAAA,EAI1B,YAAoB,YAA4B;AAA5B;AAHpB,SAAQ,YAAwB;AAChC,SAAQ,gBAAgC;AAAA,EAES;AAAA,EAEjD,QAAQ,MAAkB;AACxB,SAAK,YAAY,sBAAQ;AAAA,EAC3B;AAAA,EAEA,OAAO;AA9BT;AA+BI,QAAI,KAAK,kBAAkB,KAAM;AACjC,UAAM,OAAO,KAAK,aAAa;AAC/B,QAAI,CAAC,KAAM;AACX,SAAK,iBAAgB,sBAAK,WAAL,mBAAa,YAAb,aAAwB,UAAK,UAAL,mBAAY,YAApC,YAA+C;AACpE,QAAI,KAAK,OAAQ,MAAK,OAAO,UAAU;AACvC,QAAI,KAAK,MAAO,MAAK,MAAM,UAAU;AAAA,EACvC;AAAA,EAEA,UAAU;AACR,QAAI,KAAK,kBAAkB,KAAM;AACjC,UAAM,OAAO,KAAK,aAAa;AAC/B,UAAM,YAAY,KAAK;AACvB,SAAK,gBAAgB;AACrB,QAAI,CAAC,KAAM;AACX,QAAI,KAAK,OAAQ,MAAK,OAAO,UAAU;AACvC,QAAI,KAAK,MAAO,MAAK,MAAM,UAAU;AAAA,EACvC;AAAA,EAEQ,eAA2B;AACjC,QAAI,KAAK,UAAW,QAAO,KAAK;AAChC,QAAI;AACF,YAAM,QAAQ,KAAK,WAAW,IAAI,IAAI,KAAK;AAC3C,UAAI,EAAC,+BAAO,MAAM,QAAO;AACzB,YAAM,cAAc,KAAK,WAAW,IAAI,YAAY,EAAE;AACtD,UAAI,aAAa;AACf,cAAM,UAAU,MAAM,KAAK,IAAI,YAAY,IAAI;AAC/C,YAAI,QAAS,QAAO;AAAA,MACtB;AAEA,iBAAW,QAAQ,MAAM,KAAK,OAAO,EAAG,QAAO;AAAA,IACjD,SAAQ;AAAA,IAER;AACA,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"TrueNorthPopover.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/TrueNorthPopover.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAW9B,UAAU,KAAK;IACb,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAA;IAClB,wEAAwE;IACxE,YAAY,EAAE,OAAO,CAAA;IACrB,0EAA0E;IAC1E,QAAQ,EAAE,OAAO,CAAA;IACjB,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,YAAY,EAAE,MAAM,IAAI,CAAA;CACzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,WAAW,EACX,YAAY,GACb,EAAE,KAAK,qBA0GP"}
1
+ {"version":3,"file":"TrueNorthPopover.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/TrueNorthPopover.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAW9B,UAAU,KAAK;IACb,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAA;IAClB,wEAAwE;IACxE,YAAY,EAAE,OAAO,CAAA;IACrB,0EAA0E;IAC1E,QAAQ,EAAE,OAAO,CAAA;IACjB,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,YAAY,EAAE,MAAM,IAAI,CAAA;CACzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,WAAW,EACX,YAAY,GACb,EAAE,KAAK,qBA0GP"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/TrueNorthPopover.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport * as LR from 'lucide-react'\r\nimport { useTranslations } from 'next-intl'\r\nimport { Button } from '../../../../ui/Button'\r\nimport { Input } from '../../../../ui/Input'\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from '../../../../ui/Popover'\r\n\r\ninterface Props {\r\n /** Current rotation in degrees (0-360, clockwise from default screen-up). */\r\n northAngle: number\r\n /** Whether the floorplan tool is currently waiting for a line click. */\r\n pickingNorth: boolean\r\n /** Disabled when no floorplan is active (rotation makes no sense yet). */\r\n disabled: boolean\r\n onChangeAngle: (degrees: number) => void\r\n onStartPick: () => void\r\n onCancelPick: () => void\r\n}\r\n\r\n/**\r\n * Compass-icon button + popover that lets the user set the building's\r\n * true north for floorplan views. Two ways to set it:\r\n * 1. Type a value 0-360 °.\r\n * 2. Click \"Pick line\", then draw a line by clicking two points on the\r\n * active floorplan — each point snaps to the nearest geometry vertex,\r\n * and the bearing between them becomes the new north (Esc cancels).\r\n *\r\n * The popover closes when the user starts a pick (so the canvas isn't\r\n * obscured) and stays in sync via the `northAngle` / `pickingNorth` props\r\n * coming from FloorplanTool.\r\n */\r\nexport function TrueNorthPopover({\r\n northAngle,\r\n pickingNorth,\r\n disabled,\r\n onChangeAngle,\r\n onStartPick,\r\n onCancelPick,\r\n}: Props) {\r\n const t = useTranslations('ViewSection')\r\n const [open, setOpen] = React.useState(false)\r\n const [draft, setDraft] = React.useState<string>(formatAngle(northAngle))\r\n\r\n // Keep the input in sync when the angle changes from outside (e.g. line\r\n // pick committed a new value).\r\n React.useEffect(() => {\r\n setDraft(formatAngle(northAngle))\r\n }, [northAngle])\r\n\r\n // Close the popover automatically when the user kicks off a line pick.\r\n React.useEffect(() => {\r\n if (pickingNorth) setOpen(false)\r\n }, [pickingNorth])\r\n\r\n const commitDraft = () => {\r\n const value = Number(draft)\r\n if (!Number.isFinite(value)) {\r\n setDraft(formatAngle(northAngle))\r\n return\r\n }\r\n onChangeAngle(value)\r\n }\r\n\r\n return (\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger asChild>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-6 w-6 p-0\"\r\n title={t('trueNorthTitle')}\r\n disabled={disabled}\r\n >\r\n <LR.Compass className=\"h-3.5 w-3.5\" />\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent align=\"end\" className=\"w-64 p-3\">\r\n <div className=\"space-y-3\">\r\n <div className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\r\n {t('trueNorthTitle')}\r\n </div>\r\n\r\n <label className=\"block space-y-1\">\r\n <span className=\"text-xs text-muted-foreground\">\r\n {t('trueNorthAngleLabel')}\r\n </span>\r\n <div className=\"flex items-center gap-2\">\r\n <Input\r\n type=\"number\"\r\n min={0}\r\n max={360}\r\n step={1}\r\n value={draft}\r\n onChange={(e) => setDraft(e.target.value)}\r\n onBlur={commitDraft}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') {\r\n commitDraft()\r\n e.currentTarget.blur()\r\n }\r\n }}\r\n className=\"h-8 text-sm\"\r\n disabled={disabled}\r\n />\r\n <span className=\"text-xs text-muted-foreground\">°</span>\r\n </div>\r\n </label>\r\n\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"w-full justify-start gap-2 h-8 text-xs\"\r\n disabled={disabled || pickingNorth}\r\n onClick={onStartPick}\r\n >\r\n <LR.MousePointerClick className=\"h-3.5 w-3.5\" />\r\n {pickingNorth ? t('trueNorthPicking') : t('trueNorthPickLine')}\r\n </Button>\r\n\r\n {pickingNorth && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"w-full h-7 text-xs\"\r\n onClick={onCancelPick}\r\n >\r\n {t('trueNorthCancelPick')}\r\n </Button>\r\n )}\r\n\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"w-full h-7 text-xs\"\r\n disabled={disabled || northAngle === 0}\r\n onClick={() => onChangeAngle(0)}\r\n >\r\n <LR.RotateCcw className=\"h-3 w-3 mr-1\" />\r\n {t('trueNorthReset')}\r\n </Button>\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n )\r\n}\r\n\r\nfunction formatAngle(degrees: number): string {\r\n // Show 0 decimals for whole numbers, 1 decimal otherwise — keeps the\r\n // input clean for typed values but readable after a line pick.\r\n const rounded = Math.round(degrees * 10) / 10\r\n return Number.isInteger(rounded) ? rounded.toFixed(0) : rounded.toFixed(1)\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/TrueNorthPopover.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport * as LR from 'lucide-react'\r\nimport { useTranslations } from 'next-intl'\r\nimport { Button } from '../../../../ui/Button'\r\nimport { Input } from '../../../../ui/Input'\r\nimport {\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n} from '../../../../ui/Popover'\r\n\r\ninterface Props {\r\n /** Current rotation in degrees (0-360, clockwise from default screen-up). */\r\n northAngle: number\r\n /** Whether the floorplan tool is currently waiting for a line click. */\r\n pickingNorth: boolean\r\n /** Disabled when no floorplan is active (rotation makes no sense yet). */\r\n disabled: boolean\r\n onChangeAngle: (degrees: number) => void\r\n onStartPick: () => void\r\n onCancelPick: () => void\r\n}\r\n\r\n/**\r\n * Compass-icon button + popover that lets the user set the building's\r\n * true north for floorplan views. Two ways to set it:\r\n * 1. Type a value 0-360 °.\r\n * 2. Click \"Pick line\", then draw a line by clicking two points on the\r\n * active floorplan — each point snaps to the nearest geometry vertex,\r\n * and the bearing between them becomes the new north (Esc cancels).\r\n *\r\n * The popover closes when the user starts a pick (so the canvas isn't\r\n * obscured) and stays in sync via the `northAngle` / `pickingNorth` props\r\n * coming from FloorplanTool.\r\n */\r\nexport function TrueNorthPopover({\r\n northAngle,\r\n pickingNorth,\r\n disabled,\r\n onChangeAngle,\r\n onStartPick,\r\n onCancelPick,\r\n}: Props) {\r\n const t = useTranslations('ViewSection')\r\n const [open, setOpen] = React.useState(false)\r\n const [draft, setDraft] = React.useState<string>(formatAngle(northAngle))\r\n\r\n // Keep the input in sync when the angle changes from outside (e.g. line\r\n // pick committed a new value).\r\n React.useEffect(() => {\r\n setDraft(formatAngle(northAngle))\r\n }, [northAngle])\r\n\r\n // Close the popover automatically when the user kicks off a line pick.\r\n React.useEffect(() => {\r\n if (pickingNorth) setOpen(false)\r\n }, [pickingNorth])\r\n\r\n const commitDraft = () => {\r\n const value = Number(draft)\r\n if (!Number.isFinite(value)) {\r\n setDraft(formatAngle(northAngle))\r\n return\r\n }\r\n onChangeAngle(value)\r\n }\r\n\r\n return (\r\n <Popover open={open} onOpenChange={setOpen}>\r\n <PopoverTrigger asChild>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-6 w-6 p-0\"\r\n title={t('trueNorthTitle')}\r\n disabled={disabled}\r\n >\r\n <LR.Compass className=\"h-3.5 w-3.5\" />\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent align=\"end\" className=\"w-64 p-3\">\r\n <div className=\"space-y-3\">\r\n <div className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\r\n {t('trueNorthTitle')}\r\n </div>\r\n\r\n <label className=\"block space-y-1\">\r\n <span className=\"text-xs text-muted-foreground\">\r\n {t('trueNorthAngleLabel')}\r\n </span>\r\n <div className=\"flex items-center gap-2\">\r\n <Input\r\n type=\"number\"\r\n min={0}\r\n max={360}\r\n step={1}\r\n value={draft}\r\n onChange={(e) => setDraft(e.target.value)}\r\n onBlur={commitDraft}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') {\r\n commitDraft()\r\n e.currentTarget.blur()\r\n }\r\n }}\r\n className=\"h-8 text-sm\"\r\n disabled={disabled}\r\n />\r\n <span className=\"text-xs text-muted-foreground\">°</span>\r\n </div>\r\n </label>\r\n\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"w-full justify-start gap-2 h-8 text-xs\"\r\n disabled={disabled || pickingNorth}\r\n onClick={onStartPick}\r\n >\r\n <LR.MousePointerClick className=\"h-3.5 w-3.5\" />\r\n {pickingNorth ? t('trueNorthPicking') : t('trueNorthPickLine')}\r\n </Button>\r\n\r\n {pickingNorth && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"w-full h-7 text-xs\"\r\n onClick={onCancelPick}\r\n >\r\n {t('trueNorthCancelPick')}\r\n </Button>\r\n )}\r\n\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"w-full h-7 text-xs\"\r\n disabled={disabled || northAngle === 0}\r\n onClick={() => onChangeAngle(0)}\r\n >\r\n <LR.RotateCcw className=\"h-3 w-3 mr-1\" />\r\n {t('trueNorthReset')}\r\n </Button>\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n )\r\n}\r\n\r\nfunction formatAngle(degrees: number): string {\r\n // Show 0 decimals for whole numbers, 1 decimal otherwise — keeps the\r\n // input clean for typed values but readable after a line pick.\r\n const rounded = Math.round(degrees * 10) / 10\r\n return Number.isInteger(rounded) ? rounded.toFixed(0) : rounded.toFixed(1)\r\n}\r\n"],"mappings":";AAkFU,cAaE,YAbF;AA7EV,YAAY,WAAW;AACvB,YAAY,QAAQ;AACpB,SAAS,uBAAuB;AAChC,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AA0BA,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,QAAM,IAAI,gBAAgB,aAAa;AACvC,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAiB,YAAY,UAAU,CAAC;AAIxE,QAAM,UAAU,MAAM;AACpB,aAAS,YAAY,UAAU,CAAC;AAAA,EAClC,GAAG,CAAC,UAAU,CAAC;AAGf,QAAM,UAAU,MAAM;AACpB,QAAI,aAAc,SAAQ,KAAK;AAAA,EACjC,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,cAAc,MAAM;AACxB,UAAM,QAAQ,OAAO,KAAK;AAC1B,QAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,eAAS,YAAY,UAAU,CAAC;AAChC;AAAA,IACF;AACA,kBAAc,KAAK;AAAA,EACrB;AAEA,SACE,qBAAC,WAAQ,MAAY,cAAc,SACjC;AAAA,wBAAC,kBAAe,SAAO,MACrB;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QACV,OAAO,EAAE,gBAAgB;AAAA,QACzB;AAAA,QAEA,8BAAC,GAAG,SAAH,EAAW,WAAU,eAAc;AAAA;AAAA,IACtC,GACF;AAAA,IACA,oBAAC,kBAAe,OAAM,OAAM,WAAU,YACpC,+BAAC,SAAI,WAAU,aACb;AAAA,0BAAC,SAAI,WAAU,qEACZ,YAAE,gBAAgB,GACrB;AAAA,MAEA,qBAAC,WAAM,WAAU,mBACf;AAAA,4BAAC,UAAK,WAAU,iCACb,YAAE,qBAAqB,GAC1B;AAAA,QACA,qBAAC,SAAI,WAAU,2BACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,cACxC,QAAQ;AAAA,cACR,WAAW,CAAC,MAAM;AAChB,oBAAI,EAAE,QAAQ,SAAS;AACrB,8BAAY;AACZ,oBAAE,cAAc,KAAK;AAAA,gBACvB;AAAA,cACF;AAAA,cACA,WAAU;AAAA,cACV;AAAA;AAAA,UACF;AAAA,UACA,oBAAC,UAAK,WAAU,iCAAgC,kBAAC;AAAA,WACnD;AAAA,SACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU,YAAY;AAAA,UACtB,SAAS;AAAA,UAET;AAAA,gCAAC,GAAG,mBAAH,EAAqB,WAAU,eAAc;AAAA,YAC7C,eAAe,EAAE,kBAAkB,IAAI,EAAE,mBAAmB;AAAA;AAAA;AAAA,MAC/D;AAAA,MAEC,gBACC;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS;AAAA,UAER,YAAE,qBAAqB;AAAA;AAAA,MAC1B;AAAA,MAGF;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,WAAU;AAAA,UACV,UAAU,YAAY,eAAe;AAAA,UACrC,SAAS,MAAM,cAAc,CAAC;AAAA,UAE9B;AAAA,gCAAC,GAAG,WAAH,EAAa,WAAU,gBAAe;AAAA,YACtC,EAAE,gBAAgB;AAAA;AAAA;AAAA,MACrB;AAAA,OACF,GACF;AAAA,KACF;AAEJ;AAEA,SAAS,YAAY,SAAyB;AAG5C,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE,IAAI;AAC3C,SAAO,OAAO,UAAU,OAAO,IAAI,QAAQ,QAAQ,CAAC,IAAI,QAAQ,QAAQ,CAAC;AAC3E;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"ViewModeCoordinator.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/ViewModeCoordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAE3C;;+CAE+C;AAC/C,MAAM,WAAW,iBAAiB;IAChC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CACnC;AAED;;;;;;GAMG;AACH,qBAAa,mBAAoB,SAAQ,GAAG,CAAC,SAAS;IACpD,MAAM,CAAC,IAAI,EAAG,sCAAsC,CAAS;IAE7D,OAAO,UAAO;IAEd,OAAO,CAAC,OAAO,CAAiC;gBAEpC,UAAU,EAAE,GAAG,CAAC,UAAU;IAKtC;gEAC4D;IACtD,KAAK,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAenD,sEAAsE;IACtE,OAAO,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI;CAGvC"}
1
+ {"version":3,"file":"ViewModeCoordinator.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/ViewModeCoordinator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAE3C;;+CAE+C;AAC/C,MAAM,WAAW,iBAAiB;IAChC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CACnC;AAED;;;;;;GAMG;AACH,qBAAa,mBAAoB,SAAQ,GAAG,CAAC,SAAS;IACpD,MAAM,CAAC,IAAI,EAAG,sCAAsC,CAAS;IAE7D,OAAO,UAAO;IAEd,OAAO,CAAC,OAAO,CAAiC;gBAEpC,UAAU,EAAE,GAAG,CAAC,UAAU;IAKtC;gEAC4D;IACtD,KAAK,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAenD,sEAAsE;IACtE,OAAO,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI;CAGvC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/ViewModeCoordinator.ts"],"sourcesContent":["import * as OBC from '@thatopen/components'\r\n\r\n/** Tools that take exclusive control of the viewer (FloorplanTool,\r\n * ElevationsTool, …) implement this so the coordinator can switch them\r\n * off when another tool claims the viewer. */\r\nexport interface ExclusiveViewTool {\r\n deactivate(): Promise<void> | void\r\n}\r\n\r\n/**\r\n * Single-slot mutual exclusion for drawing-based view tools. A tool calls\r\n * `claim(this)` at the start of its `activate()` and `release(this)` at\r\n * the end of its `deactivate()`. If a different tool was active, the\r\n * coordinator awaits its `deactivate()` first — guaranteeing only one\r\n * tool drives the viewer at a time.\r\n */\r\nexport class ViewModeCoordinator extends OBC.Component {\r\n static uuid = 'fc4c8b2e-2c5a-4a4f-bb1e-6d2c3f7a18b0' as const\r\n\r\n enabled = true\r\n\r\n private _active: ExclusiveViewTool | null = null\r\n\r\n constructor(components: OBC.Components) {\r\n super(components)\r\n components.add(ViewModeCoordinator.uuid, this)\r\n }\r\n\r\n /** Take exclusive control. If another tool was active, its\r\n * `deactivate()` is awaited before this method returns. */\r\n async claim(tool: ExclusiveViewTool): Promise<void> {\r\n if (this._active === tool) return\r\n const prev = this._active\r\n // Set the new claim FIRST so prev's deactivate() can call release()\r\n // without un-setting our claim.\r\n this._active = tool\r\n if (prev) {\r\n try {\r\n await prev.deactivate()\r\n } catch (error) {\r\n console.warn('[ViewModeCoordinator] previous deactivate failed:', error)\r\n }\r\n }\r\n }\r\n\r\n /** Release the claim if `tool` is the active one. No-op otherwise. */\r\n release(tool: ExclusiveViewTool): void {\r\n if (this._active === tool) this._active = null\r\n }\r\n}\r\n"],"mappings":"AAAA,YAAY,SAAS;AAgBd,MAAM,uBAAN,MAAM,6BAA4B,IAAI,UAAU;AAAA,EAOrD,YAAY,YAA4B;AACtC,UAAM,UAAU;AALlB,mBAAU;AAEV,SAAQ,UAAoC;AAI1C,eAAW,IAAI,qBAAoB,MAAM,IAAI;AAAA,EAC/C;AAAA;AAAA;AAAA,EAIA,MAAM,MAAM,MAAwC;AAClD,QAAI,KAAK,YAAY,KAAM;AAC3B,UAAM,OAAO,KAAK;AAGlB,SAAK,UAAU;AACf,QAAI,MAAM;AACR,UAAI;AACF,cAAM,KAAK,WAAW;AAAA,MACxB,SAAS,OAAO;AACd,gBAAQ,KAAK,qDAAqD,KAAK;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ,MAA+B;AACrC,QAAI,KAAK,YAAY,KAAM,MAAK,UAAU;AAAA,EAC5C;AACF;AAjCa,qBACJ,OAAO;AADT,IAAM,sBAAN;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/ViewModeCoordinator.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\n\r\n/** Tools that take exclusive control of the viewer (FloorplanTool,\r\n * ElevationsTool, …) implement this so the coordinator can switch them\r\n * off when another tool claims the viewer. */\r\nexport interface ExclusiveViewTool {\r\n deactivate(): Promise<void> | void\r\n}\r\n\r\n/**\r\n * Single-slot mutual exclusion for drawing-based view tools. A tool calls\r\n * `claim(this)` at the start of its `activate()` and `release(this)` at\r\n * the end of its `deactivate()`. If a different tool was active, the\r\n * coordinator awaits its `deactivate()` first — guaranteeing only one\r\n * tool drives the viewer at a time.\r\n */\r\nexport class ViewModeCoordinator extends OBC.Component {\r\n static uuid = 'fc4c8b2e-2c5a-4a4f-bb1e-6d2c3f7a18b0' as const\r\n\r\n enabled = true\r\n\r\n private _active: ExclusiveViewTool | null = null\r\n\r\n constructor(components: OBC.Components) {\r\n super(components)\r\n components.add(ViewModeCoordinator.uuid, this)\r\n }\r\n\r\n /** Take exclusive control. If another tool was active, its\r\n * `deactivate()` is awaited before this method returns. */\r\n async claim(tool: ExclusiveViewTool): Promise<void> {\r\n if (this._active === tool) return\r\n const prev = this._active\r\n // Set the new claim FIRST so prev's deactivate() can call release()\r\n // without un-setting our claim.\r\n this._active = tool\r\n if (prev) {\r\n try {\r\n await prev.deactivate()\r\n } catch (error) {\r\n console.warn('[ViewModeCoordinator] previous deactivate failed:', error)\r\n }\r\n }\r\n }\r\n\r\n /** Release the claim if `tool` is the active one. No-op otherwise. */\r\n release(tool: ExclusiveViewTool): void {\r\n if (this._active === tool) this._active = null\r\n }\r\n}\r\n"],"mappings":"AAGA,YAAY,SAAS;AAgBd,MAAM,uBAAN,MAAM,6BAA4B,IAAI,UAAU;AAAA,EAOrD,YAAY,YAA4B;AACtC,UAAM,UAAU;AALlB,mBAAU;AAEV,SAAQ,UAAoC;AAI1C,eAAW,IAAI,qBAAoB,MAAM,IAAI;AAAA,EAC/C;AAAA;AAAA;AAAA,EAIA,MAAM,MAAM,MAAwC;AAClD,QAAI,KAAK,YAAY,KAAM;AAC3B,UAAM,OAAO,KAAK;AAGlB,SAAK,UAAU;AACf,QAAI,MAAM;AACR,UAAI;AACF,cAAM,KAAK,WAAW;AAAA,MACxB,SAAS,OAAO;AACd,gBAAQ,KAAK,qDAAqD,KAAK;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ,MAA+B;AACrC,QAAI,KAAK,YAAY,KAAM,MAAK,UAAU;AAAA,EAC5C;AACF;AAjCa,qBACJ,OAAO;AADT,IAAM,sBAAN;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"ViewSectionList.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/ViewSectionList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAE/D,UAAU,KAAK;IACb,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB;wEACoE;IACpE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,EAAE,gBAAgB,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB;mEAC+D;IAC/D,YAAY,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAA;IACvC,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAA;IACtB,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAA;IACrB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAA;IACjB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAA;IACjB,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAA;IACrB,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAA;IACnB,sDAAsD;IACtD,qBAAqB,EAAE,MAAM,CAAA;IAC7B,+CAA+C;IAC/C,gBAAgB,EAAE,MAAM,CAAA;IACxB;qCACiC;IACjC,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAA;IAChD,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;IACxC,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,UAAU,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;IACnE,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC5D,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAC/D;AAED;;uCAEuC;AACvC,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,QAAQ,EACR,SAAS,EACT,OAAO,EACP,cAAc,EACd,YAAY,EACZ,cAAc,EACd,aAAa,EACb,SAAS,EACT,SAAS,EACT,aAAa,EACb,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,MAAM,EACN,UAAU,EACV,aAAa,EACb,kBAAkB,GACnB,EAAE,KAAK,qBA4IP"}
1
+ {"version":3,"file":"ViewSectionList.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/ViewSectionList.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAE/D,UAAU,KAAK;IACb,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB;wEACoE;IACpE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,EAAE,gBAAgB,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB;mEAC+D;IAC/D,YAAY,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAA;IACvC,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAA;IACtB,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAA;IACrB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAA;IACjB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAA;IACjB,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAA;IACrB,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAA;IACnB,sDAAsD;IACtD,qBAAqB,EAAE,MAAM,CAAA;IAC7B,+CAA+C;IAC/C,gBAAgB,EAAE,MAAM,CAAA;IACxB;qCACiC;IACjC,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAA;IAChD,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;IACxC,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,UAAU,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;IACnE,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC5D,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAC/D;AAED;;uCAEuC;AACvC,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,QAAQ,EACR,SAAS,EACT,OAAO,EACP,cAAc,EACd,YAAY,EACZ,cAAc,EACd,aAAa,EACb,SAAS,EACT,SAAS,EACT,aAAa,EACb,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,MAAM,EACN,UAAU,EACV,aAAa,EACb,kBAAkB,GACnB,EAAE,KAAK,qBA4IP"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/ViewSectionList.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport * as LR from 'lucide-react'\r\nimport { Button } from '../../../../ui/Button'\r\nimport { Switch } from '../../../../ui/Switch'\r\nimport { DrawingLayerInfo } from './drawingLayers'\r\nimport { ViewListEntry, ViewLoadingState } from './viewSection'\r\n\r\ninterface Props {\r\n entries: ViewListEntry[]\r\n activeId: string | null\r\n /** Id the user just clicked but the tool hasn't activated yet. Lets the\r\n * spinner appear on the row immediately, before activeId flips. */\r\n pendingId: string | null\r\n loading: ViewLoadingState\r\n loadingPercent: number\r\n /** Per-IFC-class layers of the active entry, or null if none. Used to\r\n * render the expandable layers panel below the active row. */\r\n activeLayers: DrawingLayerInfo[] | null\r\n /** Translated message shown next to the spinner while loading. */\r\n loadingMessage: string\r\n /** Translated \"Viewing\" prefix shown before the entry label when active. */\r\n viewingPrefix: string\r\n /** Translated label of the Exit button. */\r\n exitLabel: string\r\n /** Translated tooltip for \"Go to …\". */\r\n goToLabel: string\r\n /** Translated tooltip for the download button. */\r\n downloadLabel: string\r\n /** Translated tooltip for the layers expand/collapse button. */\r\n layersLabel: string\r\n /** Translated tooltip for layer visibility toggle. */\r\n toggleVisibilityLabel: string\r\n /** Translated tooltip for the color picker. */\r\n chooseColorLabel: string\r\n /** Maps an IFC class name to a friendly translated label\r\n * (e.g. \"IFCWALL\" → \"Wall\"). */\r\n friendlyClassName: (className: string) => string\r\n onSelect: (entry: ViewListEntry) => void\r\n onExit: () => void\r\n onDownload: (entry: ViewListEntry, event: React.MouseEvent) => void\r\n onToggleLayer: (className: string, visible: boolean) => void\r\n onChangeLayerColor: (className: string, color: number) => void\r\n}\r\n\r\n/** Active-card + row list shared by every \"view\" sidebar section\r\n * (floorplans, elevations, …). Localized strings come from the parent —\r\n * this component is i18n-agnostic. */\r\nexport function ViewSectionList({\r\n entries,\r\n activeId,\r\n pendingId,\r\n loading,\r\n loadingPercent,\r\n activeLayers,\r\n loadingMessage,\r\n viewingPrefix,\r\n exitLabel,\r\n goToLabel,\r\n downloadLabel,\r\n layersLabel,\r\n toggleVisibilityLabel,\r\n chooseColorLabel,\r\n friendlyClassName,\r\n onSelect,\r\n onExit,\r\n onDownload,\r\n onToggleLayer,\r\n onChangeLayerColor,\r\n}: Props) {\r\n const [layersExpanded, setLayersExpanded] = React.useState(false)\r\n const activeEntry = entries.find((entry) => entry.id === activeId) ?? null\r\n const isLoading = loading.isLoading\r\n const targetId = activeId ?? pendingId\r\n const showCard = !!activeEntry || (isLoading && !!targetId)\r\n const cardEntry =\r\n activeEntry ??\r\n (targetId ? entries.find((e) => e.id === targetId) : null) ??\r\n null\r\n\r\n // Auto-collapse the layers panel when the active entry changes.\r\n React.useEffect(() => {\r\n setLayersExpanded(false)\r\n }, [activeId])\r\n\r\n return (\r\n <>\r\n {showCard && (\r\n <div className=\"mb-2 p-2 bg-accent rounded-md border border-gray-200\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-2 min-w-0\">\r\n {isLoading && (\r\n <LR.Loader2 className=\"h-3 w-3 animate-spin flex-shrink-0 text-muted-foreground\" />\r\n )}\r\n <span className=\"text-xs truncate\">\r\n {isLoading\r\n ? loadingMessage\r\n : `${viewingPrefix}: ${cardEntry?.label ?? ''}`}\r\n </span>\r\n </div>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={onExit}\r\n className=\"h-6 text-xs px-2\"\r\n >\r\n <LR.X className=\"h-3 w-3 mr-1\" />\r\n {exitLabel}\r\n </Button>\r\n </div>\r\n {isLoading && (\r\n <div className=\"mt-2 h-1 w-full bg-gray-200 rounded-full overflow-hidden\">\r\n <div\r\n className=\"h-full bg-primary transition-all duration-300 ease-out\"\r\n style={{ width: `${loadingPercent}%` }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n {entries.map((entry) => {\r\n const isActive = activeId === entry.id\r\n const isPending =\r\n isLoading && (pendingId === entry.id || activeId === entry.id)\r\n const showLayersPanel =\r\n isActive &&\r\n layersExpanded &&\r\n !!activeLayers &&\r\n activeLayers.length > 0\r\n return (\r\n <div key={entry.id}>\r\n <div\r\n className={`flex items-center justify-between m-2 px-2 py-1 hover:bg-accent/50 rounded-md transition-colors ${\r\n isActive ? 'bg-accent' : ''\r\n }`}\r\n >\r\n <div\r\n title={`${goToLabel}: ${entry.label}`}\r\n className=\"flex items-center gap-2 flex-1 min-w-0 cursor-pointer\"\r\n onClick={() => onSelect(entry)}\r\n >\r\n <span className=\"text-sm text-foreground truncate cursor-pointer\">\r\n {entry.label}\r\n </span>\r\n {isPending ? (\r\n <LR.Loader2 className=\"h-3 w-3 flex-shrink-0 text-muted-foreground animate-spin\" />\r\n ) : isActive ? (\r\n <LR.Eye className=\"h-3 w-3 flex-shrink-0 text-muted-foreground\" />\r\n ) : null}\r\n </div>\r\n {isActive && (\r\n <div className=\"flex items-center gap-1\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-6 w-6 p-0\"\r\n onClick={(event) => onDownload(entry, event)}\r\n title={downloadLabel}\r\n >\r\n <LR.Download className=\"h-3 w-3\" />\r\n </Button>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-6 w-6 p-0\"\r\n onClick={(event) => {\r\n event.stopPropagation()\r\n setLayersExpanded((prev) => !prev)\r\n }}\r\n title={layersLabel}\r\n >\r\n {layersExpanded ? (\r\n <LR.ChevronDown className=\"h-3 w-3\" />\r\n ) : (\r\n <LR.ChevronRight className=\"h-3 w-3\" />\r\n )}\r\n </Button>\r\n </div>\r\n )}\r\n </div>\r\n {showLayersPanel && (\r\n <div className=\"mx-2 mb-2 px-2 py-1 border border-gray-200 rounded-md bg-background/50\">\r\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground mb-1 px-1\">\r\n {layersLabel}\r\n </div>\r\n <div className=\"space-y-0.5\">\r\n {activeLayers!.map((layer) => (\r\n <LayerRow\r\n key={layer.className}\r\n layer={layer}\r\n label={friendlyClassName(layer.className)}\r\n toggleTitle={toggleVisibilityLabel}\r\n colorTitle={chooseColorLabel}\r\n onToggle={(visible) =>\r\n onToggleLayer(layer.className, visible)\r\n }\r\n onColor={(color) =>\r\n onChangeLayerColor(layer.className, color)\r\n }\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n })}\r\n </>\r\n )\r\n}\r\n\r\ninterface LayerRowProps {\r\n layer: DrawingLayerInfo\r\n label: string\r\n toggleTitle: string\r\n colorTitle: string\r\n onToggle: (visible: boolean) => void\r\n onColor: (color: number) => void\r\n}\r\n\r\nfunction LayerRow({\r\n layer,\r\n label,\r\n toggleTitle,\r\n colorTitle,\r\n onToggle,\r\n onColor,\r\n}: LayerRowProps) {\r\n const hex = `#${layer.color.toString(16).padStart(6, '0')}`\r\n return (\r\n <div className=\"flex items-center gap-2 px-1 py-1 hover:bg-accent/30 rounded-sm\">\r\n <Switch\r\n checked={layer.visible}\r\n onCheckedChange={onToggle}\r\n title={toggleTitle}\r\n className=\"scale-75 origin-left flex-shrink-0\"\r\n />\r\n <label\r\n title={colorTitle}\r\n className=\"relative inline-block h-4 w-4 cursor-pointer rounded-full border border-black flex-shrink-0 overflow-hidden\"\r\n style={{ backgroundColor: hex }}\r\n >\r\n <input\r\n type=\"color\"\r\n value={hex}\r\n onChange={(event) => {\r\n const next = parseInt(event.target.value.replace('#', ''), 16)\r\n if (!Number.isNaN(next)) onColor(next)\r\n }}\r\n className=\"absolute inset-0 h-full w-full cursor-pointer opacity-0\"\r\n />\r\n </label>\r\n <span className=\"text-xs text-foreground truncate flex-1 min-w-0\">\r\n {label}\r\n </span>\r\n <span className=\"text-[10px] text-muted-foreground flex-shrink-0\">\r\n {layer.itemCount}\r\n </span>\r\n </div>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/ViewSectionList.tsx"],"sourcesContent":["'use client'\r\n\r\n// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport * as LR from 'lucide-react'\r\nimport { Button } from '../../../../ui/Button'\r\nimport { Switch } from '../../../../ui/Switch'\r\nimport { DrawingLayerInfo } from './drawingLayers'\r\nimport { ViewListEntry, ViewLoadingState } from './viewSection'\r\n\r\ninterface Props {\r\n entries: ViewListEntry[]\r\n activeId: string | null\r\n /** Id the user just clicked but the tool hasn't activated yet. Lets the\r\n * spinner appear on the row immediately, before activeId flips. */\r\n pendingId: string | null\r\n loading: ViewLoadingState\r\n loadingPercent: number\r\n /** Per-IFC-class layers of the active entry, or null if none. Used to\r\n * render the expandable layers panel below the active row. */\r\n activeLayers: DrawingLayerInfo[] | null\r\n /** Translated message shown next to the spinner while loading. */\r\n loadingMessage: string\r\n /** Translated \"Viewing\" prefix shown before the entry label when active. */\r\n viewingPrefix: string\r\n /** Translated label of the Exit button. */\r\n exitLabel: string\r\n /** Translated tooltip for \"Go to …\". */\r\n goToLabel: string\r\n /** Translated tooltip for the download button. */\r\n downloadLabel: string\r\n /** Translated tooltip for the layers expand/collapse button. */\r\n layersLabel: string\r\n /** Translated tooltip for layer visibility toggle. */\r\n toggleVisibilityLabel: string\r\n /** Translated tooltip for the color picker. */\r\n chooseColorLabel: string\r\n /** Maps an IFC class name to a friendly translated label\r\n * (e.g. \"IFCWALL\" → \"Wall\"). */\r\n friendlyClassName: (className: string) => string\r\n onSelect: (entry: ViewListEntry) => void\r\n onExit: () => void\r\n onDownload: (entry: ViewListEntry, event: React.MouseEvent) => void\r\n onToggleLayer: (className: string, visible: boolean) => void\r\n onChangeLayerColor: (className: string, color: number) => void\r\n}\r\n\r\n/** Active-card + row list shared by every \"view\" sidebar section\r\n * (floorplans, elevations, …). Localized strings come from the parent —\r\n * this component is i18n-agnostic. */\r\nexport function ViewSectionList({\r\n entries,\r\n activeId,\r\n pendingId,\r\n loading,\r\n loadingPercent,\r\n activeLayers,\r\n loadingMessage,\r\n viewingPrefix,\r\n exitLabel,\r\n goToLabel,\r\n downloadLabel,\r\n layersLabel,\r\n toggleVisibilityLabel,\r\n chooseColorLabel,\r\n friendlyClassName,\r\n onSelect,\r\n onExit,\r\n onDownload,\r\n onToggleLayer,\r\n onChangeLayerColor,\r\n}: Props) {\r\n const [layersExpanded, setLayersExpanded] = React.useState(false)\r\n const activeEntry = entries.find((entry) => entry.id === activeId) ?? null\r\n const isLoading = loading.isLoading\r\n const targetId = activeId ?? pendingId\r\n const showCard = !!activeEntry || (isLoading && !!targetId)\r\n const cardEntry =\r\n activeEntry ??\r\n (targetId ? entries.find((e) => e.id === targetId) : null) ??\r\n null\r\n\r\n // Auto-collapse the layers panel when the active entry changes.\r\n React.useEffect(() => {\r\n setLayersExpanded(false)\r\n }, [activeId])\r\n\r\n return (\r\n <>\r\n {showCard && (\r\n <div className=\"mb-2 p-2 bg-accent rounded-md border border-gray-200\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-2 min-w-0\">\r\n {isLoading && (\r\n <LR.Loader2 className=\"h-3 w-3 animate-spin flex-shrink-0 text-muted-foreground\" />\r\n )}\r\n <span className=\"text-xs truncate\">\r\n {isLoading\r\n ? loadingMessage\r\n : `${viewingPrefix}: ${cardEntry?.label ?? ''}`}\r\n </span>\r\n </div>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={onExit}\r\n className=\"h-6 text-xs px-2\"\r\n >\r\n <LR.X className=\"h-3 w-3 mr-1\" />\r\n {exitLabel}\r\n </Button>\r\n </div>\r\n {isLoading && (\r\n <div className=\"mt-2 h-1 w-full bg-gray-200 rounded-full overflow-hidden\">\r\n <div\r\n className=\"h-full bg-primary transition-all duration-300 ease-out\"\r\n style={{ width: `${loadingPercent}%` }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n {entries.map((entry) => {\r\n const isActive = activeId === entry.id\r\n const isPending =\r\n isLoading && (pendingId === entry.id || activeId === entry.id)\r\n const showLayersPanel =\r\n isActive &&\r\n layersExpanded &&\r\n !!activeLayers &&\r\n activeLayers.length > 0\r\n return (\r\n <div key={entry.id}>\r\n <div\r\n className={`flex items-center justify-between m-2 px-2 py-1 hover:bg-accent/50 rounded-md transition-colors ${\r\n isActive ? 'bg-accent' : ''\r\n }`}\r\n >\r\n <div\r\n title={`${goToLabel}: ${entry.label}`}\r\n className=\"flex items-center gap-2 flex-1 min-w-0 cursor-pointer\"\r\n onClick={() => onSelect(entry)}\r\n >\r\n <span className=\"text-sm text-foreground truncate cursor-pointer\">\r\n {entry.label}\r\n </span>\r\n {isPending ? (\r\n <LR.Loader2 className=\"h-3 w-3 flex-shrink-0 text-muted-foreground animate-spin\" />\r\n ) : isActive ? (\r\n <LR.Eye className=\"h-3 w-3 flex-shrink-0 text-muted-foreground\" />\r\n ) : null}\r\n </div>\r\n {isActive && (\r\n <div className=\"flex items-center gap-1\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-6 w-6 p-0\"\r\n onClick={(event) => onDownload(entry, event)}\r\n title={downloadLabel}\r\n >\r\n <LR.Download className=\"h-3 w-3\" />\r\n </Button>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-6 w-6 p-0\"\r\n onClick={(event) => {\r\n event.stopPropagation()\r\n setLayersExpanded((prev) => !prev)\r\n }}\r\n title={layersLabel}\r\n >\r\n {layersExpanded ? (\r\n <LR.ChevronDown className=\"h-3 w-3\" />\r\n ) : (\r\n <LR.ChevronRight className=\"h-3 w-3\" />\r\n )}\r\n </Button>\r\n </div>\r\n )}\r\n </div>\r\n {showLayersPanel && (\r\n <div className=\"mx-2 mb-2 px-2 py-1 border border-gray-200 rounded-md bg-background/50\">\r\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground mb-1 px-1\">\r\n {layersLabel}\r\n </div>\r\n <div className=\"space-y-0.5\">\r\n {activeLayers!.map((layer) => (\r\n <LayerRow\r\n key={layer.className}\r\n layer={layer}\r\n label={friendlyClassName(layer.className)}\r\n toggleTitle={toggleVisibilityLabel}\r\n colorTitle={chooseColorLabel}\r\n onToggle={(visible) =>\r\n onToggleLayer(layer.className, visible)\r\n }\r\n onColor={(color) =>\r\n onChangeLayerColor(layer.className, color)\r\n }\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n })}\r\n </>\r\n )\r\n}\r\n\r\ninterface LayerRowProps {\r\n layer: DrawingLayerInfo\r\n label: string\r\n toggleTitle: string\r\n colorTitle: string\r\n onToggle: (visible: boolean) => void\r\n onColor: (color: number) => void\r\n}\r\n\r\nfunction LayerRow({\r\n layer,\r\n label,\r\n toggleTitle,\r\n colorTitle,\r\n onToggle,\r\n onColor,\r\n}: LayerRowProps) {\r\n const hex = `#${layer.color.toString(16).padStart(6, '0')}`\r\n return (\r\n <div className=\"flex items-center gap-2 px-1 py-1 hover:bg-accent/30 rounded-sm\">\r\n <Switch\r\n checked={layer.visible}\r\n onCheckedChange={onToggle}\r\n title={toggleTitle}\r\n className=\"scale-75 origin-left flex-shrink-0\"\r\n />\r\n <label\r\n title={colorTitle}\r\n className=\"relative inline-block h-4 w-4 cursor-pointer rounded-full border border-black flex-shrink-0 overflow-hidden\"\r\n style={{ backgroundColor: hex }}\r\n >\r\n <input\r\n type=\"color\"\r\n value={hex}\r\n onChange={(event) => {\r\n const next = parseInt(event.target.value.replace('#', ''), 16)\r\n if (!Number.isNaN(next)) onColor(next)\r\n }}\r\n className=\"absolute inset-0 h-full w-full cursor-pointer opacity-0\"\r\n />\r\n </label>\r\n <span className=\"text-xs text-foreground truncate flex-1 min-w-0\">\r\n {label}\r\n </span>\r\n <span className=\"text-[10px] text-muted-foreground flex-shrink-0\">\r\n {layer.itemCount}\r\n </span>\r\n </div>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"drawingLayers.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/drawingLayers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,wDAAwD;AACxD,eAAO,MAAM,WAAW,aAQtB,CAAA;AAEF,yCAAyC;AACzC,eAAO,MAAM,YAAY,aAIvB,CAAA;AAEF;;;uDAGuD;AACvD,eAAO,MAAM,aAAa,aAUxB,CAAA;AAEF;;8DAE8D;AAC9D,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAWtD,CAAA;AAED,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAA;IACjB,6EAA6E;IAC7E,SAAS,EAAE,MAAM,CAAA;IACjB,yBAAyB;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAA;IACjB;;6EAEyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;mDAMmD;AACnD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACpC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAUvB"}
1
+ {"version":3,"file":"drawingLayers.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/drawingLayers.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AAEH,wDAAwD;AACxD,eAAO,MAAM,WAAW,aAQtB,CAAA;AAEF,yCAAyC;AACzC,eAAO,MAAM,YAAY,aAIvB,CAAA;AAEF;;;uDAGuD;AACvD,eAAO,MAAM,aAAa,aAUxB,CAAA;AAEF;;8DAE8D;AAC9D,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAWtD,CAAA;AAED,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAA;IACjB,6EAA6E;IAC7E,SAAS,EAAE,MAAM,CAAA;IACjB,yBAAyB;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAA;IACjB;;6EAEyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;mDAMmD;AACnD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACpC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAUvB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/drawingLayers.ts"],"sourcesContent":["/**\r\n * Per-IFC-class drawing-layer configuration.\r\n *\r\n * The drawing splits its visible lines into one layer per IFC class so the\r\n * sidebar can toggle visibility / change color per class, and so a future\r\n * DXF export can map each class to a distinct DXF layer.\r\n *\r\n * Cut classes (walls, columns, curtain-wall mullions / panels) render dark\r\n * gray; fill classes (slabs, roofs) render pure black; everything else is\r\n * mid-gray. We don't rely on `linewidth > 1` because `LineBasicMaterial`\r\n * ignores it on most WebGL contexts.\r\n */\r\n\r\n/** Classes the section plane traverses in plan view. */\r\nexport const CUT_CLASSES = new Set<string>([\r\n 'IFCWALL',\r\n 'IFCWALLSTANDARDCASE',\r\n 'IFCCURTAINWALL',\r\n 'IFCPLATE',\r\n 'IFCMEMBER',\r\n 'IFCCOLUMN',\r\n 'IFCCOLUMNSTANDARDCASE',\r\n])\r\n\r\n/** Horizontal closures (slabs/roofs). */\r\nexport const FILL_CLASSES = new Set<string>([\r\n 'IFCSLAB',\r\n 'IFCROOF',\r\n 'IFCCOVERING',\r\n])\r\n\r\n/** Light classes — furniture / fixtures / soft fittings. Rendered in a\r\n * pale gray so the structural lines pop. WebGL can't actually vary line\r\n * width with `LineBasicMaterial`, so we approximate the line-weight\r\n * hierarchy of a real CAD plot via color contrast. */\r\nexport const LIGHT_CLASSES = new Set<string>([\r\n 'IFCFURNISHINGELEMENT',\r\n 'IFCFURNITURE',\r\n 'IFCSYSTEMFURNITUREELEMENT',\r\n 'IFCFLOWTERMINAL',\r\n 'IFCSANITARYTERMINAL',\r\n 'IFCLIGHTFIXTURE',\r\n 'IFCELECTRICAPPLIANCE',\r\n 'IFCAIRTERMINAL',\r\n 'IFCRAILING',\r\n])\r\n\r\n/** Projection / layer order: structural elements first so they appear\r\n * quickly when projection is progressive. Classes not in this list run\r\n * after, in the order returned by `getItemsOfCategories`. */\r\nexport const CLASS_PROJECTION_PRIORITY: readonly string[] = [\r\n 'IFCWALL',\r\n 'IFCWALLSTANDARDCASE',\r\n 'IFCCOLUMN',\r\n 'IFCCOLUMNSTANDARDCASE',\r\n 'IFCSLAB',\r\n 'IFCROOF',\r\n 'IFCCURTAINWALL',\r\n 'IFCPLATE',\r\n 'IFCMEMBER',\r\n 'IFCCOVERING',\r\n]\r\n\r\nexport interface DrawingLayerInfo {\r\n /** Raw IFC category name (e.g. \"IFCWALL\"). Also the drawing layer key. */\r\n className: string\r\n /** Layer name as registered in the TechnicalDrawing — equal to className. */\r\n layerName: string\r\n /** Currently visible. */\r\n visible: boolean\r\n /** Hex color of the line material. */\r\n color: number\r\n /** How many model items contribute to this layer. */\r\n itemCount: number\r\n /** Optional i18n key (next-intl namespace.path) for the UI label. The\r\n * sidebar should prefer `t(displayKey)` over `className` when set. Used\r\n * for non-IFC layers like \"Door Swings\" that need a localized label. */\r\n displayKey?: string\r\n}\r\n\r\n/** Default line color for a given IFC class. The contrast steps simulate\r\n * a CAD line-weight hierarchy (true variable widths would need Line2 +\r\n * resolution tracking — a real upgrade rather than a low-effort tweak):\r\n * - Fill (slabs, roofs) → pure black, heaviest read\r\n * - Cut (walls, columns, mullions) → dark gray, clearly structural\r\n * - Light (furniture, fixtures) → pale gray, recedes visually\r\n * - Everything else → mid gray */\r\nexport function defaultLayerColor(className: string): number {\r\n if (FILL_CLASSES.has(className)) return 0x000000\r\n if (CUT_CLASSES.has(className)) return 0x333333\r\n if (LIGHT_CLASSES.has(className)) return 0xb0b0b0\r\n return 0x666666\r\n}\r\n\r\n/**\r\n * Return the entries of `itemIdsByClass` sorted by projection priority:\r\n * priority-listed classes first (in their declared order), then everything\r\n * else in its original insertion order.\r\n */\r\nexport function sortClassesByPriority(\r\n itemIdsByClass: Map<string, number[]>,\r\n): Map<string, number[]> {\r\n const sorted = new Map<string, number[]>()\r\n for (const className of CLASS_PROJECTION_PRIORITY) {\r\n const ids = itemIdsByClass.get(className)\r\n if (ids && ids.length > 0) sorted.set(className, ids)\r\n }\r\n for (const [className, ids] of itemIdsByClass) {\r\n if (!sorted.has(className) && ids.length > 0) sorted.set(className, ids)\r\n }\r\n return sorted\r\n}\r\n"],"mappings":"AAcO,MAAM,cAAc,oBAAI,IAAY;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,MAAM,eAAe,oBAAI,IAAY;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,MAAM,gBAAgB,oBAAI,IAAY;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAKM,MAAM,4BAA+C;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA0BO,SAAS,kBAAkB,WAA2B;AAC3D,MAAI,aAAa,IAAI,SAAS,EAAG,QAAO;AACxC,MAAI,YAAY,IAAI,SAAS,EAAG,QAAO;AACvC,MAAI,cAAc,IAAI,SAAS,EAAG,QAAO;AACzC,SAAO;AACT;AAOO,SAAS,sBACd,gBACuB;AACvB,QAAM,SAAS,oBAAI,IAAsB;AACzC,aAAW,aAAa,2BAA2B;AACjD,UAAM,MAAM,eAAe,IAAI,SAAS;AACxC,QAAI,OAAO,IAAI,SAAS,EAAG,QAAO,IAAI,WAAW,GAAG;AAAA,EACtD;AACA,aAAW,CAAC,WAAW,GAAG,KAAK,gBAAgB;AAC7C,QAAI,CAAC,OAAO,IAAI,SAAS,KAAK,IAAI,SAAS,EAAG,QAAO,IAAI,WAAW,GAAG;AAAA,EACzE;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/drawingLayers.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n/**\r\n * Per-IFC-class drawing-layer configuration.\r\n *\r\n * The drawing splits its visible lines into one layer per IFC class so the\r\n * sidebar can toggle visibility / change color per class, and so a future\r\n * DXF export can map each class to a distinct DXF layer.\r\n *\r\n * Cut classes (walls, columns, curtain-wall mullions / panels) render dark\r\n * gray; fill classes (slabs, roofs) render pure black; everything else is\r\n * mid-gray. We don't rely on `linewidth > 1` because `LineBasicMaterial`\r\n * ignores it on most WebGL contexts.\r\n */\r\n\r\n/** Classes the section plane traverses in plan view. */\r\nexport const CUT_CLASSES = new Set<string>([\r\n 'IFCWALL',\r\n 'IFCWALLSTANDARDCASE',\r\n 'IFCCURTAINWALL',\r\n 'IFCPLATE',\r\n 'IFCMEMBER',\r\n 'IFCCOLUMN',\r\n 'IFCCOLUMNSTANDARDCASE',\r\n])\r\n\r\n/** Horizontal closures (slabs/roofs). */\r\nexport const FILL_CLASSES = new Set<string>([\r\n 'IFCSLAB',\r\n 'IFCROOF',\r\n 'IFCCOVERING',\r\n])\r\n\r\n/** Light classes — furniture / fixtures / soft fittings. Rendered in a\r\n * pale gray so the structural lines pop. WebGL can't actually vary line\r\n * width with `LineBasicMaterial`, so we approximate the line-weight\r\n * hierarchy of a real CAD plot via color contrast. */\r\nexport const LIGHT_CLASSES = new Set<string>([\r\n 'IFCFURNISHINGELEMENT',\r\n 'IFCFURNITURE',\r\n 'IFCSYSTEMFURNITUREELEMENT',\r\n 'IFCFLOWTERMINAL',\r\n 'IFCSANITARYTERMINAL',\r\n 'IFCLIGHTFIXTURE',\r\n 'IFCELECTRICAPPLIANCE',\r\n 'IFCAIRTERMINAL',\r\n 'IFCRAILING',\r\n])\r\n\r\n/** Projection / layer order: structural elements first so they appear\r\n * quickly when projection is progressive. Classes not in this list run\r\n * after, in the order returned by `getItemsOfCategories`. */\r\nexport const CLASS_PROJECTION_PRIORITY: readonly string[] = [\r\n 'IFCWALL',\r\n 'IFCWALLSTANDARDCASE',\r\n 'IFCCOLUMN',\r\n 'IFCCOLUMNSTANDARDCASE',\r\n 'IFCSLAB',\r\n 'IFCROOF',\r\n 'IFCCURTAINWALL',\r\n 'IFCPLATE',\r\n 'IFCMEMBER',\r\n 'IFCCOVERING',\r\n]\r\n\r\nexport interface DrawingLayerInfo {\r\n /** Raw IFC category name (e.g. \"IFCWALL\"). Also the drawing layer key. */\r\n className: string\r\n /** Layer name as registered in the TechnicalDrawing — equal to className. */\r\n layerName: string\r\n /** Currently visible. */\r\n visible: boolean\r\n /** Hex color of the line material. */\r\n color: number\r\n /** How many model items contribute to this layer. */\r\n itemCount: number\r\n /** Optional i18n key (next-intl namespace.path) for the UI label. The\r\n * sidebar should prefer `t(displayKey)` over `className` when set. Used\r\n * for non-IFC layers like \"Door Swings\" that need a localized label. */\r\n displayKey?: string\r\n}\r\n\r\n/** Default line color for a given IFC class. The contrast steps simulate\r\n * a CAD line-weight hierarchy (true variable widths would need Line2 +\r\n * resolution tracking — a real upgrade rather than a low-effort tweak):\r\n * - Fill (slabs, roofs) → pure black, heaviest read\r\n * - Cut (walls, columns, mullions) → dark gray, clearly structural\r\n * - Light (furniture, fixtures) → pale gray, recedes visually\r\n * - Everything else → mid gray */\r\nexport function defaultLayerColor(className: string): number {\r\n if (FILL_CLASSES.has(className)) return 0x000000\r\n if (CUT_CLASSES.has(className)) return 0x333333\r\n if (LIGHT_CLASSES.has(className)) return 0xb0b0b0\r\n return 0x666666\r\n}\r\n\r\n/**\r\n * Return the entries of `itemIdsByClass` sorted by projection priority:\r\n * priority-listed classes first (in their declared order), then everything\r\n * else in its original insertion order.\r\n */\r\nexport function sortClassesByPriority(\r\n itemIdsByClass: Map<string, number[]>,\r\n): Map<string, number[]> {\r\n const sorted = new Map<string, number[]>()\r\n for (const className of CLASS_PROJECTION_PRIORITY) {\r\n const ids = itemIdsByClass.get(className)\r\n if (ids && ids.length > 0) sorted.set(className, ids)\r\n }\r\n for (const [className, ids] of itemIdsByClass) {\r\n if (!sorted.has(className) && ids.length > 0) sorted.set(className, ids)\r\n }\r\n return sorted\r\n}\r\n"],"mappings":"AAiBO,MAAM,cAAc,oBAAI,IAAY;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,MAAM,eAAe,oBAAI,IAAY;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,MAAM,gBAAgB,oBAAI,IAAY;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAKM,MAAM,4BAA+C;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA0BO,SAAS,kBAAkB,WAA2B;AAC3D,MAAI,aAAa,IAAI,SAAS,EAAG,QAAO;AACxC,MAAI,YAAY,IAAI,SAAS,EAAG,QAAO;AACvC,MAAI,cAAc,IAAI,SAAS,EAAG,QAAO;AACzC,SAAO;AACT;AAOO,SAAS,sBACd,gBACuB;AACvB,QAAM,SAAS,oBAAI,IAAsB;AACzC,aAAW,aAAa,2BAA2B;AACjD,UAAM,MAAM,eAAe,IAAI,SAAS;AACxC,QAAI,OAAO,IAAI,SAAS,EAAG,QAAO,IAAI,WAAW,GAAG;AAAA,EACtD;AACA,aAAW,CAAC,WAAW,GAAG,KAAK,gBAAgB;AAC7C,QAAI,CAAC,OAAO,IAAI,SAAS,KAAK,IAAI,SAAS,EAAG,QAAO,IAAI,WAAW,GAAG;AAAA,EACzE;AACA,SAAO;AACT;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"drawingProjection.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/drawingProjection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"drawingProjection.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/drawingProjection.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/drawingProjection.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 {\r\n defaultLayerColor,\r\n DrawingLayerInfo,\r\n sortClassesByPriority,\r\n} from './drawingLayers'\r\n\r\nexport const FONT_URL =\r\n 'https://thatopen.github.io/engine_components/resources/fonts/PlusJakartaSans-Medium.ttf'\r\n\r\nexport const VISIBLE_LAYER = 'Visible'\r\nexport const HIDDEN_LAYER = 'Hidden'\r\nexport const ANNOTATIONS_LAYER = 'Annotations'\r\n\r\nexport interface DrawingViewportConfig {\r\n left: number\r\n right: number\r\n top: number\r\n bottom: number\r\n scale?: number\r\n name?: string\r\n}\r\n\r\nexport interface DrawingConfig {\r\n /** Direction the drawing's \"camera\" looks. Top-down floorplan: (0,-1,0).\r\n * North elevation: (0,0,-1). Etc. */\r\n orientation: THREE.Vector3\r\n /** World position of the drawing plane. */\r\n position: THREE.Vector3\r\n /** Depth captured from the plane along the orientation. */\r\n far: number\r\n viewport: DrawingViewportConfig\r\n}\r\n\r\n/**\r\n * Lazy, idempotent setup of `OBF.DrawingEditor` (font + source world).\r\n * Call before any drawing-projection work.\r\n */\r\nexport class DrawingEditorReady {\r\n private _fontLoaded = false\r\n private _editorSourceSet = false\r\n\r\n constructor(private components: OBC.Components) {}\r\n\r\n async ensure() {\r\n const editor = this.components.get(OBF.DrawingEditor)\r\n\r\n if (!this._fontLoaded) {\r\n try {\r\n await editor.fonts.load(FONT_URL)\r\n } catch (error) {\r\n console.warn('[drawingProjection] Font load failed:', error)\r\n }\r\n this._fontLoaded = true\r\n }\r\n\r\n if (!this._editorSourceSet) {\r\n const sourceWorld = this.components.get(CurrentWorld).world\r\n if (sourceWorld) {\r\n editor.setSource(sourceWorld)\r\n this._editorSourceSet = true\r\n }\r\n }\r\n }\r\n}\r\n\r\n/** Create a new TechnicalDrawing pre-configured with the standard\r\n * visible/hidden/annotations layers + viewport. Caller still needs to\r\n * add projection items (`addProjectionFromItems`). */\r\nexport function createDrawing(\r\n components: OBC.Components,\r\n config: DrawingConfig,\r\n): OBC.TechnicalDrawing | null {\r\n const sourceWorld = components.get(CurrentWorld).world\r\n if (!sourceWorld) return null\r\n\r\n const techDrawings = components.get(OBC.TechnicalDrawings)\r\n const drawing = techDrawings.create(sourceWorld)\r\n drawing.orientTo(config.orientation.clone())\r\n drawing.three.position.copy(config.position)\r\n drawing.three.visible = false\r\n drawing.far = config.far\r\n\r\n drawing.layers.create(VISIBLE_LAYER, {\r\n material: new THREE.LineBasicMaterial({ color: 0x000000 }),\r\n })\r\n drawing.layers.create(HIDDEN_LAYER, {\r\n material: new THREE.LineDashedMaterial({\r\n color: 0x888888,\r\n dashSize: 0.2,\r\n gapSize: 0.1,\r\n }),\r\n visible: false,\r\n } as any)\r\n drawing.layers.create(ANNOTATIONS_LAYER, {\r\n material: new THREE.LineBasicMaterial({ color: 0x000000 }),\r\n })\r\n drawing.activeLayer = ANNOTATIONS_LAYER\r\n\r\n drawing.viewports.create({\r\n left: config.viewport.left,\r\n right: config.viewport.right,\r\n top: config.viewport.top,\r\n bottom: config.viewport.bottom,\r\n scale: config.viewport.scale ?? 100,\r\n name: config.viewport.name ?? 'Drawing',\r\n })\r\n\r\n return drawing\r\n}\r\n\r\n/** Force ProjectionGenerator off the WebGPU path (it silently returns 0\r\n * edges when WebGPU is unavailable in the browser, which @thatopen\r\n * components 3.4 hits). Idempotent. */\r\nexport function disableProjectorWebGPU(components: OBC.Components) {\r\n const projector = components.get(OBC.EdgeProjector)\r\n ;(projector as any).generator.useWebGPU = false\r\n}\r\n\r\n/** Patch a model's `getItemsGeometry` to give every entry a unique\r\n * representationId. EdgeProjector at index.mjs:11228 uses\r\n * `!geomData.representationId` to validate, so id=0 is incorrectly\r\n * skipped — and the fragments worker for our models returns 0 for every\r\n * entry. Idempotent per model via a flag on the model itself. */\r\nexport function patchModelGeometryRepresentationIds(model: any) {\r\n if (model._floorplanGeometryPatched) return\r\n const original = model.getItemsGeometry.bind(model)\r\n let counter = 1\r\n model.getItemsGeometry = async (ids: number[]) => {\r\n const data = await original(ids)\r\n if (data && typeof data === 'object') {\r\n const arrays = Array.isArray(data) ? data : Object.values(data)\r\n for (const arr of arrays) {\r\n if (!Array.isArray(arr)) continue\r\n for (const g of arr) {\r\n if (\r\n g &&\r\n (g.representationId === 0 ||\r\n g.representationId == null ||\r\n g.representationId === '')\r\n ) {\r\n g.representationId = `cdt-rep-${counter++}`\r\n }\r\n }\r\n }\r\n }\r\n return data\r\n }\r\n model._floorplanGeometryPatched = true\r\n}\r\n\r\n/** Add the projection lines for the given item ids to a drawing. Lays\r\n * them into the standard visible/hidden layers. */\r\nexport async function addItemsProjection(\r\n drawing: OBC.TechnicalDrawing,\r\n modelId: string,\r\n itemIds: number[],\r\n): Promise<void> {\r\n if (itemIds.length === 0) return\r\n const modelIdMap: OBC.ModelIdMap = { [modelId]: new Set(itemIds) }\r\n await drawing.addProjectionFromItems(modelIdMap, {\r\n layers: { visible: VISIBLE_LAYER, hidden: HIDDEN_LAYER },\r\n })\r\n}\r\n\r\n/**\r\n * Project items grouped by IFC class into per-class drawing layers. Each\r\n * class gets its own visible layer with a default color (cut classes black,\r\n * everything else mid-gray); the hidden side of every class shares the\r\n * standard `HIDDEN_LAYER`.\r\n *\r\n * Returns metadata used by the sidebar UI (visibility toggles + color\r\n * pickers) and the future DXF export. Skipping classes whose projection\r\n * fails — one broken class shouldn't strand the rest of the drawing.\r\n */\r\nexport async function addItemsProjectionByClass(\r\n drawing: OBC.TechnicalDrawing,\r\n modelId: string,\r\n itemIdsByClass: Map<string, number[]>,\r\n onClassDone?: (className: string) => void,\r\n): Promise<DrawingLayerInfo[]> {\r\n const layers: DrawingLayerInfo[] = []\r\n for (const [className, ids] of itemIdsByClass) {\r\n if (ids.length === 0) continue\r\n const color = defaultLayerColor(className)\r\n if (!drawing.layers.has(className)) {\r\n drawing.layers.create(className, {\r\n material: new THREE.LineBasicMaterial({ color }),\r\n })\r\n }\r\n const modelIdMap: OBC.ModelIdMap = { [modelId]: new Set(ids) }\r\n try {\r\n await drawing.addProjectionFromItems(modelIdMap, {\r\n layers: { visible: className, hidden: HIDDEN_LAYER },\r\n })\r\n } catch (error) {\r\n console.warn(\r\n `[drawingProjection] projection for ${className} failed:`,\r\n error,\r\n )\r\n continue\r\n }\r\n layers.push({\r\n className,\r\n layerName: className,\r\n visible: true,\r\n color,\r\n itemCount: ids.length,\r\n })\r\n onClassDone?.(className)\r\n }\r\n return layers\r\n}\r\n\r\n/**\r\n * Group a model's geometric item ids by IFC class. Optional `idFilter`\r\n * narrows the result to a specific subset (e.g. items in a single storey).\r\n */\r\nexport async function getItemIdsByClass(\r\n model: any,\r\n idFilter?: Set<number>,\r\n): Promise<Map<string, number[]>> {\r\n const all = (await model.getItemsOfCategories([/^IFC/])) as Record<\r\n string,\r\n number[]\r\n >\r\n const result = new Map<string, number[]>()\r\n for (const [className, ids] of Object.entries(all)) {\r\n const filtered = idFilter ? ids.filter((id) => idFilter.has(id)) : ids\r\n if (filtered.length > 0) result.set(className, filtered)\r\n }\r\n // Walls, columns, slabs, curtain-walls render first so they appear early\r\n // during progressive projection; everything else follows.\r\n return sortClassesByPriority(result)\r\n}\r\n\r\n/**\r\n * Project items into per-IFC-class drawing layers using a SINGLE\r\n * EdgeProjector pass. The visibility culler then sees the union of all\r\n * meshes and classifies each edge against the full scene — so a wall in\r\n * front of a chair correctly hides the chair's edges, even though they\r\n * end up on different layers.\r\n *\r\n * Use this for elevation drawings, where the entire building depth is\r\n * visible. {@link addItemsProjectionByClass} stays appropriate for\r\n * floorplans, where the section clip already limits depth and the per-\r\n * class path is faster.\r\n *\r\n * Hidden edges are intentionally discarded — the elevation should only\r\n * show the lines of objects immediately visible to the camera.\r\n */\r\nexport async function addItemsProjectionByClassOccluded(\r\n drawing: OBC.TechnicalDrawing,\r\n components: OBC.Components,\r\n modelId: string,\r\n itemIdsByClass: Map<string, number[]>,\r\n): Promise<DrawingLayerInfo[]> {\r\n const world = components.get(CurrentWorld).world\r\n if (!world) return []\r\n\r\n // Build flat id set + reverse map (localId → className) so we can bin the\r\n // resulting line segments by their source class.\r\n const allIds = new Set<number>()\r\n const idToClass = new Map<number, string>()\r\n for (const [className, ids] of itemIdsByClass) {\r\n for (const id of ids) {\r\n allIds.add(id)\r\n idToClass.set(id, className)\r\n }\r\n }\r\n if (allIds.size === 0) return []\r\n\r\n const projector = components.get(OBC.EdgeProjector)\r\n ;(projector as any).generator.useWebGPU = false\r\n\r\n // Mirror the projection-direction + near/far plane setup that\r\n // `TechnicalDrawing.addProjectionFromItems` uses internally — see\r\n // node_modules/@thatopen/components/dist/index.mjs::addProjectionFromItems.\r\n const savedDir = projector.projectionDirection.clone()\r\n const savedNear = projector.nearPlane\r\n const savedFar = projector.farPlane\r\n let result: OBC.EdgeProjectionResult\r\n try {\r\n drawing.three.updateWorldMatrix(true, false)\r\n const projDir = new THREE.Vector3(0, -1, 0)\r\n .transformDirection(drawing.three.matrixWorld)\r\n .normalize()\r\n projector.projectionDirection.copy(projDir)\r\n const rotMat = new THREE.Matrix4().makeRotationFromQuaternion(\r\n new THREE.Quaternion().setFromUnitVectors(\r\n projDir,\r\n new THREE.Vector3(0, -1, 0),\r\n ),\r\n )\r\n const planeY = new THREE.Vector3()\r\n .setFromMatrixPosition(drawing.three.matrixWorld)\r\n .applyMatrix4(rotMat).y\r\n projector.farPlane = planeY\r\n projector.nearPlane = planeY - drawing.far\r\n\r\n const modelIdMap: OBC.ModelIdMap = { [modelId]: allIds }\r\n result = await projector.get(modelIdMap, world)\r\n } finally {\r\n projector.projectionDirection.copy(savedDir)\r\n projector.nearPlane = savedNear\r\n projector.farPlane = savedFar\r\n }\r\n\r\n // Pre-create empty layers so the panel UI lists every class even if its\r\n // edges all ended up occluded (count = 0 for hidden classes).\r\n for (const className of itemIdsByClass.keys()) {\r\n if (!drawing.layers.has(className)) {\r\n drawing.layers.create(className, {\r\n material: new THREE.LineBasicMaterial({\r\n color: defaultLayerColor(className),\r\n }),\r\n })\r\n }\r\n }\r\n\r\n return splitVisibleByClass(drawing, result, idToClass, itemIdsByClass)\r\n}\r\n\r\n/** Walk the per-vertex `group` attribute of `result.visible`, look up the\r\n * IFC class of the source item, and emit one `LineSegments` per class\r\n * (transformed into drawing-local space and assigned to its layer). */\r\nfunction splitVisibleByClass(\r\n drawing: OBC.TechnicalDrawing,\r\n result: OBC.EdgeProjectionResult,\r\n idToClass: Map<number, string>,\r\n itemIdsByClass: Map<string, number[]>,\r\n): DrawingLayerInfo[] {\r\n const visibleGeom = result.visible\r\n const positionsAttr = visibleGeom.getAttribute('position') as\r\n | THREE.BufferAttribute\r\n | undefined\r\n const groupAttr = visibleGeom.getAttribute('group') as\r\n | THREE.BufferAttribute\r\n | undefined\r\n if (!positionsAttr) return []\r\n\r\n const buf = new Map<string, number[]>()\r\n const items = new Map<string, Set<number>>()\r\n for (const className of itemIdsByClass.keys()) {\r\n buf.set(className, [])\r\n items.set(className, new Set())\r\n }\r\n\r\n if (!groupAttr) return [] // No group info — can't bin.\r\n\r\n const positionArr = positionsAttr.array as Float32Array\r\n const groupArr = groupAttr.array as ArrayLike<number>\r\n const vertexCount = positionsAttr.count\r\n\r\n // Each line segment = 2 consecutive vertices that share a group index\r\n // (see ProjectedEdgeCollector::toLineGeometry in OBC's bundle).\r\n for (let i = 0; i < vertexCount; i += 2) {\r\n const groupIndex = Number(groupArr[i])\r\n const groupInfo = result.groups[groupIndex]\r\n if (!groupInfo) continue\r\n const className = idToClass.get(groupInfo.localId)\r\n if (!className) continue\r\n const verts = buf.get(className)\r\n if (!verts) continue\r\n const start = i * 3\r\n verts.push(\r\n positionArr[start],\r\n positionArr[start + 1],\r\n positionArr[start + 2],\r\n positionArr[start + 3],\r\n positionArr[start + 4],\r\n positionArr[start + 5],\r\n )\r\n items.get(className)!.add(groupInfo.localId)\r\n }\r\n\r\n const layers: DrawingLayerInfo[] = []\r\n for (const [className, verts] of buf) {\r\n if (verts.length === 0) continue\r\n const geom = new THREE.BufferGeometry()\r\n geom.setAttribute(\r\n 'position',\r\n new THREE.Float32BufferAttribute(new Float32Array(verts), 3),\r\n )\r\n // Wrap in LineSegments at world origin so toDrawingSpace transforms the\r\n // (already world-space) positions into the drawing's local XZ plane.\r\n const sourceLine = new THREE.LineSegments(geom)\r\n const projected = OBC.TechnicalDrawing.toDrawingSpace(sourceLine, drawing)\r\n drawing.addProjectionLines(projected, className)\r\n layers.push({\r\n className,\r\n layerName: className,\r\n visible: true,\r\n color: defaultLayerColor(className),\r\n itemCount: items.get(className)!.size,\r\n })\r\n }\r\n return layers\r\n}\r\n\r\nexport function disposeDrawing(\r\n components: OBC.Components,\r\n drawing: OBC.TechnicalDrawing | null,\r\n) {\r\n if (!drawing) return\r\n try {\r\n const techDrawings = components.get(OBC.TechnicalDrawings)\r\n techDrawings.list.delete(drawing.uuid)\r\n } catch {\r\n // best-effort\r\n }\r\n}\r\n\r\nexport const DOOR_SWING_LAYER = 'Door Swings'\r\nconst DOOR_SWING_COLOR = 0x666666\r\nconst DOOR_SWING_SEGMENTS = 16\r\nconst DOOR_STOREY_Y_TOLERANCE = 0.6\r\n\r\n/**\r\n * Add a quarter-circle swing arc for every IFCDOOR in `idFilter` whose\r\n * bbox sits at the active storey's elevation. Returns a `DrawingLayerInfo`\r\n * for the new `Door Swings` layer (or null if no doors qualified), so the\r\n * caller can append it to the sidebar's toggleable layer list.\r\n *\r\n * The arc radius matches the door's widest horizontal dimension;\r\n * orientation is inferred from the bbox — the larger horizontal extent\r\n * is the door width direction, the smaller is wall thickness.\r\n *\r\n * Best-effort: missing bbox or implausibly-sized doors are skipped silently.\r\n */\r\nexport async function addDoorSwingsToDrawing(\r\n drawing: OBC.TechnicalDrawing,\r\n model: any,\r\n idFilter: Set<number> | null,\r\n storeyY: number,\r\n): Promise<DrawingLayerInfo | null> {\r\n const doorMap = (await model.getItemsOfCategories([/IFCDOOR/])) as Record<\r\n string,\r\n number[]\r\n >\r\n let doorIds = Object.values(doorMap).flat() as number[]\r\n if (idFilter) doorIds = doorIds.filter((id) => idFilter.has(id))\r\n if (doorIds.length === 0) return null\r\n\r\n // Fetch boxes (world-space AABB, used for size + Y filter) and geometry\r\n // (per-item transform, used to recover REAL orientation — bboxes can't,\r\n // which is why doors in curved walls or at non-axis-aligned angles get\r\n // mis-oriented swings).\r\n const boxes: THREE.Box3[] = await model.getBoxes(doorIds)\r\n if (!boxes || boxes.length === 0) return null\r\n const geomDataPerDoor = await model.getItemsGeometry(doorIds)\r\n\r\n if (!drawing.layers.has(DOOR_SWING_LAYER)) {\r\n drawing.layers.create(DOOR_SWING_LAYER, {\r\n material: new THREE.LineBasicMaterial({ color: DOOR_SWING_COLOR }),\r\n })\r\n }\r\n\r\n const modelMatrix = model.object?.matrixWorld as THREE.Matrix4 | undefined\r\n const verts: number[] = []\r\n let drawnCount = 0\r\n for (let i = 0; i < boxes.length; i++) {\r\n const box = boxes[i]\r\n if (!box || box.isEmpty()) continue\r\n // `model.getBoxes` already applies `model.object.matrixWorld` internally\r\n // (BoxManager.getAllBoxes in @thatopen/fragments). Don't double-transform.\r\n const worldBox = box\r\n // Storey-Y filter: a door's bottom should sit at the active storey's\r\n // elevation. Filters out doors that leak through from upper storeys.\r\n if (Math.abs(worldBox.min.y - storeyY) > DOOR_STOREY_Y_TOLERANCE) continue\r\n const size = new THREE.Vector3()\r\n worldBox.getSize(size)\r\n // Tighter sanity range — a typical leaf door is 0.7-1.2 m; >2.5 m is\r\n // almost certainly a stacked / double-swing / wall-segment bbox.\r\n const bboxWidth = Math.max(size.x, size.z)\r\n if (bboxWidth < 0.6 || bboxWidth > 2.5) continue\r\n const center = new THREE.Vector3()\r\n worldBox.getCenter(center)\r\n\r\n // Recover the door's actual orientation from its geometry transform.\r\n // `geomData.transform` is the local-to-model matrix; combine with\r\n // `model.object.matrixWorld` (which `getBoxes` already applied to the\r\n // bbox) to get the world-space transform. The first column of that\r\n // matrix is the door's local +X axis in world space — for IFC doors\r\n // that's the width direction along the wall.\r\n const itemMeshes = geomDataPerDoor?.[i]\r\n const localTransform: THREE.Matrix4 | undefined = itemMeshes?.[0]?.transform\r\n let widthDir: THREE.Vector3\r\n let swingDir: THREE.Vector3\r\n if (localTransform) {\r\n const worldTransform = new THREE.Matrix4()\r\n if (modelMatrix) worldTransform.copy(modelMatrix)\r\n worldTransform.multiply(localTransform)\r\n // Local +X in world space, projected to the horizontal plane.\r\n widthDir = new THREE.Vector3()\r\n .setFromMatrixColumn(worldTransform, 0)\r\n .setY(0)\r\n if (widthDir.lengthSq() < 1e-6) {\r\n // Degenerate — door's local X points straight up. Fall back to bbox.\r\n widthDir = size.x >= size.z\r\n ? new THREE.Vector3(1, 0, 0)\r\n : new THREE.Vector3(0, 0, 1)\r\n } else {\r\n widthDir.normalize()\r\n }\r\n // Swing direction = 90° rotation of width in the horizontal plane.\r\n swingDir = new THREE.Vector3(-widthDir.z, 0, widthDir.x)\r\n } else {\r\n // No transform available — fall back to the original bbox heuristic\r\n // (correct for axis-aligned doors, wrong for angled ones).\r\n const widthAlongX = size.x >= size.z\r\n widthDir = widthAlongX\r\n ? new THREE.Vector3(1, 0, 0)\r\n : new THREE.Vector3(0, 0, 1)\r\n swingDir = widthAlongX\r\n ? new THREE.Vector3(0, 0, 1)\r\n : new THREE.Vector3(1, 0, 0)\r\n }\r\n\r\n // Door width = bbox extent projected onto widthDir. Use abs since the\r\n // signed projection of (size.x, size.z) along widthDir can be negative.\r\n const width = Math.abs(size.x * widthDir.x) + Math.abs(size.z * widthDir.z)\r\n if (width < 0.6 || width > 2.5) continue\r\n\r\n // Hinge sits at one end of the door. Step backward along widthDir by\r\n // half the width from the center.\r\n const hinge = new THREE.Vector3()\r\n .copy(center)\r\n .addScaledVector(widthDir, -width / 2)\r\n\r\n // Build quarter-arc from angle 0 (closed-door end) → π/2 (perpendicular).\r\n // `prev` MUST reset per door so segments don't leak between doors.\r\n let prev: THREE.Vector3 | null = null\r\n for (let s = 0; s <= DOOR_SWING_SEGMENTS; s++) {\r\n const t = (s / DOOR_SWING_SEGMENTS) * (Math.PI / 2)\r\n const point = new THREE.Vector3()\r\n .copy(hinge)\r\n .addScaledVector(widthDir, Math.cos(t) * width)\r\n .addScaledVector(swingDir, Math.sin(t) * width)\r\n if (prev) {\r\n verts.push(prev.x, prev.y, prev.z, point.x, point.y, point.z)\r\n }\r\n prev = point\r\n }\r\n // Straight edge from hinge to swing endpoint (the open-door line).\r\n const open = new THREE.Vector3()\r\n .copy(hinge)\r\n .addScaledVector(swingDir, width)\r\n verts.push(hinge.x, hinge.y, hinge.z, open.x, open.y, open.z)\r\n drawnCount++\r\n }\r\n\r\n if (verts.length === 0) return null\r\n\r\n const geometry = new THREE.BufferGeometry()\r\n geometry.setAttribute(\r\n 'position',\r\n new THREE.Float32BufferAttribute(new Float32Array(verts), 3),\r\n )\r\n const sourceLine = new THREE.LineSegments(geometry)\r\n const projected = OBC.TechnicalDrawing.toDrawingSpace(sourceLine, drawing)\r\n drawing.addProjectionLines(projected, DOOR_SWING_LAYER)\r\n return {\r\n className: DOOR_SWING_LAYER,\r\n layerName: DOOR_SWING_LAYER,\r\n visible: true,\r\n color: DOOR_SWING_COLOR,\r\n itemCount: drawnCount,\r\n displayKey: 'DrawingLayers.doorSwings',\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/drawingProjection.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 {\r\n defaultLayerColor,\r\n DrawingLayerInfo,\r\n sortClassesByPriority,\r\n} from './drawingLayers'\r\n\r\nexport const FONT_URL =\r\n 'https://thatopen.github.io/engine_components/resources/fonts/PlusJakartaSans-Medium.ttf'\r\n\r\nexport const VISIBLE_LAYER = 'Visible'\r\nexport const HIDDEN_LAYER = 'Hidden'\r\nexport const ANNOTATIONS_LAYER = 'Annotations'\r\n\r\nexport interface DrawingViewportConfig {\r\n left: number\r\n right: number\r\n top: number\r\n bottom: number\r\n scale?: number\r\n name?: string\r\n}\r\n\r\nexport interface DrawingConfig {\r\n /** Direction the drawing's \"camera\" looks. Top-down floorplan: (0,-1,0).\r\n * North elevation: (0,0,-1). Etc. */\r\n orientation: THREE.Vector3\r\n /** World position of the drawing plane. */\r\n position: THREE.Vector3\r\n /** Depth captured from the plane along the orientation. */\r\n far: number\r\n viewport: DrawingViewportConfig\r\n}\r\n\r\n/**\r\n * Lazy, idempotent setup of `OBF.DrawingEditor` (font + source world).\r\n * Call before any drawing-projection work.\r\n */\r\nexport class DrawingEditorReady {\r\n private _fontLoaded = false\r\n private _editorSourceSet = false\r\n\r\n constructor(private components: OBC.Components) {}\r\n\r\n async ensure() {\r\n const editor = this.components.get(OBF.DrawingEditor)\r\n\r\n if (!this._fontLoaded) {\r\n try {\r\n await editor.fonts.load(FONT_URL)\r\n } catch (error) {\r\n console.warn('[drawingProjection] Font load failed:', error)\r\n }\r\n this._fontLoaded = true\r\n }\r\n\r\n if (!this._editorSourceSet) {\r\n const sourceWorld = this.components.get(CurrentWorld).world\r\n if (sourceWorld) {\r\n editor.setSource(sourceWorld)\r\n this._editorSourceSet = true\r\n }\r\n }\r\n }\r\n}\r\n\r\n/** Create a new TechnicalDrawing pre-configured with the standard\r\n * visible/hidden/annotations layers + viewport. Caller still needs to\r\n * add projection items (`addProjectionFromItems`). */\r\nexport function createDrawing(\r\n components: OBC.Components,\r\n config: DrawingConfig,\r\n): OBC.TechnicalDrawing | null {\r\n const sourceWorld = components.get(CurrentWorld).world\r\n if (!sourceWorld) return null\r\n\r\n const techDrawings = components.get(OBC.TechnicalDrawings)\r\n const drawing = techDrawings.create(sourceWorld)\r\n drawing.orientTo(config.orientation.clone())\r\n drawing.three.position.copy(config.position)\r\n drawing.three.visible = false\r\n drawing.far = config.far\r\n\r\n drawing.layers.create(VISIBLE_LAYER, {\r\n material: new THREE.LineBasicMaterial({ color: 0x000000 }),\r\n })\r\n drawing.layers.create(HIDDEN_LAYER, {\r\n material: new THREE.LineDashedMaterial({\r\n color: 0x888888,\r\n dashSize: 0.2,\r\n gapSize: 0.1,\r\n }),\r\n visible: false,\r\n } as any)\r\n drawing.layers.create(ANNOTATIONS_LAYER, {\r\n material: new THREE.LineBasicMaterial({ color: 0x000000 }),\r\n })\r\n drawing.activeLayer = ANNOTATIONS_LAYER\r\n\r\n drawing.viewports.create({\r\n left: config.viewport.left,\r\n right: config.viewport.right,\r\n top: config.viewport.top,\r\n bottom: config.viewport.bottom,\r\n scale: config.viewport.scale ?? 100,\r\n name: config.viewport.name ?? 'Drawing',\r\n })\r\n\r\n return drawing\r\n}\r\n\r\n/** Force ProjectionGenerator off the WebGPU path (it silently returns 0\r\n * edges when WebGPU is unavailable in the browser, which @thatopen\r\n * components 3.4 hits). Idempotent. */\r\nexport function disableProjectorWebGPU(components: OBC.Components) {\r\n const projector = components.get(OBC.EdgeProjector)\r\n ;(projector as any).generator.useWebGPU = false\r\n}\r\n\r\n/** Patch a model's `getItemsGeometry` to give every entry a unique\r\n * representationId. EdgeProjector at index.mjs:11228 uses\r\n * `!geomData.representationId` to validate, so id=0 is incorrectly\r\n * skipped — and the fragments worker for our models returns 0 for every\r\n * entry. Idempotent per model via a flag on the model itself. */\r\nexport function patchModelGeometryRepresentationIds(model: any) {\r\n if (model._floorplanGeometryPatched) return\r\n const original = model.getItemsGeometry.bind(model)\r\n let counter = 1\r\n model.getItemsGeometry = async (ids: number[]) => {\r\n const data = await original(ids)\r\n if (data && typeof data === 'object') {\r\n const arrays = Array.isArray(data) ? data : Object.values(data)\r\n for (const arr of arrays) {\r\n if (!Array.isArray(arr)) continue\r\n for (const g of arr) {\r\n if (\r\n g &&\r\n (g.representationId === 0 ||\r\n g.representationId == null ||\r\n g.representationId === '')\r\n ) {\r\n g.representationId = `cdt-rep-${counter++}`\r\n }\r\n }\r\n }\r\n }\r\n return data\r\n }\r\n model._floorplanGeometryPatched = true\r\n}\r\n\r\n/** Add the projection lines for the given item ids to a drawing. Lays\r\n * them into the standard visible/hidden layers. */\r\nexport async function addItemsProjection(\r\n drawing: OBC.TechnicalDrawing,\r\n modelId: string,\r\n itemIds: number[],\r\n): Promise<void> {\r\n if (itemIds.length === 0) return\r\n const modelIdMap: OBC.ModelIdMap = { [modelId]: new Set(itemIds) }\r\n await drawing.addProjectionFromItems(modelIdMap, {\r\n layers: { visible: VISIBLE_LAYER, hidden: HIDDEN_LAYER },\r\n })\r\n}\r\n\r\n/**\r\n * Project items grouped by IFC class into per-class drawing layers. Each\r\n * class gets its own visible layer with a default color (cut classes black,\r\n * everything else mid-gray); the hidden side of every class shares the\r\n * standard `HIDDEN_LAYER`.\r\n *\r\n * Returns metadata used by the sidebar UI (visibility toggles + color\r\n * pickers) and the future DXF export. Skipping classes whose projection\r\n * fails — one broken class shouldn't strand the rest of the drawing.\r\n */\r\nexport async function addItemsProjectionByClass(\r\n drawing: OBC.TechnicalDrawing,\r\n modelId: string,\r\n itemIdsByClass: Map<string, number[]>,\r\n onClassDone?: (className: string) => void,\r\n): Promise<DrawingLayerInfo[]> {\r\n const layers: DrawingLayerInfo[] = []\r\n for (const [className, ids] of itemIdsByClass) {\r\n if (ids.length === 0) continue\r\n const color = defaultLayerColor(className)\r\n if (!drawing.layers.has(className)) {\r\n drawing.layers.create(className, {\r\n material: new THREE.LineBasicMaterial({ color }),\r\n })\r\n }\r\n const modelIdMap: OBC.ModelIdMap = { [modelId]: new Set(ids) }\r\n try {\r\n await drawing.addProjectionFromItems(modelIdMap, {\r\n layers: { visible: className, hidden: HIDDEN_LAYER },\r\n })\r\n } catch (error) {\r\n console.warn(\r\n `[drawingProjection] projection for ${className} failed:`,\r\n error,\r\n )\r\n continue\r\n }\r\n layers.push({\r\n className,\r\n layerName: className,\r\n visible: true,\r\n color,\r\n itemCount: ids.length,\r\n })\r\n onClassDone?.(className)\r\n }\r\n return layers\r\n}\r\n\r\n/**\r\n * Group a model's geometric item ids by IFC class. Optional `idFilter`\r\n * narrows the result to a specific subset (e.g. items in a single storey).\r\n */\r\nexport async function getItemIdsByClass(\r\n model: any,\r\n idFilter?: Set<number>,\r\n): Promise<Map<string, number[]>> {\r\n const all = (await model.getItemsOfCategories([/^IFC/])) as Record<\r\n string,\r\n number[]\r\n >\r\n const result = new Map<string, number[]>()\r\n for (const [className, ids] of Object.entries(all)) {\r\n const filtered = idFilter ? ids.filter((id) => idFilter.has(id)) : ids\r\n if (filtered.length > 0) result.set(className, filtered)\r\n }\r\n // Walls, columns, slabs, curtain-walls render first so they appear early\r\n // during progressive projection; everything else follows.\r\n return sortClassesByPriority(result)\r\n}\r\n\r\n/**\r\n * Project items into per-IFC-class drawing layers using a SINGLE\r\n * EdgeProjector pass. The visibility culler then sees the union of all\r\n * meshes and classifies each edge against the full scene — so a wall in\r\n * front of a chair correctly hides the chair's edges, even though they\r\n * end up on different layers.\r\n *\r\n * Use this for elevation drawings, where the entire building depth is\r\n * visible. {@link addItemsProjectionByClass} stays appropriate for\r\n * floorplans, where the section clip already limits depth and the per-\r\n * class path is faster.\r\n *\r\n * Hidden edges are intentionally discarded — the elevation should only\r\n * show the lines of objects immediately visible to the camera.\r\n */\r\nexport async function addItemsProjectionByClassOccluded(\r\n drawing: OBC.TechnicalDrawing,\r\n components: OBC.Components,\r\n modelId: string,\r\n itemIdsByClass: Map<string, number[]>,\r\n): Promise<DrawingLayerInfo[]> {\r\n const world = components.get(CurrentWorld).world\r\n if (!world) return []\r\n\r\n // Build flat id set + reverse map (localId → className) so we can bin the\r\n // resulting line segments by their source class.\r\n const allIds = new Set<number>()\r\n const idToClass = new Map<number, string>()\r\n for (const [className, ids] of itemIdsByClass) {\r\n for (const id of ids) {\r\n allIds.add(id)\r\n idToClass.set(id, className)\r\n }\r\n }\r\n if (allIds.size === 0) return []\r\n\r\n const projector = components.get(OBC.EdgeProjector)\r\n ;(projector as any).generator.useWebGPU = false\r\n\r\n // Mirror the projection-direction + near/far plane setup that\r\n // `TechnicalDrawing.addProjectionFromItems` uses internally — see\r\n // node_modules/@thatopen/components/dist/index.mjs::addProjectionFromItems.\r\n const savedDir = projector.projectionDirection.clone()\r\n const savedNear = projector.nearPlane\r\n const savedFar = projector.farPlane\r\n let result: OBC.EdgeProjectionResult\r\n try {\r\n drawing.three.updateWorldMatrix(true, false)\r\n const projDir = new THREE.Vector3(0, -1, 0)\r\n .transformDirection(drawing.three.matrixWorld)\r\n .normalize()\r\n projector.projectionDirection.copy(projDir)\r\n const rotMat = new THREE.Matrix4().makeRotationFromQuaternion(\r\n new THREE.Quaternion().setFromUnitVectors(\r\n projDir,\r\n new THREE.Vector3(0, -1, 0),\r\n ),\r\n )\r\n const planeY = new THREE.Vector3()\r\n .setFromMatrixPosition(drawing.three.matrixWorld)\r\n .applyMatrix4(rotMat).y\r\n projector.farPlane = planeY\r\n projector.nearPlane = planeY - drawing.far\r\n\r\n const modelIdMap: OBC.ModelIdMap = { [modelId]: allIds }\r\n result = await projector.get(modelIdMap, world)\r\n } finally {\r\n projector.projectionDirection.copy(savedDir)\r\n projector.nearPlane = savedNear\r\n projector.farPlane = savedFar\r\n }\r\n\r\n // Pre-create empty layers so the panel UI lists every class even if its\r\n // edges all ended up occluded (count = 0 for hidden classes).\r\n for (const className of itemIdsByClass.keys()) {\r\n if (!drawing.layers.has(className)) {\r\n drawing.layers.create(className, {\r\n material: new THREE.LineBasicMaterial({\r\n color: defaultLayerColor(className),\r\n }),\r\n })\r\n }\r\n }\r\n\r\n return splitVisibleByClass(drawing, result, idToClass, itemIdsByClass)\r\n}\r\n\r\n/** Walk the per-vertex `group` attribute of `result.visible`, look up the\r\n * IFC class of the source item, and emit one `LineSegments` per class\r\n * (transformed into drawing-local space and assigned to its layer). */\r\nfunction splitVisibleByClass(\r\n drawing: OBC.TechnicalDrawing,\r\n result: OBC.EdgeProjectionResult,\r\n idToClass: Map<number, string>,\r\n itemIdsByClass: Map<string, number[]>,\r\n): DrawingLayerInfo[] {\r\n const visibleGeom = result.visible\r\n const positionsAttr = visibleGeom.getAttribute('position') as\r\n | THREE.BufferAttribute\r\n | undefined\r\n const groupAttr = visibleGeom.getAttribute('group') as\r\n | THREE.BufferAttribute\r\n | undefined\r\n if (!positionsAttr) return []\r\n\r\n const buf = new Map<string, number[]>()\r\n const items = new Map<string, Set<number>>()\r\n for (const className of itemIdsByClass.keys()) {\r\n buf.set(className, [])\r\n items.set(className, new Set())\r\n }\r\n\r\n if (!groupAttr) return [] // No group info — can't bin.\r\n\r\n const positionArr = positionsAttr.array as Float32Array\r\n const groupArr = groupAttr.array as ArrayLike<number>\r\n const vertexCount = positionsAttr.count\r\n\r\n // Each line segment = 2 consecutive vertices that share a group index\r\n // (see ProjectedEdgeCollector::toLineGeometry in OBC's bundle).\r\n for (let i = 0; i < vertexCount; i += 2) {\r\n const groupIndex = Number(groupArr[i])\r\n const groupInfo = result.groups[groupIndex]\r\n if (!groupInfo) continue\r\n const className = idToClass.get(groupInfo.localId)\r\n if (!className) continue\r\n const verts = buf.get(className)\r\n if (!verts) continue\r\n const start = i * 3\r\n verts.push(\r\n positionArr[start],\r\n positionArr[start + 1],\r\n positionArr[start + 2],\r\n positionArr[start + 3],\r\n positionArr[start + 4],\r\n positionArr[start + 5],\r\n )\r\n items.get(className)!.add(groupInfo.localId)\r\n }\r\n\r\n const layers: DrawingLayerInfo[] = []\r\n for (const [className, verts] of buf) {\r\n if (verts.length === 0) continue\r\n const geom = new THREE.BufferGeometry()\r\n geom.setAttribute(\r\n 'position',\r\n new THREE.Float32BufferAttribute(new Float32Array(verts), 3),\r\n )\r\n // Wrap in LineSegments at world origin so toDrawingSpace transforms the\r\n // (already world-space) positions into the drawing's local XZ plane.\r\n const sourceLine = new THREE.LineSegments(geom)\r\n const projected = OBC.TechnicalDrawing.toDrawingSpace(sourceLine, drawing)\r\n drawing.addProjectionLines(projected, className)\r\n layers.push({\r\n className,\r\n layerName: className,\r\n visible: true,\r\n color: defaultLayerColor(className),\r\n itemCount: items.get(className)!.size,\r\n })\r\n }\r\n return layers\r\n}\r\n\r\nexport function disposeDrawing(\r\n components: OBC.Components,\r\n drawing: OBC.TechnicalDrawing | null,\r\n) {\r\n if (!drawing) return\r\n try {\r\n const techDrawings = components.get(OBC.TechnicalDrawings)\r\n techDrawings.list.delete(drawing.uuid)\r\n } catch {\r\n // best-effort\r\n }\r\n}\r\n\r\nexport const DOOR_SWING_LAYER = 'Door Swings'\r\nconst DOOR_SWING_COLOR = 0x666666\r\nconst DOOR_SWING_SEGMENTS = 16\r\nconst DOOR_STOREY_Y_TOLERANCE = 0.6\r\n\r\n/**\r\n * Add a quarter-circle swing arc for every IFCDOOR in `idFilter` whose\r\n * bbox sits at the active storey's elevation. Returns a `DrawingLayerInfo`\r\n * for the new `Door Swings` layer (or null if no doors qualified), so the\r\n * caller can append it to the sidebar's toggleable layer list.\r\n *\r\n * The arc radius matches the door's widest horizontal dimension;\r\n * orientation is inferred from the bbox — the larger horizontal extent\r\n * is the door width direction, the smaller is wall thickness.\r\n *\r\n * Best-effort: missing bbox or implausibly-sized doors are skipped silently.\r\n */\r\nexport async function addDoorSwingsToDrawing(\r\n drawing: OBC.TechnicalDrawing,\r\n model: any,\r\n idFilter: Set<number> | null,\r\n storeyY: number,\r\n): Promise<DrawingLayerInfo | null> {\r\n const doorMap = (await model.getItemsOfCategories([/IFCDOOR/])) as Record<\r\n string,\r\n number[]\r\n >\r\n let doorIds = Object.values(doorMap).flat() as number[]\r\n if (idFilter) doorIds = doorIds.filter((id) => idFilter.has(id))\r\n if (doorIds.length === 0) return null\r\n\r\n // Fetch boxes (world-space AABB, used for size + Y filter) and geometry\r\n // (per-item transform, used to recover REAL orientation — bboxes can't,\r\n // which is why doors in curved walls or at non-axis-aligned angles get\r\n // mis-oriented swings).\r\n const boxes: THREE.Box3[] = await model.getBoxes(doorIds)\r\n if (!boxes || boxes.length === 0) return null\r\n const geomDataPerDoor = await model.getItemsGeometry(doorIds)\r\n\r\n if (!drawing.layers.has(DOOR_SWING_LAYER)) {\r\n drawing.layers.create(DOOR_SWING_LAYER, {\r\n material: new THREE.LineBasicMaterial({ color: DOOR_SWING_COLOR }),\r\n })\r\n }\r\n\r\n const modelMatrix = model.object?.matrixWorld as THREE.Matrix4 | undefined\r\n const verts: number[] = []\r\n let drawnCount = 0\r\n for (let i = 0; i < boxes.length; i++) {\r\n const box = boxes[i]\r\n if (!box || box.isEmpty()) continue\r\n // `model.getBoxes` already applies `model.object.matrixWorld` internally\r\n // (BoxManager.getAllBoxes in @thatopen/fragments). Don't double-transform.\r\n const worldBox = box\r\n // Storey-Y filter: a door's bottom should sit at the active storey's\r\n // elevation. Filters out doors that leak through from upper storeys.\r\n if (Math.abs(worldBox.min.y - storeyY) > DOOR_STOREY_Y_TOLERANCE) continue\r\n const size = new THREE.Vector3()\r\n worldBox.getSize(size)\r\n // Tighter sanity range — a typical leaf door is 0.7-1.2 m; >2.5 m is\r\n // almost certainly a stacked / double-swing / wall-segment bbox.\r\n const bboxWidth = Math.max(size.x, size.z)\r\n if (bboxWidth < 0.6 || bboxWidth > 2.5) continue\r\n const center = new THREE.Vector3()\r\n worldBox.getCenter(center)\r\n\r\n // Recover the door's actual orientation from its geometry transform.\r\n // `geomData.transform` is the local-to-model matrix; combine with\r\n // `model.object.matrixWorld` (which `getBoxes` already applied to the\r\n // bbox) to get the world-space transform. The first column of that\r\n // matrix is the door's local +X axis in world space — for IFC doors\r\n // that's the width direction along the wall.\r\n const itemMeshes = geomDataPerDoor?.[i]\r\n const localTransform: THREE.Matrix4 | undefined = itemMeshes?.[0]?.transform\r\n let widthDir: THREE.Vector3\r\n let swingDir: THREE.Vector3\r\n if (localTransform) {\r\n const worldTransform = new THREE.Matrix4()\r\n if (modelMatrix) worldTransform.copy(modelMatrix)\r\n worldTransform.multiply(localTransform)\r\n // Local +X in world space, projected to the horizontal plane.\r\n widthDir = new THREE.Vector3()\r\n .setFromMatrixColumn(worldTransform, 0)\r\n .setY(0)\r\n if (widthDir.lengthSq() < 1e-6) {\r\n // Degenerate — door's local X points straight up. Fall back to bbox.\r\n widthDir = size.x >= size.z\r\n ? new THREE.Vector3(1, 0, 0)\r\n : new THREE.Vector3(0, 0, 1)\r\n } else {\r\n widthDir.normalize()\r\n }\r\n // Swing direction = 90° rotation of width in the horizontal plane.\r\n swingDir = new THREE.Vector3(-widthDir.z, 0, widthDir.x)\r\n } else {\r\n // No transform available — fall back to the original bbox heuristic\r\n // (correct for axis-aligned doors, wrong for angled ones).\r\n const widthAlongX = size.x >= size.z\r\n widthDir = widthAlongX\r\n ? new THREE.Vector3(1, 0, 0)\r\n : new THREE.Vector3(0, 0, 1)\r\n swingDir = widthAlongX\r\n ? new THREE.Vector3(0, 0, 1)\r\n : new THREE.Vector3(1, 0, 0)\r\n }\r\n\r\n // Door width = bbox extent projected onto widthDir. Use abs since the\r\n // signed projection of (size.x, size.z) along widthDir can be negative.\r\n const width = Math.abs(size.x * widthDir.x) + Math.abs(size.z * widthDir.z)\r\n if (width < 0.6 || width > 2.5) continue\r\n\r\n // Hinge sits at one end of the door. Step backward along widthDir by\r\n // half the width from the center.\r\n const hinge = new THREE.Vector3()\r\n .copy(center)\r\n .addScaledVector(widthDir, -width / 2)\r\n\r\n // Build quarter-arc from angle 0 (closed-door end) → π/2 (perpendicular).\r\n // `prev` MUST reset per door so segments don't leak between doors.\r\n let prev: THREE.Vector3 | null = null\r\n for (let s = 0; s <= DOOR_SWING_SEGMENTS; s++) {\r\n const t = (s / DOOR_SWING_SEGMENTS) * (Math.PI / 2)\r\n const point = new THREE.Vector3()\r\n .copy(hinge)\r\n .addScaledVector(widthDir, Math.cos(t) * width)\r\n .addScaledVector(swingDir, Math.sin(t) * width)\r\n if (prev) {\r\n verts.push(prev.x, prev.y, prev.z, point.x, point.y, point.z)\r\n }\r\n prev = point\r\n }\r\n // Straight edge from hinge to swing endpoint (the open-door line).\r\n const open = new THREE.Vector3()\r\n .copy(hinge)\r\n .addScaledVector(swingDir, width)\r\n verts.push(hinge.x, hinge.y, hinge.z, open.x, open.y, open.z)\r\n drawnCount++\r\n }\r\n\r\n if (verts.length === 0) return null\r\n\r\n const geometry = new THREE.BufferGeometry()\r\n geometry.setAttribute(\r\n 'position',\r\n new THREE.Float32BufferAttribute(new Float32Array(verts), 3),\r\n )\r\n const sourceLine = new THREE.LineSegments(geometry)\r\n const projected = OBC.TechnicalDrawing.toDrawingSpace(sourceLine, drawing)\r\n drawing.addProjectionLines(projected, DOOR_SWING_LAYER)\r\n return {\r\n className: DOOR_SWING_LAYER,\r\n layerName: DOOR_SWING_LAYER,\r\n visible: true,\r\n color: DOOR_SWING_COLOR,\r\n itemCount: drawnCount,\r\n displayKey: 'DrawingLayers.doorSwings',\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"exportDrawingToDxf.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/exportDrawingToDxf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAG3C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,GAAG,CAAC,UAAU,EAC1B,OAAO,EAAE,GAAG,CAAC,gBAAgB,EAC7B,QAAQ,EAAE,MAAM,EAChB,WAAW,SAAI,QAWhB"}
1
+ {"version":3,"file":"exportDrawingToDxf.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/exportDrawingToDxf.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,sBAAsB,CAAA;AAG3C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,GAAG,CAAC,UAAU,EAC1B,OAAO,EAAE,GAAG,CAAC,gBAAgB,EAC7B,QAAQ,EAAE,MAAM,EAChB,WAAW,SAAI,QAWhB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/exportDrawingToDxf.ts"],"sourcesContent":["import * as OBC from '@thatopen/components'\r\nimport * as THREE from 'three'\r\n\r\n/**\r\n * Serialize a {@link OBC.TechnicalDrawing} to DXF and trigger a browser\r\n * download. Each per-IFC-class drawing layer becomes a DXF layer, so the\r\n * downloaded file is editable layer-by-layer in CAD software.\r\n *\r\n * `rotationDeg` rotates the exported geometry around the drawing's local Y\r\n * axis (XZ plane) so the DXF lands in the same orientation the user sees\r\n * on screen — typically the building's true-north angle. The transform is\r\n * applied to a temporary clone of each `LineSegments`'s position buffer\r\n * and reverted before the function returns, so the live drawing is never\r\n * mutated.\r\n *\r\n * Uses {@link OBC.DxfManager}'s exporter — see the `OBC.DxfExporter` class\r\n * documentation for the full set of supported entities.\r\n */\r\nexport function exportDrawingToDxf(\r\n components: OBC.Components,\r\n drawing: OBC.TechnicalDrawing,\r\n fileName: string,\r\n rotationDeg = 0,\r\n) {\r\n const restore = applyRotationInPlace(drawing, rotationDeg)\r\n try {\r\n const manager = components.get(OBC.DxfManager)\r\n // Export the full drawing (no viewport clipping).\r\n const dxf = manager.exporter.export([{ drawing, viewports: [{}] }])\r\n triggerDownload(dxf, fileName)\r\n } finally {\r\n restore?.()\r\n }\r\n}\r\n\r\nfunction triggerDownload(dxf: string, fileName: string) {\r\n const blob = new Blob([dxf], { type: 'application/dxf' })\r\n const url = URL.createObjectURL(blob)\r\n const a = document.createElement('a')\r\n a.href = url\r\n a.download = fileName.toLowerCase().endsWith('.dxf')\r\n ? fileName\r\n : `${fileName}.dxf`\r\n document.body.appendChild(a)\r\n a.click()\r\n document.body.removeChild(a)\r\n URL.revokeObjectURL(url)\r\n}\r\n\r\n/**\r\n * Rotate every `LineSegments` position attribute on the drawing by\r\n * `degrees` around the drawing's local Y axis, returning a `restore()`\r\n * callback that puts the original buffers back. The rotation matches\r\n * `controls.rotateAzimuthTo` direction (positive degrees → CCW when\r\n * viewed from above), so the DXF reads as the on-screen orientation.\r\n *\r\n * Returns `null` for the no-rotation case so callers can skip the\r\n * try/finally bookkeeping.\r\n */\r\nfunction applyRotationInPlace(\r\n drawing: OBC.TechnicalDrawing,\r\n degrees: number,\r\n): null | (() => void) {\r\n if (!degrees) return null\r\n const rad = (degrees * Math.PI) / 180\r\n const cos = Math.cos(rad)\r\n const sin = Math.sin(rad)\r\n const restorers: Array<() => void> = []\r\n\r\n drawing.three.traverse((child) => {\r\n if (!(child instanceof THREE.LineSegments)) return\r\n const pos = child.geometry.attributes.position as\r\n | THREE.BufferAttribute\r\n | undefined\r\n if (!pos) return\r\n const arr = pos.array as Float32Array\r\n const original = new Float32Array(arr.length)\r\n original.set(arr)\r\n for (let i = 0; i < pos.count; i++) {\r\n const x = arr[i * 3]\r\n const z = arr[i * 3 + 2]\r\n arr[i * 3] = x * cos + z * sin\r\n arr[i * 3 + 2] = -x * sin + z * cos\r\n }\r\n pos.needsUpdate = true\r\n restorers.push(() => {\r\n arr.set(original)\r\n pos.needsUpdate = true\r\n })\r\n })\r\n\r\n return () => {\r\n for (const r of restorers) r()\r\n }\r\n}\r\n"],"mappings":"AAAA,YAAY,SAAS;AACrB,YAAY,WAAW;AAiBhB,SAAS,mBACd,YACA,SACA,UACA,cAAc,GACd;AACA,QAAM,UAAU,qBAAqB,SAAS,WAAW;AACzD,MAAI;AACF,UAAM,UAAU,WAAW,IAAI,IAAI,UAAU;AAE7C,UAAM,MAAM,QAAQ,SAAS,OAAO,CAAC,EAAE,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAClE,oBAAgB,KAAK,QAAQ;AAAA,EAC/B,UAAE;AACA;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,KAAa,UAAkB;AACtD,QAAM,OAAO,IAAI,KAAK,CAAC,GAAG,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACxD,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,QAAM,IAAI,SAAS,cAAc,GAAG;AACpC,IAAE,OAAO;AACT,IAAE,WAAW,SAAS,YAAY,EAAE,SAAS,MAAM,IAC/C,WACA,GAAG,QAAQ;AACf,WAAS,KAAK,YAAY,CAAC;AAC3B,IAAE,MAAM;AACR,WAAS,KAAK,YAAY,CAAC;AAC3B,MAAI,gBAAgB,GAAG;AACzB;AAYA,SAAS,qBACP,SACA,SACqB;AACrB,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,MAAO,UAAU,KAAK,KAAM;AAClC,QAAM,MAAM,KAAK,IAAI,GAAG;AACxB,QAAM,MAAM,KAAK,IAAI,GAAG;AACxB,QAAM,YAA+B,CAAC;AAEtC,UAAQ,MAAM,SAAS,CAAC,UAAU;AAChC,QAAI,EAAE,iBAAiB,MAAM,cAAe;AAC5C,UAAM,MAAM,MAAM,SAAS,WAAW;AAGtC,QAAI,CAAC,IAAK;AACV,UAAM,MAAM,IAAI;AAChB,UAAM,WAAW,IAAI,aAAa,IAAI,MAAM;AAC5C,aAAS,IAAI,GAAG;AAChB,aAAS,IAAI,GAAG,IAAI,IAAI,OAAO,KAAK;AAClC,YAAM,IAAI,IAAI,IAAI,CAAC;AACnB,YAAM,IAAI,IAAI,IAAI,IAAI,CAAC;AACvB,UAAI,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI;AAC3B,UAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,IAAI;AAAA,IAClC;AACA,QAAI,cAAc;AAClB,cAAU,KAAK,MAAM;AACnB,UAAI,IAAI,QAAQ;AAChB,UAAI,cAAc;AAAA,IACpB,CAAC;AAAA,EACH,CAAC;AAED,SAAO,MAAM;AACX,eAAW,KAAK,UAAW,GAAE;AAAA,EAC/B;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/exportDrawingToDxf.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\n\r\n/**\r\n * Serialize a {@link OBC.TechnicalDrawing} to DXF and trigger a browser\r\n * download. Each per-IFC-class drawing layer becomes a DXF layer, so the\r\n * downloaded file is editable layer-by-layer in CAD software.\r\n *\r\n * `rotationDeg` rotates the exported geometry around the drawing's local Y\r\n * axis (XZ plane) so the DXF lands in the same orientation the user sees\r\n * on screen — typically the building's true-north angle. The transform is\r\n * applied to a temporary clone of each `LineSegments`'s position buffer\r\n * and reverted before the function returns, so the live drawing is never\r\n * mutated.\r\n *\r\n * Uses {@link OBC.DxfManager}'s exporter — see the `OBC.DxfExporter` class\r\n * documentation for the full set of supported entities.\r\n */\r\nexport function exportDrawingToDxf(\r\n components: OBC.Components,\r\n drawing: OBC.TechnicalDrawing,\r\n fileName: string,\r\n rotationDeg = 0,\r\n) {\r\n const restore = applyRotationInPlace(drawing, rotationDeg)\r\n try {\r\n const manager = components.get(OBC.DxfManager)\r\n // Export the full drawing (no viewport clipping).\r\n const dxf = manager.exporter.export([{ drawing, viewports: [{}] }])\r\n triggerDownload(dxf, fileName)\r\n } finally {\r\n restore?.()\r\n }\r\n}\r\n\r\nfunction triggerDownload(dxf: string, fileName: string) {\r\n const blob = new Blob([dxf], { type: 'application/dxf' })\r\n const url = URL.createObjectURL(blob)\r\n const a = document.createElement('a')\r\n a.href = url\r\n a.download = fileName.toLowerCase().endsWith('.dxf')\r\n ? fileName\r\n : `${fileName}.dxf`\r\n document.body.appendChild(a)\r\n a.click()\r\n document.body.removeChild(a)\r\n URL.revokeObjectURL(url)\r\n}\r\n\r\n/**\r\n * Rotate every `LineSegments` position attribute on the drawing by\r\n * `degrees` around the drawing's local Y axis, returning a `restore()`\r\n * callback that puts the original buffers back. The rotation matches\r\n * `controls.rotateAzimuthTo` direction (positive degrees → CCW when\r\n * viewed from above), so the DXF reads as the on-screen orientation.\r\n *\r\n * Returns `null` for the no-rotation case so callers can skip the\r\n * try/finally bookkeeping.\r\n */\r\nfunction applyRotationInPlace(\r\n drawing: OBC.TechnicalDrawing,\r\n degrees: number,\r\n): null | (() => void) {\r\n if (!degrees) return null\r\n const rad = (degrees * Math.PI) / 180\r\n const cos = Math.cos(rad)\r\n const sin = Math.sin(rad)\r\n const restorers: Array<() => void> = []\r\n\r\n drawing.three.traverse((child) => {\r\n if (!(child instanceof THREE.LineSegments)) return\r\n const pos = child.geometry.attributes.position as\r\n | THREE.BufferAttribute\r\n | undefined\r\n if (!pos) return\r\n const arr = pos.array as Float32Array\r\n const original = new Float32Array(arr.length)\r\n original.set(arr)\r\n for (let i = 0; i < pos.count; i++) {\r\n const x = arr[i * 3]\r\n const z = arr[i * 3 + 2]\r\n arr[i * 3] = x * cos + z * sin\r\n arr[i * 3 + 2] = -x * sin + z * cos\r\n }\r\n pos.needsUpdate = true\r\n restorers.push(() => {\r\n arr.set(original)\r\n pos.needsUpdate = true\r\n })\r\n })\r\n\r\n return () => {\r\n for (const r of restorers) r()\r\n }\r\n}\r\n"],"mappings":"AAGA,YAAY,SAAS;AACrB,YAAY,WAAW;AAiBhB,SAAS,mBACd,YACA,SACA,UACA,cAAc,GACd;AACA,QAAM,UAAU,qBAAqB,SAAS,WAAW;AACzD,MAAI;AACF,UAAM,UAAU,WAAW,IAAI,IAAI,UAAU;AAE7C,UAAM,MAAM,QAAQ,SAAS,OAAO,CAAC,EAAE,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAClE,oBAAgB,KAAK,QAAQ;AAAA,EAC/B,UAAE;AACA;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,KAAa,UAAkB;AACtD,QAAM,OAAO,IAAI,KAAK,CAAC,GAAG,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACxD,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,QAAM,IAAI,SAAS,cAAc,GAAG;AACpC,IAAE,OAAO;AACT,IAAE,WAAW,SAAS,YAAY,EAAE,SAAS,MAAM,IAC/C,WACA,GAAG,QAAQ;AACf,WAAS,KAAK,YAAY,CAAC;AAC3B,IAAE,MAAM;AACR,WAAS,KAAK,YAAY,CAAC;AAC3B,MAAI,gBAAgB,GAAG;AACzB;AAYA,SAAS,qBACP,SACA,SACqB;AACrB,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,MAAO,UAAU,KAAK,KAAM;AAClC,QAAM,MAAM,KAAK,IAAI,GAAG;AACxB,QAAM,MAAM,KAAK,IAAI,GAAG;AACxB,QAAM,YAA+B,CAAC;AAEtC,UAAQ,MAAM,SAAS,CAAC,UAAU;AAChC,QAAI,EAAE,iBAAiB,MAAM,cAAe;AAC5C,UAAM,MAAM,MAAM,SAAS,WAAW;AAGtC,QAAI,CAAC,IAAK;AACV,UAAM,MAAM,IAAI;AAChB,UAAM,WAAW,IAAI,aAAa,IAAI,MAAM;AAC5C,aAAS,IAAI,GAAG;AAChB,aAAS,IAAI,GAAG,IAAI,IAAI,OAAO,KAAK;AAClC,YAAM,IAAI,IAAI,IAAI,CAAC;AACnB,YAAM,IAAI,IAAI,IAAI,IAAI,CAAC;AACvB,UAAI,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI;AAC3B,UAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,IAAI;AAAA,IAClC;AACA,QAAI,cAAc;AAClB,cAAU,KAAK,MAAM;AACnB,UAAI,IAAI,QAAQ;AAChB,UAAI,cAAc;AAAA,IACpB,CAAC;AAAA,EACH,CAAC;AAED,SAAO,MAAM;AACX,eAAW,KAAK,UAAW,GAAE;AAAA,EAC/B;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"safeRun.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/safeRun.ts"],"names":[],"mappings":"AAAA;;2DAE2D;AAC3D,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,MAAM,QAMpD;AAED,kEAAkE;AAClE,wBAAsB,YAAY,CAChC,EAAE,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAC1B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAMf"}
1
+ {"version":3,"file":"safeRun.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/safeRun.ts"],"names":[],"mappings":"AAGA;;2DAE2D;AAC3D,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,MAAM,QAMpD;AAED,kEAAkE;AAClE,wBAAsB,YAAY,CAChC,EAAE,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAC1B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAMf"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/safeRun.ts"],"sourcesContent":["/** Run a side-effect helper; log and swallow errors so one failure can't\r\n * abort the surrounding sequence. Used in tool activate/deactivate paths\r\n * where every cleanup step needs to run independently. */\r\nexport function safeRun(fn: () => void, label: string) {\r\n try {\r\n fn()\r\n } catch (error) {\r\n console.warn(`[${label}] failed:`, error)\r\n }\r\n}\r\n\r\n/** Async variant — awaits the promise and swallows rejections. */\r\nexport async function safeRunAsync(\r\n fn: () => Promise<unknown>,\r\n label: string,\r\n): Promise<void> {\r\n try {\r\n await fn()\r\n } catch (error) {\r\n console.warn(`[${label}] failed:`, error)\r\n }\r\n}\r\n"],"mappings":"AAGO,SAAS,QAAQ,IAAgB,OAAe;AACrD,MAAI;AACF,OAAG;AAAA,EACL,SAAS,OAAO;AACd,YAAQ,KAAK,IAAI,KAAK,aAAa,KAAK;AAAA,EAC1C;AACF;AAGA,eAAsB,aACpB,IACA,OACe;AACf,MAAI;AACF,UAAM,GAAG;AAAA,EACX,SAAS,OAAO;AACd,YAAQ,KAAK,IAAI,KAAK,aAAa,KAAK;AAAA,EAC1C;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/safeRun.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n/** Run a side-effect helper; log and swallow errors so one failure can't\r\n * abort the surrounding sequence. Used in tool activate/deactivate paths\r\n * where every cleanup step needs to run independently. */\r\nexport function safeRun(fn: () => void, label: string) {\r\n try {\r\n fn()\r\n } catch (error) {\r\n console.warn(`[${label}] failed:`, error)\r\n }\r\n}\r\n\r\n/** Async variant — awaits the promise and swallows rejections. */\r\nexport async function safeRunAsync(\r\n fn: () => Promise<unknown>,\r\n label: string,\r\n): Promise<void> {\r\n try {\r\n await fn()\r\n } catch (error) {\r\n console.warn(`[${label}] failed:`, error)\r\n }\r\n}\r\n"],"mappings":"AAMO,SAAS,QAAQ,IAAgB,OAAe;AACrD,MAAI;AACF,OAAG;AAAA,EACL,SAAS,OAAO;AACd,YAAQ,KAAK,IAAI,KAAK,aAAa,KAAK;AAAA,EAC1C;AACF;AAGA,eAAsB,aACpB,IACA,OACe;AACf,MAAI;AACF,UAAM,GAAG;AAAA,EACX,SAAS,OAAO;AACd,YAAQ,KAAK,IAAI,KAAK,aAAa,KAAK;AAAA,EAC1C;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useBuildingName.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/useBuildingName.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,wBAAgB,eAAe,IAAI,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAmB7D"}
1
+ {"version":3,"file":"useBuildingName.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/useBuildingName.ts"],"names":[],"mappings":"AAMA;;;;;;;;;GASG;AACH,wBAAgB,eAAe,IAAI,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAmB7D"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/useBuildingName.ts"],"sourcesContent":["import * as React from 'react'\r\nimport { BimContext } from '../../../../../store'\r\n\r\n/**\r\n * Hook returning a function that resolves the building/file display name\r\n * for a given `modelId`. The model's loaded file lives in either\r\n * `bimState.bim.buildingModel.bimFile` (single-model viewer) or\r\n * `bimState.bim.bimModelsAddedToMap[]` (multi-model). We fall back to the\r\n * raw modelId so the caller never gets `null`.\r\n *\r\n * The returned name is stripped of its file extension (\".frag\", \".ifc\",\r\n * etc.) so it can be safely composed into a download filename.\r\n */\r\nexport function useBuildingName(): (modelId: string) => string {\r\n const { state: bimState } = React.useContext(BimContext)\r\n const { buildingModel, bimModelsAddedToMap } = bimState.bim\r\n\r\n return React.useCallback(\r\n (modelId: string) => {\r\n const idStr = String(modelId)\r\n const fromMap = bimModelsAddedToMap.find(\r\n (m) => String(m.bimFile.id) === idStr,\r\n )\r\n if (fromMap) return stripExtension(fromMap.bimFile.name)\r\n const single = buildingModel.bimFile\r\n if (single && String(single.id) === idStr) {\r\n return stripExtension(single.name)\r\n }\r\n return idStr\r\n },\r\n [buildingModel, bimModelsAddedToMap],\r\n )\r\n}\r\n\r\nfunction stripExtension(name: string): string {\r\n const dot = name.lastIndexOf('.')\r\n if (dot <= 0) return name\r\n return name.slice(0, dot)\r\n}\r\n"],"mappings":"AAAA,YAAY,WAAW;AACvB,SAAS,kBAAkB;AAYpB,SAAS,kBAA+C;AAC7D,QAAM,EAAE,OAAO,SAAS,IAAI,MAAM,WAAW,UAAU;AACvD,QAAM,EAAE,eAAe,oBAAoB,IAAI,SAAS;AAExD,SAAO,MAAM;AAAA,IACX,CAAC,YAAoB;AACnB,YAAM,QAAQ,OAAO,OAAO;AAC5B,YAAM,UAAU,oBAAoB;AAAA,QAClC,CAAC,MAAM,OAAO,EAAE,QAAQ,EAAE,MAAM;AAAA,MAClC;AACA,UAAI,QAAS,QAAO,eAAe,QAAQ,QAAQ,IAAI;AACvD,YAAM,SAAS,cAAc;AAC7B,UAAI,UAAU,OAAO,OAAO,EAAE,MAAM,OAAO;AACzC,eAAO,eAAe,OAAO,IAAI;AAAA,MACnC;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,eAAe,mBAAmB;AAAA,EACrC;AACF;AAEA,SAAS,eAAe,MAAsB;AAC5C,QAAM,MAAM,KAAK,YAAY,GAAG;AAChC,MAAI,OAAO,EAAG,QAAO;AACrB,SAAO,KAAK,MAAM,GAAG,GAAG;AAC1B;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/useBuildingName.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { BimContext } from '../../../../../store'\r\n\r\n/**\r\n * Hook returning a function that resolves the building/file display name\r\n * for a given `modelId`. The model's loaded file lives in either\r\n * `bimState.bim.buildingModel.bimFile` (single-model viewer) or\r\n * `bimState.bim.bimModelsAddedToMap[]` (multi-model). We fall back to the\r\n * raw modelId so the caller never gets `null`.\r\n *\r\n * The returned name is stripped of its file extension (\".frag\", \".ifc\",\r\n * etc.) so it can be safely composed into a download filename.\r\n */\r\nexport function useBuildingName(): (modelId: string) => string {\r\n const { state: bimState } = React.useContext(BimContext)\r\n const { buildingModel, bimModelsAddedToMap } = bimState.bim\r\n\r\n return React.useCallback(\r\n (modelId: string) => {\r\n const idStr = String(modelId)\r\n const fromMap = bimModelsAddedToMap.find(\r\n (m) => String(m.bimFile.id) === idStr,\r\n )\r\n if (fromMap) return stripExtension(fromMap.bimFile.name)\r\n const single = buildingModel.bimFile\r\n if (single && String(single.id) === idStr) {\r\n return stripExtension(single.name)\r\n }\r\n return idStr\r\n },\r\n [buildingModel, bimModelsAddedToMap],\r\n )\r\n}\r\n\r\nfunction stripExtension(name: string): string {\r\n const dot = name.lastIndexOf('.')\r\n if (dot <= 0) return name\r\n return name.slice(0, dot)\r\n}\r\n"],"mappings":"AAGA,YAAY,WAAW;AACvB,SAAS,kBAAkB;AAYpB,SAAS,kBAA+C;AAC7D,QAAM,EAAE,OAAO,SAAS,IAAI,MAAM,WAAW,UAAU;AACvD,QAAM,EAAE,eAAe,oBAAoB,IAAI,SAAS;AAExD,SAAO,MAAM;AAAA,IACX,CAAC,YAAoB;AACnB,YAAM,QAAQ,OAAO,OAAO;AAC5B,YAAM,UAAU,oBAAoB;AAAA,QAClC,CAAC,MAAM,OAAO,EAAE,QAAQ,EAAE,MAAM;AAAA,MAClC;AACA,UAAI,QAAS,QAAO,eAAe,QAAQ,QAAQ,IAAI;AACvD,YAAM,SAAS,cAAc;AAC7B,UAAI,UAAU,OAAO,OAAO,EAAE,MAAM,OAAO;AACzC,eAAO,eAAe,OAAO,IAAI;AAAA,MACnC;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,eAAe,mBAAmB;AAAA,EACrC;AACF;AAEA,SAAS,eAAe,MAAsB;AAC5C,QAAM,MAAM,KAAK,YAAY,GAAG;AAChC,MAAI,OAAO,EAAG,QAAO;AACrB,SAAO,KAAK,MAAM,GAAG,GAAG;AAC1B;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useFriendlyIfcClassName.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAgBvE"}
1
+ {"version":3,"file":"useFriendlyIfcClassName.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAgBvE"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.ts"],"sourcesContent":["import * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\n\r\n/**\r\n * Hook returning a function that maps a layer class name to a display label.\r\n * IFC class names (IFCWALL, IFCSLAB, …) are returned verbatim per-spec.\r\n * Special non-IFC layer keys (e.g. \"Door Swings\") are looked up in the\r\n * DrawingLayers i18n namespace so they get localized.\r\n */\r\nexport function useFriendlyIfcClassName(): (className: string) => string {\r\n const tLayers = useTranslations('DrawingLayers')\r\n\r\n return React.useCallback(\r\n (className: string) => {\r\n if (className.startsWith('IFC')) return className\r\n // The Fill/Cut group rows arrive fully qualified (\"DrawingLayers.cut\").\r\n // Strip the namespace prefix so the lookup lands on the bare key (\"cut\")\r\n // instead of resolving the dotted path as nested keys (which misses).\r\n const key = className.startsWith('DrawingLayers.')\r\n ? className.slice('DrawingLayers.'.length)\r\n : className\r\n return tLayers.has(key) ? tLayers(key) : className\r\n },\r\n [tLayers],\r\n )\r\n}\r\n"],"mappings":"AAAA,YAAY,WAAW;AACvB,SAAS,uBAAuB;AAQzB,SAAS,0BAAyD;AACvE,QAAM,UAAU,gBAAgB,eAAe;AAE/C,SAAO,MAAM;AAAA,IACX,CAAC,cAAsB;AACrB,UAAI,UAAU,WAAW,KAAK,EAAG,QAAO;AAIxC,YAAM,MAAM,UAAU,WAAW,gBAAgB,IAC7C,UAAU,MAAM,iBAAiB,MAAM,IACvC;AACJ,aAAO,QAAQ,IAAI,GAAG,IAAI,QAAQ,GAAG,IAAI;AAAA,IAC3C;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\nimport * as React from 'react'\r\nimport { useTranslations } from 'next-intl'\r\n\r\n/**\r\n * Hook returning a function that maps a layer class name to a display label.\r\n * IFC class names (IFCWALL, IFCSLAB, …) are returned verbatim per-spec.\r\n * Special non-IFC layer keys (e.g. \"Door Swings\") are looked up in the\r\n * DrawingLayers i18n namespace so they get localized.\r\n */\r\nexport function useFriendlyIfcClassName(): (className: string) => string {\r\n const tLayers = useTranslations('DrawingLayers')\r\n\r\n return React.useCallback(\r\n (className: string) => {\r\n if (className.startsWith('IFC')) return className\r\n // The Fill/Cut group rows arrive fully qualified (\"DrawingLayers.cut\").\r\n // Strip the namespace prefix so the lookup lands on the bare key (\"cut\")\r\n // instead of resolving the dotted path as nested keys (which misses).\r\n const key = className.startsWith('DrawingLayers.')\r\n ? className.slice('DrawingLayers.'.length)\r\n : className\r\n return tLayers.has(key) ? tLayers(key) : className\r\n },\r\n [tLayers],\r\n )\r\n}\r\n"],"mappings":"AAGA,YAAY,WAAW;AACvB,SAAS,uBAAuB;AAQzB,SAAS,0BAAyD;AACvE,QAAM,UAAU,gBAAgB,eAAe;AAE/C,SAAO,MAAM;AAAA,IACX,CAAC,cAAsB;AACrB,UAAI,UAAU,WAAW,KAAK,EAAG,QAAO;AAIxC,YAAM,MAAM,UAAU,WAAW,gBAAgB,IAC7C,UAAU,MAAM,iBAAiB,MAAM,IACvC;AACJ,aAAO,QAAQ,IAAI,GAAG,IAAI,QAAQ,GAAG,IAAI;AAAA,IAC3C;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"viewSection.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/viewSection.ts"],"names":[],"mappings":"AAAA;;8EAE8E;AAC9E,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM;IAC7D,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd;AAED;uEACuE;AACvE,wBAAgB,YAAY,CAAC,KAAK,SAAS,MAAM,EAC/C,KAAK,EAAE,KAAK,GAAG,SAAS,EACxB,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAC3B,MAAM,CAGR;AAED;yEACyE;AACzE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACd"}
1
+ {"version":3,"file":"viewSection.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/lib/viewSection.ts"],"names":[],"mappings":"AAGA;;8EAE8E;AAC9E,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM;IAC7D,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd;AAED;uEACuE;AACvE,wBAAgB,YAAY,CAAC,KAAK,SAAS,MAAM,EAC/C,KAAK,EAAE,KAAK,GAAG,SAAS,EACxB,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAC3B,MAAM,CAGR;AAED;yEACyE;AACzE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACd"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/viewSection.ts"],"sourcesContent":["/** Loading state shared by tools that drive a \"view\" sidebar section\r\n * (FloorplanTool, ElevationsTool, …). Each tool defines its own concrete\r\n * Stage union; the section translates the stage into a localized message. */\r\nexport interface ViewLoadingState<Stage extends string = string> {\r\n isLoading: boolean\r\n stage?: Stage\r\n}\r\n\r\n/** Resolve a percent value for the progress bar. Returns 0 for an unknown\r\n * or absent stage so the caller doesn't need to defend against it. */\r\nexport function stagePercent<Stage extends string>(\r\n stage: Stage | undefined,\r\n table: Record<Stage, number>,\r\n): number {\r\n if (!stage) return 0\r\n return table[stage] ?? 0\r\n}\r\n\r\n/** Minimal shape consumed by ViewSectionList — each section maps its\r\n * tool-specific entries (FloorplanEntry, ElevationEntry, …) to this. */\r\nexport interface ViewListEntry {\r\n id: string\r\n label: string\r\n}\r\n"],"mappings":"AAUO,SAAS,aACd,OACA,OACQ;AAbV;AAcE,MAAI,CAAC,MAAO,QAAO;AACnB,UAAO,WAAM,KAAK,MAAX,YAAgB;AACzB;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../src/core/components/viewers/bim/src/lib/viewSection.ts"],"sourcesContent":["// SPDX-License-Identifier: AGPL-3.0-or-later\r\n// Copyright (C) 2025 Collab Digital Twins\r\n\r\n/** Loading state shared by tools that drive a \"view\" sidebar section\r\n * (FloorplanTool, ElevationsTool, …). Each tool defines its own concrete\r\n * Stage union; the section translates the stage into a localized message. */\r\nexport interface ViewLoadingState<Stage extends string = string> {\r\n isLoading: boolean\r\n stage?: Stage\r\n}\r\n\r\n/** Resolve a percent value for the progress bar. Returns 0 for an unknown\r\n * or absent stage so the caller doesn't need to defend against it. */\r\nexport function stagePercent<Stage extends string>(\r\n stage: Stage | undefined,\r\n table: Record<Stage, number>,\r\n): number {\r\n if (!stage) return 0\r\n return table[stage] ?? 0\r\n}\r\n\r\n/** Minimal shape consumed by ViewSectionList — each section maps its\r\n * tool-specific entries (FloorplanEntry, ElevationEntry, …) to this. */\r\nexport interface ViewListEntry {\r\n id: string\r\n label: string\r\n}\r\n"],"mappings":"AAaO,SAAS,aACd,OACA,OACQ;AAhBV;AAiBE,MAAI,CAAC,MAAO,QAAO;AACnB,UAAO,WAAM,KAAK,MAAX,YAAgB;AACzB;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/propertiesMenu/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAY9B,UAAU,sBAAsB;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CAC7C;AAuCD,wBAAgB,cAAc,CAAC,EAAE,IAAY,EAAE,kBAAkB,EAAE,EAAE,sBAAsB,qBAsX1F"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/components/viewers/bim/src/propertiesMenu/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAY9B,UAAU,sBAAsB;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CAC7C;AAuCD,wBAAgB,cAAc,CAAC,EAAE,IAAY,EAAE,kBAAkB,EAAE,EAAE,sBAAsB,qBAsX1F"}