@ifc-lite/viewer 1.17.3 → 1.17.6

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 (530) hide show
  1. package/.turbo/turbo-build.log +39 -30
  2. package/.turbo/turbo-typecheck.log +1 -1
  3. package/CHANGELOG.md +132 -0
  4. package/DESKTOP_CONTRACT_VERSION +1 -0
  5. package/dist/assets/arrow-CZ5kQ26f.js +20 -0
  6. package/dist/assets/basketViewActivator-86rgogji.js +1 -0
  7. package/dist/assets/{bcf-D5-QWGO9.js → bcf-DOG9_WPX.js} +1 -1
  8. package/dist/assets/{browser-CKs-FY1P.js → browser-C5TFR7sH.js} +1 -1
  9. package/dist/assets/cesium-ADbP7waU.css +1 -0
  10. package/dist/assets/cesium-DUOzBlqv.js +17817 -0
  11. package/dist/assets/drawing-2d-DoxKMqbO.js +257 -0
  12. package/dist/assets/{exporters-C_6J153K.js → exporters-CcPS9MK5.js} +2898 -2380
  13. package/dist/assets/geometry.worker-BFUYA08u.js +1 -0
  14. package/dist/assets/ids-DQ5jY0E8.js +1 -0
  15. package/dist/assets/ifc-lite_bg-BINvzoCP.wasm +0 -0
  16. package/dist/assets/{index-jhBr1wbn.js → index-Bfms9I4A.js} +41036 -34613
  17. package/dist/assets/index-_bfZsDCC.css +1 -0
  18. package/dist/assets/{maplibre-gl-BpvwNKKy.js → maplibre-gl-CGLcoNXc.js} +1 -1
  19. package/dist/assets/native-bridge-DUyLCMZS.js +429 -0
  20. package/dist/assets/{sandbox-B79eavQ3.js → sandbox-C8575tul.js} +4342 -4324
  21. package/dist/assets/{server-client-D3bUPJJc.js → server-client-BuZK7OST.js} +4 -4
  22. package/dist/assets/tauri-core-stub-D8Fa-u43.js +1 -0
  23. package/dist/assets/tauri-dialog-stub-r7Wksg7o.js +1 -0
  24. package/dist/assets/tauri-fs-stub-BdeRC7aK.js +1 -0
  25. package/dist/assets/wasm-bridge-JsqEGDV8.js +1 -0
  26. package/dist/assets/{zip-B-jFFAGa.js → zip-DBEtpeu6.js} +3 -3
  27. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
  28. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
  29. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
  30. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
  31. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
  32. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
  33. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
  34. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
  35. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
  36. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
  37. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
  38. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
  39. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
  40. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
  41. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
  42. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
  43. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
  44. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
  45. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
  46. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
  47. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
  48. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
  49. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
  50. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
  51. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
  52. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
  53. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
  54. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
  55. package/dist/cesium/Assets/Images/bing_maps_credit.png +0 -0
  56. package/dist/cesium/Assets/Images/cesium_credit.png +0 -0
  57. package/dist/cesium/Assets/Images/google_earth_credit.png +0 -0
  58. package/dist/cesium/Assets/Images/ion-credit.png +0 -0
  59. package/dist/cesium/Assets/Textures/LensFlare/DirtMask.jpg +0 -0
  60. package/dist/cesium/Assets/Textures/LensFlare/StarBurst.jpg +0 -0
  61. package/dist/cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg +0 -0
  62. package/dist/cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg +0 -0
  63. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg +0 -0
  64. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg +0 -0
  65. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg +0 -0
  66. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg +0 -0
  67. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg +0 -0
  68. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg +0 -0
  69. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg +0 -0
  70. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg +0 -0
  71. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg +0 -0
  72. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg +0 -0
  73. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg +0 -0
  74. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg +0 -0
  75. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg +0 -0
  76. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg +0 -0
  77. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg +0 -0
  78. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg +0 -0
  79. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg +0 -0
  80. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg +0 -0
  81. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg +0 -0
  82. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg +0 -0
  83. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg +0 -0
  84. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg +0 -0
  85. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg +0 -0
  86. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg +0 -0
  87. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg +0 -0
  88. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg +0 -0
  89. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg +0 -0
  90. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg +0 -0
  91. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg +0 -0
  92. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg +0 -0
  93. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg +0 -0
  94. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg +0 -0
  95. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg +0 -0
  96. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg +0 -0
  97. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg +0 -0
  98. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg +0 -0
  99. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg +0 -0
  100. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg +0 -0
  101. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg +0 -0
  102. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg +0 -0
  103. package/dist/cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml +14 -0
  104. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
  105. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
  106. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
  107. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
  108. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
  109. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
  110. package/dist/cesium/Assets/Textures/maki/airfield.png +0 -0
  111. package/dist/cesium/Assets/Textures/maki/airport.png +0 -0
  112. package/dist/cesium/Assets/Textures/maki/alcohol-shop.png +0 -0
  113. package/dist/cesium/Assets/Textures/maki/america-football.png +0 -0
  114. package/dist/cesium/Assets/Textures/maki/art-gallery.png +0 -0
  115. package/dist/cesium/Assets/Textures/maki/bakery.png +0 -0
  116. package/dist/cesium/Assets/Textures/maki/bank.png +0 -0
  117. package/dist/cesium/Assets/Textures/maki/bar.png +0 -0
  118. package/dist/cesium/Assets/Textures/maki/baseball.png +0 -0
  119. package/dist/cesium/Assets/Textures/maki/basketball.png +0 -0
  120. package/dist/cesium/Assets/Textures/maki/beer.png +0 -0
  121. package/dist/cesium/Assets/Textures/maki/bicycle.png +0 -0
  122. package/dist/cesium/Assets/Textures/maki/building.png +0 -0
  123. package/dist/cesium/Assets/Textures/maki/bus.png +0 -0
  124. package/dist/cesium/Assets/Textures/maki/cafe.png +0 -0
  125. package/dist/cesium/Assets/Textures/maki/camera.png +0 -0
  126. package/dist/cesium/Assets/Textures/maki/campsite.png +0 -0
  127. package/dist/cesium/Assets/Textures/maki/car.png +0 -0
  128. package/dist/cesium/Assets/Textures/maki/cemetery.png +0 -0
  129. package/dist/cesium/Assets/Textures/maki/cesium.png +0 -0
  130. package/dist/cesium/Assets/Textures/maki/chemist.png +0 -0
  131. package/dist/cesium/Assets/Textures/maki/cinema.png +0 -0
  132. package/dist/cesium/Assets/Textures/maki/circle-stroked.png +0 -0
  133. package/dist/cesium/Assets/Textures/maki/circle.png +0 -0
  134. package/dist/cesium/Assets/Textures/maki/city.png +0 -0
  135. package/dist/cesium/Assets/Textures/maki/clothing-store.png +0 -0
  136. package/dist/cesium/Assets/Textures/maki/college.png +0 -0
  137. package/dist/cesium/Assets/Textures/maki/commercial.png +0 -0
  138. package/dist/cesium/Assets/Textures/maki/cricket.png +0 -0
  139. package/dist/cesium/Assets/Textures/maki/cross.png +0 -0
  140. package/dist/cesium/Assets/Textures/maki/dam.png +0 -0
  141. package/dist/cesium/Assets/Textures/maki/danger.png +0 -0
  142. package/dist/cesium/Assets/Textures/maki/disability.png +0 -0
  143. package/dist/cesium/Assets/Textures/maki/dog-park.png +0 -0
  144. package/dist/cesium/Assets/Textures/maki/embassy.png +0 -0
  145. package/dist/cesium/Assets/Textures/maki/emergency-telephone.png +0 -0
  146. package/dist/cesium/Assets/Textures/maki/entrance.png +0 -0
  147. package/dist/cesium/Assets/Textures/maki/farm.png +0 -0
  148. package/dist/cesium/Assets/Textures/maki/fast-food.png +0 -0
  149. package/dist/cesium/Assets/Textures/maki/ferry.png +0 -0
  150. package/dist/cesium/Assets/Textures/maki/fire-station.png +0 -0
  151. package/dist/cesium/Assets/Textures/maki/fuel.png +0 -0
  152. package/dist/cesium/Assets/Textures/maki/garden.png +0 -0
  153. package/dist/cesium/Assets/Textures/maki/gift.png +0 -0
  154. package/dist/cesium/Assets/Textures/maki/golf.png +0 -0
  155. package/dist/cesium/Assets/Textures/maki/grocery.png +0 -0
  156. package/dist/cesium/Assets/Textures/maki/hairdresser.png +0 -0
  157. package/dist/cesium/Assets/Textures/maki/harbor.png +0 -0
  158. package/dist/cesium/Assets/Textures/maki/heart.png +0 -0
  159. package/dist/cesium/Assets/Textures/maki/heliport.png +0 -0
  160. package/dist/cesium/Assets/Textures/maki/hospital.png +0 -0
  161. package/dist/cesium/Assets/Textures/maki/ice-cream.png +0 -0
  162. package/dist/cesium/Assets/Textures/maki/industrial.png +0 -0
  163. package/dist/cesium/Assets/Textures/maki/land-use.png +0 -0
  164. package/dist/cesium/Assets/Textures/maki/laundry.png +0 -0
  165. package/dist/cesium/Assets/Textures/maki/library.png +0 -0
  166. package/dist/cesium/Assets/Textures/maki/lighthouse.png +0 -0
  167. package/dist/cesium/Assets/Textures/maki/lodging.png +0 -0
  168. package/dist/cesium/Assets/Textures/maki/logging.png +0 -0
  169. package/dist/cesium/Assets/Textures/maki/london-underground.png +0 -0
  170. package/dist/cesium/Assets/Textures/maki/marker-stroked.png +0 -0
  171. package/dist/cesium/Assets/Textures/maki/marker.png +0 -0
  172. package/dist/cesium/Assets/Textures/maki/minefield.png +0 -0
  173. package/dist/cesium/Assets/Textures/maki/mobilephone.png +0 -0
  174. package/dist/cesium/Assets/Textures/maki/monument.png +0 -0
  175. package/dist/cesium/Assets/Textures/maki/museum.png +0 -0
  176. package/dist/cesium/Assets/Textures/maki/music.png +0 -0
  177. package/dist/cesium/Assets/Textures/maki/oil-well.png +0 -0
  178. package/dist/cesium/Assets/Textures/maki/park.png +0 -0
  179. package/dist/cesium/Assets/Textures/maki/park2.png +0 -0
  180. package/dist/cesium/Assets/Textures/maki/parking-garage.png +0 -0
  181. package/dist/cesium/Assets/Textures/maki/parking.png +0 -0
  182. package/dist/cesium/Assets/Textures/maki/pharmacy.png +0 -0
  183. package/dist/cesium/Assets/Textures/maki/pitch.png +0 -0
  184. package/dist/cesium/Assets/Textures/maki/place-of-worship.png +0 -0
  185. package/dist/cesium/Assets/Textures/maki/playground.png +0 -0
  186. package/dist/cesium/Assets/Textures/maki/police.png +0 -0
  187. package/dist/cesium/Assets/Textures/maki/polling-place.png +0 -0
  188. package/dist/cesium/Assets/Textures/maki/post.png +0 -0
  189. package/dist/cesium/Assets/Textures/maki/prison.png +0 -0
  190. package/dist/cesium/Assets/Textures/maki/rail-above.png +0 -0
  191. package/dist/cesium/Assets/Textures/maki/rail-light.png +0 -0
  192. package/dist/cesium/Assets/Textures/maki/rail-metro.png +0 -0
  193. package/dist/cesium/Assets/Textures/maki/rail-underground.png +0 -0
  194. package/dist/cesium/Assets/Textures/maki/rail.png +0 -0
  195. package/dist/cesium/Assets/Textures/maki/religious-christian.png +0 -0
  196. package/dist/cesium/Assets/Textures/maki/religious-jewish.png +0 -0
  197. package/dist/cesium/Assets/Textures/maki/religious-muslim.png +0 -0
  198. package/dist/cesium/Assets/Textures/maki/restaurant.png +0 -0
  199. package/dist/cesium/Assets/Textures/maki/roadblock.png +0 -0
  200. package/dist/cesium/Assets/Textures/maki/rocket.png +0 -0
  201. package/dist/cesium/Assets/Textures/maki/school.png +0 -0
  202. package/dist/cesium/Assets/Textures/maki/scooter.png +0 -0
  203. package/dist/cesium/Assets/Textures/maki/shop.png +0 -0
  204. package/dist/cesium/Assets/Textures/maki/skiing.png +0 -0
  205. package/dist/cesium/Assets/Textures/maki/slaughterhouse.png +0 -0
  206. package/dist/cesium/Assets/Textures/maki/soccer.png +0 -0
  207. package/dist/cesium/Assets/Textures/maki/square-stroked.png +0 -0
  208. package/dist/cesium/Assets/Textures/maki/square.png +0 -0
  209. package/dist/cesium/Assets/Textures/maki/star-stroked.png +0 -0
  210. package/dist/cesium/Assets/Textures/maki/star.png +0 -0
  211. package/dist/cesium/Assets/Textures/maki/suitcase.png +0 -0
  212. package/dist/cesium/Assets/Textures/maki/swimming.png +0 -0
  213. package/dist/cesium/Assets/Textures/maki/telephone.png +0 -0
  214. package/dist/cesium/Assets/Textures/maki/tennis.png +0 -0
  215. package/dist/cesium/Assets/Textures/maki/theatre.png +0 -0
  216. package/dist/cesium/Assets/Textures/maki/toilets.png +0 -0
  217. package/dist/cesium/Assets/Textures/maki/town-hall.png +0 -0
  218. package/dist/cesium/Assets/Textures/maki/town.png +0 -0
  219. package/dist/cesium/Assets/Textures/maki/triangle-stroked.png +0 -0
  220. package/dist/cesium/Assets/Textures/maki/triangle.png +0 -0
  221. package/dist/cesium/Assets/Textures/maki/village.png +0 -0
  222. package/dist/cesium/Assets/Textures/maki/warehouse.png +0 -0
  223. package/dist/cesium/Assets/Textures/maki/waste-basket.png +0 -0
  224. package/dist/cesium/Assets/Textures/maki/water.png +0 -0
  225. package/dist/cesium/Assets/Textures/maki/wetland.png +0 -0
  226. package/dist/cesium/Assets/Textures/maki/zoo.png +0 -0
  227. package/dist/cesium/Assets/Textures/moonSmall.jpg +0 -0
  228. package/dist/cesium/Assets/Textures/pin.svg +1 -0
  229. package/dist/cesium/Assets/Textures/waterNormals.jpg +0 -0
  230. package/dist/cesium/Assets/Textures/waterNormalsSmall.jpg +0 -0
  231. package/dist/cesium/Assets/approximateTerrainHeights.json +1 -0
  232. package/dist/cesium/ThirdParty/Workers/package.json +1 -0
  233. package/dist/cesium/ThirdParty/Workers/zip-web-worker.js +1 -0
  234. package/dist/cesium/ThirdParty/basis_transcoder.wasm +0 -0
  235. package/dist/cesium/ThirdParty/draco_decoder.wasm +0 -0
  236. package/dist/cesium/ThirdParty/google-earth-dbroot-parser.js +1 -0
  237. package/dist/cesium/ThirdParty/wasm_splats_bg.wasm +0 -0
  238. package/dist/cesium/ThirdParty/zip-module.wasm +0 -0
  239. package/dist/cesium/Widgets/Animation/Animation.css +127 -0
  240. package/dist/cesium/Widgets/Animation/lighter.css +70 -0
  241. package/dist/cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css +108 -0
  242. package/dist/cesium/Widgets/BaseLayerPicker/lighter.css +22 -0
  243. package/dist/cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css +102 -0
  244. package/dist/cesium/Widgets/CesiumInspector/CesiumInspector.css +113 -0
  245. package/dist/cesium/Widgets/CesiumWidget/CesiumWidget.css +119 -0
  246. package/dist/cesium/Widgets/CesiumWidget/lighter.css +14 -0
  247. package/dist/cesium/Widgets/FullscreenButton/FullscreenButton.css +8 -0
  248. package/dist/cesium/Widgets/Geocoder/Geocoder.css +70 -0
  249. package/dist/cesium/Widgets/Geocoder/lighter.css +17 -0
  250. package/dist/cesium/Widgets/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +27 -0
  251. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
  252. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
  253. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
  254. package/dist/cesium/Widgets/Images/ImageryProviders/azureAerial.png +0 -0
  255. package/dist/cesium/Widgets/Images/ImageryProviders/azureRoads.png +0 -0
  256. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerial.png +0 -0
  257. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png +0 -0
  258. package/dist/cesium/Widgets/Images/ImageryProviders/bingRoads.png +0 -0
  259. package/dist/cesium/Widgets/Images/ImageryProviders/blueMarble.png +0 -0
  260. package/dist/cesium/Widgets/Images/ImageryProviders/earthAtNight.png +0 -0
  261. package/dist/cesium/Widgets/Images/ImageryProviders/googleContour.png +0 -0
  262. package/dist/cesium/Widgets/Images/ImageryProviders/googleRoadmap.png +0 -0
  263. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatellite.png +0 -0
  264. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
  265. package/dist/cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
  266. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxSatellite.png +0 -0
  267. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxStreets.png +0 -0
  268. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxTerrain.png +0 -0
  269. package/dist/cesium/Widgets/Images/ImageryProviders/naturalEarthII.png +0 -0
  270. package/dist/cesium/Widgets/Images/ImageryProviders/openStreetMap.png +0 -0
  271. package/dist/cesium/Widgets/Images/ImageryProviders/sentinel-2.png +0 -0
  272. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
  273. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
  274. package/dist/cesium/Widgets/Images/ImageryProviders/stamenToner.png +0 -0
  275. package/dist/cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png +0 -0
  276. package/dist/cesium/Widgets/Images/NavigationHelp/Mouse.svg +84 -0
  277. package/dist/cesium/Widgets/Images/NavigationHelp/MouseLeft.svg +76 -0
  278. package/dist/cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg +76 -0
  279. package/dist/cesium/Widgets/Images/NavigationHelp/MouseRight.svg +76 -0
  280. package/dist/cesium/Widgets/Images/NavigationHelp/Touch.svg +120 -0
  281. package/dist/cesium/Widgets/Images/NavigationHelp/TouchDrag.svg +129 -0
  282. package/dist/cesium/Widgets/Images/NavigationHelp/TouchRotate.svg +76 -0
  283. package/dist/cesium/Widgets/Images/NavigationHelp/TouchTilt.svg +135 -0
  284. package/dist/cesium/Widgets/Images/NavigationHelp/TouchZoom.svg +74 -0
  285. package/dist/cesium/Widgets/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
  286. package/dist/cesium/Widgets/Images/TerrainProviders/Ellipsoid.png +0 -0
  287. package/dist/cesium/Widgets/Images/TimelineIcons.png +0 -0
  288. package/dist/cesium/Widgets/Images/info-loading.gif +0 -0
  289. package/dist/cesium/Widgets/InfoBox/InfoBox.css +92 -0
  290. package/dist/cesium/Widgets/InfoBox/InfoBoxDescription.css +178 -0
  291. package/dist/cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css +93 -0
  292. package/dist/cesium/Widgets/NavigationHelpButton/lighter.css +38 -0
  293. package/dist/cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css +15 -0
  294. package/dist/cesium/Widgets/ProjectionPicker/ProjectionPicker.css +38 -0
  295. package/dist/cesium/Widgets/SceneModePicker/SceneModePicker.css +56 -0
  296. package/dist/cesium/Widgets/SelectionIndicator/SelectionIndicator.css +20 -0
  297. package/dist/cesium/Widgets/Timeline/Timeline.css +103 -0
  298. package/dist/cesium/Widgets/Timeline/lighter.css +23 -0
  299. package/dist/cesium/Widgets/VRButton/VRButton.css +8 -0
  300. package/dist/cesium/Widgets/Viewer/Viewer.css +107 -0
  301. package/dist/cesium/Widgets/VoxelInspector/VoxelInspector.css +16 -0
  302. package/dist/cesium/Widgets/lighter.css +237 -0
  303. package/dist/cesium/Widgets/lighterShared.css +46 -0
  304. package/dist/cesium/Widgets/shared.css +103 -0
  305. package/dist/cesium/Widgets/widgets.css +1342 -0
  306. package/dist/cesium/Workers/chunk-23ZQ2IVV.js +29 -0
  307. package/dist/cesium/Workers/chunk-2EQO3Q56.js +26 -0
  308. package/dist/cesium/Workers/chunk-2MJIIVP4.js +26 -0
  309. package/dist/cesium/Workers/chunk-2TE5NTVD.js +26 -0
  310. package/dist/cesium/Workers/chunk-2ZBHLJST.js +26 -0
  311. package/dist/cesium/Workers/chunk-5TJMAQVL.js +26 -0
  312. package/dist/cesium/Workers/chunk-6BD4U3VO.js +26 -0
  313. package/dist/cesium/Workers/chunk-7TVGLKQF.js +26 -0
  314. package/dist/cesium/Workers/chunk-BTSYJ5XU.js +26 -0
  315. package/dist/cesium/Workers/chunk-BXMEEOCS.js +63 -0
  316. package/dist/cesium/Workers/chunk-BYLCY7GP.js +29 -0
  317. package/dist/cesium/Workers/chunk-CTHM3W6I.js +26 -0
  318. package/dist/cesium/Workers/chunk-CUUSNIVQ.js +26 -0
  319. package/dist/cesium/Workers/chunk-E3JOOS3S.js +26 -0
  320. package/dist/cesium/Workers/chunk-E7KYDCM5.js +26 -0
  321. package/dist/cesium/Workers/chunk-EDVBB7SS.js +27 -0
  322. package/dist/cesium/Workers/chunk-EFBN7QNX.js +26 -0
  323. package/dist/cesium/Workers/chunk-EQ4YRVWL.js +26 -0
  324. package/dist/cesium/Workers/chunk-F6PRE7D6.js +26 -0
  325. package/dist/cesium/Workers/chunk-FC4ZZ65J.js +26 -0
  326. package/dist/cesium/Workers/chunk-FFBVWF2L.js +26 -0
  327. package/dist/cesium/Workers/chunk-GBAA6GVX.js +26 -0
  328. package/dist/cesium/Workers/chunk-ICALLYLG.js +26 -0
  329. package/dist/cesium/Workers/chunk-ILRYTWTP.js +26 -0
  330. package/dist/cesium/Workers/chunk-IRNLBSEJ.js +26 -0
  331. package/dist/cesium/Workers/chunk-IX4VMHEV.js +26 -0
  332. package/dist/cesium/Workers/chunk-L6QHHACZ.js +26 -0
  333. package/dist/cesium/Workers/chunk-LI2ZSORM.js +26 -0
  334. package/dist/cesium/Workers/chunk-LSLE2RL4.js +26 -0
  335. package/dist/cesium/Workers/chunk-M4HLDBCG.js +26 -0
  336. package/dist/cesium/Workers/chunk-MJHHSGEH.js +26 -0
  337. package/dist/cesium/Workers/chunk-NMVKML6W.js +26 -0
  338. package/dist/cesium/Workers/chunk-OCWJRAXS.js +26 -0
  339. package/dist/cesium/Workers/chunk-OIRKANTH.js +26 -0
  340. package/dist/cesium/Workers/chunk-OIT7J4IC.js +26 -0
  341. package/dist/cesium/Workers/chunk-OLZ3FYUM.js +26 -0
  342. package/dist/cesium/Workers/chunk-Q5BPHJQF.js +26 -0
  343. package/dist/cesium/Workers/chunk-QFM5DCMQ.js +26 -0
  344. package/dist/cesium/Workers/chunk-QKUIYMGC.js +28 -0
  345. package/dist/cesium/Workers/chunk-S44JILQT.js +26 -0
  346. package/dist/cesium/Workers/chunk-SLT4J352.js +26 -0
  347. package/dist/cesium/Workers/chunk-SQMIIXB7.js +26 -0
  348. package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +26 -0
  349. package/dist/cesium/Workers/chunk-TNSUQXWK.js +27 -0
  350. package/dist/cesium/Workers/chunk-UBOGZS7F.js +26 -0
  351. package/dist/cesium/Workers/chunk-V3OSTMM6.js +26 -0
  352. package/dist/cesium/Workers/chunk-V7QEYVP3.js +26 -0
  353. package/dist/cesium/Workers/chunk-VUKYSU4H.js +26 -0
  354. package/dist/cesium/Workers/chunk-W37FE5GR.js +26 -0
  355. package/dist/cesium/Workers/chunk-WBOV35NL.js +26 -0
  356. package/dist/cesium/Workers/chunk-WPMZLB3Y.js +26 -0
  357. package/dist/cesium/Workers/chunk-WWWZVEEH.js +26 -0
  358. package/dist/cesium/Workers/chunk-XFIQ5DEQ.js +28 -0
  359. package/dist/cesium/Workers/chunk-XQHLGIO7.js +26 -0
  360. package/dist/cesium/Workers/chunk-XUSCFAVF.js +26 -0
  361. package/dist/cesium/Workers/chunk-YP7I5QBZ.js +26 -0
  362. package/dist/cesium/Workers/chunk-Z3QF2EHT.js +26 -0
  363. package/dist/cesium/Workers/combineGeometry.js +26 -0
  364. package/dist/cesium/Workers/createBoxGeometry.js +26 -0
  365. package/dist/cesium/Workers/createBoxOutlineGeometry.js +26 -0
  366. package/dist/cesium/Workers/createCircleGeometry.js +26 -0
  367. package/dist/cesium/Workers/createCircleOutlineGeometry.js +26 -0
  368. package/dist/cesium/Workers/createCoplanarPolygonGeometry.js +26 -0
  369. package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
  370. package/dist/cesium/Workers/createCorridorGeometry.js +26 -0
  371. package/dist/cesium/Workers/createCorridorOutlineGeometry.js +26 -0
  372. package/dist/cesium/Workers/createCylinderGeometry.js +26 -0
  373. package/dist/cesium/Workers/createCylinderOutlineGeometry.js +26 -0
  374. package/dist/cesium/Workers/createEllipseGeometry.js +26 -0
  375. package/dist/cesium/Workers/createEllipseOutlineGeometry.js +26 -0
  376. package/dist/cesium/Workers/createEllipsoidGeometry.js +26 -0
  377. package/dist/cesium/Workers/createEllipsoidOutlineGeometry.js +26 -0
  378. package/dist/cesium/Workers/createFrustumGeometry.js +26 -0
  379. package/dist/cesium/Workers/createFrustumOutlineGeometry.js +26 -0
  380. package/dist/cesium/Workers/createGeometry.js +26 -0
  381. package/dist/cesium/Workers/createGroundPolylineGeometry.js +26 -0
  382. package/dist/cesium/Workers/createPlaneGeometry.js +26 -0
  383. package/dist/cesium/Workers/createPlaneOutlineGeometry.js +26 -0
  384. package/dist/cesium/Workers/createPolygonGeometry.js +26 -0
  385. package/dist/cesium/Workers/createPolygonOutlineGeometry.js +26 -0
  386. package/dist/cesium/Workers/createPolylineGeometry.js +26 -0
  387. package/dist/cesium/Workers/createPolylineVolumeGeometry.js +26 -0
  388. package/dist/cesium/Workers/createPolylineVolumeOutlineGeometry.js +26 -0
  389. package/dist/cesium/Workers/createRectangleGeometry.js +26 -0
  390. package/dist/cesium/Workers/createRectangleOutlineGeometry.js +26 -0
  391. package/dist/cesium/Workers/createSimplePolylineGeometry.js +26 -0
  392. package/dist/cesium/Workers/createSphereGeometry.js +26 -0
  393. package/dist/cesium/Workers/createSphereOutlineGeometry.js +26 -0
  394. package/dist/cesium/Workers/createTaskProcessorWorker.js +26 -0
  395. package/dist/cesium/Workers/createVectorTileClampedPolylines.js +26 -0
  396. package/dist/cesium/Workers/createVectorTileGeometries.js +26 -0
  397. package/dist/cesium/Workers/createVectorTilePoints.js +26 -0
  398. package/dist/cesium/Workers/createVectorTilePolygons.js +26 -0
  399. package/dist/cesium/Workers/createVectorTilePolylines.js +26 -0
  400. package/dist/cesium/Workers/createVerticesFromCesium3DTilesTerrain.js +26 -0
  401. package/dist/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +26 -0
  402. package/dist/cesium/Workers/createVerticesFromHeightmap.js +26 -0
  403. package/dist/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +26 -0
  404. package/dist/cesium/Workers/createWallGeometry.js +26 -0
  405. package/dist/cesium/Workers/createWallOutlineGeometry.js +26 -0
  406. package/dist/cesium/Workers/decodeDraco.js +26 -0
  407. package/dist/cesium/Workers/decodeGoogleEarthEnterprisePacket.js +26 -0
  408. package/dist/cesium/Workers/decodeI3S.js +26 -0
  409. package/dist/cesium/Workers/gaussianSplatSorter.js +26 -0
  410. package/dist/cesium/Workers/gaussianSplatTextureGenerator.js +26 -0
  411. package/dist/cesium/Workers/incrementallyBuildTerrainPicker.js +26 -0
  412. package/dist/cesium/Workers/transcodeKTX2.js +56 -0
  413. package/dist/cesium/Workers/transferTypedArrayTest.js +26 -0
  414. package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
  415. package/dist/cesium/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +26 -0
  416. package/dist/index.html +13 -10
  417. package/index.html +1 -0
  418. package/package.json +18 -15
  419. package/src/App.tsx +7 -9
  420. package/src/components/viewer/BCFPanel.tsx +46 -4
  421. package/src/components/viewer/CesiumOverlay.tsx +715 -0
  422. package/src/components/viewer/CesiumSettingsDialog.tsx +100 -0
  423. package/src/components/viewer/ChatPanel.tsx +232 -90
  424. package/src/components/viewer/CommandPalette.tsx +6 -1
  425. package/src/components/viewer/DesktopEntitlementBanner.tsx +74 -0
  426. package/src/components/viewer/ExportChangesButton.tsx +6 -1
  427. package/src/components/viewer/ExportDialog.tsx +22 -6
  428. package/src/components/viewer/HierarchyPanel.tsx +196 -0
  429. package/src/components/viewer/IDSPanel.tsx +52 -3
  430. package/src/components/viewer/KeyboardShortcutsDialog.tsx +1 -1
  431. package/src/components/viewer/MainToolbar.tsx +355 -28
  432. package/src/components/viewer/PropertiesPanel.tsx +234 -81
  433. package/src/components/viewer/ScriptPanel.tsx +34 -8
  434. package/src/components/viewer/SettingsPage.tsx +581 -0
  435. package/src/components/viewer/StatusBar.tsx +17 -1
  436. package/src/components/viewer/ThemeSwitch.tsx +63 -7
  437. package/src/components/viewer/ViewerLayout.tsx +48 -6
  438. package/src/components/viewer/Viewport.tsx +61 -8
  439. package/src/components/viewer/ViewportContainer.tsx +265 -28
  440. package/src/components/viewer/ViewportOverlays.tsx +132 -27
  441. package/src/components/viewer/bcf/BCFTopicDetail.tsx +4 -4
  442. package/src/components/viewer/chat/ModelSelector.tsx +90 -54
  443. package/src/components/viewer/properties/GeoreferencingPanel.tsx +229 -55
  444. package/src/components/viewer/properties/LocationMap.tsx +462 -19
  445. package/src/components/viewer/properties/ModelMetadataPanel.tsx +1 -1
  446. package/src/components/viewer/selectionHandlers.ts +4 -3
  447. package/src/components/viewer/tools/SectionCapControls.tsx +237 -0
  448. package/src/components/viewer/tools/SectionPanel.tsx +39 -18
  449. package/src/components/viewer/useAnimationLoop.ts +13 -1
  450. package/src/components/viewer/useGeometryStreaming.ts +127 -40
  451. package/src/components/viewer/useMouseControls.ts +4 -1
  452. package/src/components/viewer/useRenderUpdates.ts +1 -1
  453. package/src/hooks/ids/idsDataAccessor.ts +60 -24
  454. package/src/hooks/ingest/viewerModelIngest.ts +280 -0
  455. package/src/hooks/useIDS.ts +1 -1
  456. package/src/hooks/useIfc.ts +7 -1
  457. package/src/hooks/useIfcCache.ts +28 -15
  458. package/src/hooks/useIfcFederation.ts +378 -291
  459. package/src/hooks/useIfcLoader.ts +1657 -130
  460. package/src/hooks/useIfcServer.ts +0 -69
  461. package/src/hooks/useViewControls.ts +13 -5
  462. package/src/index.css +484 -10
  463. package/src/lib/desktop/desktopEntitlementEvents.ts +39 -0
  464. package/src/lib/desktop-entitlement.ts +43 -0
  465. package/src/lib/desktop-product.ts +124 -0
  466. package/src/lib/geo/cesium-bridge.ts +318 -0
  467. package/src/lib/geo/effective-georef.test.ts +73 -0
  468. package/src/lib/geo/effective-georef.ts +111 -0
  469. package/src/lib/geo/reproject.ts +249 -37
  470. package/src/lib/llm/byok-guard.test.ts +77 -0
  471. package/src/lib/llm/byok-guard.ts +39 -0
  472. package/src/lib/llm/free-models.test.ts +0 -6
  473. package/src/lib/llm/models.ts +104 -42
  474. package/src/lib/llm/stream-client.ts +74 -110
  475. package/src/lib/llm/stream-direct.test.ts +130 -0
  476. package/src/lib/llm/stream-direct.ts +316 -0
  477. package/src/lib/llm/types.ts +14 -2
  478. package/src/lib/recent-files.ts +2 -1
  479. package/src/main.tsx +1 -10
  480. package/src/services/analysis-extensions.ts +125 -0
  481. package/src/services/api-keys.ts +73 -0
  482. package/src/services/app-navigation.ts +13 -0
  483. package/src/services/bsdd.ts +53 -4
  484. package/src/services/cacheService.ts +1 -1
  485. package/src/services/desktop-cache.ts +43 -0
  486. package/src/services/desktop-export.ts +77 -0
  487. package/src/services/desktop-harness.ts +196 -0
  488. package/src/services/desktop-logger.ts +20 -0
  489. package/src/services/desktop-native-metadata.ts +207 -0
  490. package/src/services/desktop-panel-actions.ts +43 -0
  491. package/src/services/desktop-preferences.ts +44 -0
  492. package/src/services/file-dialog.ts +147 -0
  493. package/src/services/tauri-core-stub.ts +7 -0
  494. package/src/services/tauri-dialog-stub.ts +7 -0
  495. package/src/services/tauri-fs-stub.ts +7 -0
  496. package/src/store/constants.ts +20 -2
  497. package/src/store/index.ts +52 -7
  498. package/src/store/slices/cesiumSlice.ts +127 -0
  499. package/src/store/slices/chatSlice.test.ts +6 -76
  500. package/src/store/slices/chatSlice.ts +21 -58
  501. package/src/store/slices/dataSlice.ts +139 -28
  502. package/src/store/slices/desktopEntitlementSlice.ts +86 -0
  503. package/src/store/slices/loadingSlice.ts +14 -2
  504. package/src/store/slices/modelSlice.ts +58 -3
  505. package/src/store/slices/sectionSlice.test.ts +87 -7
  506. package/src/store/slices/sectionSlice.ts +151 -5
  507. package/src/store/slices/uiSlice.ts +28 -5
  508. package/src/store/types.ts +122 -2
  509. package/src/store.ts +1 -1
  510. package/src/utils/desktopModelSnapshot.ts +358 -0
  511. package/src/utils/ifcConfig.ts +6 -1
  512. package/src/utils/nativeSpatialDataStore.ts +253 -0
  513. package/src/utils/serverDataModel.ts +4 -0
  514. package/src/utils/spatialHierarchy.ts +10 -11
  515. package/src/utils/viewportUtils.ts +7 -2
  516. package/src/vite-env.d.ts +0 -4
  517. package/vite.config.ts +24 -0
  518. package/dist/assets/arrow-DJf2ErbF.js +0 -20
  519. package/dist/assets/basketViewActivator-aojwdomq.js +0 -1
  520. package/dist/assets/desktop-cache-oPzaWXYE.js +0 -1
  521. package/dist/assets/drawing-2d-gWfpdfYe.js +0 -257
  522. package/dist/assets/geometry.worker-Nz9_YIqh.js +0 -1
  523. package/dist/assets/ids-B4jTqB1O.js +0 -1
  524. package/dist/assets/ifc-lite_bg-eSkBTizQ.wasm +0 -0
  525. package/dist/assets/index-pbE7itQS.css +0 -1
  526. package/dist/assets/native-bridge-DSIyEYXG.js +0 -113
  527. package/dist/assets/wasm-bridge-B0J07fZZ.js +0 -1
  528. package/src/components/viewer/UpgradePage.tsx +0 -69
  529. package/src/lib/llm/ClerkChatSync.tsx +0 -74
  530. package/src/lib/llm/clerk-auth.ts +0 -62
