@ifc-lite/viewer 1.17.2 → 1.17.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (520) hide show
  1. package/.turbo/turbo-build.log +34 -24
  2. package/.turbo/turbo-typecheck.log +1 -42
  3. package/CHANGELOG.md +24 -0
  4. package/DESKTOP_CONTRACT_VERSION +1 -0
  5. package/dist/assets/arrow-CZ5kQ26f.js +20 -0
  6. package/dist/assets/basketViewActivator-BmnNtVfZ.js +1 -0
  7. package/dist/assets/bcf-DOG9_WPX.js +281 -0
  8. package/dist/assets/{browser-BDShTXzi.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-gWfpdfYe.js +257 -0
  12. package/dist/assets/epsg-index.generated-BjJrt_0S.js +1 -0
  13. package/dist/assets/exporters-ChAtBmlj.js +80367 -0
  14. package/dist/assets/geometry.worker-BQ0rzNo-.js +1 -0
  15. package/dist/assets/ids-B4jTqB1O.js +1 -0
  16. package/dist/assets/ifc-lite_bg-BX4E7TX8.wasm +0 -0
  17. package/dist/assets/index-Co8E2-FE.js +106013 -0
  18. package/dist/assets/index-DckuDqlv.css +1 -0
  19. package/dist/assets/lens-CSASnhAL.js +1 -0
  20. package/dist/assets/maplibre-gl-CGLcoNXc.js +811 -0
  21. package/dist/assets/native-bridge-BRvbckFQ.js +429 -0
  22. package/dist/assets/{arrow2-bb-jcVEo.js → parquet-CEXmQNRO.js} +2 -2
  23. package/dist/assets/sandbox-DZiNLNMk.js +5933 -0
  24. package/dist/assets/server-client-BV8zHZ7Y.js +626 -0
  25. package/dist/assets/tauri-core-stub-D8Fa-u43.js +1 -0
  26. package/dist/assets/tauri-dialog-stub-r7Wksg7o.js +1 -0
  27. package/dist/assets/tauri-fs-stub-BdeRC7aK.js +1 -0
  28. package/dist/assets/wasm-bridge-g01g7T9b.js +1 -0
  29. package/dist/assets/zip-DBEtpeu6.js +12 -0
  30. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
  31. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
  32. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
  33. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
  34. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
  35. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
  36. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
  37. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
  38. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
  39. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
  40. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
  41. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
  42. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
  43. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
  44. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
  45. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
  46. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
  47. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
  48. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
  49. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
  50. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
  51. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
  52. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
  53. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
  54. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
  55. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
  56. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
  57. package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
  58. package/dist/cesium/Assets/Images/bing_maps_credit.png +0 -0
  59. package/dist/cesium/Assets/Images/cesium_credit.png +0 -0
  60. package/dist/cesium/Assets/Images/google_earth_credit.png +0 -0
  61. package/dist/cesium/Assets/Images/ion-credit.png +0 -0
  62. package/dist/cesium/Assets/Textures/LensFlare/DirtMask.jpg +0 -0
  63. package/dist/cesium/Assets/Textures/LensFlare/StarBurst.jpg +0 -0
  64. package/dist/cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg +0 -0
  65. package/dist/cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg +0 -0
  66. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg +0 -0
  67. package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg +0 -0
  68. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg +0 -0
  69. package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg +0 -0
  70. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg +0 -0
  71. package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg +0 -0
  72. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg +0 -0
  73. package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg +0 -0
  74. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg +0 -0
  75. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg +0 -0
  76. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg +0 -0
  77. package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg +0 -0
  78. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg +0 -0
  79. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg +0 -0
  80. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg +0 -0
  81. package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg +0 -0
  82. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg +0 -0
  83. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg +0 -0
  84. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg +0 -0
  85. package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg +0 -0
  86. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg +0 -0
  87. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg +0 -0
  88. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg +0 -0
  89. package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg +0 -0
  90. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg +0 -0
  91. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg +0 -0
  92. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg +0 -0
  93. package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg +0 -0
  94. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg +0 -0
  95. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg +0 -0
  96. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg +0 -0
  97. package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg +0 -0
  98. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg +0 -0
  99. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg +0 -0
  100. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg +0 -0
  101. package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg +0 -0
  102. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg +0 -0
  103. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg +0 -0
  104. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg +0 -0
  105. package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg +0 -0
  106. package/dist/cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml +14 -0
  107. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
  108. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
  109. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
  110. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
  111. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
  112. package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
  113. package/dist/cesium/Assets/Textures/maki/airfield.png +0 -0
  114. package/dist/cesium/Assets/Textures/maki/airport.png +0 -0
  115. package/dist/cesium/Assets/Textures/maki/alcohol-shop.png +0 -0
  116. package/dist/cesium/Assets/Textures/maki/america-football.png +0 -0
  117. package/dist/cesium/Assets/Textures/maki/art-gallery.png +0 -0
  118. package/dist/cesium/Assets/Textures/maki/bakery.png +0 -0
  119. package/dist/cesium/Assets/Textures/maki/bank.png +0 -0
  120. package/dist/cesium/Assets/Textures/maki/bar.png +0 -0
  121. package/dist/cesium/Assets/Textures/maki/baseball.png +0 -0
  122. package/dist/cesium/Assets/Textures/maki/basketball.png +0 -0
  123. package/dist/cesium/Assets/Textures/maki/beer.png +0 -0
  124. package/dist/cesium/Assets/Textures/maki/bicycle.png +0 -0
  125. package/dist/cesium/Assets/Textures/maki/building.png +0 -0
  126. package/dist/cesium/Assets/Textures/maki/bus.png +0 -0
  127. package/dist/cesium/Assets/Textures/maki/cafe.png +0 -0
  128. package/dist/cesium/Assets/Textures/maki/camera.png +0 -0
  129. package/dist/cesium/Assets/Textures/maki/campsite.png +0 -0
  130. package/dist/cesium/Assets/Textures/maki/car.png +0 -0
  131. package/dist/cesium/Assets/Textures/maki/cemetery.png +0 -0
  132. package/dist/cesium/Assets/Textures/maki/cesium.png +0 -0
  133. package/dist/cesium/Assets/Textures/maki/chemist.png +0 -0
  134. package/dist/cesium/Assets/Textures/maki/cinema.png +0 -0
  135. package/dist/cesium/Assets/Textures/maki/circle-stroked.png +0 -0
  136. package/dist/cesium/Assets/Textures/maki/circle.png +0 -0
  137. package/dist/cesium/Assets/Textures/maki/city.png +0 -0
  138. package/dist/cesium/Assets/Textures/maki/clothing-store.png +0 -0
  139. package/dist/cesium/Assets/Textures/maki/college.png +0 -0
  140. package/dist/cesium/Assets/Textures/maki/commercial.png +0 -0
  141. package/dist/cesium/Assets/Textures/maki/cricket.png +0 -0
  142. package/dist/cesium/Assets/Textures/maki/cross.png +0 -0
  143. package/dist/cesium/Assets/Textures/maki/dam.png +0 -0
  144. package/dist/cesium/Assets/Textures/maki/danger.png +0 -0
  145. package/dist/cesium/Assets/Textures/maki/disability.png +0 -0
  146. package/dist/cesium/Assets/Textures/maki/dog-park.png +0 -0
  147. package/dist/cesium/Assets/Textures/maki/embassy.png +0 -0
  148. package/dist/cesium/Assets/Textures/maki/emergency-telephone.png +0 -0
  149. package/dist/cesium/Assets/Textures/maki/entrance.png +0 -0
  150. package/dist/cesium/Assets/Textures/maki/farm.png +0 -0
  151. package/dist/cesium/Assets/Textures/maki/fast-food.png +0 -0
  152. package/dist/cesium/Assets/Textures/maki/ferry.png +0 -0
  153. package/dist/cesium/Assets/Textures/maki/fire-station.png +0 -0
  154. package/dist/cesium/Assets/Textures/maki/fuel.png +0 -0
  155. package/dist/cesium/Assets/Textures/maki/garden.png +0 -0
  156. package/dist/cesium/Assets/Textures/maki/gift.png +0 -0
  157. package/dist/cesium/Assets/Textures/maki/golf.png +0 -0
  158. package/dist/cesium/Assets/Textures/maki/grocery.png +0 -0
  159. package/dist/cesium/Assets/Textures/maki/hairdresser.png +0 -0
  160. package/dist/cesium/Assets/Textures/maki/harbor.png +0 -0
  161. package/dist/cesium/Assets/Textures/maki/heart.png +0 -0
  162. package/dist/cesium/Assets/Textures/maki/heliport.png +0 -0
  163. package/dist/cesium/Assets/Textures/maki/hospital.png +0 -0
  164. package/dist/cesium/Assets/Textures/maki/ice-cream.png +0 -0
  165. package/dist/cesium/Assets/Textures/maki/industrial.png +0 -0
  166. package/dist/cesium/Assets/Textures/maki/land-use.png +0 -0
  167. package/dist/cesium/Assets/Textures/maki/laundry.png +0 -0
  168. package/dist/cesium/Assets/Textures/maki/library.png +0 -0
  169. package/dist/cesium/Assets/Textures/maki/lighthouse.png +0 -0
  170. package/dist/cesium/Assets/Textures/maki/lodging.png +0 -0
  171. package/dist/cesium/Assets/Textures/maki/logging.png +0 -0
  172. package/dist/cesium/Assets/Textures/maki/london-underground.png +0 -0
  173. package/dist/cesium/Assets/Textures/maki/marker-stroked.png +0 -0
  174. package/dist/cesium/Assets/Textures/maki/marker.png +0 -0
  175. package/dist/cesium/Assets/Textures/maki/minefield.png +0 -0
  176. package/dist/cesium/Assets/Textures/maki/mobilephone.png +0 -0
  177. package/dist/cesium/Assets/Textures/maki/monument.png +0 -0
  178. package/dist/cesium/Assets/Textures/maki/museum.png +0 -0
  179. package/dist/cesium/Assets/Textures/maki/music.png +0 -0
  180. package/dist/cesium/Assets/Textures/maki/oil-well.png +0 -0
  181. package/dist/cesium/Assets/Textures/maki/park.png +0 -0
  182. package/dist/cesium/Assets/Textures/maki/park2.png +0 -0
  183. package/dist/cesium/Assets/Textures/maki/parking-garage.png +0 -0
  184. package/dist/cesium/Assets/Textures/maki/parking.png +0 -0
  185. package/dist/cesium/Assets/Textures/maki/pharmacy.png +0 -0
  186. package/dist/cesium/Assets/Textures/maki/pitch.png +0 -0
  187. package/dist/cesium/Assets/Textures/maki/place-of-worship.png +0 -0
  188. package/dist/cesium/Assets/Textures/maki/playground.png +0 -0
  189. package/dist/cesium/Assets/Textures/maki/police.png +0 -0
  190. package/dist/cesium/Assets/Textures/maki/polling-place.png +0 -0
  191. package/dist/cesium/Assets/Textures/maki/post.png +0 -0
  192. package/dist/cesium/Assets/Textures/maki/prison.png +0 -0
  193. package/dist/cesium/Assets/Textures/maki/rail-above.png +0 -0
  194. package/dist/cesium/Assets/Textures/maki/rail-light.png +0 -0
  195. package/dist/cesium/Assets/Textures/maki/rail-metro.png +0 -0
  196. package/dist/cesium/Assets/Textures/maki/rail-underground.png +0 -0
  197. package/dist/cesium/Assets/Textures/maki/rail.png +0 -0
  198. package/dist/cesium/Assets/Textures/maki/religious-christian.png +0 -0
  199. package/dist/cesium/Assets/Textures/maki/religious-jewish.png +0 -0
  200. package/dist/cesium/Assets/Textures/maki/religious-muslim.png +0 -0
  201. package/dist/cesium/Assets/Textures/maki/restaurant.png +0 -0
  202. package/dist/cesium/Assets/Textures/maki/roadblock.png +0 -0
  203. package/dist/cesium/Assets/Textures/maki/rocket.png +0 -0
  204. package/dist/cesium/Assets/Textures/maki/school.png +0 -0
  205. package/dist/cesium/Assets/Textures/maki/scooter.png +0 -0
  206. package/dist/cesium/Assets/Textures/maki/shop.png +0 -0
  207. package/dist/cesium/Assets/Textures/maki/skiing.png +0 -0
  208. package/dist/cesium/Assets/Textures/maki/slaughterhouse.png +0 -0
  209. package/dist/cesium/Assets/Textures/maki/soccer.png +0 -0
  210. package/dist/cesium/Assets/Textures/maki/square-stroked.png +0 -0
  211. package/dist/cesium/Assets/Textures/maki/square.png +0 -0
  212. package/dist/cesium/Assets/Textures/maki/star-stroked.png +0 -0
  213. package/dist/cesium/Assets/Textures/maki/star.png +0 -0
  214. package/dist/cesium/Assets/Textures/maki/suitcase.png +0 -0
  215. package/dist/cesium/Assets/Textures/maki/swimming.png +0 -0
  216. package/dist/cesium/Assets/Textures/maki/telephone.png +0 -0
  217. package/dist/cesium/Assets/Textures/maki/tennis.png +0 -0
  218. package/dist/cesium/Assets/Textures/maki/theatre.png +0 -0
  219. package/dist/cesium/Assets/Textures/maki/toilets.png +0 -0
  220. package/dist/cesium/Assets/Textures/maki/town-hall.png +0 -0
  221. package/dist/cesium/Assets/Textures/maki/town.png +0 -0
  222. package/dist/cesium/Assets/Textures/maki/triangle-stroked.png +0 -0
  223. package/dist/cesium/Assets/Textures/maki/triangle.png +0 -0
  224. package/dist/cesium/Assets/Textures/maki/village.png +0 -0
  225. package/dist/cesium/Assets/Textures/maki/warehouse.png +0 -0
  226. package/dist/cesium/Assets/Textures/maki/waste-basket.png +0 -0
  227. package/dist/cesium/Assets/Textures/maki/water.png +0 -0
  228. package/dist/cesium/Assets/Textures/maki/wetland.png +0 -0
  229. package/dist/cesium/Assets/Textures/maki/zoo.png +0 -0
  230. package/dist/cesium/Assets/Textures/moonSmall.jpg +0 -0
  231. package/dist/cesium/Assets/Textures/pin.svg +1 -0
  232. package/dist/cesium/Assets/Textures/waterNormals.jpg +0 -0
  233. package/dist/cesium/Assets/Textures/waterNormalsSmall.jpg +0 -0
  234. package/dist/cesium/Assets/approximateTerrainHeights.json +1 -0
  235. package/dist/cesium/ThirdParty/Workers/package.json +1 -0
  236. package/dist/cesium/ThirdParty/Workers/zip-web-worker.js +1 -0
  237. package/dist/cesium/ThirdParty/basis_transcoder.wasm +0 -0
  238. package/dist/cesium/ThirdParty/draco_decoder.wasm +0 -0
  239. package/dist/cesium/ThirdParty/google-earth-dbroot-parser.js +1 -0
  240. package/dist/cesium/ThirdParty/wasm_splats_bg.wasm +0 -0
  241. package/dist/cesium/ThirdParty/zip-module.wasm +0 -0
  242. package/dist/cesium/Widgets/Animation/Animation.css +127 -0
  243. package/dist/cesium/Widgets/Animation/lighter.css +70 -0
  244. package/dist/cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css +108 -0
  245. package/dist/cesium/Widgets/BaseLayerPicker/lighter.css +22 -0
  246. package/dist/cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css +102 -0
  247. package/dist/cesium/Widgets/CesiumInspector/CesiumInspector.css +113 -0
  248. package/dist/cesium/Widgets/CesiumWidget/CesiumWidget.css +119 -0
  249. package/dist/cesium/Widgets/CesiumWidget/lighter.css +14 -0
  250. package/dist/cesium/Widgets/FullscreenButton/FullscreenButton.css +8 -0
  251. package/dist/cesium/Widgets/Geocoder/Geocoder.css +70 -0
  252. package/dist/cesium/Widgets/Geocoder/lighter.css +17 -0
  253. package/dist/cesium/Widgets/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +27 -0
  254. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
  255. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
  256. package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
  257. package/dist/cesium/Widgets/Images/ImageryProviders/azureAerial.png +0 -0
  258. package/dist/cesium/Widgets/Images/ImageryProviders/azureRoads.png +0 -0
  259. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerial.png +0 -0
  260. package/dist/cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png +0 -0
  261. package/dist/cesium/Widgets/Images/ImageryProviders/bingRoads.png +0 -0
  262. package/dist/cesium/Widgets/Images/ImageryProviders/blueMarble.png +0 -0
  263. package/dist/cesium/Widgets/Images/ImageryProviders/earthAtNight.png +0 -0
  264. package/dist/cesium/Widgets/Images/ImageryProviders/googleContour.png +0 -0
  265. package/dist/cesium/Widgets/Images/ImageryProviders/googleRoadmap.png +0 -0
  266. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatellite.png +0 -0
  267. package/dist/cesium/Widgets/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
  268. package/dist/cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
  269. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxSatellite.png +0 -0
  270. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxStreets.png +0 -0
  271. package/dist/cesium/Widgets/Images/ImageryProviders/mapboxTerrain.png +0 -0
  272. package/dist/cesium/Widgets/Images/ImageryProviders/naturalEarthII.png +0 -0
  273. package/dist/cesium/Widgets/Images/ImageryProviders/openStreetMap.png +0 -0
  274. package/dist/cesium/Widgets/Images/ImageryProviders/sentinel-2.png +0 -0
  275. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
  276. package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
  277. package/dist/cesium/Widgets/Images/ImageryProviders/stamenToner.png +0 -0
  278. package/dist/cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png +0 -0
  279. package/dist/cesium/Widgets/Images/NavigationHelp/Mouse.svg +84 -0
  280. package/dist/cesium/Widgets/Images/NavigationHelp/MouseLeft.svg +76 -0
  281. package/dist/cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg +76 -0
  282. package/dist/cesium/Widgets/Images/NavigationHelp/MouseRight.svg +76 -0
  283. package/dist/cesium/Widgets/Images/NavigationHelp/Touch.svg +120 -0
  284. package/dist/cesium/Widgets/Images/NavigationHelp/TouchDrag.svg +129 -0
  285. package/dist/cesium/Widgets/Images/NavigationHelp/TouchRotate.svg +76 -0
  286. package/dist/cesium/Widgets/Images/NavigationHelp/TouchTilt.svg +135 -0
  287. package/dist/cesium/Widgets/Images/NavigationHelp/TouchZoom.svg +74 -0
  288. package/dist/cesium/Widgets/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
  289. package/dist/cesium/Widgets/Images/TerrainProviders/Ellipsoid.png +0 -0
  290. package/dist/cesium/Widgets/Images/TimelineIcons.png +0 -0
  291. package/dist/cesium/Widgets/Images/info-loading.gif +0 -0
  292. package/dist/cesium/Widgets/InfoBox/InfoBox.css +92 -0
  293. package/dist/cesium/Widgets/InfoBox/InfoBoxDescription.css +178 -0
  294. package/dist/cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css +93 -0
  295. package/dist/cesium/Widgets/NavigationHelpButton/lighter.css +38 -0
  296. package/dist/cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css +15 -0
  297. package/dist/cesium/Widgets/ProjectionPicker/ProjectionPicker.css +38 -0
  298. package/dist/cesium/Widgets/SceneModePicker/SceneModePicker.css +56 -0
  299. package/dist/cesium/Widgets/SelectionIndicator/SelectionIndicator.css +20 -0
  300. package/dist/cesium/Widgets/Timeline/Timeline.css +103 -0
  301. package/dist/cesium/Widgets/Timeline/lighter.css +23 -0
  302. package/dist/cesium/Widgets/VRButton/VRButton.css +8 -0
  303. package/dist/cesium/Widgets/Viewer/Viewer.css +107 -0
  304. package/dist/cesium/Widgets/VoxelInspector/VoxelInspector.css +16 -0
  305. package/dist/cesium/Widgets/lighter.css +237 -0
  306. package/dist/cesium/Widgets/lighterShared.css +46 -0
  307. package/dist/cesium/Widgets/shared.css +103 -0
  308. package/dist/cesium/Widgets/widgets.css +1342 -0
  309. package/dist/cesium/Workers/chunk-23ZQ2IVV.js +29 -0
  310. package/dist/cesium/Workers/chunk-2EQO3Q56.js +26 -0
  311. package/dist/cesium/Workers/chunk-2MJIIVP4.js +26 -0
  312. package/dist/cesium/Workers/chunk-2TE5NTVD.js +26 -0
  313. package/dist/cesium/Workers/chunk-2ZBHLJST.js +26 -0
  314. package/dist/cesium/Workers/chunk-5TJMAQVL.js +26 -0
  315. package/dist/cesium/Workers/chunk-6BD4U3VO.js +26 -0
  316. package/dist/cesium/Workers/chunk-7TVGLKQF.js +26 -0
  317. package/dist/cesium/Workers/chunk-BTSYJ5XU.js +26 -0
  318. package/dist/cesium/Workers/chunk-BXMEEOCS.js +63 -0
  319. package/dist/cesium/Workers/chunk-BYLCY7GP.js +29 -0
  320. package/dist/cesium/Workers/chunk-CTHM3W6I.js +26 -0
  321. package/dist/cesium/Workers/chunk-CUUSNIVQ.js +26 -0
  322. package/dist/cesium/Workers/chunk-E3JOOS3S.js +26 -0
  323. package/dist/cesium/Workers/chunk-E7KYDCM5.js +26 -0
  324. package/dist/cesium/Workers/chunk-EDVBB7SS.js +27 -0
  325. package/dist/cesium/Workers/chunk-EFBN7QNX.js +26 -0
  326. package/dist/cesium/Workers/chunk-EQ4YRVWL.js +26 -0
  327. package/dist/cesium/Workers/chunk-F6PRE7D6.js +26 -0
  328. package/dist/cesium/Workers/chunk-FC4ZZ65J.js +26 -0
  329. package/dist/cesium/Workers/chunk-FFBVWF2L.js +26 -0
  330. package/dist/cesium/Workers/chunk-GBAA6GVX.js +26 -0
  331. package/dist/cesium/Workers/chunk-ICALLYLG.js +26 -0
  332. package/dist/cesium/Workers/chunk-ILRYTWTP.js +26 -0
  333. package/dist/cesium/Workers/chunk-IRNLBSEJ.js +26 -0
  334. package/dist/cesium/Workers/chunk-IX4VMHEV.js +26 -0
  335. package/dist/cesium/Workers/chunk-L6QHHACZ.js +26 -0
  336. package/dist/cesium/Workers/chunk-LI2ZSORM.js +26 -0
  337. package/dist/cesium/Workers/chunk-LSLE2RL4.js +26 -0
  338. package/dist/cesium/Workers/chunk-M4HLDBCG.js +26 -0
  339. package/dist/cesium/Workers/chunk-MJHHSGEH.js +26 -0
  340. package/dist/cesium/Workers/chunk-NMVKML6W.js +26 -0
  341. package/dist/cesium/Workers/chunk-OCWJRAXS.js +26 -0
  342. package/dist/cesium/Workers/chunk-OIRKANTH.js +26 -0
  343. package/dist/cesium/Workers/chunk-OIT7J4IC.js +26 -0
  344. package/dist/cesium/Workers/chunk-OLZ3FYUM.js +26 -0
  345. package/dist/cesium/Workers/chunk-Q5BPHJQF.js +26 -0
  346. package/dist/cesium/Workers/chunk-QFM5DCMQ.js +26 -0
  347. package/dist/cesium/Workers/chunk-QKUIYMGC.js +28 -0
  348. package/dist/cesium/Workers/chunk-S44JILQT.js +26 -0
  349. package/dist/cesium/Workers/chunk-SLT4J352.js +26 -0
  350. package/dist/cesium/Workers/chunk-SQMIIXB7.js +26 -0
  351. package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +26 -0
  352. package/dist/cesium/Workers/chunk-TNSUQXWK.js +27 -0
  353. package/dist/cesium/Workers/chunk-UBOGZS7F.js +26 -0
  354. package/dist/cesium/Workers/chunk-V3OSTMM6.js +26 -0
  355. package/dist/cesium/Workers/chunk-V7QEYVP3.js +26 -0
  356. package/dist/cesium/Workers/chunk-VUKYSU4H.js +26 -0
  357. package/dist/cesium/Workers/chunk-W37FE5GR.js +26 -0
  358. package/dist/cesium/Workers/chunk-WBOV35NL.js +26 -0
  359. package/dist/cesium/Workers/chunk-WPMZLB3Y.js +26 -0
  360. package/dist/cesium/Workers/chunk-WWWZVEEH.js +26 -0
  361. package/dist/cesium/Workers/chunk-XFIQ5DEQ.js +28 -0
  362. package/dist/cesium/Workers/chunk-XQHLGIO7.js +26 -0
  363. package/dist/cesium/Workers/chunk-XUSCFAVF.js +26 -0
  364. package/dist/cesium/Workers/chunk-YP7I5QBZ.js +26 -0
  365. package/dist/cesium/Workers/chunk-Z3QF2EHT.js +26 -0
  366. package/dist/cesium/Workers/combineGeometry.js +26 -0
  367. package/dist/cesium/Workers/createBoxGeometry.js +26 -0
  368. package/dist/cesium/Workers/createBoxOutlineGeometry.js +26 -0
  369. package/dist/cesium/Workers/createCircleGeometry.js +26 -0
  370. package/dist/cesium/Workers/createCircleOutlineGeometry.js +26 -0
  371. package/dist/cesium/Workers/createCoplanarPolygonGeometry.js +26 -0
  372. package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
  373. package/dist/cesium/Workers/createCorridorGeometry.js +26 -0
  374. package/dist/cesium/Workers/createCorridorOutlineGeometry.js +26 -0
  375. package/dist/cesium/Workers/createCylinderGeometry.js +26 -0
  376. package/dist/cesium/Workers/createCylinderOutlineGeometry.js +26 -0
  377. package/dist/cesium/Workers/createEllipseGeometry.js +26 -0
  378. package/dist/cesium/Workers/createEllipseOutlineGeometry.js +26 -0
  379. package/dist/cesium/Workers/createEllipsoidGeometry.js +26 -0
  380. package/dist/cesium/Workers/createEllipsoidOutlineGeometry.js +26 -0
  381. package/dist/cesium/Workers/createFrustumGeometry.js +26 -0
  382. package/dist/cesium/Workers/createFrustumOutlineGeometry.js +26 -0
  383. package/dist/cesium/Workers/createGeometry.js +26 -0
  384. package/dist/cesium/Workers/createGroundPolylineGeometry.js +26 -0
  385. package/dist/cesium/Workers/createPlaneGeometry.js +26 -0
  386. package/dist/cesium/Workers/createPlaneOutlineGeometry.js +26 -0
  387. package/dist/cesium/Workers/createPolygonGeometry.js +26 -0
  388. package/dist/cesium/Workers/createPolygonOutlineGeometry.js +26 -0
  389. package/dist/cesium/Workers/createPolylineGeometry.js +26 -0
  390. package/dist/cesium/Workers/createPolylineVolumeGeometry.js +26 -0
  391. package/dist/cesium/Workers/createPolylineVolumeOutlineGeometry.js +26 -0
  392. package/dist/cesium/Workers/createRectangleGeometry.js +26 -0
  393. package/dist/cesium/Workers/createRectangleOutlineGeometry.js +26 -0
  394. package/dist/cesium/Workers/createSimplePolylineGeometry.js +26 -0
  395. package/dist/cesium/Workers/createSphereGeometry.js +26 -0
  396. package/dist/cesium/Workers/createSphereOutlineGeometry.js +26 -0
  397. package/dist/cesium/Workers/createTaskProcessorWorker.js +26 -0
  398. package/dist/cesium/Workers/createVectorTileClampedPolylines.js +26 -0
  399. package/dist/cesium/Workers/createVectorTileGeometries.js +26 -0
  400. package/dist/cesium/Workers/createVectorTilePoints.js +26 -0
  401. package/dist/cesium/Workers/createVectorTilePolygons.js +26 -0
  402. package/dist/cesium/Workers/createVectorTilePolylines.js +26 -0
  403. package/dist/cesium/Workers/createVerticesFromCesium3DTilesTerrain.js +26 -0
  404. package/dist/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +26 -0
  405. package/dist/cesium/Workers/createVerticesFromHeightmap.js +26 -0
  406. package/dist/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +26 -0
  407. package/dist/cesium/Workers/createWallGeometry.js +26 -0
  408. package/dist/cesium/Workers/createWallOutlineGeometry.js +26 -0
  409. package/dist/cesium/Workers/decodeDraco.js +26 -0
  410. package/dist/cesium/Workers/decodeGoogleEarthEnterprisePacket.js +26 -0
  411. package/dist/cesium/Workers/decodeI3S.js +26 -0
  412. package/dist/cesium/Workers/gaussianSplatSorter.js +26 -0
  413. package/dist/cesium/Workers/gaussianSplatTextureGenerator.js +26 -0
  414. package/dist/cesium/Workers/incrementallyBuildTerrainPicker.js +26 -0
  415. package/dist/cesium/Workers/transcodeKTX2.js +56 -0
  416. package/dist/cesium/Workers/transferTypedArrayTest.js +26 -0
  417. package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
  418. package/dist/cesium/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +26 -0
  419. package/dist/index.html +13 -2
  420. package/package.json +27 -19
  421. package/src/App.tsx +1 -17
  422. package/src/components/viewer/BCFPanel.tsx +46 -4
  423. package/src/components/viewer/CesiumOverlay.tsx +672 -0
  424. package/src/components/viewer/CesiumSettingsDialog.tsx +100 -0
  425. package/src/components/viewer/ChatPanel.tsx +54 -16
  426. package/src/components/viewer/CommandPalette.tsx +6 -1
  427. package/src/components/viewer/DesktopEntitlementBanner.tsx +74 -0
  428. package/src/components/viewer/ExportChangesButton.tsx +24 -4
  429. package/src/components/viewer/ExportDialog.tsx +38 -9
  430. package/src/components/viewer/HierarchyPanel.tsx +202 -6
  431. package/src/components/viewer/IDSPanel.tsx +52 -3
  432. package/src/components/viewer/KeyboardShortcutsDialog.tsx +1 -1
  433. package/src/components/viewer/MainToolbar.tsx +353 -27
  434. package/src/components/viewer/PropertiesPanel.tsx +306 -131
  435. package/src/components/viewer/ScriptPanel.tsx +34 -8
  436. package/src/components/viewer/Section2DPanel.tsx +3 -2
  437. package/src/components/viewer/SettingsPage.tsx +430 -0
  438. package/src/components/viewer/StatusBar.tsx +17 -1
  439. package/src/components/viewer/UpgradePage.tsx +6 -4
  440. package/src/components/viewer/ViewerLayout.tsx +47 -6
  441. package/src/components/viewer/Viewport.tsx +49 -8
  442. package/src/components/viewer/ViewportContainer.tsx +285 -32
  443. package/src/components/viewer/ViewportOverlays.tsx +129 -27
  444. package/src/components/viewer/hierarchy/treeDataBuilder.ts +2 -1
  445. package/src/components/viewer/properties/EpsgLookupDialog.tsx +418 -0
  446. package/src/components/viewer/properties/GeoreferencingPanel.tsx +703 -0
  447. package/src/components/viewer/properties/LocationMap.tsx +730 -0
  448. package/src/components/viewer/properties/ModelMetadataPanel.tsx +3 -70
  449. package/src/components/viewer/selectionHandlers.ts +4 -3
  450. package/src/components/viewer/useAnimationLoop.ts +4 -0
  451. package/src/components/viewer/useGeometryStreaming.ts +127 -40
  452. package/src/components/viewer/useMouseControls.ts +4 -1
  453. package/src/hooks/bcfIdLookup.ts +13 -11
  454. package/src/hooks/ids/idsColorSystem.ts +3 -8
  455. package/src/hooks/ingest/viewerModelIngest.ts +275 -0
  456. package/src/hooks/useIDS.ts +32 -17
  457. package/src/hooks/useIfc.ts +7 -1
  458. package/src/hooks/useIfcCache.ts +28 -15
  459. package/src/hooks/useIfcFederation.ts +59 -227
  460. package/src/hooks/useIfcLoader.ts +1656 -130
  461. package/src/hooks/useIfcServer.ts +0 -69
  462. package/src/lib/desktop/ClerkDesktopEntitlementSync.tsx +175 -0
  463. package/src/lib/desktop/desktopEntitlementEvents.ts +39 -0
  464. package/src/lib/desktop-entitlement.ts +45 -0
  465. package/src/lib/desktop-product.ts +124 -0
  466. package/src/lib/geo/cesium-bridge.ts +310 -0
  467. package/src/lib/geo/kmz-exporter.ts +112 -0
  468. package/src/lib/geo/reproject.ts +370 -0
  469. package/src/lib/lens/adapter.ts +3 -1
  470. package/src/lib/recent-files.ts +2 -1
  471. package/src/main.tsx +1 -0
  472. package/src/sdk/adapters/export-adapter.ts +14 -1
  473. package/src/sdk/adapters/viewer-adapter.ts +5 -9
  474. package/src/sdk/adapters/visibility-adapter.ts +6 -9
  475. package/src/services/analysis-extensions.ts +125 -0
  476. package/src/services/app-navigation.ts +13 -0
  477. package/src/services/bsdd.ts +53 -4
  478. package/src/services/cacheService.ts +1 -1
  479. package/src/services/desktop-cache.ts +43 -0
  480. package/src/services/desktop-export.ts +77 -0
  481. package/src/services/desktop-harness.ts +196 -0
  482. package/src/services/desktop-logger.ts +20 -0
  483. package/src/services/desktop-native-metadata.ts +207 -0
  484. package/src/services/desktop-panel-actions.ts +43 -0
  485. package/src/services/desktop-preferences.ts +44 -0
  486. package/src/services/file-dialog.ts +147 -0
  487. package/src/services/tauri-core-stub.ts +7 -0
  488. package/src/services/tauri-dialog-stub.ts +7 -0
  489. package/src/services/tauri-fs-stub.ts +7 -0
  490. package/src/store/basketVisibleSet.ts +3 -4
  491. package/src/store/globalId.ts +79 -0
  492. package/src/store/index.ts +41 -2
  493. package/src/store/slices/cesiumSlice.ts +122 -0
  494. package/src/store/slices/chatSlice.ts +5 -1
  495. package/src/store/slices/dataSlice.ts +139 -28
  496. package/src/store/slices/desktopEntitlementSlice.ts +86 -0
  497. package/src/store/slices/loadingSlice.ts +14 -2
  498. package/src/store/slices/modelSlice.ts +58 -3
  499. package/src/store/slices/mutationSlice.ts +178 -0
  500. package/src/store/slices/pinboardSlice.ts +4 -8
  501. package/src/store/types.ts +96 -2
  502. package/src/store.ts +1 -1
  503. package/src/utils/desktopModelSnapshot.ts +358 -0
  504. package/src/utils/ifcConfig.ts +6 -1
  505. package/src/utils/nativeSpatialDataStore.ts +250 -0
  506. package/src/utils/serverDataModel.ts +4 -0
  507. package/src/utils/spatialHierarchy.ts +10 -11
  508. package/vite.config.ts +41 -0
  509. package/dist/assets/Arrow.dom-BhOg9lpn.js +0 -20
  510. package/dist/assets/arrow2_bg-BlXl-cSQ.js +0 -1
  511. package/dist/assets/basketViewActivator-BRG5DBmM.js +0 -1
  512. package/dist/assets/desktop-cache-oPzaWXYE.js +0 -1
  513. package/dist/assets/geometry.worker-kgiT_Qhh.js +0 -1
  514. package/dist/assets/ifc-lite_bg-FNRmpSvM.wasm +0 -0
  515. package/dist/assets/index-B1Ecw4AU.js +0 -189756
  516. package/dist/assets/index-Ba4eoTe7.css +0 -1
  517. package/dist/assets/index-CrgYBjTn.js +0 -229
  518. package/dist/assets/module-6F3E5H7Y-tx0BadV3.js +0 -6
  519. package/dist/assets/native-bridge-Crsb7TKz.js +0 -111
  520. package/dist/assets/wasm-bridge-mJUhb7uk.js +0 -1
@@ -0,0 +1,275 @@
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 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 | { initial: number; subsequent: number };
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
+ }
55
+
56
+ export interface StepBufferIngestResult extends ViewerModelPayload {
57
+ allMeshes: MeshData[];
58
+ cumulativeColorUpdates: Map<number, RgbaColor>;
59
+ }
60
+
61
+ export function convertIfcxMeshes(rawMeshes: RawIfcxMesh[]): MeshData[] {
62
+ return rawMeshes.map((mesh) => {
63
+ const positions = mesh.positions instanceof Float32Array ? mesh.positions : new Float32Array(mesh.positions || []);
64
+ const indices = mesh.indices instanceof Uint32Array ? mesh.indices : new Uint32Array(mesh.indices || []);
65
+ const normals = mesh.normals instanceof Float32Array ? mesh.normals : new Float32Array(mesh.normals || []);
66
+
67
+ return {
68
+ expressId: mesh.expressId ?? mesh.express_id ?? mesh.id ?? 0,
69
+ positions,
70
+ indices,
71
+ normals,
72
+ color: normalizeColor(mesh.color),
73
+ ifcType: mesh.ifcType ?? mesh.ifc_type ?? 'IfcProduct',
74
+ };
75
+ }).filter((mesh) => mesh.positions.length > 0 && mesh.indices.length > 0);
76
+ }
77
+
78
+ export function createMinimalGlbDataStore(buffer: ArrayBuffer, meshCount: number): IfcDataStore {
79
+ return {
80
+ fileSize: buffer.byteLength,
81
+ schemaVersion: 'IFC4' as const,
82
+ entityCount: meshCount,
83
+ parseTime: 0,
84
+ source: new Uint8Array(0),
85
+ entityIndex: { byId: new Map(), byType: new Map() },
86
+ strings: { getString: () => undefined, getStringId: () => undefined, count: 0 } as unknown as IfcDataStore['strings'],
87
+ entities: { count: 0, getId: () => 0, getType: () => 0, getName: () => undefined, getGlobalId: () => undefined } as unknown as IfcDataStore['entities'],
88
+ properties: { count: 0, getPropertiesForEntity: () => [], getPropertySetForEntity: () => [] } as unknown as IfcDataStore['properties'],
89
+ quantities: { count: 0, getQuantitiesForEntity: () => [] } as unknown as IfcDataStore['quantities'],
90
+ relationships: { count: 0, getRelationships: () => [], getRelated: () => [] } as unknown as IfcDataStore['relationships'],
91
+ spatialHierarchy: null as unknown as IfcDataStore['spatialHierarchy'],
92
+ } as unknown as IfcDataStore;
93
+ }
94
+
95
+ export function normalizeDataStoreStoreys(dataStore: IfcDataStore): IfcDataStore {
96
+ if (dataStore.spatialHierarchy && dataStore.spatialHierarchy.storeyHeights.size === 0 && dataStore.spatialHierarchy.storeyElevations.size > 1) {
97
+ const calculatedHeights = calculateStoreyHeights(dataStore.spatialHierarchy.storeyElevations);
98
+ for (const [storeyId, height] of calculatedHeights) {
99
+ dataStore.spatialHierarchy.storeyHeights.set(storeyId, height);
100
+ }
101
+ }
102
+ return dataStore;
103
+ }
104
+
105
+ export function getMaxExpressId(dataStore: IfcDataStore, meshes: MeshData[]): number {
106
+ const maxExpressIdFromMeshes = meshes.reduce((max, mesh) => Math.max(max, mesh.expressId), 0);
107
+ let maxExpressIdFromEntities = 0;
108
+ if (dataStore.entityIndex?.byId) {
109
+ for (const key of dataStore.entityIndex.byId.keys()) {
110
+ if (key > maxExpressIdFromEntities) {
111
+ maxExpressIdFromEntities = key;
112
+ }
113
+ }
114
+ }
115
+ return Math.max(maxExpressIdFromMeshes, maxExpressIdFromEntities);
116
+ }
117
+
118
+ export async function parseIfcxViewerModel(
119
+ buffer: ArrayBuffer,
120
+ onProgress?: (progress: { phase: string; percent: number }) => void,
121
+ ): Promise<ViewerModelPayload> {
122
+ const ifcxResult = await parseIfcx(buffer, {
123
+ onProgress: (progress) => {
124
+ onProgress?.({
125
+ phase: `IFCX ${progress.phase}`,
126
+ percent: 10 + (progress.percent * 0.8),
127
+ });
128
+ },
129
+ });
130
+
131
+ const meshes = convertIfcxMeshes(ifcxResult.meshes);
132
+ if (meshes.length === 0 && ifcxResult.entityCount > 0) {
133
+ throw new Error('overlay-only-ifcx');
134
+ }
135
+
136
+ const { bounds, stats } = calculateMeshBounds(meshes);
137
+ return {
138
+ dataStore: {
139
+ fileSize: ifcxResult.fileSize,
140
+ schemaVersion: 'IFC5' as const,
141
+ entityCount: ifcxResult.entityCount,
142
+ parseTime: ifcxResult.parseTime,
143
+ source: new Uint8Array(buffer),
144
+ entityIndex: { byId: new Map(), byType: new Map() },
145
+ strings: ifcxResult.strings,
146
+ entities: ifcxResult.entities,
147
+ properties: ifcxResult.properties,
148
+ quantities: ifcxResult.quantities,
149
+ relationships: ifcxResult.relationships,
150
+ spatialHierarchy: ifcxResult.spatialHierarchy,
151
+ } as unknown as IfcDataStore,
152
+ geometryResult: {
153
+ meshes,
154
+ totalVertices: stats.totalVertices,
155
+ totalTriangles: stats.totalTriangles,
156
+ coordinateInfo: createCoordinateInfo(bounds),
157
+ },
158
+ schemaVersion: 'IFC5',
159
+ };
160
+ }
161
+
162
+ export async function parseGlbViewerModel(buffer: ArrayBuffer): Promise<ViewerModelPayload> {
163
+ const meshes = loadGLBToMeshData(new Uint8Array(buffer));
164
+ if (meshes.length === 0) {
165
+ throw new Error('glb-empty');
166
+ }
167
+
168
+ const { bounds, stats } = calculateMeshBounds(meshes);
169
+ return {
170
+ dataStore: createMinimalGlbDataStore(buffer, meshes.length),
171
+ geometryResult: {
172
+ meshes,
173
+ totalVertices: stats.totalVertices,
174
+ totalTriangles: stats.totalTriangles,
175
+ coordinateInfo: createCoordinateInfo(bounds),
176
+ },
177
+ schemaVersion: 'IFC4',
178
+ };
179
+ }
180
+
181
+ export async function parseStepBufferViewerModel(options: StepBufferIngestOptions): Promise<StepBufferIngestResult> {
182
+ const geometryProcessor = new GeometryProcessor({ quality: GeometryQuality.Balanced });
183
+ await geometryProcessor.init();
184
+
185
+ const parser = new IfcParser();
186
+ const wasmApi = geometryProcessor.getApi();
187
+ const allMeshes: MeshData[] = [];
188
+ const cumulativeColorUpdates = new Map<number, RgbaColor>();
189
+ let finalCoordinateInfo: CoordinateInfo | null = null;
190
+ let batchIndex = 0;
191
+ let estimatedTotal = 0;
192
+ let capturedRtcOffset: { x: number; y: number; z: number } | null = null;
193
+
194
+ const dataStorePromise = parser.parseColumnar(options.buffer, {
195
+ wasmApi,
196
+ onSpatialReady: (partialStore) => {
197
+ if (options.shouldAbort?.()) {
198
+ return;
199
+ }
200
+ options.onSpatialReady?.(normalizeDataStoreStoreys(partialStore));
201
+ },
202
+ });
203
+
204
+ for await (const event of geometryProcessor.processAdaptive(new Uint8Array(options.buffer), {
205
+ sizeThreshold: 2 * 1024 * 1024,
206
+ batchSize: options.getDynamicBatchSize(options.fileSizeMB),
207
+ })) {
208
+ if (options.shouldAbort?.()) {
209
+ break;
210
+ }
211
+ switch (event.type) {
212
+ case 'start':
213
+ estimatedTotal = event.totalEstimate;
214
+ break;
215
+ case 'colorUpdate':
216
+ for (const [expressId, color] of event.updates) {
217
+ cumulativeColorUpdates.set(expressId, color);
218
+ }
219
+ options.onColorUpdate?.(event.updates);
220
+ break;
221
+ case 'rtcOffset':
222
+ if (event.hasRtc) {
223
+ capturedRtcOffset = event.rtcOffset;
224
+ options.onRtcOffset?.({ rtcOffset: event.rtcOffset });
225
+ }
226
+ break;
227
+ case 'batch':
228
+ batchIndex += 1;
229
+ for (let i = 0; i < event.meshes.length; i++) {
230
+ allMeshes.push(event.meshes[i]);
231
+ }
232
+ finalCoordinateInfo = event.coordinateInfo ?? null;
233
+ options.onBatch?.({
234
+ batchIndex,
235
+ estimatedTotal,
236
+ totalSoFar: event.totalSoFar,
237
+ meshes: event.meshes,
238
+ coordinateInfo: event.coordinateInfo ?? null,
239
+ });
240
+ options.onProgress?.({
241
+ phase: `Processing geometry (${event.totalSoFar} meshes)`,
242
+ percent: 10 + Math.min(80, (allMeshes.length / 1000) * 0.8),
243
+ });
244
+ break;
245
+ case 'complete':
246
+ finalCoordinateInfo = event.coordinateInfo ?? null;
247
+ break;
248
+ }
249
+ }
250
+
251
+ const dataStore = normalizeDataStoreStoreys(await dataStorePromise);
252
+ if (!finalCoordinateInfo) {
253
+ finalCoordinateInfo = createCoordinateInfo(calculateMeshBounds(allMeshes).bounds);
254
+ }
255
+ if (capturedRtcOffset) {
256
+ finalCoordinateInfo.wasmRtcOffset = capturedRtcOffset;
257
+ }
258
+
259
+ return {
260
+ dataStore,
261
+ geometryResult: {
262
+ meshes: allMeshes,
263
+ totalVertices: allMeshes.reduce((sum, mesh) => sum + mesh.positions.length / 3, 0),
264
+ totalTriangles: allMeshes.reduce((sum, mesh) => sum + mesh.indices.length / 3, 0),
265
+ coordinateInfo: finalCoordinateInfo,
266
+ },
267
+ schemaVersion: dataStore.schemaVersion === 'IFC4X3'
268
+ ? 'IFC4X3'
269
+ : dataStore.schemaVersion === 'IFC4'
270
+ ? 'IFC4'
271
+ : 'IFC2X3',
272
+ allMeshes,
273
+ cumulativeColorUpdates,
274
+ };
275
+ }
@@ -213,12 +213,28 @@ export function useIDS(options: UseIDSOptions = {}): UseIDSResult {
213
213
  const setSelectedEntityId = useViewerStore((s) => s.setSelectedEntityId);
214
214
  const setSelectedEntity = useViewerStore((s) => s.setSelectedEntity);
215
215
  const setIsolatedEntities = useViewerStore((s) => s.setIsolatedEntities);
216
+ const toGlobalId = useViewerStore((s) => s.toGlobalId);
216
217
  const cameraCallbacks = useViewerStore((s) => s.cameraCallbacks);
217
218
  const geometryResult = useViewerStore((s) => s.geometryResult);
218
219
 
219
220
  // Ref to store original colors before IDS color overrides
220
221
  const originalColorsRef = useRef<Map<number, ColorTuple>>(new Map());
221
222
 
223
+ const toViewerGlobalId = useCallback((modelId: string, expressId: number): number | undefined => {
224
+ if (
225
+ modelId === '__legacy__'
226
+ || modelId === 'legacy'
227
+ || models.size === 0
228
+ || (models.size === 1 && !models.has(modelId))
229
+ ) {
230
+ return expressId;
231
+ }
232
+ if (!models.has(modelId)) {
233
+ return undefined;
234
+ }
235
+ return toGlobalId(modelId, expressId);
236
+ }, [models, toGlobalId]);
237
+
222
238
  // Ref to access geometryResult without creating callback dependencies (prevents infinite loops)
223
239
  const geometryResultRef = useRef(geometryResult);
224
240
  geometryResultRef.current = geometryResult;
@@ -357,7 +373,7 @@ export function useIDS(options: UseIDSOptions = {}): UseIDSResult {
357
373
 
358
374
  // Sync to viewer selection
359
375
  // Handle legacy mode vs federation mode
360
- const isLegacyMode = modelId === '__legacy__' || models.size === 0;
376
+ const isLegacyMode = modelId === '__legacy__' || modelId === 'legacy' || models.size === 0;
361
377
 
362
378
  if (isLegacyMode) {
363
379
  // Legacy mode: globalId equals expressId, use 'legacy' for selection
@@ -365,9 +381,9 @@ export function useIDS(options: UseIDSOptions = {}): UseIDSResult {
365
381
  // Use 'legacy' as the modelId for PropertiesPanel compatibility
366
382
  setSelectedEntity({ modelId: 'legacy', expressId });
367
383
  } else {
368
- // Federation mode: convert to globalId using model offset
369
- const model = models.get(modelId);
370
- const globalId = model ? expressId + (model.idOffset ?? 0) : expressId;
384
+ // Federation mode: use the store helper so ID resolution stays centralized.
385
+ const globalId = toViewerGlobalId(modelId, expressId);
386
+ if (globalId == null) return;
371
387
  setSelectedEntityId(globalId);
372
388
  setSelectedEntity({ modelId, expressId });
373
389
  }
@@ -378,7 +394,7 @@ export function useIDS(options: UseIDSOptions = {}): UseIDSResult {
378
394
  cameraCallbacks.frameSelection?.();
379
395
  }, 50);
380
396
  }
381
- }, [setIdsActiveEntity, setSelectedEntityId, setSelectedEntity, models, cameraCallbacks]);
397
+ }, [setIdsActiveEntity, setSelectedEntityId, setSelectedEntity, models, cameraCallbacks, toViewerGlobalId]);
382
398
 
