@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
|
@@ -0,0 +1,318 @@
|
|
|
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
|
+
/**
|
|
6
|
+
* Cesium coordinate bridge — lookAtTransform approach.
|
|
7
|
+
*
|
|
8
|
+
* KEY INSIGHT (from Cesium GitHub #6032): Camera.setView() with direction/up
|
|
9
|
+
* vectors causes drift because it doesn't properly orthonormalize. The fix:
|
|
10
|
+
* use lookAtTransform() which sets a reference frame and keeps the camera
|
|
11
|
+
* matrix clean.
|
|
12
|
+
*
|
|
13
|
+
* APPROACH: Build a single 4x4 matrix that transforms from IFC viewer space
|
|
14
|
+
* to ECEF, pass it to Cesium via lookAtTransform(). Then set camera position,
|
|
15
|
+
* direction, and up in IFC viewer coordinates — Cesium applies the transform
|
|
16
|
+
* internally with full precision.
|
|
17
|
+
*
|
|
18
|
+
* The viewer→ECEF transform is composed of:
|
|
19
|
+
* 1. Translate by (-modelCenter) to center on model origin
|
|
20
|
+
* 2. Rotate via viewerYup→ifcZup axis swap
|
|
21
|
+
* 3. Rotate via Helmert (IFC→projected CRS alignment)
|
|
22
|
+
* 4. Transform ENU→ECEF via Cesium.Transforms.eastNorthUpToFixedFrame()
|
|
23
|
+
*
|
|
24
|
+
* Since this is a SINGLE matrix, it's applied atomically by Cesium — no
|
|
25
|
+
* intermediate rounding or re-orthonormalization. The model stays pinned.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import proj4 from 'proj4';
|
|
29
|
+
import type { MapConversion, ProjectedCRS } from '@ifc-lite/parser';
|
|
30
|
+
import type { CoordinateInfo } from '@ifc-lite/geometry';
|
|
31
|
+
import { resolveProjection } from './reproject';
|
|
32
|
+
|
|
33
|
+
export interface GeodesicPosition {
|
|
34
|
+
longitude: number;
|
|
35
|
+
latitude: number;
|
|
36
|
+
height: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface CesiumBridge {
|
|
40
|
+
modelOrigin: GeodesicPosition;
|
|
41
|
+
rotationAngle: number;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Sync the Cesium camera using lookAtTransform with a viewer→ECEF matrix.
|
|
45
|
+
* The IFC camera position/direction/up are passed in viewer coordinates —
|
|
46
|
+
* Cesium transforms them to ECEF internally using one consistent matrix.
|
|
47
|
+
*/
|
|
48
|
+
syncCamera(
|
|
49
|
+
Cesium: typeof import('cesium'),
|
|
50
|
+
viewer: InstanceType<typeof import('cesium').Viewer>,
|
|
51
|
+
camPos: { x: number; y: number; z: number },
|
|
52
|
+
camTarget: { x: number; y: number; z: number },
|
|
53
|
+
camUp: { x: number; y: number; z: number },
|
|
54
|
+
fov: number,
|
|
55
|
+
terrainClampOffset?: number,
|
|
56
|
+
): void;
|
|
57
|
+
|
|
58
|
+
/** Query terrain height at model origin. */
|
|
59
|
+
queryTerrainHeight(
|
|
60
|
+
Cesium: typeof import('cesium'),
|
|
61
|
+
viewer: InstanceType<typeof import('cesium').Viewer>,
|
|
62
|
+
): Promise<number | null>;
|
|
63
|
+
|
|
64
|
+
viewerToGeodetic(vx: number, vy: number, vz: number): GeodesicPosition | null;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const TERRAIN_QUERY_RETRY_DELAY_MS = 3000;
|
|
68
|
+
|
|
69
|
+
export async function createCesiumBridge(
|
|
70
|
+
mapConversion: MapConversion,
|
|
71
|
+
projectedCRS: ProjectedCRS,
|
|
72
|
+
coordinateInfo?: CoordinateInfo,
|
|
73
|
+
lengthUnitScale = 1,
|
|
74
|
+
): Promise<CesiumBridge | null> {
|
|
75
|
+
const projDef = await resolveProjection(projectedCRS);
|
|
76
|
+
if (!projDef) return null;
|
|
77
|
+
|
|
78
|
+
const hScale = mapConversion.scale ?? 1.0;
|
|
79
|
+
const absc = mapConversion.xAxisAbscissa ?? 1.0;
|
|
80
|
+
const ordi = mapConversion.xAxisOrdinate ?? 0.0;
|
|
81
|
+
const rotAngle = Math.atan2(ordi, absc);
|
|
82
|
+
|
|
83
|
+
const shift = coordinateInfo?.originShift ?? { x: 0, y: 0, z: 0 };
|
|
84
|
+
const rtc = coordinateInfo?.wasmRtcOffset;
|
|
85
|
+
const rtcYup = rtc
|
|
86
|
+
? { x: rtc.x, y: rtc.z, z: -rtc.y }
|
|
87
|
+
: { x: 0, y: 0, z: 0 };
|
|
88
|
+
|
|
89
|
+
const bounds = coordinateInfo?.originalBounds;
|
|
90
|
+
const modelVX = bounds ? (bounds.min.x + bounds.max.x) / 2 : 0;
|
|
91
|
+
const modelVY = bounds ? (bounds.min.y + bounds.max.y) / 2 : 0;
|
|
92
|
+
const modelVZ = bounds ? (bounds.min.z + bounds.max.z) / 2 : 0;
|
|
93
|
+
|
|
94
|
+
// ── Compute model origin in WGS84 ──
|
|
95
|
+
const owx = modelVX + shift.x + rtcYup.x;
|
|
96
|
+
const owy = modelVY + shift.y + rtcYup.y;
|
|
97
|
+
const owz = modelVZ + shift.z + rtcYup.z;
|
|
98
|
+
// Viewer Y-up → IFC Z-up
|
|
99
|
+
const oIfcX = owx;
|
|
100
|
+
const oIfcY = -owz;
|
|
101
|
+
const oIfcZ = owy;
|
|
102
|
+
// Geometry coordinates (oIfcX/Y/Z) are already in metres (the geometry engine
|
|
103
|
+
// converts from the IFC file's native unit during extraction). MapConversion
|
|
104
|
+
// values use the unit from IfcProjectedCRS.MapUnit; fall back to project unit.
|
|
105
|
+
const mapScale = projectedCRS.mapUnitScale ?? lengthUnitScale;
|
|
106
|
+
const oEasting = mapConversion.eastings * mapScale + hScale * (absc * oIfcX - ordi * oIfcY);
|
|
107
|
+
const oNorthing = mapConversion.northings * mapScale + hScale * (ordi * oIfcX + absc * oIfcY);
|
|
108
|
+
const oHeight = mapConversion.orthogonalHeight * mapScale + oIfcZ;
|
|
109
|
+
|
|
110
|
+
let originLon: number, originLat: number;
|
|
111
|
+
try {
|
|
112
|
+
const [lon, lat] = proj4(projDef, 'WGS84', [oEasting, oNorthing]);
|
|
113
|
+
if (!Number.isFinite(lat) || !Number.isFinite(lon)) return null;
|
|
114
|
+
originLon = lon;
|
|
115
|
+
originLat = lat;
|
|
116
|
+
} catch {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const modelOrigin: GeodesicPosition = {
|
|
121
|
+
longitude: originLon,
|
|
122
|
+
latitude: originLat,
|
|
123
|
+
height: oHeight,
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
// ── Build the viewer→ENU 3x3 rotation matrix ──
|
|
127
|
+
// This converts a DELTA vector from viewer space to ENU.
|
|
128
|
+
// Step 1: viewer Y-up → IFC Z-up: (vx, vy, vz) → (vx, -vz, vy)
|
|
129
|
+
// Step 2: Helmert rotation: (ifcX, ifcY) → (east, north) with scale
|
|
130
|
+
//
|
|
131
|
+
// Combined as a 3x3 matrix M where [east, north, up] = M * [vx, vy, vz]:
|
|
132
|
+
// east = hScale * (absc * vx - ordi * (-vz)) = hScale * (absc*vx + ordi*vz)
|
|
133
|
+
// north = hScale * (ordi * vx + absc * (-vz)) = hScale * (ordi*vx - absc*vz)
|
|
134
|
+
// up = vy (ifcZ = vy, vertical is viewer Y)
|
|
135
|
+
//
|
|
136
|
+
// So M = [hScale*absc, 0, hScale*ordi ]
|
|
137
|
+
// [hScale*ordi, 0, -hScale*absc ]
|
|
138
|
+
// [0, 1, 0 ]
|
|
139
|
+
// Viewer-space deltas are already in metres (geometry engine converts during
|
|
140
|
+
// extraction), so no lengthUnitScale needed here.
|
|
141
|
+
const m00 = hScale * absc; // east from vx
|
|
142
|
+
const m01 = 0; // east from vy
|
|
143
|
+
const m02 = hScale * ordi; // east from vz
|
|
144
|
+
const m10 = hScale * ordi; // north from vx
|
|
145
|
+
const m11 = 0; // north from vy
|
|
146
|
+
const m12 = -hScale * absc; // north from vz
|
|
147
|
+
const m20 = 0; // up from vx
|
|
148
|
+
const m21 = 1; // up from vy (vertical = viewer Y, already metres)
|
|
149
|
+
const m22 = 0; // up from vz
|
|
150
|
+
|
|
151
|
+
// ── Cache for ECEF objects ──
|
|
152
|
+
let viewerToEcefMatrix: InstanceType<typeof import('cesium').Matrix4> | null = null;
|
|
153
|
+
let modelOriginCartesian: InstanceType<typeof import('cesium').Cartesian3> | null = null;
|
|
154
|
+
let cachedClampUp: number | null = null;
|
|
155
|
+
|
|
156
|
+
function ensureEcefCache(Cesium: typeof import('cesium'), clampUp: number) {
|
|
157
|
+
if (cachedClampUp === clampUp && viewerToEcefMatrix !== null) return;
|
|
158
|
+
cachedClampUp = clampUp;
|
|
159
|
+
|
|
160
|
+
const originWithClamp = Cesium.Cartesian3.fromDegrees(
|
|
161
|
+
originLon, originLat, oHeight + clampUp,
|
|
162
|
+
);
|
|
163
|
+
modelOriginCartesian = originWithClamp;
|
|
164
|
+
|
|
165
|
+
// Get ENU→ECEF 4x4 matrix at model origin
|
|
166
|
+
const enuToEcef = Cesium.Transforms.eastNorthUpToFixedFrame(originWithClamp);
|
|
167
|
+
|
|
168
|
+
// Build viewer→ECEF = enuToEcef * viewerToENU
|
|
169
|
+
// viewerToENU is: translate(-modelCenter) then rotate by M
|
|
170
|
+
// As a 4x4: columns are the ENU directions of viewer axes, translation is -modelCenter in ENU
|
|
171
|
+
//
|
|
172
|
+
// viewerToENU_4x4 = [ m00 m01 m02 tx ]
|
|
173
|
+
// [ m10 m11 m12 ty ]
|
|
174
|
+
// [ m20 m21 m22 tz ]
|
|
175
|
+
// [ 0 0 0 1 ]
|
|
176
|
+
// where (tx, ty, tz) = M * (-modelVX, -modelVY, -modelVZ)
|
|
177
|
+
const tx = m00 * (-modelVX) + m01 * (-modelVY) + m02 * (-modelVZ);
|
|
178
|
+
const ty = m10 * (-modelVX) + m11 * (-modelVY) + m12 * (-modelVZ);
|
|
179
|
+
const tz = m20 * (-modelVX) + m21 * (-modelVY) + m22 * (-modelVZ);
|
|
180
|
+
|
|
181
|
+
// Cesium Matrix4 is column-major
|
|
182
|
+
const viewerToEnu = new Cesium.Matrix4(
|
|
183
|
+
m00, m01, m02, tx,
|
|
184
|
+
m10, m11, m12, ty,
|
|
185
|
+
m20, m21, m22, tz,
|
|
186
|
+
0, 0, 0, 1,
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
// Compose: viewerToEcef = enuToEcef * viewerToEnu
|
|
190
|
+
viewerToEcefMatrix = Cesium.Matrix4.multiply(
|
|
191
|
+
enuToEcef, viewerToEnu, new Cesium.Matrix4(),
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function syncCamera(
|
|
196
|
+
Cesium: typeof import('cesium'),
|
|
197
|
+
viewer: InstanceType<typeof import('cesium').Viewer>,
|
|
198
|
+
camPos: { x: number; y: number; z: number },
|
|
199
|
+
camTarget: { x: number; y: number; z: number },
|
|
200
|
+
camUp: { x: number; y: number; z: number },
|
|
201
|
+
fov: number,
|
|
202
|
+
terrainClampOffset?: number,
|
|
203
|
+
): void {
|
|
204
|
+
const clampUp = terrainClampOffset ?? 0;
|
|
205
|
+
ensureEcefCache(Cesium, clampUp);
|
|
206
|
+
if (!viewerToEcefMatrix) return;
|
|
207
|
+
|
|
208
|
+
// Set the camera's reference frame to our viewer→ECEF transform.
|
|
209
|
+
// After this call, all camera properties (position, direction, up)
|
|
210
|
+
// are interpreted in IFC VIEWER coordinates, not ECEF.
|
|
211
|
+
viewer.camera.lookAtTransform(viewerToEcefMatrix);
|
|
212
|
+
|
|
213
|
+
// Now set camera in VIEWER coordinates — Cesium applies the transform
|
|
214
|
+
viewer.camera.position = new Cesium.Cartesian3(camPos.x, camPos.y, camPos.z);
|
|
215
|
+
|
|
216
|
+
const dirX = camTarget.x - camPos.x;
|
|
217
|
+
const dirY = camTarget.y - camPos.y;
|
|
218
|
+
const dirZ = camTarget.z - camPos.z;
|
|
219
|
+
const dirLen = Math.sqrt(dirX * dirX + dirY * dirY + dirZ * dirZ);
|
|
220
|
+
if (dirLen > 1e-8) {
|
|
221
|
+
viewer.camera.direction = new Cesium.Cartesian3(
|
|
222
|
+
dirX / dirLen, dirY / dirLen, dirZ / dirLen,
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
viewer.camera.up = new Cesium.Cartesian3(camUp.x, camUp.y, camUp.z);
|
|
227
|
+
|
|
228
|
+
// Recompute right = direction × up (maintain orthonormality)
|
|
229
|
+
const right = Cesium.Cartesian3.cross(
|
|
230
|
+
viewer.camera.direction, viewer.camera.up, new Cesium.Cartesian3(),
|
|
231
|
+
);
|
|
232
|
+
Cesium.Cartesian3.normalize(right, right);
|
|
233
|
+
viewer.camera.right = right;
|
|
234
|
+
|
|
235
|
+
// Sync FOV — CRITICAL for preventing model drift.
|
|
236
|
+
// IFC renderer uses `fov` as VERTICAL FOV always.
|
|
237
|
+
// Cesium's PerspectiveFrustum.fov is HORIZONTAL when aspect > 1 (landscape).
|
|
238
|
+
// If we set Cesium's fov = IFC's vertical fov, Cesium treats it as horizontal,
|
|
239
|
+
// producing a completely different projection — the model slides during orbit.
|
|
240
|
+
// Fix: convert vertical FOV → horizontal FOV.
|
|
241
|
+
const frustum = viewer.camera.frustum;
|
|
242
|
+
if (frustum instanceof Cesium.PerspectiveFrustum) {
|
|
243
|
+
const aspect = frustum.aspectRatio || (viewer.canvas.width / viewer.canvas.height);
|
|
244
|
+
if (aspect > 1) {
|
|
245
|
+
// Landscape: Cesium expects horizontal FOV
|
|
246
|
+
// horizontal_fov = 2 * atan(aspect * tan(vertical_fov / 2))
|
|
247
|
+
frustum.fov = 2 * Math.atan(aspect * Math.tan(fov / 2));
|
|
248
|
+
} else {
|
|
249
|
+
// Portrait: Cesium uses fov as vertical — pass through
|
|
250
|
+
frustum.fov = fov;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
viewer.scene.requestRender();
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
async function queryTerrainHeight(
|
|
258
|
+
Cesium: typeof import('cesium'),
|
|
259
|
+
viewer: InstanceType<typeof import('cesium').Viewer>,
|
|
260
|
+
): Promise<number | null> {
|
|
261
|
+
const position = Cesium.Cartographic.fromDegrees(originLon, originLat);
|
|
262
|
+
|
|
263
|
+
try {
|
|
264
|
+
const globeHeight = viewer.scene.globe.getHeight(position);
|
|
265
|
+
if (globeHeight !== undefined && Number.isFinite(globeHeight)) {
|
|
266
|
+
return globeHeight;
|
|
267
|
+
}
|
|
268
|
+
} catch { /* not available yet */ }
|
|
269
|
+
|
|
270
|
+
try {
|
|
271
|
+
const terrainProvider = viewer.terrainProvider;
|
|
272
|
+
if (terrainProvider) {
|
|
273
|
+
const results = await Cesium.sampleTerrainMostDetailed(terrainProvider, [position]);
|
|
274
|
+
if (results && results.length > 0 && Number.isFinite(results[0].height)) {
|
|
275
|
+
return results[0].height;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
} catch { /* terrain sampling failed */ }
|
|
279
|
+
|
|
280
|
+
await new Promise(r => setTimeout(r, TERRAIN_QUERY_RETRY_DELAY_MS));
|
|
281
|
+
try {
|
|
282
|
+
const globeHeight = viewer.scene.globe.getHeight(position);
|
|
283
|
+
if (globeHeight !== undefined && Number.isFinite(globeHeight)) {
|
|
284
|
+
return globeHeight;
|
|
285
|
+
}
|
|
286
|
+
} catch { /* still not available */ }
|
|
287
|
+
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
function viewerToGeodetic(vx: number, vy: number, vz: number): GeodesicPosition | null {
|
|
292
|
+
const wx = vx + shift.x + rtcYup.x;
|
|
293
|
+
const wy = vy + shift.y + rtcYup.y;
|
|
294
|
+
const wz = vz + shift.z + rtcYup.z;
|
|
295
|
+
const ifcX = wx;
|
|
296
|
+
const ifcY = -wz;
|
|
297
|
+
const ifcZ = wy;
|
|
298
|
+
// Viewer coords (ifcX/Y/Z) are already in metres; only MapConversion values need scaling
|
|
299
|
+
const easting = mapConversion.eastings * mapScale + hScale * (absc * ifcX - ordi * ifcY);
|
|
300
|
+
const northing = mapConversion.northings * mapScale + hScale * (ordi * ifcX + absc * ifcY);
|
|
301
|
+
const height = mapConversion.orthogonalHeight * mapScale + ifcZ;
|
|
302
|
+
try {
|
|
303
|
+
const [lon, lat] = proj4(projDef!, 'WGS84', [easting, northing]);
|
|
304
|
+
if (!Number.isFinite(lat) || !Number.isFinite(lon)) return null;
|
|
305
|
+
return { longitude: lon, latitude: lat, height };
|
|
306
|
+
} catch {
|
|
307
|
+
return null;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
return {
|
|
312
|
+
modelOrigin,
|
|
313
|
+
rotationAngle: rotAngle,
|
|
314
|
+
syncCamera,
|
|
315
|
+
queryTerrainHeight,
|
|
316
|
+
viewerToGeodetic,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
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 { describe, it } from 'node:test';
|
|
6
|
+
import assert from 'node:assert';
|
|
7
|
+
|
|
8
|
+
import { inferMapUnitScale, mergeMapConversion, mergeProjectedCRS } from './effective-georef.js';
|
|
9
|
+
import type { MapConversion, ProjectedCRS } from '@ifc-lite/parser';
|
|
10
|
+
|
|
11
|
+
describe('effective georeferencing', () => {
|
|
12
|
+
it('recomputes map unit scale when the edited MapUnit changes', () => {
|
|
13
|
+
const original: ProjectedCRS = {
|
|
14
|
+
id: 1,
|
|
15
|
+
name: 'EPSG:28992',
|
|
16
|
+
mapUnit: 'METRE',
|
|
17
|
+
mapUnitScale: 1,
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const merged = mergeProjectedCRS(original, { mapUnit: 'US SURVEY FOOT' }, 1);
|
|
21
|
+
|
|
22
|
+
assert.strictEqual(merged?.mapUnit, 'US SURVEY FOOT');
|
|
23
|
+
assert.strictEqual(merged?.mapUnitScale, 0.3048006096);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('preserves the extracted map unit scale when MapUnit was not edited', () => {
|
|
27
|
+
const original: ProjectedCRS = {
|
|
28
|
+
id: 1,
|
|
29
|
+
name: 'EPSG:1234',
|
|
30
|
+
mapUnit: 'CUSTOM',
|
|
31
|
+
mapUnitScale: 2.5,
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const merged = mergeProjectedCRS(original, { description: 'Edited CRS' }, 1);
|
|
35
|
+
|
|
36
|
+
assert.strictEqual(merged?.description, 'Edited CRS');
|
|
37
|
+
assert.strictEqual(merged?.mapUnitScale, 2.5);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('overlays edited IfcMapConversion fields without dropping original rotation and scale', () => {
|
|
41
|
+
const original: MapConversion = {
|
|
42
|
+
id: 2,
|
|
43
|
+
sourceCRS: 10,
|
|
44
|
+
targetCRS: 11,
|
|
45
|
+
eastings: 100,
|
|
46
|
+
northings: 200,
|
|
47
|
+
orthogonalHeight: 5,
|
|
48
|
+
xAxisAbscissa: 0,
|
|
49
|
+
xAxisOrdinate: 1,
|
|
50
|
+
scale: 0.9999,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const merged = mergeMapConversion(original, { eastings: 150, orthogonalHeight: 9 });
|
|
54
|
+
|
|
55
|
+
assert.deepStrictEqual(merged, {
|
|
56
|
+
id: 2,
|
|
57
|
+
sourceCRS: 10,
|
|
58
|
+
targetCRS: 11,
|
|
59
|
+
eastings: 150,
|
|
60
|
+
northings: 200,
|
|
61
|
+
orthogonalHeight: 9,
|
|
62
|
+
xAxisAbscissa: 0,
|
|
63
|
+
xAxisOrdinate: 1,
|
|
64
|
+
scale: 0.9999,
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('infers common IFC map unit names', () => {
|
|
69
|
+
assert.strictEqual(inferMapUnitScale('FOOT'), 0.3048);
|
|
70
|
+
assert.strictEqual(inferMapUnitScale('METRE'), 1);
|
|
71
|
+
assert.strictEqual(inferMapUnitScale('MILLIMETRE'), 0.001);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
extractGeoreferencingOnDemand,
|
|
7
|
+
extractLengthUnitScale,
|
|
8
|
+
type GeoreferenceInfo,
|
|
9
|
+
type IfcDataStore,
|
|
10
|
+
type MapConversion,
|
|
11
|
+
type ProjectedCRS,
|
|
12
|
+
} from '@ifc-lite/parser';
|
|
13
|
+
import type { CoordinateInfo } from '@ifc-lite/geometry';
|
|
14
|
+
|
|
15
|
+
export interface GeorefMutationDataLike {
|
|
16
|
+
projectedCRS?: Partial<ProjectedCRS>;
|
|
17
|
+
mapConversion?: Partial<MapConversion>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface EffectiveGeoreference extends GeoreferenceInfo {
|
|
21
|
+
hasGeoreference: true;
|
|
22
|
+
coordinateInfo?: CoordinateInfo;
|
|
23
|
+
lengthUnitScale: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function inferMapUnitScale(mapUnit: string | undefined, fallback?: number): number | undefined {
|
|
27
|
+
if (!mapUnit) return fallback;
|
|
28
|
+
const normalized = mapUnit.toUpperCase();
|
|
29
|
+
if (normalized.includes('US') && (normalized.includes('SURVEY') || normalized.includes('FTUS'))) {
|
|
30
|
+
return 0.3048006096;
|
|
31
|
+
}
|
|
32
|
+
if (normalized.includes('FOOT') || normalized.includes('FEET')) return 0.3048;
|
|
33
|
+
if (normalized.includes('MILLI')) return 0.001;
|
|
34
|
+
if (normalized.includes('CENTI')) return 0.01;
|
|
35
|
+
if (normalized.includes('DECI')) return 0.1;
|
|
36
|
+
if (normalized.includes('KILO')) return 1000;
|
|
37
|
+
if (normalized.includes('METRE') || normalized.includes('METER')) return 1;
|
|
38
|
+
return fallback;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function getIfcLengthUnitScale(dataStore: IfcDataStore | null | undefined): number {
|
|
42
|
+
if (!dataStore?.source?.length || !dataStore.entityIndex) return 1;
|
|
43
|
+
return extractLengthUnitScale(dataStore.source, dataStore.entityIndex);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function mergeProjectedCRS(
|
|
47
|
+
original: ProjectedCRS | undefined,
|
|
48
|
+
mutations: Partial<ProjectedCRS> | undefined,
|
|
49
|
+
lengthUnitScale: number,
|
|
50
|
+
): ProjectedCRS | undefined {
|
|
51
|
+
if (!original && !mutations) return undefined;
|
|
52
|
+
const mapUnit = mutations?.mapUnit ?? original?.mapUnit;
|
|
53
|
+
const mapUnitScale = mutations?.mapUnit !== undefined
|
|
54
|
+
? inferMapUnitScale(mapUnit, lengthUnitScale)
|
|
55
|
+
: original?.mapUnitScale ?? inferMapUnitScale(mapUnit, undefined);
|
|
56
|
+
return {
|
|
57
|
+
id: original?.id ?? 0,
|
|
58
|
+
name: (mutations?.name ?? original?.name ?? '') as string,
|
|
59
|
+
description: mutations?.description ?? original?.description,
|
|
60
|
+
geodeticDatum: mutations?.geodeticDatum ?? original?.geodeticDatum,
|
|
61
|
+
verticalDatum: mutations?.verticalDatum ?? original?.verticalDatum,
|
|
62
|
+
mapProjection: mutations?.mapProjection ?? original?.mapProjection,
|
|
63
|
+
mapZone: mutations?.mapZone ?? original?.mapZone,
|
|
64
|
+
mapUnit,
|
|
65
|
+
mapUnitScale,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function mergeMapConversion(
|
|
70
|
+
original: MapConversion | undefined,
|
|
71
|
+
mutations: Partial<MapConversion> | undefined,
|
|
72
|
+
): MapConversion | undefined {
|
|
73
|
+
if (!original && !mutations) return undefined;
|
|
74
|
+
return {
|
|
75
|
+
id: original?.id ?? 0,
|
|
76
|
+
sourceCRS: original?.sourceCRS ?? 0,
|
|
77
|
+
targetCRS: original?.targetCRS ?? 0,
|
|
78
|
+
eastings: (mutations?.eastings ?? original?.eastings ?? 0) as number,
|
|
79
|
+
northings: (mutations?.northings ?? original?.northings ?? 0) as number,
|
|
80
|
+
orthogonalHeight: (mutations?.orthogonalHeight ?? original?.orthogonalHeight ?? 0) as number,
|
|
81
|
+
xAxisAbscissa: mutations?.xAxisAbscissa ?? original?.xAxisAbscissa,
|
|
82
|
+
xAxisOrdinate: mutations?.xAxisOrdinate ?? original?.xAxisOrdinate,
|
|
83
|
+
scale: mutations?.scale ?? original?.scale,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function getEffectiveGeoreference(
|
|
88
|
+
dataStore: IfcDataStore | null | undefined,
|
|
89
|
+
coordinateInfo?: CoordinateInfo,
|
|
90
|
+
mutations?: GeorefMutationDataLike,
|
|
91
|
+
): EffectiveGeoreference | null {
|
|
92
|
+
if (!dataStore) return null;
|
|
93
|
+
const original = extractGeoreferencingOnDemand(dataStore);
|
|
94
|
+
const lengthUnitScale = getIfcLengthUnitScale(dataStore);
|
|
95
|
+
const projectedCRS = mergeProjectedCRS(
|
|
96
|
+
original?.projectedCRS,
|
|
97
|
+
mutations?.projectedCRS,
|
|
98
|
+
lengthUnitScale,
|
|
99
|
+
);
|
|
100
|
+
const mapConversion = mergeMapConversion(original?.mapConversion, mutations?.mapConversion);
|
|
101
|
+
|
|
102
|
+
if (!projectedCRS && !mapConversion) return null;
|
|
103
|
+
return {
|
|
104
|
+
hasGeoreference: true,
|
|
105
|
+
projectedCRS,
|
|
106
|
+
mapConversion,
|
|
107
|
+
coordinateInfo,
|
|
108
|
+
lengthUnitScale,
|
|
109
|
+
transformMatrix: original?.transformMatrix,
|
|
110
|
+
};
|
|
111
|
+
}
|