@ifc-lite/viewer 1.17.2 → 1.17.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +34 -24
- package/.turbo/turbo-typecheck.log +1 -42
- package/CHANGELOG.md +24 -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-DOG9_WPX.js +281 -0
- package/dist/assets/{browser-BDShTXzi.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-gWfpdfYe.js +257 -0
- package/dist/assets/epsg-index.generated-BjJrt_0S.js +1 -0
- package/dist/assets/exporters-ChAtBmlj.js +80367 -0
- package/dist/assets/geometry.worker-BQ0rzNo-.js +1 -0
- package/dist/assets/ids-B4jTqB1O.js +1 -0
- package/dist/assets/ifc-lite_bg-BX4E7TX8.wasm +0 -0
- package/dist/assets/index-Co8E2-FE.js +106013 -0
- package/dist/assets/index-DckuDqlv.css +1 -0
- package/dist/assets/lens-CSASnhAL.js +1 -0
- package/dist/assets/maplibre-gl-CGLcoNXc.js +811 -0
- package/dist/assets/native-bridge-BRvbckFQ.js +429 -0
- package/dist/assets/{arrow2-bb-jcVEo.js → parquet-CEXmQNRO.js} +2 -2
- package/dist/assets/sandbox-DZiNLNMk.js +5933 -0
- package/dist/assets/server-client-BV8zHZ7Y.js +626 -0
- 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-DBEtpeu6.js +12 -0
- 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 -2
- package/package.json +27 -19
- 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 +24 -4
- package/src/components/viewer/ExportDialog.tsx +38 -9
- package/src/components/viewer/HierarchyPanel.tsx +202 -6
- 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 +306 -131
- package/src/components/viewer/ScriptPanel.tsx +34 -8
- package/src/components/viewer/Section2DPanel.tsx +3 -2
- 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 +285 -32
- package/src/components/viewer/ViewportOverlays.tsx +129 -27
- package/src/components/viewer/hierarchy/treeDataBuilder.ts +2 -1
- package/src/components/viewer/properties/EpsgLookupDialog.tsx +418 -0
- package/src/components/viewer/properties/GeoreferencingPanel.tsx +703 -0
- package/src/components/viewer/properties/LocationMap.tsx +730 -0
- package/src/components/viewer/properties/ModelMetadataPanel.tsx +3 -70
- 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/bcfIdLookup.ts +13 -11
- package/src/hooks/ids/idsColorSystem.ts +3 -8
- package/src/hooks/ingest/viewerModelIngest.ts +275 -0
- package/src/hooks/useIDS.ts +32 -17
- package/src/hooks/useIfc.ts +7 -1
- package/src/hooks/useIfcCache.ts +28 -15
- package/src/hooks/useIfcFederation.ts +59 -227
- 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/kmz-exporter.ts +112 -0
- package/src/lib/geo/reproject.ts +370 -0
- package/src/lib/lens/adapter.ts +3 -1
- package/src/lib/recent-files.ts +2 -1
- package/src/main.tsx +1 -0
- package/src/sdk/adapters/export-adapter.ts +14 -1
- package/src/sdk/adapters/viewer-adapter.ts +5 -9
- package/src/sdk/adapters/visibility-adapter.ts +6 -9
- 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/basketVisibleSet.ts +3 -4
- package/src/store/globalId.ts +79 -0
- package/src/store/index.ts +41 -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/slices/mutationSlice.ts +178 -0
- package/src/store/slices/pinboardSlice.ts +4 -8
- 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 +41 -0
- package/dist/assets/Arrow.dom-BhOg9lpn.js +0 -20
- package/dist/assets/arrow2_bg-BlXl-cSQ.js +0 -1
- package/dist/assets/basketViewActivator-BRG5DBmM.js +0 -1
- package/dist/assets/desktop-cache-oPzaWXYE.js +0 -1
- package/dist/assets/geometry.worker-kgiT_Qhh.js +0 -1
- package/dist/assets/ifc-lite_bg-FNRmpSvM.wasm +0 -0
- package/dist/assets/index-B1Ecw4AU.js +0 -189756
- package/dist/assets/index-Ba4eoTe7.css +0 -1
- package/dist/assets/index-CrgYBjTn.js +0 -229
- package/dist/assets/module-6F3E5H7Y-tx0BadV3.js +0 -6
- package/dist/assets/native-bridge-Crsb7TKz.js +0 -111
- package/dist/assets/wasm-bridge-mJUhb7uk.js +0 -1
package/src/services/bsdd.ts
CHANGED
|
@@ -99,6 +99,40 @@ async function fetchJson<T>(url: string): Promise<T> {
|
|
|
99
99
|
return res.json() as Promise<T>;
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
+
interface BsddSearchApiResult {
|
|
103
|
+
uri?: string;
|
|
104
|
+
code?: string;
|
|
105
|
+
referenceCode?: string;
|
|
106
|
+
name?: string;
|
|
107
|
+
definition?: string | null;
|
|
108
|
+
dictionaryUri?: string;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function matchesIfcType(candidate: BsddSearchApiResult, ifcType: string): boolean {
|
|
112
|
+
return candidate.code === ifcType
|
|
113
|
+
|| candidate.referenceCode === ifcType
|
|
114
|
+
|| candidate.name === ifcType;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async function resolveFallbackClassUri(ifcType: string): Promise<string | null> {
|
|
118
|
+
try {
|
|
119
|
+
const raw = await fetchJson<{ classes?: BsddSearchApiResult[] }>(
|
|
120
|
+
`${BSDD_API}/api/Class/Search/v1?SearchText=${encodeURIComponent(ifcType)}&RelatedIfcEntities=${encodeURIComponent(ifcType)}`,
|
|
121
|
+
);
|
|
122
|
+
const classes = raw.classes ?? [];
|
|
123
|
+
if (classes.length === 0) return null;
|
|
124
|
+
|
|
125
|
+
const preferred = classes.find((entry) => entry.dictionaryUri === IFC_DICTIONARY_URI && matchesIfcType(entry, ifcType))
|
|
126
|
+
?? classes.find((entry) => matchesIfcType(entry, ifcType))
|
|
127
|
+
?? classes.find((entry) => entry.dictionaryUri === IFC_DICTIONARY_URI)
|
|
128
|
+
?? classes[0];
|
|
129
|
+
|
|
130
|
+
return preferred?.uri ?? null;
|
|
131
|
+
} catch {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
102
136
|
// ---------------------------------------------------------------------------
|
|
103
137
|
// Public API
|
|
104
138
|
// ---------------------------------------------------------------------------
|
|
@@ -128,15 +162,30 @@ export function ifcClassUri(ifcType: string): string {
|
|
|
128
162
|
export async function fetchClassInfo(
|
|
129
163
|
ifcType: string,
|
|
130
164
|
): Promise<BsddClassInfo | null> {
|
|
131
|
-
const
|
|
165
|
+
const defaultUri = ifcClassUri(ifcType);
|
|
166
|
+
let uri = defaultUri;
|
|
132
167
|
const cached = getCached(uri);
|
|
133
168
|
if (cached) return cached;
|
|
134
169
|
|
|
135
170
|
try {
|
|
136
171
|
// Parameter names must be PascalCase per the bSDD OpenAPI spec
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
172
|
+
let raw: Record<string, unknown>;
|
|
173
|
+
try {
|
|
174
|
+
raw = await fetchJson<Record<string, unknown>>(
|
|
175
|
+
`${BSDD_API}/api/Class/v1?Uri=${encodeURIComponent(uri)}&IncludeClassProperties=true&IncludeClassRelations=true`,
|
|
176
|
+
);
|
|
177
|
+
} catch {
|
|
178
|
+
const fallbackUri = await resolveFallbackClassUri(ifcType);
|
|
179
|
+
if (!fallbackUri || fallbackUri === uri) {
|
|
180
|
+
throw new Error('bSDD class lookup failed');
|
|
181
|
+
}
|
|
182
|
+
uri = fallbackUri;
|
|
183
|
+
const fallbackCached = getCached(uri);
|
|
184
|
+
if (fallbackCached) return fallbackCached;
|
|
185
|
+
raw = await fetchJson<Record<string, unknown>>(
|
|
186
|
+
`${BSDD_API}/api/Class/v1?Uri=${encodeURIComponent(uri)}&IncludeClassProperties=true&IncludeClassRelations=true`,
|
|
187
|
+
);
|
|
188
|
+
}
|
|
140
189
|
|
|
141
190
|
let info = mapClassResponse(raw, true);
|
|
142
191
|
|
|
@@ -71,7 +71,7 @@ let cacheService: ICacheService | null = null;
|
|
|
71
71
|
export async function getCacheService(): Promise<ICacheService> {
|
|
72
72
|
if (cacheService) return cacheService;
|
|
73
73
|
|
|
74
|
-
if (isTauri) {
|
|
74
|
+
if (isTauri()) {
|
|
75
75
|
// Desktop: Use Tauri native filesystem
|
|
76
76
|
const mod = await import('./desktop-cache.js');
|
|
77
77
|
cacheService = {
|
|
@@ -141,3 +141,46 @@ export async function hasCached(key: string): Promise<boolean> {
|
|
|
141
141
|
const data = await getCached(key);
|
|
142
142
|
return data !== null;
|
|
143
143
|
}
|
|
144
|
+
|
|
145
|
+
export async function hasNativeGeometryCache(key: string): Promise<boolean> {
|
|
146
|
+
try {
|
|
147
|
+
const inv = await getInvoke();
|
|
148
|
+
return await inv<boolean>('has_native_geometry_cache', { cacheKey: key });
|
|
149
|
+
} catch (error) {
|
|
150
|
+
console.warn('[DesktopCache] Failed to check native geometry cache:', error);
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export async function getNativeModelSnapshot(key: string): Promise<ArrayBuffer | null> {
|
|
156
|
+
try {
|
|
157
|
+
const inv = await getInvoke();
|
|
158
|
+
const data = await inv<number[] | null>('get_native_model_snapshot', { cacheKey: key });
|
|
159
|
+
return data ? new Uint8Array(data).buffer : null;
|
|
160
|
+
} catch (error) {
|
|
161
|
+
console.warn('[DesktopCache] Failed to read native model snapshot:', error);
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export async function setNativeModelSnapshot(key: string, buffer: ArrayBuffer): Promise<void> {
|
|
167
|
+
try {
|
|
168
|
+
const inv = await getInvoke();
|
|
169
|
+
await inv('set_native_model_snapshot', {
|
|
170
|
+
cacheKey: key,
|
|
171
|
+
data: Array.from(new Uint8Array(buffer)),
|
|
172
|
+
});
|
|
173
|
+
} catch (error) {
|
|
174
|
+
console.warn('[DesktopCache] Failed to write native model snapshot:', error);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export async function hasNativeModelSnapshot(key: string): Promise<boolean> {
|
|
179
|
+
try {
|
|
180
|
+
const inv = await getInvoke();
|
|
181
|
+
return await inv<boolean>('has_native_model_snapshot', { cacheKey: key });
|
|
182
|
+
} catch (error) {
|
|
183
|
+
console.warn('[DesktopCache] Failed to check native model snapshot:', error);
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
|
|
5
|
+
import { IfcParser, type IfcDataStore } from '@ifc-lite/parser';
|
|
6
|
+
import { getViewerStoreApi } from '@/store';
|
|
7
|
+
import { toast } from '@/components/ui/toast';
|
|
8
|
+
import { readNativeFile } from '@/services/file-dialog';
|
|
9
|
+
|
|
10
|
+
const exportHydrationByModel = new Map<string, Promise<IfcDataStore | null>>();
|
|
11
|
+
|
|
12
|
+
function isDesktopRuntime(): boolean {
|
|
13
|
+
const win = globalThis as Window & { __TAURI_INTERNALS__?: { invoke?: unknown } };
|
|
14
|
+
return typeof win.__TAURI_INTERNALS__?.invoke === 'function';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function hasFullStepSource(dataStore: IfcDataStore | null | undefined): dataStore is IfcDataStore {
|
|
18
|
+
return Boolean(dataStore?.source?.length && dataStore.entityIndex?.byId?.size);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function toExactArrayBuffer(bytes: Uint8Array): ArrayBuffer {
|
|
22
|
+
if (
|
|
23
|
+
bytes.buffer instanceof ArrayBuffer
|
|
24
|
+
&& bytes.byteOffset === 0
|
|
25
|
+
&& bytes.byteLength === bytes.buffer.byteLength
|
|
26
|
+
) {
|
|
27
|
+
return bytes.buffer;
|
|
28
|
+
}
|
|
29
|
+
return bytes.slice().buffer;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export async function ensureModelExportReady(modelId: string): Promise<IfcDataStore | null> {
|
|
33
|
+
const store = getViewerStoreApi();
|
|
34
|
+
const state = store.getState();
|
|
35
|
+
|
|
36
|
+
if (modelId === '__legacy__') {
|
|
37
|
+
return state.ifcDataStore;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const model = state.models.get(modelId);
|
|
41
|
+
if (!model) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (hasFullStepSource(model.ifcDataStore)) {
|
|
46
|
+
return model.ifcDataStore;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (!isDesktopRuntime() || !model.nativeMetadata?.filePath) {
|
|
50
|
+
return model.ifcDataStore;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const pending = exportHydrationByModel.get(modelId);
|
|
54
|
+
if (pending) {
|
|
55
|
+
return pending;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const hydrationPromise = (async () => {
|
|
59
|
+
toast.info(`Preparing ${model.name} for IFC export...`);
|
|
60
|
+
const bytes = await readNativeFile(model.nativeMetadata!.filePath);
|
|
61
|
+
const parser = new IfcParser();
|
|
62
|
+
const hydratedStore = await parser.parseColumnar(toExactArrayBuffer(bytes));
|
|
63
|
+
|
|
64
|
+
store.getState().updateModel(modelId, {
|
|
65
|
+
ifcDataStore: hydratedStore,
|
|
66
|
+
schemaVersion: hydratedStore.schemaVersion,
|
|
67
|
+
metadataLoadState: 'complete',
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
return hydratedStore;
|
|
71
|
+
})().finally(() => {
|
|
72
|
+
exportHydrationByModel.delete(modelId);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
exportHydrationByModel.set(modelId, hydrationPromise);
|
|
76
|
+
return hydrationPromise;
|
|
77
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
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 type { NativeFileHandle } from './file-dialog.js';
|
|
6
|
+
|
|
7
|
+
type InvokeFn = <T>(cmd: string, args?: Record<string, unknown>) => Promise<T>;
|
|
8
|
+
|
|
9
|
+
interface TauriInternals {
|
|
10
|
+
invoke: InvokeFn;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface DesktopHarnessRequest {
|
|
14
|
+
file: NativeFileHandle;
|
|
15
|
+
replaceFile?: NativeFileHandle;
|
|
16
|
+
telemetryOutputPath?: string;
|
|
17
|
+
runLabel?: string;
|
|
18
|
+
exitAfterTelemetry: boolean;
|
|
19
|
+
waitForMetadataCompletion: boolean;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface DesktopTelemetryReport {
|
|
23
|
+
schemaVersion: number;
|
|
24
|
+
source: 'desktop-native';
|
|
25
|
+
mode: 'startup-harness' | 'manual';
|
|
26
|
+
success: boolean;
|
|
27
|
+
runLabel?: string;
|
|
28
|
+
cache?: {
|
|
29
|
+
key?: string | null;
|
|
30
|
+
hit?: boolean | null;
|
|
31
|
+
manifestMeshCount?: number | null;
|
|
32
|
+
manifestShardCount?: number | null;
|
|
33
|
+
} | null;
|
|
34
|
+
file: {
|
|
35
|
+
path: string;
|
|
36
|
+
name: string;
|
|
37
|
+
sizeBytes: number;
|
|
38
|
+
sizeMB: number;
|
|
39
|
+
};
|
|
40
|
+
timings: Record<string, number | null>;
|
|
41
|
+
batches: Record<string, number | string | null>;
|
|
42
|
+
nativeStats?: Record<string, number | null> | null;
|
|
43
|
+
metadata?: Record<string, number | boolean | null> | null;
|
|
44
|
+
firstBatchTelemetry?: Record<string, number | string | null> | null;
|
|
45
|
+
error?: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
let activeHarnessRequest: DesktopHarnessRequest | null = null;
|
|
49
|
+
let startupHarnessRequestPromise: Promise<DesktopHarnessRequest | null> | null = null;
|
|
50
|
+
const STORAGE_KEY = 'ifc-lite:desktop-harness-request';
|
|
51
|
+
const CLAIMED_KEY = 'ifc-lite:desktop-harness-claimed';
|
|
52
|
+
|
|
53
|
+
function getInvoke(): InvokeFn | null {
|
|
54
|
+
const win = globalThis as unknown as { __TAURI_INTERNALS__?: TauriInternals };
|
|
55
|
+
return win.__TAURI_INTERNALS__?.invoke ?? null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function consumeStartupHarnessRequest(): Promise<DesktopHarnessRequest | null> {
|
|
59
|
+
const invoke = getInvoke();
|
|
60
|
+
if (!invoke) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
try {
|
|
65
|
+
return await invoke<DesktopHarnessRequest | null>('consume_startup_harness_request');
|
|
66
|
+
} catch (error) {
|
|
67
|
+
console.warn('[DesktopHarness] Failed to consume startup harness request:', error);
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function getHarnessRequestFingerprint(request: DesktopHarnessRequest): string {
|
|
73
|
+
return JSON.stringify({
|
|
74
|
+
path: request.file.path,
|
|
75
|
+
replacePath: request.replaceFile?.path ?? null,
|
|
76
|
+
telemetryOutputPath: request.telemetryOutputPath ?? null,
|
|
77
|
+
runLabel: request.runLabel ?? null,
|
|
78
|
+
exitAfterTelemetry: request.exitAfterTelemetry,
|
|
79
|
+
waitForMetadataCompletion: request.waitForMetadataCompletion,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function getClaimedFingerprint(): string | null {
|
|
84
|
+
try {
|
|
85
|
+
return sessionStorage.getItem(CLAIMED_KEY);
|
|
86
|
+
} catch {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function setClaimedFingerprint(fingerprint: string | null): void {
|
|
92
|
+
try {
|
|
93
|
+
if (fingerprint) {
|
|
94
|
+
sessionStorage.setItem(CLAIMED_KEY, fingerprint);
|
|
95
|
+
} else {
|
|
96
|
+
sessionStorage.removeItem(CLAIMED_KEY);
|
|
97
|
+
}
|
|
98
|
+
} catch {
|
|
99
|
+
// Ignore storage issues.
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function setActiveHarnessRequest(request: DesktopHarnessRequest | null): void {
|
|
104
|
+
activeHarnessRequest = request;
|
|
105
|
+
try {
|
|
106
|
+
if (request) {
|
|
107
|
+
sessionStorage.setItem(STORAGE_KEY, JSON.stringify(request));
|
|
108
|
+
if (getClaimedFingerprint() !== getHarnessRequestFingerprint(request)) {
|
|
109
|
+
setClaimedFingerprint(null);
|
|
110
|
+
}
|
|
111
|
+
} else {
|
|
112
|
+
sessionStorage.removeItem(STORAGE_KEY);
|
|
113
|
+
}
|
|
114
|
+
} catch {
|
|
115
|
+
// Ignore storage issues in non-browser or restricted contexts.
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function getActiveHarnessRequest(): DesktopHarnessRequest | null {
|
|
120
|
+
if (!activeHarnessRequest) {
|
|
121
|
+
try {
|
|
122
|
+
const raw = sessionStorage.getItem(STORAGE_KEY);
|
|
123
|
+
if (raw) {
|
|
124
|
+
activeHarnessRequest = JSON.parse(raw) as DesktopHarnessRequest;
|
|
125
|
+
}
|
|
126
|
+
} catch {
|
|
127
|
+
// Ignore storage parse failures and fall back to in-memory state.
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return activeHarnessRequest;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export async function getStartupHarnessRequest(): Promise<DesktopHarnessRequest | null> {
|
|
134
|
+
const existing = getActiveHarnessRequest();
|
|
135
|
+
if (existing) {
|
|
136
|
+
return existing;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (!startupHarnessRequestPromise) {
|
|
140
|
+
startupHarnessRequestPromise = consumeStartupHarnessRequest().then((request) => {
|
|
141
|
+
if (request) {
|
|
142
|
+
setActiveHarnessRequest(request);
|
|
143
|
+
}
|
|
144
|
+
return request;
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return await startupHarnessRequestPromise;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export function tryClaimStartupHarnessRequest(request: DesktopHarnessRequest): boolean {
|
|
152
|
+
const active = getActiveHarnessRequest();
|
|
153
|
+
if (!active) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const requestFingerprint = getHarnessRequestFingerprint(request);
|
|
158
|
+
if (getHarnessRequestFingerprint(active) !== requestFingerprint) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (getClaimedFingerprint() === requestFingerprint) {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
setClaimedFingerprint(requestFingerprint);
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function clearActiveHarnessRequest(): void {
|
|
171
|
+
activeHarnessRequest = null;
|
|
172
|
+
startupHarnessRequestPromise = null;
|
|
173
|
+
try {
|
|
174
|
+
sessionStorage.removeItem(STORAGE_KEY);
|
|
175
|
+
} catch {
|
|
176
|
+
// Ignore storage issues.
|
|
177
|
+
}
|
|
178
|
+
setClaimedFingerprint(null);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export async function finalizeActiveHarnessRun(report: DesktopTelemetryReport): Promise<string | null> {
|
|
182
|
+
const invoke = getInvoke();
|
|
183
|
+
const request = getActiveHarnessRequest();
|
|
184
|
+
clearActiveHarnessRequest();
|
|
185
|
+
|
|
186
|
+
if (!invoke || !request) {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
try {
|
|
191
|
+
return await invoke<string>('write_desktop_telemetry', { report });
|
|
192
|
+
} catch (error) {
|
|
193
|
+
console.warn('[DesktopHarness] Failed to write desktop telemetry:', error);
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
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
|
+
type InvokeFn = <T>(cmd: string, args?: Record<string, unknown>) => Promise<T>;
|
|
6
|
+
|
|
7
|
+
type LogLevel = 'info' | 'warn' | 'error';
|
|
8
|
+
|
|
9
|
+
export async function logToDesktopTerminal(level: LogLevel, message: string): Promise<void> {
|
|
10
|
+
const win = globalThis as unknown as { __TAURI_INTERNALS__?: { invoke: InvokeFn } };
|
|
11
|
+
if (!win.__TAURI_INTERNALS__?.invoke) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
await win.__TAURI_INTERNALS__.invoke('frontend_debug_log', { level, message });
|
|
17
|
+
} catch {
|
|
18
|
+
// Debug logging should never break app behavior.
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,207 @@
|
|
|
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 type {
|
|
6
|
+
NativeMetadataEntityDetails,
|
|
7
|
+
NativeMetadataEntitySummary,
|
|
8
|
+
NativeMetadataSnapshot,
|
|
9
|
+
} from '@/store/types';
|
|
10
|
+
import type { MetadataBootstrapPayload } from '@ifc-lite/geometry';
|
|
11
|
+
import { getNativeModelSnapshot, setNativeModelSnapshot } from './desktop-cache';
|
|
12
|
+
|
|
13
|
+
type InvokeFn = <T>(cmd: string, args?: Record<string, unknown>) => Promise<T>;
|
|
14
|
+
|
|
15
|
+
async function getInvoke(): Promise<InvokeFn> {
|
|
16
|
+
const win = globalThis as unknown as { __TAURI_INTERNALS__?: { invoke: InvokeFn } };
|
|
17
|
+
if (win.__TAURI_INTERNALS__?.invoke) {
|
|
18
|
+
return win.__TAURI_INTERNALS__.invoke;
|
|
19
|
+
}
|
|
20
|
+
const core = await import('@tauri-apps/api/core');
|
|
21
|
+
return core.invoke as InvokeFn;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface NativeMetadataBootstrapPayload {
|
|
25
|
+
cacheKey: string;
|
|
26
|
+
schemaVersion: string;
|
|
27
|
+
entityCount: number;
|
|
28
|
+
spatialTree: NativeMetadataSnapshot['spatialTree'];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function toSchemaVersion(schemaVersion: string): NativeMetadataSnapshot['schemaVersion'] {
|
|
32
|
+
if (schemaVersion === 'IFC4X3' || schemaVersion === 'IFC4' || schemaVersion === 'IFC5') {
|
|
33
|
+
return schemaVersion;
|
|
34
|
+
}
|
|
35
|
+
return 'IFC2X3';
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function nativeMetadataSnapshotFromBootstrap(
|
|
39
|
+
path: string,
|
|
40
|
+
payload: MetadataBootstrapPayload
|
|
41
|
+
): NativeMetadataSnapshot {
|
|
42
|
+
return {
|
|
43
|
+
mode: 'desktop-lazy',
|
|
44
|
+
cacheKey: payload.cacheKey,
|
|
45
|
+
filePath: path,
|
|
46
|
+
schemaVersion: toSchemaVersion(payload.schemaVersion),
|
|
47
|
+
entityCount: payload.entityCount,
|
|
48
|
+
spatialTree: payload.spatialTree ?? null,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export async function bootstrapNativeMetadata(path: string, cacheKey: string): Promise<NativeMetadataSnapshot> {
|
|
53
|
+
const invoke = await getInvoke();
|
|
54
|
+
const result = await invoke<NativeMetadataBootstrapPayload>('bootstrap_native_metadata', {
|
|
55
|
+
path,
|
|
56
|
+
cacheKey,
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
mode: 'desktop-lazy',
|
|
60
|
+
cacheKey: result.cacheKey,
|
|
61
|
+
filePath: path,
|
|
62
|
+
schemaVersion: toSchemaVersion(result.schemaVersion),
|
|
63
|
+
entityCount: result.entityCount,
|
|
64
|
+
spatialTree: result.spatialTree ?? null,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export async function restoreNativeMetadataSnapshot(cacheKey: string): Promise<NativeMetadataSnapshot | null> {
|
|
69
|
+
const buffer = await getNativeModelSnapshot(cacheKey);
|
|
70
|
+
if (!buffer) return null;
|
|
71
|
+
try {
|
|
72
|
+
const payload = JSON.parse(new TextDecoder().decode(new Uint8Array(buffer))) as NativeMetadataSnapshot;
|
|
73
|
+
if (payload?.mode !== 'desktop-lazy' || payload.cacheKey !== cacheKey) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
...payload,
|
|
78
|
+
schemaVersion: toSchemaVersion(payload.schemaVersion),
|
|
79
|
+
spatialTree: payload.spatialTree ?? null,
|
|
80
|
+
};
|
|
81
|
+
} catch {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export async function persistNativeMetadataSnapshot(snapshot: NativeMetadataSnapshot): Promise<void> {
|
|
87
|
+
const bytes = new TextEncoder().encode(JSON.stringify(snapshot));
|
|
88
|
+
await setNativeModelSnapshot(snapshot.cacheKey, bytes.buffer);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export async function getNativeMetadataChildren(cacheKey: string, expressId: number): Promise<NativeMetadataEntitySummary[]> {
|
|
92
|
+
const invoke = await getInvoke();
|
|
93
|
+
const result = await invoke<Array<{
|
|
94
|
+
expressId: number;
|
|
95
|
+
typeName: string;
|
|
96
|
+
name: string;
|
|
97
|
+
globalId?: string | null;
|
|
98
|
+
kind: 'spatial' | 'element';
|
|
99
|
+
hasChildren: boolean;
|
|
100
|
+
elementCount?: number;
|
|
101
|
+
elevation?: number | null;
|
|
102
|
+
}>>('get_native_metadata_children', {
|
|
103
|
+
cacheKey,
|
|
104
|
+
expressId,
|
|
105
|
+
});
|
|
106
|
+
return result.map((entry) => ({
|
|
107
|
+
expressId: entry.expressId,
|
|
108
|
+
type: entry.typeName,
|
|
109
|
+
name: entry.name,
|
|
110
|
+
globalId: entry.globalId ?? undefined,
|
|
111
|
+
kind: entry.kind,
|
|
112
|
+
hasChildren: entry.hasChildren,
|
|
113
|
+
elementCount: entry.elementCount,
|
|
114
|
+
elevation: entry.elevation ?? undefined,
|
|
115
|
+
}));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export async function getNativeEntityDetails(cacheKey: string, expressId: number): Promise<NativeMetadataEntityDetails> {
|
|
119
|
+
const invoke = await getInvoke();
|
|
120
|
+
const result = await invoke<{
|
|
121
|
+
summary: {
|
|
122
|
+
expressId: number;
|
|
123
|
+
typeName: string;
|
|
124
|
+
name: string;
|
|
125
|
+
globalId?: string | null;
|
|
126
|
+
kind: 'spatial' | 'element';
|
|
127
|
+
hasChildren: boolean;
|
|
128
|
+
elementCount?: number;
|
|
129
|
+
elevation?: number | null;
|
|
130
|
+
};
|
|
131
|
+
typeSummary?: {
|
|
132
|
+
expressId: number;
|
|
133
|
+
typeName: string;
|
|
134
|
+
name: string;
|
|
135
|
+
globalId?: string | null;
|
|
136
|
+
kind: 'spatial' | 'element';
|
|
137
|
+
hasChildren: boolean;
|
|
138
|
+
elementCount?: number;
|
|
139
|
+
elevation?: number | null;
|
|
140
|
+
} | null;
|
|
141
|
+
spatial?: {
|
|
142
|
+
storeyId?: number | null;
|
|
143
|
+
storeyName?: string | null;
|
|
144
|
+
elevation?: number | null;
|
|
145
|
+
height?: number | null;
|
|
146
|
+
} | null;
|
|
147
|
+
properties: NativeMetadataEntityDetails['properties'];
|
|
148
|
+
quantities: NativeMetadataEntityDetails['quantities'];
|
|
149
|
+
}>('get_native_entity_details', {
|
|
150
|
+
cacheKey,
|
|
151
|
+
expressId,
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
const mapSummary = (entry: NonNullable<typeof result['summary']>): NativeMetadataEntitySummary => ({
|
|
155
|
+
expressId: entry.expressId,
|
|
156
|
+
type: entry.typeName,
|
|
157
|
+
name: entry.name,
|
|
158
|
+
globalId: entry.globalId ?? undefined,
|
|
159
|
+
kind: entry.kind,
|
|
160
|
+
hasChildren: entry.hasChildren,
|
|
161
|
+
elementCount: entry.elementCount,
|
|
162
|
+
elevation: entry.elevation ?? undefined,
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
return {
|
|
166
|
+
summary: mapSummary(result.summary),
|
|
167
|
+
typeSummary: result.typeSummary ? mapSummary(result.typeSummary) : null,
|
|
168
|
+
spatial: result.spatial
|
|
169
|
+
? {
|
|
170
|
+
storeyId: result.spatial.storeyId ?? null,
|
|
171
|
+
storeyName: result.spatial.storeyName ?? null,
|
|
172
|
+
elevation: result.spatial.elevation ?? null,
|
|
173
|
+
height: result.spatial.height ?? null,
|
|
174
|
+
}
|
|
175
|
+
: null,
|
|
176
|
+
properties: result.properties,
|
|
177
|
+
quantities: result.quantities,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export async function searchNativeMetadataEntities(cacheKey: string, query: string, limit = 100): Promise<NativeMetadataEntitySummary[]> {
|
|
182
|
+
const invoke = await getInvoke();
|
|
183
|
+
const result = await invoke<Array<{
|
|
184
|
+
expressId: number;
|
|
185
|
+
typeName: string;
|
|
186
|
+
name: string;
|
|
187
|
+
globalId?: string | null;
|
|
188
|
+
kind: 'spatial' | 'element';
|
|
189
|
+
hasChildren: boolean;
|
|
190
|
+
elementCount?: number;
|
|
191
|
+
elevation?: number | null;
|
|
192
|
+
}>>('search_native_metadata_entities', {
|
|
193
|
+
cacheKey,
|
|
194
|
+
query,
|
|
195
|
+
limit,
|
|
196
|
+
});
|
|
197
|
+
return result.map((entry) => ({
|
|
198
|
+
expressId: entry.expressId,
|
|
199
|
+
type: entry.typeName,
|
|
200
|
+
name: entry.name,
|
|
201
|
+
globalId: entry.globalId ?? undefined,
|
|
202
|
+
kind: entry.kind,
|
|
203
|
+
hasChildren: entry.hasChildren,
|
|
204
|
+
elementCount: entry.elementCount,
|
|
205
|
+
elevation: entry.elevation ?? undefined,
|
|
206
|
+
}));
|
|
207
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
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
|
+
export type DesktopPanelActionType =
|
|
6
|
+
| 'bcf-import'
|
|
7
|
+
| 'bcf-export'
|
|
8
|
+
| 'ids-open'
|
|
9
|
+
| 'ids-run-validation';
|
|
10
|
+
|
|
11
|
+
interface DesktopPanelAction {
|
|
12
|
+
id: number;
|
|
13
|
+
type: DesktopPanelActionType;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type DesktopPanelActionListener = () => void;
|
|
17
|
+
|
|
18
|
+
let nextActionId = 1;
|
|
19
|
+
const pendingActions: DesktopPanelAction[] = [];
|
|
20
|
+
const listeners = new Set<DesktopPanelActionListener>();
|
|
21
|
+
|
|
22
|
+
export function requestDesktopPanelAction(type: DesktopPanelActionType): void {
|
|
23
|
+
pendingActions.push({ id: nextActionId++, type });
|
|
24
|
+
for (const listener of listeners) {
|
|
25
|
+
listener();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function claimNextDesktopPanelAction(type: DesktopPanelActionType): DesktopPanelAction | null {
|
|
30
|
+
const index = pendingActions.findIndex((action) => action.type === type);
|
|
31
|
+
if (index < 0) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const [action] = pendingActions.splice(index, 1);
|
|
35
|
+
return action ?? null;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function subscribeDesktopPanelActions(listener: DesktopPanelActionListener): () => void {
|
|
39
|
+
listeners.add(listener);
|
|
40
|
+
return () => {
|
|
41
|
+
listeners.delete(listener);
|
|
42
|
+
};
|
|
43
|
+
}
|