@ifc-lite/viewer 1.17.3 → 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.
- package/.turbo/turbo-build.log +39 -30
- package/.turbo/turbo-typecheck.log +1 -1
- package/CHANGELOG.md +15 -0
- package/DESKTOP_CONTRACT_VERSION +1 -0
- package/dist/assets/arrow-CZ5kQ26f.js +20 -0
- package/dist/assets/basketViewActivator-BmnNtVfZ.js +1 -0
- package/dist/assets/{bcf-D5-QWGO9.js → bcf-DOG9_WPX.js} +1 -1
- package/dist/assets/{browser-CKs-FY1P.js → browser-C5TFR7sH.js} +1 -1
- package/dist/assets/cesium-ADbP7waU.css +1 -0
- package/dist/assets/cesium-DUOzBlqv.js +17817 -0
- package/dist/assets/{exporters-C_6J153K.js → exporters-ChAtBmlj.js} +2225 -1754
- package/dist/assets/geometry.worker-BQ0rzNo-.js +1 -0
- package/dist/assets/ifc-lite_bg-BX4E7TX8.wasm +0 -0
- package/dist/assets/{index-jhBr1wbn.js → index-Co8E2-FE.js} +28959 -24612
- package/dist/assets/index-DckuDqlv.css +1 -0
- package/dist/assets/{maplibre-gl-BpvwNKKy.js → maplibre-gl-CGLcoNXc.js} +1 -1
- package/dist/assets/native-bridge-BRvbckFQ.js +429 -0
- package/dist/assets/{sandbox-B79eavQ3.js → sandbox-DZiNLNMk.js} +5 -5
- package/dist/assets/{server-client-D3bUPJJc.js → server-client-BV8zHZ7Y.js} +4 -4
- package/dist/assets/tauri-core-stub-D8Fa-u43.js +1 -0
- package/dist/assets/tauri-dialog-stub-r7Wksg7o.js +1 -0
- package/dist/assets/tauri-fs-stub-BdeRC7aK.js +1 -0
- package/dist/assets/wasm-bridge-g01g7T9b.js +1 -0
- package/dist/assets/{zip-B-jFFAGa.js → zip-DBEtpeu6.js} +3 -3
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
- package/dist/cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
- package/dist/cesium/Assets/Images/bing_maps_credit.png +0 -0
- package/dist/cesium/Assets/Images/cesium_credit.png +0 -0
- package/dist/cesium/Assets/Images/google_earth_credit.png +0 -0
- package/dist/cesium/Assets/Images/ion-credit.png +0 -0
- package/dist/cesium/Assets/Textures/LensFlare/DirtMask.jpg +0 -0
- package/dist/cesium/Assets/Textures/LensFlare/StarBurst.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg +0 -0
- package/dist/cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml +14 -0
- package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
- package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
- package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
- package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
- package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
- package/dist/cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
- package/dist/cesium/Assets/Textures/maki/airfield.png +0 -0
- package/dist/cesium/Assets/Textures/maki/airport.png +0 -0
- package/dist/cesium/Assets/Textures/maki/alcohol-shop.png +0 -0
- package/dist/cesium/Assets/Textures/maki/america-football.png +0 -0
- package/dist/cesium/Assets/Textures/maki/art-gallery.png +0 -0
- package/dist/cesium/Assets/Textures/maki/bakery.png +0 -0
- package/dist/cesium/Assets/Textures/maki/bank.png +0 -0
- package/dist/cesium/Assets/Textures/maki/bar.png +0 -0
- package/dist/cesium/Assets/Textures/maki/baseball.png +0 -0
- package/dist/cesium/Assets/Textures/maki/basketball.png +0 -0
- package/dist/cesium/Assets/Textures/maki/beer.png +0 -0
- package/dist/cesium/Assets/Textures/maki/bicycle.png +0 -0
- package/dist/cesium/Assets/Textures/maki/building.png +0 -0
- package/dist/cesium/Assets/Textures/maki/bus.png +0 -0
- package/dist/cesium/Assets/Textures/maki/cafe.png +0 -0
- package/dist/cesium/Assets/Textures/maki/camera.png +0 -0
- package/dist/cesium/Assets/Textures/maki/campsite.png +0 -0
- package/dist/cesium/Assets/Textures/maki/car.png +0 -0
- package/dist/cesium/Assets/Textures/maki/cemetery.png +0 -0
- package/dist/cesium/Assets/Textures/maki/cesium.png +0 -0
- package/dist/cesium/Assets/Textures/maki/chemist.png +0 -0
- package/dist/cesium/Assets/Textures/maki/cinema.png +0 -0
- package/dist/cesium/Assets/Textures/maki/circle-stroked.png +0 -0
- package/dist/cesium/Assets/Textures/maki/circle.png +0 -0
- package/dist/cesium/Assets/Textures/maki/city.png +0 -0
- package/dist/cesium/Assets/Textures/maki/clothing-store.png +0 -0
- package/dist/cesium/Assets/Textures/maki/college.png +0 -0
- package/dist/cesium/Assets/Textures/maki/commercial.png +0 -0
- package/dist/cesium/Assets/Textures/maki/cricket.png +0 -0
- package/dist/cesium/Assets/Textures/maki/cross.png +0 -0
- package/dist/cesium/Assets/Textures/maki/dam.png +0 -0
- package/dist/cesium/Assets/Textures/maki/danger.png +0 -0
- package/dist/cesium/Assets/Textures/maki/disability.png +0 -0
- package/dist/cesium/Assets/Textures/maki/dog-park.png +0 -0
- package/dist/cesium/Assets/Textures/maki/embassy.png +0 -0
- package/dist/cesium/Assets/Textures/maki/emergency-telephone.png +0 -0
- package/dist/cesium/Assets/Textures/maki/entrance.png +0 -0
- package/dist/cesium/Assets/Textures/maki/farm.png +0 -0
- package/dist/cesium/Assets/Textures/maki/fast-food.png +0 -0
- package/dist/cesium/Assets/Textures/maki/ferry.png +0 -0
- package/dist/cesium/Assets/Textures/maki/fire-station.png +0 -0
- package/dist/cesium/Assets/Textures/maki/fuel.png +0 -0
- package/dist/cesium/Assets/Textures/maki/garden.png +0 -0
- package/dist/cesium/Assets/Textures/maki/gift.png +0 -0
- package/dist/cesium/Assets/Textures/maki/golf.png +0 -0
- package/dist/cesium/Assets/Textures/maki/grocery.png +0 -0
- package/dist/cesium/Assets/Textures/maki/hairdresser.png +0 -0
- package/dist/cesium/Assets/Textures/maki/harbor.png +0 -0
- package/dist/cesium/Assets/Textures/maki/heart.png +0 -0
- package/dist/cesium/Assets/Textures/maki/heliport.png +0 -0
- package/dist/cesium/Assets/Textures/maki/hospital.png +0 -0
- package/dist/cesium/Assets/Textures/maki/ice-cream.png +0 -0
- package/dist/cesium/Assets/Textures/maki/industrial.png +0 -0
- package/dist/cesium/Assets/Textures/maki/land-use.png +0 -0
- package/dist/cesium/Assets/Textures/maki/laundry.png +0 -0
- package/dist/cesium/Assets/Textures/maki/library.png +0 -0
- package/dist/cesium/Assets/Textures/maki/lighthouse.png +0 -0
- package/dist/cesium/Assets/Textures/maki/lodging.png +0 -0
- package/dist/cesium/Assets/Textures/maki/logging.png +0 -0
- package/dist/cesium/Assets/Textures/maki/london-underground.png +0 -0
- package/dist/cesium/Assets/Textures/maki/marker-stroked.png +0 -0
- package/dist/cesium/Assets/Textures/maki/marker.png +0 -0
- package/dist/cesium/Assets/Textures/maki/minefield.png +0 -0
- package/dist/cesium/Assets/Textures/maki/mobilephone.png +0 -0
- package/dist/cesium/Assets/Textures/maki/monument.png +0 -0
- package/dist/cesium/Assets/Textures/maki/museum.png +0 -0
- package/dist/cesium/Assets/Textures/maki/music.png +0 -0
- package/dist/cesium/Assets/Textures/maki/oil-well.png +0 -0
- package/dist/cesium/Assets/Textures/maki/park.png +0 -0
- package/dist/cesium/Assets/Textures/maki/park2.png +0 -0
- package/dist/cesium/Assets/Textures/maki/parking-garage.png +0 -0
- package/dist/cesium/Assets/Textures/maki/parking.png +0 -0
- package/dist/cesium/Assets/Textures/maki/pharmacy.png +0 -0
- package/dist/cesium/Assets/Textures/maki/pitch.png +0 -0
- package/dist/cesium/Assets/Textures/maki/place-of-worship.png +0 -0
- package/dist/cesium/Assets/Textures/maki/playground.png +0 -0
- package/dist/cesium/Assets/Textures/maki/police.png +0 -0
- package/dist/cesium/Assets/Textures/maki/polling-place.png +0 -0
- package/dist/cesium/Assets/Textures/maki/post.png +0 -0
- package/dist/cesium/Assets/Textures/maki/prison.png +0 -0
- package/dist/cesium/Assets/Textures/maki/rail-above.png +0 -0
- package/dist/cesium/Assets/Textures/maki/rail-light.png +0 -0
- package/dist/cesium/Assets/Textures/maki/rail-metro.png +0 -0
- package/dist/cesium/Assets/Textures/maki/rail-underground.png +0 -0
- package/dist/cesium/Assets/Textures/maki/rail.png +0 -0
- package/dist/cesium/Assets/Textures/maki/religious-christian.png +0 -0
- package/dist/cesium/Assets/Textures/maki/religious-jewish.png +0 -0
- package/dist/cesium/Assets/Textures/maki/religious-muslim.png +0 -0
- package/dist/cesium/Assets/Textures/maki/restaurant.png +0 -0
- package/dist/cesium/Assets/Textures/maki/roadblock.png +0 -0
- package/dist/cesium/Assets/Textures/maki/rocket.png +0 -0
- package/dist/cesium/Assets/Textures/maki/school.png +0 -0
- package/dist/cesium/Assets/Textures/maki/scooter.png +0 -0
- package/dist/cesium/Assets/Textures/maki/shop.png +0 -0
- package/dist/cesium/Assets/Textures/maki/skiing.png +0 -0
- package/dist/cesium/Assets/Textures/maki/slaughterhouse.png +0 -0
- package/dist/cesium/Assets/Textures/maki/soccer.png +0 -0
- package/dist/cesium/Assets/Textures/maki/square-stroked.png +0 -0
- package/dist/cesium/Assets/Textures/maki/square.png +0 -0
- package/dist/cesium/Assets/Textures/maki/star-stroked.png +0 -0
- package/dist/cesium/Assets/Textures/maki/star.png +0 -0
- package/dist/cesium/Assets/Textures/maki/suitcase.png +0 -0
- package/dist/cesium/Assets/Textures/maki/swimming.png +0 -0
- package/dist/cesium/Assets/Textures/maki/telephone.png +0 -0
- package/dist/cesium/Assets/Textures/maki/tennis.png +0 -0
- package/dist/cesium/Assets/Textures/maki/theatre.png +0 -0
- package/dist/cesium/Assets/Textures/maki/toilets.png +0 -0
- package/dist/cesium/Assets/Textures/maki/town-hall.png +0 -0
- package/dist/cesium/Assets/Textures/maki/town.png +0 -0
- package/dist/cesium/Assets/Textures/maki/triangle-stroked.png +0 -0
- package/dist/cesium/Assets/Textures/maki/triangle.png +0 -0
- package/dist/cesium/Assets/Textures/maki/village.png +0 -0
- package/dist/cesium/Assets/Textures/maki/warehouse.png +0 -0
- package/dist/cesium/Assets/Textures/maki/waste-basket.png +0 -0
- package/dist/cesium/Assets/Textures/maki/water.png +0 -0
- package/dist/cesium/Assets/Textures/maki/wetland.png +0 -0
- package/dist/cesium/Assets/Textures/maki/zoo.png +0 -0
- package/dist/cesium/Assets/Textures/moonSmall.jpg +0 -0
- package/dist/cesium/Assets/Textures/pin.svg +1 -0
- package/dist/cesium/Assets/Textures/waterNormals.jpg +0 -0
- package/dist/cesium/Assets/Textures/waterNormalsSmall.jpg +0 -0
- package/dist/cesium/Assets/approximateTerrainHeights.json +1 -0
- package/dist/cesium/ThirdParty/Workers/package.json +1 -0
- package/dist/cesium/ThirdParty/Workers/zip-web-worker.js +1 -0
- package/dist/cesium/ThirdParty/basis_transcoder.wasm +0 -0
- package/dist/cesium/ThirdParty/draco_decoder.wasm +0 -0
- package/dist/cesium/ThirdParty/google-earth-dbroot-parser.js +1 -0
- package/dist/cesium/ThirdParty/wasm_splats_bg.wasm +0 -0
- package/dist/cesium/ThirdParty/zip-module.wasm +0 -0
- package/dist/cesium/Widgets/Animation/Animation.css +127 -0
- package/dist/cesium/Widgets/Animation/lighter.css +70 -0
- package/dist/cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css +108 -0
- package/dist/cesium/Widgets/BaseLayerPicker/lighter.css +22 -0
- package/dist/cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css +102 -0
- package/dist/cesium/Widgets/CesiumInspector/CesiumInspector.css +113 -0
- package/dist/cesium/Widgets/CesiumWidget/CesiumWidget.css +119 -0
- package/dist/cesium/Widgets/CesiumWidget/lighter.css +14 -0
- package/dist/cesium/Widgets/FullscreenButton/FullscreenButton.css +8 -0
- package/dist/cesium/Widgets/Geocoder/Geocoder.css +70 -0
- package/dist/cesium/Widgets/Geocoder/lighter.css +17 -0
- package/dist/cesium/Widgets/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +27 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/azureAerial.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/azureRoads.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/bingAerial.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/bingRoads.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/blueMarble.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/earthAtNight.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/googleContour.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/googleRoadmap.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/googleSatellite.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/mapboxSatellite.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/mapboxStreets.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/mapboxTerrain.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/naturalEarthII.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/openStreetMap.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/sentinel-2.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/stamenToner.png +0 -0
- package/dist/cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png +0 -0
- package/dist/cesium/Widgets/Images/NavigationHelp/Mouse.svg +84 -0
- package/dist/cesium/Widgets/Images/NavigationHelp/MouseLeft.svg +76 -0
- package/dist/cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg +76 -0
- package/dist/cesium/Widgets/Images/NavigationHelp/MouseRight.svg +76 -0
- package/dist/cesium/Widgets/Images/NavigationHelp/Touch.svg +120 -0
- package/dist/cesium/Widgets/Images/NavigationHelp/TouchDrag.svg +129 -0
- package/dist/cesium/Widgets/Images/NavigationHelp/TouchRotate.svg +76 -0
- package/dist/cesium/Widgets/Images/NavigationHelp/TouchTilt.svg +135 -0
- package/dist/cesium/Widgets/Images/NavigationHelp/TouchZoom.svg +74 -0
- package/dist/cesium/Widgets/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
- package/dist/cesium/Widgets/Images/TerrainProviders/Ellipsoid.png +0 -0
- package/dist/cesium/Widgets/Images/TimelineIcons.png +0 -0
- package/dist/cesium/Widgets/Images/info-loading.gif +0 -0
- package/dist/cesium/Widgets/InfoBox/InfoBox.css +92 -0
- package/dist/cesium/Widgets/InfoBox/InfoBoxDescription.css +178 -0
- package/dist/cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css +93 -0
- package/dist/cesium/Widgets/NavigationHelpButton/lighter.css +38 -0
- package/dist/cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css +15 -0
- package/dist/cesium/Widgets/ProjectionPicker/ProjectionPicker.css +38 -0
- package/dist/cesium/Widgets/SceneModePicker/SceneModePicker.css +56 -0
- package/dist/cesium/Widgets/SelectionIndicator/SelectionIndicator.css +20 -0
- package/dist/cesium/Widgets/Timeline/Timeline.css +103 -0
- package/dist/cesium/Widgets/Timeline/lighter.css +23 -0
- package/dist/cesium/Widgets/VRButton/VRButton.css +8 -0
- package/dist/cesium/Widgets/Viewer/Viewer.css +107 -0
- package/dist/cesium/Widgets/VoxelInspector/VoxelInspector.css +16 -0
- package/dist/cesium/Widgets/lighter.css +237 -0
- package/dist/cesium/Widgets/lighterShared.css +46 -0
- package/dist/cesium/Widgets/shared.css +103 -0
- package/dist/cesium/Widgets/widgets.css +1342 -0
- package/dist/cesium/Workers/chunk-23ZQ2IVV.js +29 -0
- package/dist/cesium/Workers/chunk-2EQO3Q56.js +26 -0
- package/dist/cesium/Workers/chunk-2MJIIVP4.js +26 -0
- package/dist/cesium/Workers/chunk-2TE5NTVD.js +26 -0
- package/dist/cesium/Workers/chunk-2ZBHLJST.js +26 -0
- package/dist/cesium/Workers/chunk-5TJMAQVL.js +26 -0
- package/dist/cesium/Workers/chunk-6BD4U3VO.js +26 -0
- package/dist/cesium/Workers/chunk-7TVGLKQF.js +26 -0
- package/dist/cesium/Workers/chunk-BTSYJ5XU.js +26 -0
- package/dist/cesium/Workers/chunk-BXMEEOCS.js +63 -0
- package/dist/cesium/Workers/chunk-BYLCY7GP.js +29 -0
- package/dist/cesium/Workers/chunk-CTHM3W6I.js +26 -0
- package/dist/cesium/Workers/chunk-CUUSNIVQ.js +26 -0
- package/dist/cesium/Workers/chunk-E3JOOS3S.js +26 -0
- package/dist/cesium/Workers/chunk-E7KYDCM5.js +26 -0
- package/dist/cesium/Workers/chunk-EDVBB7SS.js +27 -0
- package/dist/cesium/Workers/chunk-EFBN7QNX.js +26 -0
- package/dist/cesium/Workers/chunk-EQ4YRVWL.js +26 -0
- package/dist/cesium/Workers/chunk-F6PRE7D6.js +26 -0
- package/dist/cesium/Workers/chunk-FC4ZZ65J.js +26 -0
- package/dist/cesium/Workers/chunk-FFBVWF2L.js +26 -0
- package/dist/cesium/Workers/chunk-GBAA6GVX.js +26 -0
- package/dist/cesium/Workers/chunk-ICALLYLG.js +26 -0
- package/dist/cesium/Workers/chunk-ILRYTWTP.js +26 -0
- package/dist/cesium/Workers/chunk-IRNLBSEJ.js +26 -0
- package/dist/cesium/Workers/chunk-IX4VMHEV.js +26 -0
- package/dist/cesium/Workers/chunk-L6QHHACZ.js +26 -0
- package/dist/cesium/Workers/chunk-LI2ZSORM.js +26 -0
- package/dist/cesium/Workers/chunk-LSLE2RL4.js +26 -0
- package/dist/cesium/Workers/chunk-M4HLDBCG.js +26 -0
- package/dist/cesium/Workers/chunk-MJHHSGEH.js +26 -0
- package/dist/cesium/Workers/chunk-NMVKML6W.js +26 -0
- package/dist/cesium/Workers/chunk-OCWJRAXS.js +26 -0
- package/dist/cesium/Workers/chunk-OIRKANTH.js +26 -0
- package/dist/cesium/Workers/chunk-OIT7J4IC.js +26 -0
- package/dist/cesium/Workers/chunk-OLZ3FYUM.js +26 -0
- package/dist/cesium/Workers/chunk-Q5BPHJQF.js +26 -0
- package/dist/cesium/Workers/chunk-QFM5DCMQ.js +26 -0
- package/dist/cesium/Workers/chunk-QKUIYMGC.js +28 -0
- package/dist/cesium/Workers/chunk-S44JILQT.js +26 -0
- package/dist/cesium/Workers/chunk-SLT4J352.js +26 -0
- package/dist/cesium/Workers/chunk-SQMIIXB7.js +26 -0
- package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +26 -0
- package/dist/cesium/Workers/chunk-TNSUQXWK.js +27 -0
- package/dist/cesium/Workers/chunk-UBOGZS7F.js +26 -0
- package/dist/cesium/Workers/chunk-V3OSTMM6.js +26 -0
- package/dist/cesium/Workers/chunk-V7QEYVP3.js +26 -0
- package/dist/cesium/Workers/chunk-VUKYSU4H.js +26 -0
- package/dist/cesium/Workers/chunk-W37FE5GR.js +26 -0
- package/dist/cesium/Workers/chunk-WBOV35NL.js +26 -0
- package/dist/cesium/Workers/chunk-WPMZLB3Y.js +26 -0
- package/dist/cesium/Workers/chunk-WWWZVEEH.js +26 -0
- package/dist/cesium/Workers/chunk-XFIQ5DEQ.js +28 -0
- package/dist/cesium/Workers/chunk-XQHLGIO7.js +26 -0
- package/dist/cesium/Workers/chunk-XUSCFAVF.js +26 -0
- package/dist/cesium/Workers/chunk-YP7I5QBZ.js +26 -0
- package/dist/cesium/Workers/chunk-Z3QF2EHT.js +26 -0
- package/dist/cesium/Workers/combineGeometry.js +26 -0
- package/dist/cesium/Workers/createBoxGeometry.js +26 -0
- package/dist/cesium/Workers/createBoxOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createCircleGeometry.js +26 -0
- package/dist/cesium/Workers/createCircleOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createCoplanarPolygonGeometry.js +26 -0
- package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createCorridorGeometry.js +26 -0
- package/dist/cesium/Workers/createCorridorOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createCylinderGeometry.js +26 -0
- package/dist/cesium/Workers/createCylinderOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createEllipseGeometry.js +26 -0
- package/dist/cesium/Workers/createEllipseOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createEllipsoidGeometry.js +26 -0
- package/dist/cesium/Workers/createEllipsoidOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createFrustumGeometry.js +26 -0
- package/dist/cesium/Workers/createFrustumOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createGeometry.js +26 -0
- package/dist/cesium/Workers/createGroundPolylineGeometry.js +26 -0
- package/dist/cesium/Workers/createPlaneGeometry.js +26 -0
- package/dist/cesium/Workers/createPlaneOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createPolygonGeometry.js +26 -0
- package/dist/cesium/Workers/createPolygonOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createPolylineGeometry.js +26 -0
- package/dist/cesium/Workers/createPolylineVolumeGeometry.js +26 -0
- package/dist/cesium/Workers/createPolylineVolumeOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createRectangleGeometry.js +26 -0
- package/dist/cesium/Workers/createRectangleOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createSimplePolylineGeometry.js +26 -0
- package/dist/cesium/Workers/createSphereGeometry.js +26 -0
- package/dist/cesium/Workers/createSphereOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/createTaskProcessorWorker.js +26 -0
- package/dist/cesium/Workers/createVectorTileClampedPolylines.js +26 -0
- package/dist/cesium/Workers/createVectorTileGeometries.js +26 -0
- package/dist/cesium/Workers/createVectorTilePoints.js +26 -0
- package/dist/cesium/Workers/createVectorTilePolygons.js +26 -0
- package/dist/cesium/Workers/createVectorTilePolylines.js +26 -0
- package/dist/cesium/Workers/createVerticesFromCesium3DTilesTerrain.js +26 -0
- package/dist/cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +26 -0
- package/dist/cesium/Workers/createVerticesFromHeightmap.js +26 -0
- package/dist/cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +26 -0
- package/dist/cesium/Workers/createWallGeometry.js +26 -0
- package/dist/cesium/Workers/createWallOutlineGeometry.js +26 -0
- package/dist/cesium/Workers/decodeDraco.js +26 -0
- package/dist/cesium/Workers/decodeGoogleEarthEnterprisePacket.js +26 -0
- package/dist/cesium/Workers/decodeI3S.js +26 -0
- package/dist/cesium/Workers/gaussianSplatSorter.js +26 -0
- package/dist/cesium/Workers/gaussianSplatTextureGenerator.js +26 -0
- package/dist/cesium/Workers/incrementallyBuildTerrainPicker.js +26 -0
- package/dist/cesium/Workers/transcodeKTX2.js +56 -0
- package/dist/cesium/Workers/transferTypedArrayTest.js +26 -0
- package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
- package/dist/cesium/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +26 -0
- package/dist/index.html +10 -8
- package/package.json +15 -12
- package/src/App.tsx +1 -17
- package/src/components/viewer/BCFPanel.tsx +46 -4
- package/src/components/viewer/CesiumOverlay.tsx +672 -0
- package/src/components/viewer/CesiumSettingsDialog.tsx +100 -0
- package/src/components/viewer/ChatPanel.tsx +54 -16
- package/src/components/viewer/CommandPalette.tsx +6 -1
- package/src/components/viewer/DesktopEntitlementBanner.tsx +74 -0
- package/src/components/viewer/ExportChangesButton.tsx +6 -1
- package/src/components/viewer/ExportDialog.tsx +22 -6
- package/src/components/viewer/HierarchyPanel.tsx +196 -0
- package/src/components/viewer/IDSPanel.tsx +52 -3
- package/src/components/viewer/KeyboardShortcutsDialog.tsx +1 -1
- package/src/components/viewer/MainToolbar.tsx +353 -27
- package/src/components/viewer/PropertiesPanel.tsx +218 -79
- package/src/components/viewer/ScriptPanel.tsx +34 -8
- package/src/components/viewer/SettingsPage.tsx +430 -0
- package/src/components/viewer/StatusBar.tsx +17 -1
- package/src/components/viewer/UpgradePage.tsx +6 -4
- package/src/components/viewer/ViewerLayout.tsx +47 -6
- package/src/components/viewer/Viewport.tsx +49 -8
- package/src/components/viewer/ViewportContainer.tsx +280 -28
- package/src/components/viewer/ViewportOverlays.tsx +129 -27
- package/src/components/viewer/properties/GeoreferencingPanel.tsx +117 -5
- package/src/components/viewer/properties/LocationMap.tsx +458 -17
- package/src/components/viewer/selectionHandlers.ts +4 -3
- package/src/components/viewer/useAnimationLoop.ts +4 -0
- package/src/components/viewer/useGeometryStreaming.ts +127 -40
- package/src/components/viewer/useMouseControls.ts +4 -1
- package/src/hooks/ingest/viewerModelIngest.ts +275 -0
- package/src/hooks/useIDS.ts +1 -1
- package/src/hooks/useIfc.ts +7 -1
- package/src/hooks/useIfcCache.ts +28 -15
- package/src/hooks/useIfcFederation.ts +57 -225
- package/src/hooks/useIfcLoader.ts +1656 -130
- package/src/hooks/useIfcServer.ts +0 -69
- package/src/lib/desktop/ClerkDesktopEntitlementSync.tsx +175 -0
- package/src/lib/desktop/desktopEntitlementEvents.ts +39 -0
- package/src/lib/desktop-entitlement.ts +45 -0
- package/src/lib/desktop-product.ts +124 -0
- package/src/lib/geo/cesium-bridge.ts +310 -0
- package/src/lib/geo/reproject.ts +151 -25
- package/src/lib/recent-files.ts +2 -1
- package/src/services/analysis-extensions.ts +125 -0
- package/src/services/app-navigation.ts +13 -0
- package/src/services/bsdd.ts +53 -4
- package/src/services/cacheService.ts +1 -1
- package/src/services/desktop-cache.ts +43 -0
- package/src/services/desktop-export.ts +77 -0
- package/src/services/desktop-harness.ts +196 -0
- package/src/services/desktop-logger.ts +20 -0
- package/src/services/desktop-native-metadata.ts +207 -0
- package/src/services/desktop-panel-actions.ts +43 -0
- package/src/services/desktop-preferences.ts +44 -0
- package/src/services/file-dialog.ts +147 -0
- package/src/services/tauri-core-stub.ts +7 -0
- package/src/services/tauri-dialog-stub.ts +7 -0
- package/src/services/tauri-fs-stub.ts +7 -0
- package/src/store/index.ts +40 -2
- package/src/store/slices/cesiumSlice.ts +122 -0
- package/src/store/slices/chatSlice.ts +5 -1
- package/src/store/slices/dataSlice.ts +139 -28
- package/src/store/slices/desktopEntitlementSlice.ts +86 -0
- package/src/store/slices/loadingSlice.ts +14 -2
- package/src/store/slices/modelSlice.ts +58 -3
- package/src/store/types.ts +96 -2
- package/src/store.ts +1 -1
- package/src/utils/desktopModelSnapshot.ts +358 -0
- package/src/utils/ifcConfig.ts +6 -1
- package/src/utils/nativeSpatialDataStore.ts +250 -0
- package/src/utils/serverDataModel.ts +4 -0
- package/src/utils/spatialHierarchy.ts +10 -11
- package/vite.config.ts +24 -0
- package/dist/assets/arrow-DJf2ErbF.js +0 -20
- package/dist/assets/basketViewActivator-aojwdomq.js +0 -1
- package/dist/assets/desktop-cache-oPzaWXYE.js +0 -1
- package/dist/assets/geometry.worker-Nz9_YIqh.js +0 -1
- package/dist/assets/ifc-lite_bg-eSkBTizQ.wasm +0 -0
- package/dist/assets/index-pbE7itQS.css +0 -1
- package/dist/assets/native-bridge-DSIyEYXG.js +0 -113
- package/dist/assets/wasm-bridge-B0J07fZZ.js +0 -1
|
@@ -0,0 +1,358 @@
|
|
|
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 {
|
|
6
|
+
IfcTypeEnum,
|
|
7
|
+
IfcTypeEnumToString,
|
|
8
|
+
PropertyTableBuilder,
|
|
9
|
+
PropertyValueType,
|
|
10
|
+
QuantityTableBuilder,
|
|
11
|
+
type PropertyTable,
|
|
12
|
+
type QuantityTable,
|
|
13
|
+
type SpatialHierarchy,
|
|
14
|
+
type SpatialNode,
|
|
15
|
+
} from '@ifc-lite/data';
|
|
16
|
+
import {
|
|
17
|
+
BinaryCacheReader,
|
|
18
|
+
BinaryCacheWriter,
|
|
19
|
+
SchemaVersion as CacheSchemaVersion,
|
|
20
|
+
type IfcDataStore as CacheDataStore,
|
|
21
|
+
} from '@ifc-lite/cache';
|
|
22
|
+
import { extractPropertiesOnDemand, extractQuantitiesOnDemand, type IfcDataStore } from '@ifc-lite/parser';
|
|
23
|
+
import { rebuildOnDemandMaps } from './spatialHierarchy.js';
|
|
24
|
+
|
|
25
|
+
interface SerializedSpatialNode {
|
|
26
|
+
expressId: number;
|
|
27
|
+
type: number;
|
|
28
|
+
name: string;
|
|
29
|
+
elevation?: number;
|
|
30
|
+
children: SerializedSpatialNode[];
|
|
31
|
+
elements: number[];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
interface SerializedSpatialHierarchy {
|
|
35
|
+
project: SerializedSpatialNode;
|
|
36
|
+
byStorey: Array<[number, number[]]>;
|
|
37
|
+
byBuilding: Array<[number, number[]]>;
|
|
38
|
+
bySite: Array<[number, number[]]>;
|
|
39
|
+
bySpace: Array<[number, number[]]>;
|
|
40
|
+
storeyElevations: Array<[number, number]>;
|
|
41
|
+
storeyHeights: Array<[number, number]>;
|
|
42
|
+
elementToStorey: Array<[number, number]>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
interface SerializedDesktopMetadataSnapshot {
|
|
46
|
+
version: number;
|
|
47
|
+
schemaVersion: IfcDataStore['schemaVersion'];
|
|
48
|
+
fileSize: number;
|
|
49
|
+
entityCount: number;
|
|
50
|
+
parseTime: number;
|
|
51
|
+
spatialHierarchy: SerializedSpatialHierarchy | null;
|
|
52
|
+
propertySetIds: number[];
|
|
53
|
+
quantitySetIds: number[];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
interface DecodedDesktopMetadataSnapshot {
|
|
57
|
+
cacheBuffer: ArrayBuffer;
|
|
58
|
+
metadata: SerializedDesktopMetadataSnapshot;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const SNAPSHOT_VERSION = 2;
|
|
62
|
+
|
|
63
|
+
function toCacheSchemaVersion(schemaVersion: IfcDataStore['schemaVersion']): CacheSchemaVersion {
|
|
64
|
+
switch (schemaVersion) {
|
|
65
|
+
case 'IFC4':
|
|
66
|
+
return CacheSchemaVersion.IFC4;
|
|
67
|
+
case 'IFC4X3':
|
|
68
|
+
return CacheSchemaVersion.IFC4X3;
|
|
69
|
+
default:
|
|
70
|
+
return CacheSchemaVersion.IFC2X3;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function serializeSpatialNode(node: SpatialNode): SerializedSpatialNode {
|
|
75
|
+
return {
|
|
76
|
+
expressId: node.expressId,
|
|
77
|
+
type: node.type,
|
|
78
|
+
name: node.name,
|
|
79
|
+
elevation: node.elevation,
|
|
80
|
+
children: node.children.map(serializeSpatialNode),
|
|
81
|
+
elements: [...node.elements],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function deserializeSpatialNode(node: SerializedSpatialNode): SpatialNode {
|
|
86
|
+
return {
|
|
87
|
+
expressId: node.expressId,
|
|
88
|
+
type: node.type as IfcTypeEnum,
|
|
89
|
+
name: node.name,
|
|
90
|
+
elevation: node.elevation,
|
|
91
|
+
children: node.children.map(deserializeSpatialNode),
|
|
92
|
+
elements: [...node.elements],
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function serializeSpatialHierarchy(spatialHierarchy: SpatialHierarchy | undefined): SerializedSpatialHierarchy | null {
|
|
97
|
+
if (!spatialHierarchy) return null;
|
|
98
|
+
return {
|
|
99
|
+
project: serializeSpatialNode(spatialHierarchy.project),
|
|
100
|
+
byStorey: [...spatialHierarchy.byStorey.entries()].map(([id, elements]) => [id, [...elements]]),
|
|
101
|
+
byBuilding: [...spatialHierarchy.byBuilding.entries()].map(([id, elements]) => [id, [...elements]]),
|
|
102
|
+
bySite: [...spatialHierarchy.bySite.entries()].map(([id, elements]) => [id, [...elements]]),
|
|
103
|
+
bySpace: [...spatialHierarchy.bySpace.entries()].map(([id, elements]) => [id, [...elements]]),
|
|
104
|
+
storeyElevations: [...spatialHierarchy.storeyElevations.entries()],
|
|
105
|
+
storeyHeights: [...spatialHierarchy.storeyHeights.entries()],
|
|
106
|
+
elementToStorey: [...spatialHierarchy.elementToStorey.entries()],
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function deserializeSpatialHierarchy(
|
|
111
|
+
serialized: SerializedSpatialHierarchy | null | undefined,
|
|
112
|
+
): SpatialHierarchy | undefined {
|
|
113
|
+
if (!serialized) return undefined;
|
|
114
|
+
|
|
115
|
+
const project = deserializeSpatialNode(serialized.project);
|
|
116
|
+
const byStorey = new Map<number, number[]>(serialized.byStorey.map(([id, elements]) => [id, [...elements]]));
|
|
117
|
+
const byBuilding = new Map<number, number[]>(serialized.byBuilding.map(([id, elements]) => [id, [...elements]]));
|
|
118
|
+
const bySite = new Map<number, number[]>(serialized.bySite.map(([id, elements]) => [id, [...elements]]));
|
|
119
|
+
const bySpace = new Map<number, number[]>(serialized.bySpace.map(([id, elements]) => [id, [...elements]]));
|
|
120
|
+
const storeyElevations = new Map<number, number>(serialized.storeyElevations);
|
|
121
|
+
const storeyHeights = new Map<number, number>(serialized.storeyHeights);
|
|
122
|
+
const elementToStorey = new Map<number, number>(serialized.elementToStorey);
|
|
123
|
+
const elementToSpace = new Map<number, number>();
|
|
124
|
+
|
|
125
|
+
for (const [spaceId, elementIds] of bySpace) {
|
|
126
|
+
for (const elementId of elementIds) {
|
|
127
|
+
elementToSpace.set(elementId, spaceId);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return {
|
|
132
|
+
project,
|
|
133
|
+
byStorey,
|
|
134
|
+
byBuilding,
|
|
135
|
+
bySite,
|
|
136
|
+
bySpace,
|
|
137
|
+
storeyElevations,
|
|
138
|
+
storeyHeights,
|
|
139
|
+
elementToStorey,
|
|
140
|
+
getStoreyElements(storeyId: number): number[] {
|
|
141
|
+
return byStorey.get(storeyId) ?? [];
|
|
142
|
+
},
|
|
143
|
+
getStoreyByElevation(z: number): number | null {
|
|
144
|
+
let bestStoreyId: number | null = null;
|
|
145
|
+
let bestDistance = Number.POSITIVE_INFINITY;
|
|
146
|
+
for (const [storeyId, elevation] of storeyElevations) {
|
|
147
|
+
const distance = Math.abs(elevation - z);
|
|
148
|
+
if (distance < bestDistance) {
|
|
149
|
+
bestDistance = distance;
|
|
150
|
+
bestStoreyId = storeyId;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return bestStoreyId;
|
|
154
|
+
},
|
|
155
|
+
getContainingSpace(elementId: number): number | null {
|
|
156
|
+
return elementToSpace.get(elementId) ?? null;
|
|
157
|
+
},
|
|
158
|
+
getPath(elementId: number): SpatialNode[] {
|
|
159
|
+
const path: SpatialNode[] = [];
|
|
160
|
+
const walk = (node: SpatialNode): boolean => {
|
|
161
|
+
path.push(node);
|
|
162
|
+
if (node.elements.includes(elementId)) {
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
for (const child of node.children) {
|
|
166
|
+
if (walk(child)) {
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
path.pop();
|
|
171
|
+
return false;
|
|
172
|
+
};
|
|
173
|
+
walk(project);
|
|
174
|
+
return path;
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function encodeSnapshotEnvelope(cacheBuffer: ArrayBuffer, metadata: SerializedDesktopMetadataSnapshot): ArrayBuffer {
|
|
180
|
+
const metadataBytes = new TextEncoder().encode(JSON.stringify(metadata));
|
|
181
|
+
const cacheBytes = new Uint8Array(cacheBuffer);
|
|
182
|
+
const out = new Uint8Array(4 + metadataBytes.length + cacheBytes.length);
|
|
183
|
+
const view = new DataView(out.buffer);
|
|
184
|
+
view.setUint32(0, metadataBytes.length, true);
|
|
185
|
+
out.set(metadataBytes, 4);
|
|
186
|
+
out.set(cacheBytes, 4 + metadataBytes.length);
|
|
187
|
+
return out.buffer;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function collectSnapshotIndexIds(dataStore: IfcDataStore): { propertySetIds: number[]; quantitySetIds: number[] } {
|
|
191
|
+
return {
|
|
192
|
+
propertySetIds: [
|
|
193
|
+
...(dataStore.entityIndex.byType.get('IFCPROPERTYSET') ?? dataStore.entityIndex.byType.get('IfcPropertySet') ?? []),
|
|
194
|
+
],
|
|
195
|
+
quantitySetIds: [
|
|
196
|
+
...(dataStore.entityIndex.byType.get('IFCELEMENTQUANTITY') ?? dataStore.entityIndex.byType.get('IfcElementQuantity') ?? []),
|
|
197
|
+
],
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function buildEntityIndexByType(
|
|
202
|
+
dataStore: Pick<IfcDataStore, 'entities'>,
|
|
203
|
+
propertySetIds: number[],
|
|
204
|
+
quantitySetIds: number[],
|
|
205
|
+
): Map<string, number[]> {
|
|
206
|
+
const byType = new Map<string, number[]>();
|
|
207
|
+
for (let i = 0; i < dataStore.entities.count; i++) {
|
|
208
|
+
const typeName = IfcTypeEnumToString(dataStore.entities.typeEnum[i]).toUpperCase();
|
|
209
|
+
const expressId = dataStore.entities.expressId[i];
|
|
210
|
+
let ids = byType.get(typeName);
|
|
211
|
+
if (!ids) {
|
|
212
|
+
ids = [];
|
|
213
|
+
byType.set(typeName, ids);
|
|
214
|
+
}
|
|
215
|
+
ids.push(expressId);
|
|
216
|
+
}
|
|
217
|
+
if (propertySetIds.length > 0) {
|
|
218
|
+
byType.set('IFCPROPERTYSET', [...propertySetIds]);
|
|
219
|
+
}
|
|
220
|
+
if (quantitySetIds.length > 0) {
|
|
221
|
+
byType.set('IFCELEMENTQUANTITY', [...quantitySetIds]);
|
|
222
|
+
}
|
|
223
|
+
return byType;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function decodeSnapshotEnvelope(buffer: ArrayBuffer): DecodedDesktopMetadataSnapshot {
|
|
227
|
+
const bytes = new Uint8Array(buffer);
|
|
228
|
+
const view = new DataView(buffer);
|
|
229
|
+
const metadataLength = view.getUint32(0, true);
|
|
230
|
+
const metadataBytes = bytes.subarray(4, 4 + metadataLength);
|
|
231
|
+
const cacheBytes = bytes.subarray(4 + metadataLength);
|
|
232
|
+
const metadata = JSON.parse(new TextDecoder().decode(metadataBytes)) as SerializedDesktopMetadataSnapshot;
|
|
233
|
+
return {
|
|
234
|
+
cacheBuffer: cacheBytes.slice().buffer,
|
|
235
|
+
metadata,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function materializeSnapshotPropertyTable(dataStore: IfcDataStore): PropertyTable {
|
|
240
|
+
if (dataStore.properties.count > 0 || !dataStore.source?.length || !dataStore.onDemandPropertyMap?.size) {
|
|
241
|
+
return dataStore.properties;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
const builder = new PropertyTableBuilder(dataStore.strings);
|
|
245
|
+
for (const entityId of dataStore.onDemandPropertyMap.keys()) {
|
|
246
|
+
const propertySets = extractPropertiesOnDemand(dataStore, entityId);
|
|
247
|
+
for (const propertySet of propertySets) {
|
|
248
|
+
for (const property of propertySet.properties) {
|
|
249
|
+
builder.add({
|
|
250
|
+
entityId,
|
|
251
|
+
psetName: propertySet.name,
|
|
252
|
+
psetGlobalId: propertySet.globalId ?? '',
|
|
253
|
+
propName: property.name,
|
|
254
|
+
propType: property.type as PropertyValueType,
|
|
255
|
+
value: property.value,
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return builder.build();
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function materializeSnapshotQuantityTable(dataStore: IfcDataStore): QuantityTable {
|
|
264
|
+
if (dataStore.quantities.count > 0 || !dataStore.source?.length || !dataStore.onDemandQuantityMap?.size) {
|
|
265
|
+
return dataStore.quantities;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
const builder = new QuantityTableBuilder(dataStore.strings);
|
|
269
|
+
for (const entityId of dataStore.onDemandQuantityMap.keys()) {
|
|
270
|
+
const quantitySets = extractQuantitiesOnDemand(dataStore, entityId);
|
|
271
|
+
for (const quantitySet of quantitySets) {
|
|
272
|
+
for (const quantity of quantitySet.quantities) {
|
|
273
|
+
builder.add({
|
|
274
|
+
entityId,
|
|
275
|
+
qsetName: quantitySet.name,
|
|
276
|
+
quantityName: quantity.name,
|
|
277
|
+
quantityType: quantity.type,
|
|
278
|
+
value: quantity.value,
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return builder.build();
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
export async function buildDesktopMetadataSnapshot(
|
|
287
|
+
dataStore: IfcDataStore,
|
|
288
|
+
sourceBuffer: ArrayBuffer,
|
|
289
|
+
): Promise<ArrayBuffer> {
|
|
290
|
+
const writer = new BinaryCacheWriter();
|
|
291
|
+
const properties = materializeSnapshotPropertyTable(dataStore);
|
|
292
|
+
const quantities = materializeSnapshotQuantityTable(dataStore);
|
|
293
|
+
const cacheDataStore: CacheDataStore = {
|
|
294
|
+
schema: toCacheSchemaVersion(dataStore.schemaVersion),
|
|
295
|
+
entityCount: dataStore.entityCount || dataStore.entities?.count || 0,
|
|
296
|
+
strings: dataStore.strings,
|
|
297
|
+
entities: dataStore.entities,
|
|
298
|
+
properties,
|
|
299
|
+
quantities,
|
|
300
|
+
relationships: dataStore.relationships,
|
|
301
|
+
spatialHierarchy: dataStore.spatialHierarchy,
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
const cacheBuffer = await writer.write(cacheDataStore, undefined, sourceBuffer, {
|
|
305
|
+
includeGeometry: false,
|
|
306
|
+
includeSpatialHierarchy: false,
|
|
307
|
+
});
|
|
308
|
+
const { propertySetIds, quantitySetIds } = collectSnapshotIndexIds(dataStore);
|
|
309
|
+
|
|
310
|
+
return encodeSnapshotEnvelope(cacheBuffer, {
|
|
311
|
+
version: SNAPSHOT_VERSION,
|
|
312
|
+
schemaVersion: dataStore.schemaVersion,
|
|
313
|
+
fileSize: dataStore.fileSize,
|
|
314
|
+
entityCount: dataStore.entityCount,
|
|
315
|
+
parseTime: dataStore.parseTime,
|
|
316
|
+
spatialHierarchy: serializeSpatialHierarchy(dataStore.spatialHierarchy),
|
|
317
|
+
propertySetIds,
|
|
318
|
+
quantitySetIds,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
export async function restoreDesktopMetadataSnapshot(
|
|
323
|
+
snapshotBuffer: ArrayBuffer,
|
|
324
|
+
): Promise<IfcDataStore> {
|
|
325
|
+
const { cacheBuffer, metadata } = decodeSnapshotEnvelope(snapshotBuffer);
|
|
326
|
+
if (metadata.version !== SNAPSHOT_VERSION) {
|
|
327
|
+
throw new Error(`unsupported-desktop-metadata-snapshot:${metadata.version}`);
|
|
328
|
+
}
|
|
329
|
+
const reader = new BinaryCacheReader();
|
|
330
|
+
const result = await reader.read(cacheBuffer, { skipGeometry: true });
|
|
331
|
+
const dataStore = result.dataStore as unknown as IfcDataStore;
|
|
332
|
+
const byType = buildEntityIndexByType(
|
|
333
|
+
dataStore,
|
|
334
|
+
metadata.propertySetIds ?? [],
|
|
335
|
+
metadata.quantitySetIds ?? [],
|
|
336
|
+
);
|
|
337
|
+
|
|
338
|
+
dataStore.fileSize = metadata.fileSize;
|
|
339
|
+
dataStore.schemaVersion = metadata.schemaVersion;
|
|
340
|
+
dataStore.entityCount = metadata.entityCount;
|
|
341
|
+
dataStore.parseTime = metadata.parseTime;
|
|
342
|
+
dataStore.source = new Uint8Array(0);
|
|
343
|
+
dataStore.entityIndex = {
|
|
344
|
+
byId: new Map() as IfcDataStore['entityIndex']['byId'],
|
|
345
|
+
byType,
|
|
346
|
+
};
|
|
347
|
+
dataStore.spatialHierarchy = deserializeSpatialHierarchy(metadata.spatialHierarchy);
|
|
348
|
+
|
|
349
|
+
const { onDemandPropertyMap, onDemandQuantityMap } = rebuildOnDemandMaps(
|
|
350
|
+
dataStore.entities,
|
|
351
|
+
dataStore.relationships,
|
|
352
|
+
dataStore.entityIndex,
|
|
353
|
+
);
|
|
354
|
+
dataStore.onDemandPropertyMap = onDemandPropertyMap;
|
|
355
|
+
dataStore.onDemandQuantityMap = onDemandQuantityMap;
|
|
356
|
+
|
|
357
|
+
return dataStore;
|
|
358
|
+
}
|
package/src/utils/ifcConfig.ts
CHANGED
|
@@ -46,6 +46,9 @@ export const CACHE_SIZE_THRESHOLD = 10 * 1024 * 1024;
|
|
|
46
46
|
* and including it would make the IndexedDB write prohibitively large. */
|
|
47
47
|
export const CACHE_MAX_SOURCE_SIZE = 150 * 1024 * 1024;
|
|
48
48
|
|
|
49
|
+
/** Route desktop IFCs above this threshold through the bounded-memory path. */
|
|
50
|
+
export const HUGE_NATIVE_FILE_THRESHOLD = 128 * 1024 * 1024;
|
|
51
|
+
|
|
49
52
|
/** File size thresholds for various optimizations */
|
|
50
53
|
export const THRESHOLDS = {
|
|
51
54
|
/** Use streaming Parquet above this (150MB) */
|
|
@@ -65,7 +68,9 @@ export const THRESHOLDS = {
|
|
|
65
68
|
// ============================================================================
|
|
66
69
|
|
|
67
70
|
/** Detect if running in Tauri (desktop) environment */
|
|
68
|
-
export
|
|
71
|
+
export function isTauri(): boolean {
|
|
72
|
+
return typeof window !== 'undefined' && '__TAURI_INTERNALS__' in window;
|
|
73
|
+
}
|
|
69
74
|
|
|
70
75
|
// ============================================================================
|
|
71
76
|
// Dynamic Batch Configuration
|
|
@@ -0,0 +1,250 @@
|
|
|
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 {
|
|
6
|
+
IfcTypeEnumFromString,
|
|
7
|
+
isBuildingLikeSpatialType,
|
|
8
|
+
isStoreyLikeSpatialType,
|
|
9
|
+
type SpatialHierarchy,
|
|
10
|
+
type SpatialNode,
|
|
11
|
+
} from '@ifc-lite/data';
|
|
12
|
+
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
13
|
+
import type { NativeMetadataEntitySummary, NativeMetadataSnapshot, NativeMetadataSpatialNode } from '@/store/types';
|
|
14
|
+
|
|
15
|
+
function normalizeSummary(summary: Partial<NativeMetadataEntitySummary> & { typeName?: string; summary?: Partial<NativeMetadataEntitySummary> }): NativeMetadataEntitySummary | null {
|
|
16
|
+
const source = summary.summary ? { ...summary.summary, ...summary } : summary;
|
|
17
|
+
const expressId = typeof source.expressId === 'number' ? source.expressId : null;
|
|
18
|
+
const type = typeof source.type === 'string'
|
|
19
|
+
? source.type
|
|
20
|
+
: typeof source.typeName === 'string'
|
|
21
|
+
? source.typeName
|
|
22
|
+
: null;
|
|
23
|
+
if (expressId === null || !type) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
expressId,
|
|
28
|
+
type,
|
|
29
|
+
name: typeof source.name === 'string' ? source.name : `${type} #${expressId}`,
|
|
30
|
+
globalId: typeof source.globalId === 'string' ? source.globalId : null,
|
|
31
|
+
kind: source.kind === 'spatial' ? 'spatial' : 'element',
|
|
32
|
+
hasChildren: Boolean(source.hasChildren),
|
|
33
|
+
elementCount: typeof source.elementCount === 'number' ? source.elementCount : undefined,
|
|
34
|
+
elevation: typeof source.elevation === 'number' ? source.elevation : undefined,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function normalizeSpatialNode(
|
|
39
|
+
node: NativeMetadataSpatialNode | (Partial<NativeMetadataSpatialNode> & { typeName?: string; summary?: Partial<NativeMetadataEntitySummary> }),
|
|
40
|
+
): (NativeMetadataSpatialNode & { elements: NativeMetadataEntitySummary[] }) | null {
|
|
41
|
+
const summary = normalizeSummary(node as Partial<NativeMetadataEntitySummary> & { typeName?: string; summary?: Partial<NativeMetadataEntitySummary> });
|
|
42
|
+
if (!summary) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
const children = Array.isArray(node.children)
|
|
46
|
+
? node.children
|
|
47
|
+
.map((child) => normalizeSpatialNode(child as Partial<NativeMetadataSpatialNode> & { typeName?: string; summary?: Partial<NativeMetadataEntitySummary> }))
|
|
48
|
+
.filter((child): child is NativeMetadataSpatialNode & { elements: NativeMetadataEntitySummary[] } => child !== null)
|
|
49
|
+
: [];
|
|
50
|
+
const elements = Array.isArray((node as { elements?: unknown[] }).elements)
|
|
51
|
+
? ((node as { elements?: unknown[] }).elements ?? [])
|
|
52
|
+
.map((entry) => normalizeSummary(entry as Partial<NativeMetadataEntitySummary> & { typeName?: string; summary?: Partial<NativeMetadataEntitySummary> }))
|
|
53
|
+
.filter((entry): entry is NativeMetadataEntitySummary => entry !== null)
|
|
54
|
+
: [];
|
|
55
|
+
return {
|
|
56
|
+
...summary,
|
|
57
|
+
children,
|
|
58
|
+
elements,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function buildEntityLookup() {
|
|
63
|
+
const ids: number[] = [];
|
|
64
|
+
const typeEnums: number[] = [];
|
|
65
|
+
const flags: number[] = [];
|
|
66
|
+
const nameById = new Map<number, string>();
|
|
67
|
+
const typeNameById = new Map<number, string>();
|
|
68
|
+
const byType = new Map<string, number[]>();
|
|
69
|
+
|
|
70
|
+
const addSummary = (summary: NativeMetadataEntitySummary) => {
|
|
71
|
+
if (!summary.type) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (nameById.has(summary.expressId)) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
ids.push(summary.expressId);
|
|
78
|
+
typeEnums.push(IfcTypeEnumFromString(summary.type));
|
|
79
|
+
flags.push(0);
|
|
80
|
+
nameById.set(summary.expressId, summary.name);
|
|
81
|
+
typeNameById.set(summary.expressId, summary.type);
|
|
82
|
+
const typeKey = summary.type.toUpperCase();
|
|
83
|
+
const existing = byType.get(typeKey);
|
|
84
|
+
if (existing) {
|
|
85
|
+
existing.push(summary.expressId);
|
|
86
|
+
} else {
|
|
87
|
+
byType.set(typeKey, [summary.expressId]);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
addSummary,
|
|
93
|
+
buildEntities() {
|
|
94
|
+
return {
|
|
95
|
+
count: ids.length,
|
|
96
|
+
expressId: Uint32Array.from(ids),
|
|
97
|
+
typeEnum: Uint32Array.from(typeEnums),
|
|
98
|
+
flags: Uint8Array.from(flags),
|
|
99
|
+
getName(expressId: number) {
|
|
100
|
+
return nameById.get(expressId);
|
|
101
|
+
},
|
|
102
|
+
getTypeName(expressId: number) {
|
|
103
|
+
return typeNameById.get(expressId) ?? 'Unknown';
|
|
104
|
+
},
|
|
105
|
+
getByType(type: string | number) {
|
|
106
|
+
const key = typeof type === 'string' ? type.toUpperCase() : String(type);
|
|
107
|
+
return byType.get(key) ?? [];
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
},
|
|
111
|
+
buildByType() {
|
|
112
|
+
return byType;
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function buildPathResolver(project: SpatialNode) {
|
|
118
|
+
return (elementId: number): SpatialNode[] => {
|
|
119
|
+
const path: SpatialNode[] = [];
|
|
120
|
+
const visit = (node: SpatialNode): boolean => {
|
|
121
|
+
path.push(node);
|
|
122
|
+
if (node.elements.includes(elementId)) {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
for (const child of node.children) {
|
|
126
|
+
if (visit(child)) {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
path.pop();
|
|
131
|
+
return false;
|
|
132
|
+
};
|
|
133
|
+
visit(project);
|
|
134
|
+
return path;
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export function buildIfcDataStoreFromNativeMetadata(snapshot: NativeMetadataSnapshot): IfcDataStore | null {
|
|
139
|
+
const root = snapshot.spatialTree ? normalizeSpatialNode(snapshot.spatialTree) : null;
|
|
140
|
+
if (!root) {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const byStorey = new Map<number, number[]>();
|
|
145
|
+
const byBuilding = new Map<number, number[]>();
|
|
146
|
+
const bySite = new Map<number, number[]>();
|
|
147
|
+
const bySpace = new Map<number, number[]>();
|
|
148
|
+
const storeyElevations = new Map<number, number>();
|
|
149
|
+
const storeyHeights = new Map<number, number>();
|
|
150
|
+
const elementToStorey = new Map<number, number>();
|
|
151
|
+
const elementToSpace = new Map<number, number>();
|
|
152
|
+
const entityLookup = buildEntityLookup();
|
|
153
|
+
|
|
154
|
+
const buildNode = (
|
|
155
|
+
node: NativeMetadataSpatialNode & { elements: NativeMetadataEntitySummary[] },
|
|
156
|
+
currentStoreyId: number | null,
|
|
157
|
+
currentSpaceId: number | null,
|
|
158
|
+
): SpatialNode => {
|
|
159
|
+
entityLookup.addSummary(node);
|
|
160
|
+
const typeEnum = IfcTypeEnumFromString(node.type);
|
|
161
|
+
const nextStoreyId = isStoreyLikeSpatialType(typeEnum) ? node.expressId : currentStoreyId;
|
|
162
|
+
const nextSpaceId = node.type === 'IfcSpace' ? node.expressId : currentSpaceId;
|
|
163
|
+
const elements = node.elements.map((summary) => {
|
|
164
|
+
entityLookup.addSummary(summary);
|
|
165
|
+
if (nextStoreyId !== null) {
|
|
166
|
+
elementToStorey.set(summary.expressId, nextStoreyId);
|
|
167
|
+
}
|
|
168
|
+
if (nextSpaceId !== null) {
|
|
169
|
+
elementToSpace.set(summary.expressId, nextSpaceId);
|
|
170
|
+
}
|
|
171
|
+
return summary.expressId;
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
const childNodes = node.children.map((child) => buildNode(child, nextStoreyId, nextSpaceId));
|
|
175
|
+
const spatialNode: SpatialNode = {
|
|
176
|
+
expressId: node.expressId,
|
|
177
|
+
type: typeEnum,
|
|
178
|
+
name: node.name,
|
|
179
|
+
elevation: node.elevation ?? undefined,
|
|
180
|
+
children: childNodes,
|
|
181
|
+
elements,
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
if (isStoreyLikeSpatialType(typeEnum)) {
|
|
185
|
+
byStorey.set(node.expressId, elements);
|
|
186
|
+
if (typeof node.elevation === 'number') {
|
|
187
|
+
storeyElevations.set(node.expressId, node.elevation);
|
|
188
|
+
}
|
|
189
|
+
} else if (isBuildingLikeSpatialType(typeEnum)) {
|
|
190
|
+
byBuilding.set(node.expressId, elements);
|
|
191
|
+
} else if (node.type === 'IfcSite') {
|
|
192
|
+
bySite.set(node.expressId, elements);
|
|
193
|
+
} else if (node.type === 'IfcSpace') {
|
|
194
|
+
bySpace.set(node.expressId, elements);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return spatialNode;
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
const project = buildNode(root, null, null);
|
|
201
|
+
const getPath = buildPathResolver(project);
|
|
202
|
+
const hierarchy: SpatialHierarchy = {
|
|
203
|
+
project,
|
|
204
|
+
byStorey,
|
|
205
|
+
byBuilding,
|
|
206
|
+
bySite,
|
|
207
|
+
bySpace,
|
|
208
|
+
storeyElevations,
|
|
209
|
+
storeyHeights,
|
|
210
|
+
elementToStorey,
|
|
211
|
+
getStoreyElements(storeyId: number) {
|
|
212
|
+
return byStorey.get(storeyId) ?? [];
|
|
213
|
+
},
|
|
214
|
+
getStoreyByElevation(z: number) {
|
|
215
|
+
let closestStoreyId: number | null = null;
|
|
216
|
+
let closestDistance = Number.POSITIVE_INFINITY;
|
|
217
|
+
for (const [storeyId, elevation] of storeyElevations) {
|
|
218
|
+
const distance = Math.abs(elevation - z);
|
|
219
|
+
if (distance < closestDistance) {
|
|
220
|
+
closestDistance = distance;
|
|
221
|
+
closestStoreyId = storeyId;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return closestStoreyId;
|
|
225
|
+
},
|
|
226
|
+
getContainingSpace(elementId: number) {
|
|
227
|
+
return elementToSpace.get(elementId) ?? null;
|
|
228
|
+
},
|
|
229
|
+
getPath,
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
const entities = entityLookup.buildEntities();
|
|
233
|
+
return {
|
|
234
|
+
fileSize: 0,
|
|
235
|
+
schemaVersion: snapshot.schemaVersion,
|
|
236
|
+
entityCount: snapshot.entityCount,
|
|
237
|
+
parseTime: 0,
|
|
238
|
+
source: new Uint8Array(0),
|
|
239
|
+
entityIndex: {
|
|
240
|
+
byId: new Map(),
|
|
241
|
+
byType: entityLookup.buildByType(),
|
|
242
|
+
},
|
|
243
|
+
strings: {} as IfcDataStore['strings'],
|
|
244
|
+
entities: entities as unknown as IfcDataStore['entities'],
|
|
245
|
+
properties: undefined as unknown as IfcDataStore['properties'],
|
|
246
|
+
quantities: undefined as unknown as IfcDataStore['quantities'],
|
|
247
|
+
relationships: undefined as unknown as IfcDataStore['relationships'],
|
|
248
|
+
spatialHierarchy: hierarchy,
|
|
249
|
+
} as IfcDataStore;
|
|
250
|
+
}
|
|
@@ -394,6 +394,10 @@ function buildEntityTable(
|
|
|
394
394
|
if (!indices) return [];
|
|
395
395
|
return indices.map(idx => expressId[idx]);
|
|
396
396
|
},
|
|
397
|
+
getTypeEnum: (id) => {
|
|
398
|
+
const i = indexOfId(id);
|
|
399
|
+
return i >= 0 ? typeEnumArr[i] as IfcTypeEnum : IfcTypeEnum.Unknown;
|
|
400
|
+
},
|
|
397
401
|
getExpressIdByGlobalId: (gid) => {
|
|
398
402
|
return globalIdToExpressId.get(gid) ?? -1;
|
|
399
403
|
},
|
|
@@ -32,12 +32,9 @@ export function rebuildSpatialHierarchy(
|
|
|
32
32
|
entities: EntityTable,
|
|
33
33
|
relationships: RelationshipGraph
|
|
34
34
|
): SpatialHierarchy | undefined {
|
|
35
|
-
//
|
|
36
|
-
// This
|
|
37
|
-
|
|
38
|
-
for (let i = 0; i < entities.count; i++) {
|
|
39
|
-
entityTypeMap.set(entities.expressId[i], entities.typeEnum[i]);
|
|
40
|
-
}
|
|
35
|
+
// Use EntityTable.getTypeEnum() for O(1) lookups via its internal idToIndex map.
|
|
36
|
+
// This avoids building a temporary Map<number, IfcTypeEnum> with 4.4M entries
|
|
37
|
+
// (~350MB for large files) that duplicates data already in the entity table.
|
|
41
38
|
|
|
42
39
|
const byStorey = new Map<number, number[]>();
|
|
43
40
|
const byBuilding = new Map<number, number[]>();
|
|
@@ -58,7 +55,7 @@ export function rebuildSpatialHierarchy(
|
|
|
58
55
|
// Build node tree recursively - NOW O(1) lookups!
|
|
59
56
|
function buildNode(expressId: number): SpatialNode {
|
|
60
57
|
// O(1) lookup instead of O(n) linear search
|
|
61
|
-
const typeEnum =
|
|
58
|
+
const typeEnum = entities.getTypeEnum(expressId);
|
|
62
59
|
const name = entities.getName(expressId) || `Entity #${expressId}`;
|
|
63
60
|
|
|
64
61
|
// Get contained elements via IfcRelContainedInSpatialStructure
|
|
@@ -68,10 +65,12 @@ export function rebuildSpatialHierarchy(
|
|
|
68
65
|
'forward'
|
|
69
66
|
);
|
|
70
67
|
|
|
71
|
-
// Filter out spatial structure elements
|
|
68
|
+
// Filter out spatial structure elements — keep unknown types (custom/newer IFC classes).
|
|
69
|
+
// getTypeEnum() returns IfcTypeEnum.Unknown for both missing and unrecognized entities;
|
|
70
|
+
// isSpatialStructureType(Unknown) is false, so unknown types pass through correctly.
|
|
72
71
|
const containedElements = rawContainedElements.filter((id) => {
|
|
73
|
-
const elemType =
|
|
74
|
-
return
|
|
72
|
+
const elemType = entities.getTypeEnum(id);
|
|
73
|
+
return !isSpatialStructureType(elemType);
|
|
75
74
|
});
|
|
76
75
|
|
|
77
76
|
// Get aggregated children via IfcRelAggregates
|
|
@@ -84,7 +83,7 @@ export function rebuildSpatialHierarchy(
|
|
|
84
83
|
// Filter to spatial structure types and recurse - O(1) per child now!
|
|
85
84
|
const childNodes: SpatialNode[] = [];
|
|
86
85
|
for (const childId of aggregatedChildren) {
|
|
87
|
-
const childType =
|
|
86
|
+
const childType = entities.getTypeEnum(childId);
|
|
88
87
|
if (childType && isSpatialStructureType(childType) && childType !== IfcTypeEnum.IfcProject) {
|
|
89
88
|
childNodes.push(buildNode(childId));
|
|
90
89
|
}
|