383
399
  const clearEntitySelection = useCallback(() => {
384
400
  setIdsActiveEntity(null);
@@ -462,15 +478,14 @@ export function useIDS(options: UseIDSOptions = {}): UseIDSResult {
462
478
  const modelId = key.substring(0, lastColonIndex);
463
479
  const expressIdStr = key.substring(lastColonIndex + 1);
464
480
  const expressId = parseInt(expressIdStr, 10);
465
- const model = models.get(modelId);
466
- const globalId = model ? expressId + (model.idOffset ?? 0) : expressId;
467
- failedIds.add(globalId);
481
+ const globalId = toViewerGlobalId(modelId, expressId);
482
+ if (globalId != null) failedIds.add(globalId);
468
483
  }
469
484
 
470
485
  if (failedIds.size > 0) {
471
486
  setIsolatedEntities(failedIds);
472
487
  }
473
- }, [idsFailedEntityIds, models, setIsolatedEntities]);
488
+ }, [idsFailedEntityIds, setIsolatedEntities, toViewerGlobalId]);
474
489
 
475
490
  const isolatePassed = useCallback(() => {
476
491
  const passedIds = new Set<number>();
@@ -480,15 +495,14 @@ export function useIDS(options: UseIDSOptions = {}): UseIDSResult {
480
495
  const modelId = key.substring(0, lastColonIndex);
481
496
  const expressIdStr = key.substring(lastColonIndex + 1);
482
497
  const expressId = parseInt(expressIdStr, 10);
483
- const model = models.get(modelId);
484
- const globalId = model ? expressId + (model.idOffset ?? 0) : expressId;
485
- passedIds.add(globalId);
498
+ const globalId = toViewerGlobalId(modelId, expressId);
499
+ if (globalId != null) passedIds.add(globalId);
486
500
  }
487
501
 
488
502
  if (passedIds.size > 0) {
489
503
  setIsolatedEntities(passedIds);
490
504
  }
491
- }, [idsPassedEntityIds, models, setIsolatedEntities]);
505
+ }, [idsPassedEntityIds, setIsolatedEntities, toViewerGlobalId]);
492
506
 
