@ifc-lite/viewer 1.17.3 → 1.17.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +39 -30
- package/.turbo/turbo-typecheck.log +1 -1
- package/CHANGELOG.md +132 -0
- package/DESKTOP_CONTRACT_VERSION +1 -0
- package/dist/assets/arrow-CZ5kQ26f.js +20 -0
- package/dist/assets/basketViewActivator-86rgogji.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/drawing-2d-DoxKMqbO.js +257 -0
- package/dist/assets/{exporters-C_6J153K.js → exporters-CcPS9MK5.js} +2898 -2380
- package/dist/assets/geometry.worker-BFUYA08u.js +1 -0
- package/dist/assets/ids-DQ5jY0E8.js +1 -0
- package/dist/assets/ifc-lite_bg-BINvzoCP.wasm +0 -0
- package/dist/assets/{index-jhBr1wbn.js → index-Bfms9I4A.js} +41036 -34613
- package/dist/assets/index-_bfZsDCC.css +1 -0
- package/dist/assets/{maplibre-gl-BpvwNKKy.js → maplibre-gl-CGLcoNXc.js} +1 -1
- package/dist/assets/native-bridge-DUyLCMZS.js +429 -0
- package/dist/assets/{sandbox-B79eavQ3.js → sandbox-C8575tul.js} +4342 -4324
- package/dist/assets/{server-client-D3bUPJJc.js → server-client-BuZK7OST.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-JsqEGDV8.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 +13 -10
- package/index.html +1 -0
- package/package.json +18 -15
- package/src/App.tsx +7 -9
- package/src/components/viewer/BCFPanel.tsx +46 -4
- package/src/components/viewer/CesiumOverlay.tsx +715 -0
- package/src/components/viewer/CesiumSettingsDialog.tsx +100 -0
- package/src/components/viewer/ChatPanel.tsx +232 -90
- 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 +355 -28
- package/src/components/viewer/PropertiesPanel.tsx +234 -81
- package/src/components/viewer/ScriptPanel.tsx +34 -8
- package/src/components/viewer/SettingsPage.tsx +581 -0
- package/src/components/viewer/StatusBar.tsx +17 -1
- package/src/components/viewer/ThemeSwitch.tsx +63 -7
- package/src/components/viewer/ViewerLayout.tsx +48 -6
- package/src/components/viewer/Viewport.tsx +61 -8
- package/src/components/viewer/ViewportContainer.tsx +265 -28
- package/src/components/viewer/ViewportOverlays.tsx +132 -27
- package/src/components/viewer/bcf/BCFTopicDetail.tsx +4 -4
- package/src/components/viewer/chat/ModelSelector.tsx +90 -54
- package/src/components/viewer/properties/GeoreferencingPanel.tsx +229 -55
- package/src/components/viewer/properties/LocationMap.tsx +462 -19
- package/src/components/viewer/properties/ModelMetadataPanel.tsx +1 -1
- package/src/components/viewer/selectionHandlers.ts +4 -3
- package/src/components/viewer/tools/SectionCapControls.tsx +237 -0
- package/src/components/viewer/tools/SectionPanel.tsx +39 -18
- package/src/components/viewer/useAnimationLoop.ts +13 -1
- package/src/components/viewer/useGeometryStreaming.ts +127 -40
- package/src/components/viewer/useMouseControls.ts +4 -1
- package/src/components/viewer/useRenderUpdates.ts +1 -1
- package/src/hooks/ids/idsDataAccessor.ts +60 -24
- package/src/hooks/ingest/viewerModelIngest.ts +280 -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 +378 -291
- package/src/hooks/useIfcLoader.ts +1657 -130
- package/src/hooks/useIfcServer.ts +0 -69
- package/src/hooks/useViewControls.ts +13 -5
- package/src/index.css +484 -10
- package/src/lib/desktop/desktopEntitlementEvents.ts +39 -0
- package/src/lib/desktop-entitlement.ts +43 -0
- package/src/lib/desktop-product.ts +124 -0
- package/src/lib/geo/cesium-bridge.ts +318 -0
- package/src/lib/geo/effective-georef.test.ts +73 -0
- package/src/lib/geo/effective-georef.ts +111 -0
- package/src/lib/geo/reproject.ts +249 -37
- package/src/lib/llm/byok-guard.test.ts +77 -0
- package/src/lib/llm/byok-guard.ts +39 -0
- package/src/lib/llm/free-models.test.ts +0 -6
- package/src/lib/llm/models.ts +104 -42
- package/src/lib/llm/stream-client.ts +74 -110
- package/src/lib/llm/stream-direct.test.ts +130 -0
- package/src/lib/llm/stream-direct.ts +316 -0
- package/src/lib/llm/types.ts +14 -2
- package/src/lib/recent-files.ts +2 -1
- package/src/main.tsx +1 -10
- package/src/services/analysis-extensions.ts +125 -0
- package/src/services/api-keys.ts +73 -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/constants.ts +20 -2
- package/src/store/index.ts +52 -7
- package/src/store/slices/cesiumSlice.ts +127 -0
- package/src/store/slices/chatSlice.test.ts +6 -76
- package/src/store/slices/chatSlice.ts +21 -58
- 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/slices/sectionSlice.test.ts +87 -7
- package/src/store/slices/sectionSlice.ts +151 -5
- package/src/store/slices/uiSlice.ts +28 -5
- package/src/store/types.ts +122 -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 +253 -0
- package/src/utils/serverDataModel.ts +4 -0
- package/src/utils/spatialHierarchy.ts +10 -11
- package/src/utils/viewportUtils.ts +7 -2
- package/src/vite-env.d.ts +0 -4
- 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/drawing-2d-gWfpdfYe.js +0 -257
- package/dist/assets/geometry.worker-Nz9_YIqh.js +0 -1
- package/dist/assets/ids-B4jTqB1O.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
- package/src/components/viewer/UpgradePage.tsx +0 -69
- package/src/lib/llm/ClerkChatSync.tsx +0 -74
- package/src/lib/llm/clerk-auth.ts +0 -62
|
@@ -47,6 +47,14 @@ describe('SectionSlice', () => {
|
|
|
47
47
|
assert.strictEqual(state.sectionPlane.axis, 'side');
|
|
48
48
|
assert.strictEqual(state.sectionPlane.position, 75);
|
|
49
49
|
});
|
|
50
|
+
|
|
51
|
+
it('should auto-enable the clip so the axis change is immediately visible', () => {
|
|
52
|
+
// Simulate a user who disabled clipping, then picks a new axis — they
|
|
53
|
+
// almost certainly want to see the new cut, not stay in "Clip off".
|
|
54
|
+
state.sectionPlane.enabled = false;
|
|
55
|
+
state.setSectionPlaneAxis('front');
|
|
56
|
+
assert.strictEqual(state.sectionPlane.enabled, true);
|
|
57
|
+
});
|
|
50
58
|
});
|
|
51
59
|
|
|
52
60
|
describe('setSectionPlanePosition', () => {
|
|
@@ -74,6 +82,74 @@ describe('SectionSlice', () => {
|
|
|
74
82
|
state.setSectionPlanePosition('50' as any);
|
|
75
83
|
assert.strictEqual(state.sectionPlane.position, 50);
|
|
76
84
|
});
|
|
85
|
+
|
|
86
|
+
it('should auto-enable the clip when the slider moves', () => {
|
|
87
|
+
// This is the fix for the "it jitters, doesn't cut" user report: moving
|
|
88
|
+
// the slider implicitly turns on clipping so the user doesn't have to
|
|
89
|
+
// hunt for the toggle.
|
|
90
|
+
state.sectionPlane.enabled = false;
|
|
91
|
+
state.setSectionPlanePosition(42);
|
|
92
|
+
assert.strictEqual(state.sectionPlane.enabled, true);
|
|
93
|
+
assert.strictEqual(state.sectionPlane.position, 42);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
describe('setSectionPlaneEnabled', () => {
|
|
98
|
+
it('should set enabled to true explicitly', () => {
|
|
99
|
+
state.sectionPlane.enabled = false;
|
|
100
|
+
state.setSectionPlaneEnabled(true);
|
|
101
|
+
assert.strictEqual(state.sectionPlane.enabled, true);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('should set enabled to false explicitly', () => {
|
|
105
|
+
state.setSectionPlaneEnabled(false);
|
|
106
|
+
assert.strictEqual(state.sectionPlane.enabled, false);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
describe('setSectionShowCap', () => {
|
|
111
|
+
it('should toggle the showCap flag without touching clipping', () => {
|
|
112
|
+
assert.strictEqual(state.sectionPlane.showCap, true);
|
|
113
|
+
state.setSectionShowCap(false);
|
|
114
|
+
assert.strictEqual(state.sectionPlane.showCap, false);
|
|
115
|
+
// Clipping unchanged — cap is a visual-only add-on.
|
|
116
|
+
assert.strictEqual(state.sectionPlane.enabled, true);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
describe('setSectionShowOutlines', () => {
|
|
121
|
+
it('should toggle the showOutlines flag independently of showCap and clipping', () => {
|
|
122
|
+
assert.strictEqual(state.sectionPlane.showOutlines, true);
|
|
123
|
+
state.setSectionShowOutlines(false);
|
|
124
|
+
assert.strictEqual(state.sectionPlane.showOutlines, false);
|
|
125
|
+
assert.strictEqual(state.sectionPlane.showCap, true);
|
|
126
|
+
assert.strictEqual(state.sectionPlane.enabled, true);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it('should set showOutlines back to true', () => {
|
|
130
|
+
state.setSectionShowOutlines(false);
|
|
131
|
+
state.setSectionShowOutlines(true);
|
|
132
|
+
assert.strictEqual(state.sectionPlane.showOutlines, true);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
describe('setSectionCapStyle', () => {
|
|
137
|
+
it('should partially update the cap style without clobbering other fields', () => {
|
|
138
|
+
const before = state.sectionPlane.capStyle;
|
|
139
|
+
state.setSectionCapStyle({ pattern: 'concrete' });
|
|
140
|
+
assert.strictEqual(state.sectionPlane.capStyle.pattern, 'concrete');
|
|
141
|
+
assert.strictEqual(state.sectionPlane.capStyle.spacingPx, before.spacingPx);
|
|
142
|
+
assert.strictEqual(state.sectionPlane.capStyle.angleRad, before.angleRad);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it('should accept custom fill and stroke colours', () => {
|
|
146
|
+
state.setSectionCapStyle({
|
|
147
|
+
fillColor: [0.2, 0.3, 0.4, 1.0],
|
|
148
|
+
strokeColor: [0.9, 0.1, 0.1, 1.0],
|
|
149
|
+
});
|
|
150
|
+
assert.deepStrictEqual(state.sectionPlane.capStyle.fillColor, [0.2, 0.3, 0.4, 1.0]);
|
|
151
|
+
assert.deepStrictEqual(state.sectionPlane.capStyle.strokeColor, [0.9, 0.1, 0.1, 1.0]);
|
|
152
|
+
});
|
|
77
153
|
});
|
|
78
154
|
|
|
79
155
|
describe('toggleSectionPlane', () => {
|
|
@@ -106,13 +182,13 @@ describe('SectionSlice', () => {
|
|
|
106
182
|
|
|
107
183
|
describe('resetSectionPlane', () => {
|
|
108
184
|
it('should reset to default values', () => {
|
|
109
|
-
|
|
110
|
-
state.
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
};
|
|
185
|
+
state.setSectionPlaneAxis('side');
|
|
186
|
+
state.setSectionPlanePosition(25);
|
|
187
|
+
state.setSectionPlaneEnabled(false);
|
|
188
|
+
state.flipSectionPlane();
|
|
189
|
+
state.setSectionShowCap(false);
|
|
190
|
+
state.setSectionShowOutlines(false);
|
|
191
|
+
state.setSectionCapStyle({ pattern: 'brick' });
|
|
116
192
|
|
|
117
193
|
state.resetSectionPlane();
|
|
118
194
|
|
|
@@ -120,6 +196,10 @@ describe('SectionSlice', () => {
|
|
|
120
196
|
assert.strictEqual(state.sectionPlane.position, SECTION_PLANE_DEFAULTS.POSITION);
|
|
121
197
|
assert.strictEqual(state.sectionPlane.enabled, SECTION_PLANE_DEFAULTS.ENABLED);
|
|
122
198
|
assert.strictEqual(state.sectionPlane.flipped, SECTION_PLANE_DEFAULTS.FLIPPED);
|
|
199
|
+
assert.strictEqual(state.sectionPlane.showCap, SECTION_PLANE_DEFAULTS.SHOW_CAP);
|
|
200
|
+
assert.strictEqual(state.sectionPlane.showOutlines, SECTION_PLANE_DEFAULTS.SHOW_OUTLINES);
|
|
201
|
+
// Default cap pattern restored.
|
|
202
|
+
assert.strictEqual(state.sectionPlane.capStyle.pattern, 'diagonal');
|
|
123
203
|
});
|
|
124
204
|
});
|
|
125
205
|
});
|
|
@@ -7,8 +7,103 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import type { StateCreator } from 'zustand';
|
|
10
|
-
import type { SectionPlane, SectionPlaneAxis } from '../types.js';
|
|
11
|
-
import { SECTION_PLANE_DEFAULTS } from '../constants.js';
|
|
10
|
+
import type { SectionPlane, SectionPlaneAxis, SectionCapStyle, SectionCapHatchId } from '../types.js';
|
|
11
|
+
import { SECTION_PLANE_DEFAULTS, SECTION_CAP_DEFAULTS } from '../constants.js';
|
|
12
|
+
|
|
13
|
+
// ─── Persistence ─────────────────────────────────────────────────────────
|
|
14
|
+
// Cap appearance (hatch pattern, colours, spacing, angle, whether the cap is
|
|
15
|
+
// shown at all) persists across reloads via localStorage, so the user's
|
|
16
|
+
// preferred cut surface survives closing and re-opening the app. Axis and
|
|
17
|
+
// position are session-scoped because they only make sense relative to a
|
|
18
|
+
// loaded model. See chatSlice.ts for the same direct-localStorage pattern
|
|
19
|
+
// used elsewhere in the store.
|
|
20
|
+
const CAP_STYLE_STORAGE_KEY = 'ifc-lite:section-cap-style';
|
|
21
|
+
const CAP_SHOW_STORAGE_KEY = 'ifc-lite:section-cap-show';
|
|
22
|
+
const OUTLINES_SHOW_STORAGE_KEY = 'ifc-lite:section-outlines-show';
|
|
23
|
+
|
|
24
|
+
const HATCH_IDS: readonly SectionCapHatchId[] = [
|
|
25
|
+
'solid', 'diagonal', 'crossHatch', 'horizontal',
|
|
26
|
+
'vertical', 'concrete', 'brick', 'insulation',
|
|
27
|
+
] as const;
|
|
28
|
+
|
|
29
|
+
function isHatchId(v: unknown): v is SectionCapHatchId {
|
|
30
|
+
return typeof v === 'string' && (HATCH_IDS as readonly string[]).includes(v);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function isRgba(v: unknown): v is [number, number, number, number] {
|
|
34
|
+
return Array.isArray(v) && v.length === 4 && v.every((n) => typeof n === 'number' && Number.isFinite(n));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function loadCapStyle(): SectionCapStyle {
|
|
38
|
+
const fallback: SectionCapStyle = {
|
|
39
|
+
fillColor: [...SECTION_CAP_DEFAULTS.FILL_COLOR],
|
|
40
|
+
strokeColor: [...SECTION_CAP_DEFAULTS.STROKE_COLOR],
|
|
41
|
+
pattern: SECTION_CAP_DEFAULTS.PATTERN,
|
|
42
|
+
spacingPx: SECTION_CAP_DEFAULTS.SPACING_PX,
|
|
43
|
+
angleRad: SECTION_CAP_DEFAULTS.ANGLE_RAD,
|
|
44
|
+
widthPx: SECTION_CAP_DEFAULTS.WIDTH_PX,
|
|
45
|
+
secondaryAngleRad: SECTION_CAP_DEFAULTS.SECONDARY_ANGLE_RAD,
|
|
46
|
+
};
|
|
47
|
+
if (typeof window === 'undefined') return fallback;
|
|
48
|
+
try {
|
|
49
|
+
const raw = window.localStorage.getItem(CAP_STYLE_STORAGE_KEY);
|
|
50
|
+
if (!raw) return fallback;
|
|
51
|
+
const parsed = JSON.parse(raw) as Record<string, unknown>;
|
|
52
|
+
return {
|
|
53
|
+
fillColor: isRgba(parsed.fillColor) ? parsed.fillColor : fallback.fillColor,
|
|
54
|
+
strokeColor: isRgba(parsed.strokeColor) ? parsed.strokeColor : fallback.strokeColor,
|
|
55
|
+
pattern: isHatchId(parsed.pattern) ? parsed.pattern : fallback.pattern,
|
|
56
|
+
spacingPx: typeof parsed.spacingPx === 'number' && Number.isFinite(parsed.spacingPx)
|
|
57
|
+
? Math.max(2, parsed.spacingPx) : fallback.spacingPx,
|
|
58
|
+
angleRad: typeof parsed.angleRad === 'number' && Number.isFinite(parsed.angleRad)
|
|
59
|
+
? parsed.angleRad : fallback.angleRad,
|
|
60
|
+
widthPx: typeof parsed.widthPx === 'number' && Number.isFinite(parsed.widthPx)
|
|
61
|
+
? Math.max(1, parsed.widthPx) : fallback.widthPx,
|
|
62
|
+
secondaryAngleRad: typeof parsed.secondaryAngleRad === 'number' && Number.isFinite(parsed.secondaryAngleRad)
|
|
63
|
+
? parsed.secondaryAngleRad : fallback.secondaryAngleRad,
|
|
64
|
+
};
|
|
65
|
+
} catch (error) {
|
|
66
|
+
console.warn('[section] failed to load cap style from localStorage', error);
|
|
67
|
+
return fallback;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function saveCapStyle(style: SectionCapStyle): void {
|
|
72
|
+
if (typeof window === 'undefined') return;
|
|
73
|
+
try {
|
|
74
|
+
window.localStorage.setItem(CAP_STYLE_STORAGE_KEY, JSON.stringify(style));
|
|
75
|
+
} catch (error) {
|
|
76
|
+
// Storage quota, private mode etc. — preference just doesn't persist this
|
|
77
|
+
// session; log so a missing setting is at least diagnosable in devtools.
|
|
78
|
+
console.warn('[section] failed to save cap style to localStorage', error);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function loadBoolean(key: string, fallback: boolean): boolean {
|
|
83
|
+
if (typeof window === 'undefined') return fallback;
|
|
84
|
+
try {
|
|
85
|
+
const raw = window.localStorage.getItem(key);
|
|
86
|
+
if (raw === 'true') return true;
|
|
87
|
+
if (raw === 'false') return false;
|
|
88
|
+
} catch (error) {
|
|
89
|
+
console.warn(`[section] failed to load preference '${key}' from localStorage`, error);
|
|
90
|
+
}
|
|
91
|
+
return fallback;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function saveBoolean(key: string, value: boolean): void {
|
|
95
|
+
if (typeof window === 'undefined') return;
|
|
96
|
+
try {
|
|
97
|
+
window.localStorage.setItem(key, String(value));
|
|
98
|
+
} catch (error) {
|
|
99
|
+
console.warn(`[section] failed to save preference '${key}' to localStorage`, error);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const loadShowCap = () => loadBoolean(CAP_SHOW_STORAGE_KEY, SECTION_PLANE_DEFAULTS.SHOW_CAP);
|
|
104
|
+
const saveShowCap = (v: boolean) => saveBoolean(CAP_SHOW_STORAGE_KEY, v);
|
|
105
|
+
const loadShowOutlines = () => loadBoolean(OUTLINES_SHOW_STORAGE_KEY, SECTION_PLANE_DEFAULTS.SHOW_OUTLINES);
|
|
106
|
+
const saveShowOutlines = (v: boolean) => saveBoolean(OUTLINES_SHOW_STORAGE_KEY, v);
|
|
12
107
|
|
|
13
108
|
export interface SectionSlice {
|
|
14
109
|
// State
|
|
@@ -18,15 +113,28 @@ export interface SectionSlice {
|
|
|
18
113
|
setSectionPlaneAxis: (axis: SectionPlaneAxis) => void;
|
|
19
114
|
setSectionPlanePosition: (position: number) => void;
|
|
20
115
|
toggleSectionPlane: () => void;
|
|
116
|
+
setSectionPlaneEnabled: (enabled: boolean) => void;
|
|
21
117
|
flipSectionPlane: () => void;
|
|
118
|
+
setSectionShowCap: (show: boolean) => void;
|
|
119
|
+
setSectionShowOutlines: (show: boolean) => void;
|
|
120
|
+
setSectionCapStyle: (style: Partial<SectionCapStyle>) => void;
|
|
22
121
|
resetSectionPlane: () => void;
|
|
23
122
|
}
|
|
24
123
|
|
|
124
|
+
const getDefaultCapStyle = (): SectionCapStyle => loadCapStyle();
|
|
125
|
+
|
|
25
126
|
const getDefaultSectionPlane = (): SectionPlane => ({
|
|
26
127
|
axis: SECTION_PLANE_DEFAULTS.AXIS,
|
|
27
128
|
position: SECTION_PLANE_DEFAULTS.POSITION,
|
|
28
129
|
enabled: SECTION_PLANE_DEFAULTS.ENABLED,
|
|
29
130
|
flipped: SECTION_PLANE_DEFAULTS.FLIPPED,
|
|
131
|
+
// showCap + showOutlines + capStyle come from localStorage so the
|
|
132
|
+
// user's preferred cut-surface appearance survives reloads; the axis,
|
|
133
|
+
// position, and enabled fields stay session-scoped because they only
|
|
134
|
+
// make sense for the currently loaded model.
|
|
135
|
+
showCap: loadShowCap(),
|
|
136
|
+
showOutlines: loadShowOutlines(),
|
|
137
|
+
capStyle: getDefaultCapStyle(),
|
|
30
138
|
});
|
|
31
139
|
|
|
32
140
|
export const createSectionSlice: StateCreator<SectionSlice, [], [], SectionSlice> = (set) => ({
|
|
@@ -35,14 +143,19 @@ export const createSectionSlice: StateCreator<SectionSlice, [], [], SectionSlice
|
|
|
35
143
|
|
|
36
144
|
// Actions
|
|
37
145
|
setSectionPlaneAxis: (axis) => set((state) => ({
|
|
38
|
-
|
|
146
|
+
// Changing the axis implicitly means "I want to cut now" — enable the clip
|
|
147
|
+
// so users don't get stuck in a confusing no-op preview.
|
|
148
|
+
sectionPlane: { ...state.sectionPlane, axis, enabled: true },
|
|
39
149
|
})),
|
|
40
150
|
|
|
41
151
|
setSectionPlanePosition: (position) => set((state) => {
|
|
42
152
|
// Clamp position to valid range [0, 100]
|
|
43
153
|
const clampedPosition = Math.min(100, Math.max(0, Number(position) || 0));
|
|
44
154
|
return {
|
|
45
|
-
|
|
155
|
+
// Moving the slider also enables the cut — previously you had to press
|
|
156
|
+
// "Cutting" separately, which led to the "it just jitters, doesn't cut"
|
|
157
|
+
// feedback from users.
|
|
158
|
+
sectionPlane: { ...state.sectionPlane, position: clampedPosition, enabled: true },
|
|
46
159
|
};
|
|
47
160
|
}),
|
|
48
161
|
|
|
@@ -50,9 +163,42 @@ export const createSectionSlice: StateCreator<SectionSlice, [], [], SectionSlice
|
|
|
50
163
|
sectionPlane: { ...state.sectionPlane, enabled: !state.sectionPlane.enabled },
|
|
51
164
|
})),
|
|
52
165
|
|
|
166
|
+
setSectionPlaneEnabled: (enabled) => set((state) => ({
|
|
167
|
+
sectionPlane: { ...state.sectionPlane, enabled },
|
|
168
|
+
})),
|
|
169
|
+
|
|
53
170
|
flipSectionPlane: () => set((state) => ({
|
|
54
171
|
sectionPlane: { ...state.sectionPlane, flipped: !state.sectionPlane.flipped },
|
|
55
172
|
})),
|
|
56
173
|
|
|
57
|
-
|
|
174
|
+
setSectionShowCap: (showCap) => set((state) => {
|
|
175
|
+
saveShowCap(showCap);
|
|
176
|
+
return { sectionPlane: { ...state.sectionPlane, showCap } };
|
|
177
|
+
}),
|
|
178
|
+
|
|
179
|
+
setSectionShowOutlines: (showOutlines) => set((state) => {
|
|
180
|
+
saveShowOutlines(showOutlines);
|
|
181
|
+
return { sectionPlane: { ...state.sectionPlane, showOutlines } };
|
|
182
|
+
}),
|
|
183
|
+
|
|
184
|
+
setSectionCapStyle: (style) => set((state) => {
|
|
185
|
+
const capStyle: SectionCapStyle = { ...state.sectionPlane.capStyle, ...style };
|
|
186
|
+
saveCapStyle(capStyle);
|
|
187
|
+
return { sectionPlane: { ...state.sectionPlane, capStyle } };
|
|
188
|
+
}),
|
|
189
|
+
|
|
190
|
+
resetSectionPlane: () => set(() => {
|
|
191
|
+
// Reset clears persisted cap style too — users asking for defaults expect
|
|
192
|
+
// the defaults to stick on the next reload.
|
|
193
|
+
try {
|
|
194
|
+
if (typeof window !== 'undefined') {
|
|
195
|
+
window.localStorage.removeItem(CAP_STYLE_STORAGE_KEY);
|
|
196
|
+
window.localStorage.removeItem(CAP_SHOW_STORAGE_KEY);
|
|
197
|
+
window.localStorage.removeItem(OUTLINES_SHOW_STORAGE_KEY);
|
|
198
|
+
}
|
|
199
|
+
} catch (error) {
|
|
200
|
+
console.warn('[section] failed to clear persisted cap preferences', error);
|
|
201
|
+
}
|
|
202
|
+
return { sectionPlane: getDefaultSectionPlane() };
|
|
203
|
+
}),
|
|
58
204
|
});
|
|
@@ -10,12 +10,14 @@ import type { StateCreator } from 'zustand';
|
|
|
10
10
|
import { UI_DEFAULTS } from '../constants.js';
|
|
11
11
|
import type { ContactShadingQuality, SeparationLinesQuality } from '@ifc-lite/renderer';
|
|
12
12
|
|
|
13
|
+
export type ThemeMode = 'light' | 'dark' | 'colorful';
|
|
14
|
+
|
|
13
15
|
export interface UISlice {
|
|
14
16
|
// State
|
|
15
17
|
leftPanelCollapsed: boolean;
|
|
16
18
|
rightPanelCollapsed: boolean;
|
|
17
19
|
activeTool: string;
|
|
18
|
-
theme:
|
|
20
|
+
theme: ThemeMode;
|
|
19
21
|
isMobile: boolean;
|
|
20
22
|
hoverTooltipsEnabled: boolean;
|
|
21
23
|
visualEnhancementsEnabled: boolean;
|
|
@@ -33,8 +35,10 @@ export interface UISlice {
|
|
|
33
35
|
setLeftPanelCollapsed: (collapsed: boolean) => void;
|
|
34
36
|
setRightPanelCollapsed: (collapsed: boolean) => void;
|
|
35
37
|
setActiveTool: (tool: string) => void;
|
|
36
|
-
setTheme: (theme:
|
|
38
|
+
setTheme: (theme: ThemeMode) => void;
|
|
37
39
|
toggleTheme: () => void;
|
|
40
|
+
/** Shift+click secret: toggle colorful mode on/off */
|
|
41
|
+
toggleColorful: () => void;
|
|
38
42
|
setIsMobile: (isMobile: boolean) => void;
|
|
39
43
|
toggleHoverTooltips: () => void;
|
|
40
44
|
setVisualEnhancementsEnabled: (enabled: boolean) => void;
|
|
@@ -49,6 +53,13 @@ export interface UISlice {
|
|
|
49
53
|
setSeparationLinesRadius: (radius: number) => void;
|
|
50
54
|
}
|
|
51
55
|
|
|
56
|
+
/** Apply the correct CSS classes on <html> for the given theme */
|
|
57
|
+
function applyThemeClasses(theme: ThemeMode) {
|
|
58
|
+
const el = document.documentElement;
|
|
59
|
+
el.classList.toggle('dark', theme === 'dark');
|
|
60
|
+
el.classList.toggle('colorful', theme === 'colorful');
|
|
61
|
+
}
|
|
62
|
+
|
|
52
63
|
export const createUISlice: StateCreator<UISlice, [], [], UISlice> = (set, get) => ({
|
|
53
64
|
// Initial state
|
|
54
65
|
leftPanelCollapsed: false,
|
|
@@ -74,14 +85,26 @@ export const createUISlice: StateCreator<UISlice, [], [], UISlice> = (set, get)
|
|
|
74
85
|
setActiveTool: (activeTool) => set({ activeTool }),
|
|
75
86
|
|
|
76
87
|
setTheme: (theme) => {
|
|
77
|
-
|
|
88
|
+
applyThemeClasses(theme);
|
|
78
89
|
localStorage.setItem('ifc-lite-theme', theme);
|
|
79
90
|
set({ theme });
|
|
80
91
|
},
|
|
81
92
|
|
|
82
93
|
toggleTheme: () => {
|
|
83
|
-
|
|
84
|
-
|
|
94
|
+
// Normal toggle: dark ↔ light. If currently colorful, drop to dark.
|
|
95
|
+
const current = get().theme;
|
|
96
|
+
const newTheme = current === 'dark' ? 'light' : 'dark';
|
|
97
|
+
applyThemeClasses(newTheme);
|
|
98
|
+
localStorage.setItem('ifc-lite-theme', newTheme);
|
|
99
|
+
set({ theme: newTheme });
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
toggleColorful: () => {
|
|
103
|
+
// Shift+click secret: toggle colorful on/off
|
|
104
|
+
// Into colorful from any state. Out of colorful → light (the storm clears).
|
|
105
|
+
const current = get().theme;
|
|
106
|
+
const newTheme: ThemeMode = current === 'colorful' ? 'light' : 'colorful';
|
|
107
|
+
applyThemeClasses(newTheme);
|
|
85
108
|
localStorage.setItem('ifc-lite-theme', newTheme);
|
|
86
109
|
set({ theme: newTheme });
|
|
87
110
|
},
|
package/src/store/types.ts
CHANGED
|
@@ -86,6 +86,12 @@ export interface EdgeLockState {
|
|
|
86
86
|
/** Semantic axis names: down (Y), front (Z), side (X) for intuitive user experience */
|
|
87
87
|
export type SectionPlaneAxis = 'down' | 'front' | 'side';
|
|
88
88
|
|
|
89
|
+
// Re-export the renderer's canonical cap-styling types so the viewer store and
|
|
90
|
+
// the WebGPU renderer share a single source of truth. Adding a new hatch
|
|
91
|
+
// pattern only requires editing `packages/renderer/src/section-cap-style.ts`.
|
|
92
|
+
export type { HatchPatternId as SectionCapHatchId, SectionCapStyle } from '@ifc-lite/renderer';
|
|
93
|
+
import type { SectionCapStyle } from '@ifc-lite/renderer';
|
|
94
|
+
|
|
89
95
|
export interface SectionPlane {
|
|
90
96
|
axis: SectionPlaneAxis;
|
|
91
97
|
/** 0-100 percentage of model bounds */
|
|
@@ -93,6 +99,17 @@ export interface SectionPlane {
|
|
|
93
99
|
enabled: boolean;
|
|
94
100
|
/** If true, show the opposite side of the cut */
|
|
95
101
|
flipped: boolean;
|
|
102
|
+
/** Whether to render the filled, hatched cap surface at the plane. Defaults to true. */
|
|
103
|
+
showCap: boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Whether to draw polygon outlines on top of the cut (the crisp black
|
|
106
|
+
* line the architect expects around each sliced element). Independent
|
|
107
|
+
* from `showCap` so users can have a hatched fill without outlines,
|
|
108
|
+
* or vice versa. Defaults to true.
|
|
109
|
+
*/
|
|
110
|
+
showOutlines: boolean;
|
|
111
|
+
/** User-defined colour + hatch for the cut surface. */
|
|
112
|
+
capStyle: SectionCapStyle;
|
|
96
113
|
}
|
|
97
114
|
|
|
98
115
|
// ============================================================================
|
|
@@ -192,6 +209,93 @@ export interface EntityRef {
|
|
|
192
209
|
/** IFC schema version enum for type safety */
|
|
193
210
|
export type SchemaVersion = 'IFC2X3' | 'IFC4' | 'IFC4X3' | 'IFC5';
|
|
194
211
|
|
|
212
|
+
export type GeometryLoadState =
|
|
213
|
+
| 'pending'
|
|
214
|
+
| 'opening'
|
|
215
|
+
| 'streaming'
|
|
216
|
+
| 'interactive'
|
|
217
|
+
| 'complete'
|
|
218
|
+
| 'error';
|
|
219
|
+
|
|
220
|
+
export type MetadataLoadState =
|
|
221
|
+
| 'idle'
|
|
222
|
+
| 'bootstrapping'
|
|
223
|
+
| 'spatial-ready'
|
|
224
|
+
| 'lazy'
|
|
225
|
+
| 'querying'
|
|
226
|
+
| 'complete'
|
|
227
|
+
| 'error';
|
|
228
|
+
|
|
229
|
+
export interface NativeMetadataProperty {
|
|
230
|
+
name: string;
|
|
231
|
+
value: string | number | boolean | null;
|
|
232
|
+
type?: number;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export interface NativeMetadataPropertySet {
|
|
236
|
+
name: string;
|
|
237
|
+
globalId?: string;
|
|
238
|
+
properties: NativeMetadataProperty[];
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
export interface NativeMetadataQuantity {
|
|
242
|
+
name: string;
|
|
243
|
+
value: number;
|
|
244
|
+
type?: number;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export interface NativeMetadataQuantitySet {
|
|
248
|
+
name: string;
|
|
249
|
+
quantities: NativeMetadataQuantity[];
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export interface NativeMetadataEntitySummary {
|
|
253
|
+
expressId: number;
|
|
254
|
+
type: string;
|
|
255
|
+
name: string;
|
|
256
|
+
globalId?: string | null;
|
|
257
|
+
kind: 'spatial' | 'element';
|
|
258
|
+
hasChildren: boolean;
|
|
259
|
+
elementCount?: number;
|
|
260
|
+
elevation?: number | null;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
export interface NativeMetadataSpatialNode extends NativeMetadataEntitySummary {
|
|
264
|
+
children: NativeMetadataSpatialNode[];
|
|
265
|
+
elements: NativeMetadataEntitySummary[];
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
export interface NativeMetadataSpatialInfo {
|
|
269
|
+
storeyId?: number | null;
|
|
270
|
+
storeyName?: string | null;
|
|
271
|
+
elevation?: number | null;
|
|
272
|
+
height?: number | null;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
export interface NativeMetadataEntityDetails {
|
|
276
|
+
summary: NativeMetadataEntitySummary;
|
|
277
|
+
typeSummary?: NativeMetadataEntitySummary | null;
|
|
278
|
+
spatial?: NativeMetadataSpatialInfo | null;
|
|
279
|
+
properties: NativeMetadataPropertySet[];
|
|
280
|
+
quantities: NativeMetadataQuantitySet[];
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
export interface NativeMetadataSnapshot {
|
|
284
|
+
mode: 'desktop-lazy';
|
|
285
|
+
cacheKey: string;
|
|
286
|
+
filePath: string;
|
|
287
|
+
schemaVersion: SchemaVersion;
|
|
288
|
+
entityCount: number;
|
|
289
|
+
spatialTree: NativeMetadataSpatialNode | null;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
export type ModelSourceFile = File | {
|
|
293
|
+
path: string;
|
|
294
|
+
name: string;
|
|
295
|
+
size: number;
|
|
296
|
+
modifiedMs?: number | null;
|
|
297
|
+
};
|
|
298
|
+
|
|
195
299
|
/** Complete model container for federation */
|
|
196
300
|
export interface FederatedModel {
|
|
197
301
|
/** Unique identifier (UUID generated on load) */
|
|
@@ -199,9 +303,9 @@ export interface FederatedModel {
|
|
|
199
303
|
/** Display name (filename by default, user can rename) */
|
|
200
304
|
name: string;
|
|
201
305
|
/** Parsed IFC data model */
|
|
202
|
-
ifcDataStore: IfcDataStore;
|
|
306
|
+
ifcDataStore: IfcDataStore | null;
|
|
203
307
|
/** Pre-tessellated geometry (with globalIds, not original expressIds) */
|
|
204
|
-
geometryResult: GeometryResult;
|
|
308
|
+
geometryResult: GeometryResult | null;
|
|
205
309
|
/** Model-level visibility toggle */
|
|
206
310
|
visible: boolean;
|
|
207
311
|
/** UI collapse state in hierarchy panel */
|
|
@@ -212,6 +316,8 @@ export interface FederatedModel {
|
|
|
212
316
|
loadedAt: number;
|
|
213
317
|
/** Original file size in bytes */
|
|
214
318
|
fileSize: number;
|
|
319
|
+
/** Original source handle used for explicit reload/reposition operations. */
|
|
320
|
+
sourceFile?: ModelSourceFile;
|
|
215
321
|
/**
|
|
216
322
|
* ID offset for this model (from FederationRegistry)
|
|
217
323
|
* All mesh expressIds are globalIds = originalExpressId + idOffset
|
|
@@ -220,6 +326,20 @@ export interface FederatedModel {
|
|
|
220
326
|
idOffset: number;
|
|
221
327
|
/** Maximum original expressId in this model (for range validation) */
|
|
222
328
|
maxExpressId: number;
|
|
329
|
+
/** Unified ingest lifecycle state. */
|
|
330
|
+
loadState?: 'pending' | 'streaming-geometry' | 'hydrating-metadata' | 'complete' | 'error';
|
|
331
|
+
/** Geometry-first readiness for large desktop loads. */
|
|
332
|
+
geometryLoadState?: GeometryLoadState;
|
|
333
|
+
/** Metadata availability state for lazy desktop loads. */
|
|
334
|
+
metadataLoadState?: MetadataLoadState;
|
|
335
|
+
/** True once the model is visibly interactive in the viewport. */
|
|
336
|
+
interactiveReady?: boolean;
|
|
337
|
+
/** Optional sparse desktop metadata snapshot for huge native loads. */
|
|
338
|
+
nativeMetadata?: NativeMetadataSnapshot | null;
|
|
339
|
+
/** Cache state for the current load session. */
|
|
340
|
+
cacheState?: 'none' | 'hit' | 'miss' | 'writing';
|
|
341
|
+
/** Optional load error for this model. */
|
|
342
|
+
loadError?: string | null;
|
|
223
343
|
}
|
|
224
344
|
|
|
225
345
|
/** Convert EntityRef to string for use as Map/Set key */
|
package/src/store.ts
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
22
|
// Re-export everything from the modular store
|
|
23
|
-
export { useViewerStore } from './store/index.js';
|
|
23
|
+
export { getViewerStoreApi, useViewerStore } from './store/index.js';
|
|
24
24
|
export type { ViewerState } from './store/index.js';
|
|
25
25
|
|
|
26
26
|
// Re-export types for backward compatibility
|