@@ -129,6 +129,8 @@ export interface UseMouseControlsParams {
129
129
  RENDER_THROTTLE_MS_SMALL: number;
130
130
  RENDER_THROTTLE_MS_LARGE: number;
131
131
  RENDER_THROTTLE_MS_HUGE: number;
132
+ /** When true, wheel zoom uses unrestricted pure-dolly mode (Cesium) */
133
+ fastZoomRef: MutableRefObject<boolean>;
132
134
  }
133
135
 
134
136
  export function useMouseControls(params: UseMouseControlsParams): void {
@@ -476,7 +478,8 @@ export function useMouseControls(params: UseMouseControlsParams): void {
476
478
  const rect = canvas.getBoundingClientRect();
477
479
  const mouseX = e.clientX - rect.left;
478
480
  const mouseY = e.clientY - rect.top;
479
- camera.zoom(e.deltaY, false, mouseX, mouseY, canvas.width, canvas.height);
481
+ const fastZoom = e.shiftKey || params.fastZoomRef.current;
482
+ camera.zoom(e.deltaY, false, mouseX, mouseY, canvas.width, canvas.height, fastZoom);
480
483
 
481
484
  isInteractingRef.current = true;
482
485
  renderer.requestRender();
@@ -77,7 +77,7 @@ export function useRenderUpdates(params: UseRenderUpdatesParams): void {
77
77
 
78
78
  // Theme-aware clear color update
79
79
  useEffect(() => {
80
- clearColorRef.current = getThemeClearColor(theme as 'light' | 'dark');
80
+ clearColorRef.current = getThemeClearColor(theme as 'light' | 'dark' | 'colorful');
81
81
  rendererRef.current?.requestRender();
82
82
  }, [theme, isInitialized]);
83
83
 
@@ -19,7 +19,11 @@ import type {
19
19
  ParentInfo,
20
20
  PartOfRelation,
21
21
  } from '@ifc-lite/ids';
22
- import type { IfcDataStore } from '@ifc-lite/parser';
22
+ import {
23
+ type IfcDataStore,
24
+ extractAllEntityAttributes,
25
+ extractTypeEntityOwnProperties,
26
+ } from '@ifc-lite/parser';
23
27
 
24
28
  /**
25
29
  * Create an IFCDataAccessor from an IfcDataStore
@@ -59,7 +63,26 @@ export function createDataAccessor(
59
63
  },
60
64
 
61
65
  getObjectType(expressId: number): string | undefined {
62
- return dataStore.entities?.getObjectType?.(expressId);
66
+ // Try the pre-computed ObjectType first (works for IfcObject subtypes)
67
+ const objectType = dataStore.entities?.getObjectType?.(expressId);
68
+ if (objectType) return objectType;
69
+
70
+ // For IfcTypeObject subtypes (IfcWallType, etc.), ObjectType doesn't exist —
71
+ // we need to extract PredefinedType from entity attributes instead.
72
+ // Also handles IfcObject subtypes that have PredefinedType at different positions.
73
+ const allAttrs = extractAllEntityAttributes(dataStore, expressId);
74
+ const predefinedType = allAttrs.find(a => a.name === 'PredefinedType');
75
+ if (predefinedType?.value && predefinedType.value !== 'NOTDEFINED') {
76
+ return predefinedType.value;
77
+ }
78
+
79
+ // If PredefinedType is USERDEFINED or absent, check ObjectType from attributes
80
+ const objTypeAttr = allAttrs.find(a => a.name === 'ObjectType');
81
+ if (objTypeAttr?.value) {
82
+ return objTypeAttr.value;
83
+ }
84
+
85
+ return undefined;
63
86
  },
64
87
 
65
88
  getEntitiesByType(typeName: string): number[] {
@@ -119,29 +142,42 @@ export function createDataAccessor(
119
142
 
120
143
  getPropertySets(expressId: number): PropertySetInfo[] {
121
144
  const propertiesStore = dataStore.properties;
122
- if (!propertiesStore) return [];
123
145
 
124
- // Use getForEntity (returns PropertySet[])
125
- const psets = propertiesStore.getForEntity?.(expressId);
126
- if (!psets) return [];
127
-
128
- return psets.map((pset) => ({
129
- name: pset.name,
130
- properties: (pset.properties || []).map((prop) => {
131
- // Convert value: ensure it's a primitive type (not array)
132
- let value: string | number | boolean | null = null;
133
- if (Array.isArray(prop.value)) {
134
- value = JSON.stringify(prop.value);
135
- } else {
136
- value = prop.value as string | number | boolean | null;
137
- }
138
- return {
139
- name: prop.name,
140
- value,
141
- dataType: String(prop.type || 'IFCLABEL'),
142
- };
143
- }),
144
- }));
146
+ // Try relationship-based properties first (works for IfcObject instances)
147
+ const psets = propertiesStore?.getForEntity?.(expressId);
148
+
149
+ // Convert property sets to the IDS format
150
+ const mapPsets = (rawPsets: Array<{ name: string; properties: Array<{ name: string; value: unknown; type: unknown }> }>): PropertySetInfo[] =>
151
+ rawPsets.map((pset) => ({
152
+ name: pset.name,
153
+ properties: (pset.properties || []).map((prop) => {
154
+ let value: string | number | boolean | null = null;
155
+ if (Array.isArray(prop.value)) {
156
+ value = JSON.stringify(prop.value);
157
+ } else {
158
+ value = prop.value as string | number | boolean | null;
159
+ }
160
+ return {
161
+ name: prop.name,
162
+ value,
163
+ dataType: String(prop.type || 'IFCLABEL'),
164
+ };
165
+ }),
166
+ }));
167
+
168
+ if (psets && psets.length > 0) {
169
+ return mapPsets(psets);
170
+ }
171
+
172
+ // For IfcTypeObject subtypes (IfcWallType, IfcSlabType, etc.),
173
+ // properties come from the HasPropertySets attribute (index 5),
174
+ // not from IfcRelDefinesByProperties relationships.
175
+ const typePsets = extractTypeEntityOwnProperties(dataStore, expressId);
176
+ if (typePsets.length > 0) {
177
+ return mapPsets(typePsets);
178
+ }
179
+
180
+ return [];
145
181
  },
146
182
 
147
183
  getClassifications(expressId: number): ClassificationInfo[] {
@@ -0,0 +1,280 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+
5
+ import { IfcParser, parseIfcx, type IfcDataStore } from '@ifc-lite/parser';
6
+ import { GeometryProcessor, GeometryQuality, type CoordinateInfo, type DynamicBatchConfig, type GeometryResult, type MeshData } from '@ifc-lite/geometry';
7
+ import { loadGLBToMeshData } from '@ifc-lite/cache';
8
+ import type { SchemaVersion } from '../../store/types.js';
9
+ import { calculateMeshBounds, calculateStoreyHeights, createCoordinateInfo, normalizeColor } from '../../utils/localParsingUtils.js';
10
+
11
+ type RgbaColor = [number, number, number, number];
12
+
13
+ interface RawIfcxMesh {
14
+ expressId?: number;
15
+ express_id?: number;
16
+ id?: number;
17
+ positions: Float32Array | number[];
18
+ indices: Uint32Array | number[];
19
+ normals: Float32Array | number[];
20
+ color?: [number, number, number, number] | [number, number, number];
21
+ ifcType?: string;
22
+ ifc_type?: string;
23
+ }
24
+
25
+ export interface ViewerModelPayload {
26
+ dataStore: IfcDataStore;
27
+ geometryResult: GeometryResult;
28
+ schemaVersion: SchemaVersion;
29
+ }
30
+
31
+ export interface StepBatchEvent {
32
+ batchIndex: number;
33
+ estimatedTotal: number;
34
+ totalSoFar: number;
35
+ meshes: MeshData[];
36
+ coordinateInfo?: CoordinateInfo | null;
37
+ }
38
+
39
+ export interface StepRtcOffsetEvent {
40
+ rtcOffset: { x: number; y: number; z: number };
41
+ }
42
+
43
+ export interface StepBufferIngestOptions {
44
+ fileName: string;
45
+ buffer: ArrayBuffer;
46
+ fileSizeMB: number;
47
+ getDynamicBatchSize: (fileSizeMB: number) => number | DynamicBatchConfig;
48
+ onProgress?: (progress: { phase: string; percent: number }) => void;
49
+ onBatch?: (event: StepBatchEvent) => void;
50
+ onColorUpdate?: (updates: Map<number, RgbaColor>) => void;
51
+ onSpatialReady?: (dataStore: IfcDataStore) => void;
52
+ onRtcOffset?: (event: StepRtcOffsetEvent) => void;
53
+ shouldAbort?: () => boolean;
54
+ /** Shared RTC offset from first federated model (IFC Z-up coords).
55
+ * When set, this model uses the same RTC as the first model instead of
56
+ * computing its own, ensuring all models share the same coordinate space. */
57
+ sharedRtcOffset?: { x: number; y: number; z: number };
58
+ }
59
+
60
+ export interface StepBufferIngestResult extends ViewerModelPayload {
61
+ allMeshes: MeshData[];
62
+ cumulativeColorUpdates: Map<number, RgbaColor>;
63
+ }
64
+
65
+ export function convertIfcxMeshes(rawMeshes: RawIfcxMesh[]): MeshData[] {
66
+ return rawMeshes.map((mesh) => {
67
+ const positions = mesh.positions instanceof Float32Array ? mesh.positions : new Float32Array(mesh.positions || []);
68
+ const indices = mesh.indices instanceof Uint32Array ? mesh.indices : new Uint32Array(mesh.indices || []);
69
+ const normals = mesh.normals instanceof Float32Array ? mesh.normals : new Float32Array(mesh.normals || []);
70
+
71
+ return {
72
+ expressId: mesh.expressId ?? mesh.express_id ?? mesh.id ?? 0,
73
+ positions,
74
+ indices,
75
+ normals,
76
+ color: normalizeColor(mesh.color),
77
+ ifcType: mesh.ifcType ?? mesh.ifc_type ?? 'IfcProduct',
78
+ };
79
+ }).filter((mesh) => mesh.positions.length > 0 && mesh.indices.length > 0);
80
+ }
81
+
82
+ export function createMinimalGlbDataStore(buffer: ArrayBuffer, meshCount: number): IfcDataStore {
83
+ return {
84
+ fileSize: buffer.byteLength,
85
+ schemaVersion: 'IFC4' as const,
86
+ entityCount: meshCount,
87
+ parseTime: 0,
88
+ source: new Uint8Array(0),
89
+ entityIndex: { byId: new Map(), byType: new Map() },
90
+ strings: { getString: () => undefined, getStringId: () => undefined, count: 0 } as unknown as IfcDataStore['strings'],
91
+ entities: { count: 0, getId: () => 0, getType: () => 0, getName: () => undefined, getGlobalId: () => undefined } as unknown as IfcDataStore['entities'],
92
+ properties: { count: 0, getPropertiesForEntity: () => [], getPropertySetForEntity: () => [] } as unknown as IfcDataStore['properties'],
93
+ quantities: { count: 0, getQuantitiesForEntity: () => [] } as unknown as IfcDataStore['quantities'],
94
+ relationships: { count: 0, getRelationships: () => [], getRelated: () => [] } as unknown as IfcDataStore['relationships'],
95
+ spatialHierarchy: null as unknown as IfcDataStore['spatialHierarchy'],
96
+ } as unknown as IfcDataStore;
97
+ }
98
+
99
+ export function normalizeDataStoreStoreys(dataStore: IfcDataStore): IfcDataStore {
100
+ if (dataStore.spatialHierarchy && dataStore.spatialHierarchy.storeyHeights.size === 0 && dataStore.spatialHierarchy.storeyElevations.size > 1) {
101
+ const calculatedHeights = calculateStoreyHeights(dataStore.spatialHierarchy.storeyElevations);
102
+ for (const [storeyId, height] of calculatedHeights) {
103
+ dataStore.spatialHierarchy.storeyHeights.set(storeyId, height);
104
+ }
105
+ }
106
+ return dataStore;
107
+ }
108
+
109
+ export function getMaxExpressId(dataStore: IfcDataStore, meshes: MeshData[]): number {
110
+ const maxExpressIdFromMeshes = meshes.reduce((max, mesh) => Math.max(max, mesh.expressId), 0);
111
+ let maxExpressIdFromEntities = 0;
112
+ if (dataStore.entityIndex?.byId) {
113
+ for (const key of dataStore.entityIndex.byId.keys()) {
114
+ if (key > maxExpressIdFromEntities) {
115
+ maxExpressIdFromEntities = key;
116
+ }
117
+ }
118
+ }
119
+ return Math.max(maxExpressIdFromMeshes, maxExpressIdFromEntities);
120
+ }
121
+
122
+ export async function parseIfcxViewerModel(
123
+ buffer: ArrayBuffer,
124
+ onProgress?: (progress: { phase: string; percent: number }) => void,
125
+ ): Promise<ViewerModelPayload> {
126
+ const ifcxResult = await parseIfcx(buffer, {
127
+ onProgress: (progress) => {
128
+ onProgress?.({
129
+ phase: `IFCX ${progress.phase}`,
130
+ percent: 10 + (progress.percent * 0.8),
131
+ });
132
+ },
133
+ });
134
+
135
+ const meshes = convertIfcxMeshes(ifcxResult.meshes);
136
+ if (meshes.length === 0 && ifcxResult.entityCount > 0) {
137
+ throw new Error('overlay-only-ifcx');
138
+ }
139
+
140
+ const { bounds, stats } = calculateMeshBounds(meshes);
141
+ return {
142
+ dataStore: {
143
+ fileSize: ifcxResult.fileSize,
144
+ schemaVersion: 'IFC5' as const,
145
+ entityCount: ifcxResult.entityCount,
146
+ parseTime: ifcxResult.parseTime,
147
+ source: new Uint8Array(buffer),
148
+ entityIndex: { byId: new Map(), byType: new Map() },
149
+ strings: ifcxResult.strings,
150
+ entities: ifcxResult.entities,
151
+ properties: ifcxResult.properties,
152
+ quantities: ifcxResult.quantities,
153
+ relationships: ifcxResult.relationships,
154
+ spatialHierarchy: ifcxResult.spatialHierarchy,
155
+ } as unknown as IfcDataStore,
156
+ geometryResult: {
157
+ meshes,
158
+ totalVertices: stats.totalVertices,
159
+ totalTriangles: stats.totalTriangles,
160
+ coordinateInfo: createCoordinateInfo(bounds),
161
+ },
162
+ schemaVersion: 'IFC5',
163
+ };
164
+ }
165
+
166
+ export async function parseGlbViewerModel(buffer: ArrayBuffer): Promise<ViewerModelPayload> {
167
+ const meshes = loadGLBToMeshData(new Uint8Array(buffer));
168
+ if (meshes.length === 0) {
169
+ throw new Error('glb-empty');
170
+ }
171
+
172
+ const { bounds, stats } = calculateMeshBounds(meshes);
173
+ return {
174
+ dataStore: createMinimalGlbDataStore(buffer, meshes.length),
175
+ geometryResult: {
176
+ meshes,
177
+ totalVertices: stats.totalVertices,
178
+ totalTriangles: stats.totalTriangles,
179
+ coordinateInfo: createCoordinateInfo(bounds),
180
+ },
181
+ schemaVersion: 'IFC4',
182
+ };
183
+ }
184
+
185
+ export async function parseStepBufferViewerModel(options: StepBufferIngestOptions): Promise<StepBufferIngestResult> {
186
+ const geometryProcessor = new GeometryProcessor({ quality: GeometryQuality.Balanced });
187
+ await geometryProcessor.init();
188
+
189
+ const parser = new IfcParser();
190
+ const wasmApi = geometryProcessor.getApi();
191
+ const allMeshes: MeshData[] = [];
192
+ const cumulativeColorUpdates = new Map<number, RgbaColor>();
193
+ let finalCoordinateInfo: CoordinateInfo | null = null;
194
+ let batchIndex = 0;
195
+ let estimatedTotal = 0;
196
+ let capturedRtcOffset: { x: number; y: number; z: number } | null = null;
197
+
198
+ const dataStorePromise = parser.parseColumnar(options.buffer, {
199
+ wasmApi,
200
+ onSpatialReady: (partialStore) => {
201
+ if (options.shouldAbort?.()) {
202
+ return;
203
+ }
204
+ options.onSpatialReady?.(normalizeDataStoreStoreys(partialStore));
205
+ },
206
+ });
207
+
208
+ for await (const event of geometryProcessor.processAdaptive(new Uint8Array(options.buffer), {
209
+ sizeThreshold: 2 * 1024 * 1024,
210
+ batchSize: options.getDynamicBatchSize(options.fileSizeMB),
211
+ sharedRtcOffset: options.sharedRtcOffset,
212
+ })) {
213
+ if (options.shouldAbort?.()) {
214
+ break;
215
+ }
216
+ switch (event.type) {
217
+ case 'start':
218
+ estimatedTotal = event.totalEstimate;
219
+ break;
220
+ case 'colorUpdate':
221
+ for (const [expressId, color] of event.updates) {
222
+ cumulativeColorUpdates.set(expressId, color);
223
+ }
224
+ options.onColorUpdate?.(event.updates);
225
+ break;
226
+ case 'rtcOffset':
227
+ if (event.hasRtc) {
228
+ capturedRtcOffset = event.rtcOffset;
229
+ options.onRtcOffset?.({ rtcOffset: event.rtcOffset });
230
+ }
231
+ break;
232
+ case 'batch':
233
+ batchIndex += 1;
234
+ for (let i = 0; i < event.meshes.length; i++) {
235
+ allMeshes.push(event.meshes[i]);
236
+ }
237
+ finalCoordinateInfo = event.coordinateInfo ?? null;
238
+ options.onBatch?.({
239
+ batchIndex,
240
+ estimatedTotal,
241
+ totalSoFar: event.totalSoFar,
242
+ meshes: event.meshes,
243
+ coordinateInfo: event.coordinateInfo ?? null,
244
+ });
245
+ options.onProgress?.({
246
+ phase: `Processing geometry (${event.totalSoFar} meshes)`,
247
+ percent: 10 + Math.min(80, (allMeshes.length / 1000) * 0.8),
248
+ });
249
+ break;
250
+ case 'complete':
251
+ finalCoordinateInfo = event.coordinateInfo ?? null;
252
+ break;
253
+ }
254
+ }
255
+
256
+ const dataStore = normalizeDataStoreStoreys(await dataStorePromise);
257
+ if (!finalCoordinateInfo) {
258
+ finalCoordinateInfo = createCoordinateInfo(calculateMeshBounds(allMeshes).bounds);
259
+ }
260
+ if (capturedRtcOffset) {
261
+ finalCoordinateInfo.wasmRtcOffset = capturedRtcOffset;
262
+ }
263
+
264
+ return {
265
+ dataStore,
266
+ geometryResult: {
267
+ meshes: allMeshes,
268
+ totalVertices: allMeshes.reduce((sum, mesh) => sum + mesh.positions.length / 3, 0),
269
+ totalTriangles: allMeshes.reduce((sum, mesh) => sum + mesh.indices.length / 3, 0),
270
+ coordinateInfo: finalCoordinateInfo,
271
+ },
272
+ schemaVersion: dataStore.schemaVersion === 'IFC4X3'
273
+ ? 'IFC4X3'
274
+ : dataStore.schemaVersion === 'IFC4'
275
+ ? 'IFC4'
276
+ : 'IFC2X3',
277
+ allMeshes,
278
+ cumulativeColorUpdates,
279
+ };
280
+ }
@@ -793,7 +793,7 @@ export function useIDS(options: UseIDSOptions = {}): UseIDSResult {
793
793
  const url = URL.createObjectURL(blob);
794
794
  const a = globalThis.document.createElement('a');
795
795
  a.href = url;
796
- a.download = `ids-report-${new Date().toISOString().split('T')[0]}.bcf`;
796
+ a.download = `ids-report-${new Date().toISOString().split('T')[0]}.bcfzip`;
797
797
  a.click();
798
798
  URL.revokeObjectURL(url);
799
799
 
@@ -14,7 +14,7 @@
14
14
 
15
15
  import { useMemo, useRef } from 'react';
16
16
  import { useShallow } from 'zustand/react/shallow';
17
- import { useViewerStore } from '../store.js';
17
+ import { useViewerStore } from '@/store';
18
18
  import { IfcQuery } from '@ifc-lite/query';
19
19
  import type { IfcDataStore } from '@ifc-lite/parser';
20
20
 
@@ -26,6 +26,8 @@ export function useIfc() {
26
26
  const {
27
27
  loading,
28
28
  progress,
29
+ geometryProgress,
30
+ metadataProgress,
29
31
  error,
30
32
  ifcDataStore,
31
33
  geometryResult,
@@ -45,6 +47,8 @@ export function useIfc() {
45
47
  } = useViewerStore(useShallow((s) => ({
46
48
  loading: s.loading,
47
49
  progress: s.progress,
50
+ geometryProgress: s.geometryProgress,
51
+ metadataProgress: s.metadataProgress,
48
52
  error: s.error,
49
53
  ifcDataStore: s.ifcDataStore,
50
54
  geometryResult: s.geometryResult,
@@ -94,6 +98,8 @@ export function useIfc() {
94
98
  // Legacy single-model API (backward compatibility)
95
99
  loading,
96
100
  progress,
101
+ geometryProgress,
102
+ metadataProgress,
97
103
  error,
98
104
  ifcDataStore,
99
105
  geometryResult,
@@ -16,7 +16,7 @@ import {
16
16
  type IfcDataStore as CacheDataStore,
17
17
  type GeometryData,
18
18
  } from '@ifc-lite/cache';
19
- import { SpatialHierarchyBuilder, StepTokenizer, buildCompactEntityIndex, extractLengthUnitScale, type IfcDataStore } from '@ifc-lite/parser';
19
+ import { SpatialHierarchyBuilder, StepTokenizer, CompactEntityIndexBuilder, extractLengthUnitScale, type IfcDataStore } from '@ifc-lite/parser';
20
20
  import { buildSpatialIndexGuarded } from '../utils/loadingUtils.js';
21
21
  import type { MeshData } from '@ifc-lite/geometry';
22
22
 
@@ -55,6 +55,13 @@ export interface CacheGeometryResult {
55
55
  };
56
56
  }
57
57
 
58
+ export interface CacheLoadResult {
59
+ success: boolean;
60
+ meshCount: number;
61
+ totalVertices: number;
62
+ totalTriangles: number;
63
+ }
64
+
58
65
  // ============================================================================
59
66
  // Hook
60
67
  // ============================================================================
@@ -81,7 +88,7 @@ export function useIfcCache() {
81
88
  cacheResult: CacheResult,
82
89
  fileName: string,
83
90
  cacheKey?: string
84
- ): Promise<boolean> => {
91
+ ): Promise<CacheLoadResult> => {
85
92
  try {
86
93
  const cacheLoadStart = performance.now();
87
94
  setProgress({ phase: 'Loading from cache', percent: 10 });
@@ -100,19 +107,16 @@ export function useIfcCache() {
100
107
  if (cacheResult.sourceBuffer) {
101
108
  dataStore.source = new Uint8Array(cacheResult.sourceBuffer);
102
109
 
103
- // Quick scan to rebuild entity index with byte offsets (needed for on-demand extraction)
110
+ // Quick scan to rebuild entity index with byte offsets (needed for on-demand extraction).
111
+ // Uses CompactEntityIndexBuilder to fill typed arrays directly during the scan,
112
+ // avoiding a temporary array of 4.4M+ objects (~350MB for large files).
104
113
  const tokenizer = new StepTokenizer(dataStore.source);
105
- const entityRefs: Array<{ expressId: number; type: string; byteOffset: number; byteLength: number; lineNumber: number }> = [];
114
+ const estimatedCount = dataStore.entities?.count ?? 100_000;
115
+ const indexBuilder = new CompactEntityIndexBuilder(estimatedCount);
106
116
  const byType = new Map<string, number[]>();
107
117
 
108
118
  for (const ref of tokenizer.scanEntitiesFast()) {
109
- entityRefs.push({
110
- expressId: ref.expressId,
111
- type: ref.type,
112
- byteOffset: ref.offset,
113
- byteLength: ref.length,
114
- lineNumber: ref.line,
115
- });
119
+ indexBuilder.add(ref.expressId, ref.type, ref.offset, ref.length);
116
120
  let typeList = byType.get(ref.type);
117
121
  if (!typeList) {
118
122
  typeList = [];
@@ -120,8 +124,7 @@ export function useIfcCache() {
120
124
  }
121
125
  typeList.push(ref.expressId);
122
126
  }
123
- // Use compact entity index (typed arrays) for lower memory usage
124
- const compactByIdIndex = buildCompactEntityIndex(entityRefs);
127
+ const compactByIdIndex = indexBuilder.build();
125
128
  dataStore.entityIndex = { byId: compactByIdIndex, byType };
126
129
 
127
130
  // Rebuild on-demand maps from relationships
@@ -201,7 +204,12 @@ export function useIfcCache() {
201
204
  const meshCount = result.geometry?.meshes.length || 0;
202
205
  console.log(`[useIfcCache] ✓ ${fileName} (cached) → ${meshCount} meshes | ${totalCacheTime.toFixed(0)}ms`);
203
206
 
204
- return true;
207
+ return {
208
+ success: true,
209
+ meshCount,
210
+ totalVertices: result.geometry?.totalVertices || 0,
211
+ totalTriangles: result.geometry?.totalTriangles || 0,
212
+ };
205
213
  } catch (err) {
206
214
  console.error('[useIfcCache] Failed to load from cache:', err);
207
215
  // Clear corrupted cache entry if we have the key
@@ -213,7 +221,12 @@ export function useIfcCache() {
213
221
  // Ignore cleanup errors
214
222
  }
215
223
  }
216
- return false;
224
+ return {
225
+ success: false,
226
+ meshCount: 0,
227
+ totalVertices: 0,
228
+ totalTriangles: 0,
229
+ };
217
230
  }
218
231
  }, [setProgress, setIfcDataStore, setGeometryResult]);
219
232