493
507
  const clearIsolation = useCallback(() => {
494
508
  setIsolatedEntities(null);
@@ -632,7 +646,8 @@ export function useIDS(options: UseIDSOptions = {}): UseIDSResult {
632
646
  // Find matching model geometry
633
647
  for (const modelData of allMeshData) {
634
648
  if (modelData.modelId === entity.modelId || allMeshData.length === 1) {
635
- const globalExpressId = entity.expressId + modelData.idOffset;
649
+ const globalExpressId = toViewerGlobalId(entity.modelId, entity.expressId);
650
+ if (globalExpressId == null) break;
636
651
  const bounds = getEntityBounds(
637
652
  modelData.meshes as Parameters<typeof getEntityBounds>[0],
638
653
  globalExpressId,
@@ -700,8 +715,8 @@ export function useIDS(options: UseIDSOptions = {}): UseIDSResult {
700
715
  if (!bounds) continue;
701
716
 
702
717
  // Find the global expressId for isolation (direct Map lookup)
703
- const model = models.get(entity.modelId);
704
- const globalExpressId = entity.expressId + (model?.idOffset ?? 0);
718
+ const globalExpressId = toViewerGlobalId(entity.modelId, entity.expressId);
719
+ if (globalExpressId == null) continue;
705
720
 
706
721
  // Frame the entity bounds directly via camera (properly centers the object)
707
722
  // duration=1 (not 0) because the animator skips updates when duration===0,
@@ -778,7 +793,7 @@ export function useIDS(options: UseIDSOptions = {}): UseIDSResult {
778
793
  const url = URL.createObjectURL(blob);
779
794
  const a = globalThis.document.createElement('a');
780
795
  a.href = url;
781
- a.download = `ids-report-${new Date().toISOString().split('T')[0]}.bcf`;
796
+ a.download = `ids-report-${new Date().toISOString().split('T')[0]}.bcfzip`;
782
797
  a.click();
783
798
  URL.revokeObjectURL(url);
784
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