@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
|
@@ -18,11 +18,11 @@ import {
|
|
|
18
18
|
Hash,
|
|
19
19
|
Database,
|
|
20
20
|
Building2,
|
|
21
|
-
Globe,
|
|
22
21
|
Ruler,
|
|
23
22
|
} from 'lucide-react';
|
|
24
23
|
import { ScrollArea } from '@/components/ui/scroll-area';
|
|
25
24
|
import { PropertySetCard } from './PropertySetCard';
|
|
25
|
+
import { GeoreferencingPanel } from './GeoreferencingPanel';
|
|
26
26
|
import type { PropertySet } from './encodingUtils';
|
|
27
27
|
import type { FederatedModel } from '@/store/types';
|
|
28
28
|
import { extractGeoreferencingOnDemand, extractLengthUnitScale, type IfcDataStore } from '@ifc-lite/parser';
|
|
@@ -147,7 +147,7 @@ export function ModelMetadataPanel({ model }: { model: FederatedModel }) {
|
|
|
147
147
|
{formatDate(model.loadedAt)}
|
|
148
148
|
</span>
|
|
149
149
|
</div>
|
|
150
|
-
{dataStore && (
|
|
150
|
+
{dataStore && dataStore.parseTime != null && (
|
|
151
151
|
<div className="flex items-center gap-3 px-3 py-2">
|
|
152
152
|
<Clock className="h-3.5 w-3.5 text-zinc-400 shrink-0" />
|
|
153
153
|
<span className="text-xs text-zinc-500">Parse Time</span>
|
|
@@ -212,74 +212,7 @@ export function ModelMetadataPanel({ model }: { model: FederatedModel }) {
|
|
|
212
212
|
</div>
|
|
213
213
|
|
|
214
214
|
{/* Georeferencing */}
|
|
215
|
-
{georef
|
|
216
|
-
<div className="border-b border-zinc-200 dark:border-zinc-800">
|
|
217
|
-
<div className="p-3 bg-teal-50/50 dark:bg-teal-950/20">
|
|
218
|
-
<div className="flex items-center gap-2">
|
|
219
|
-
<Globe className="h-3.5 w-3.5 text-teal-600 dark:text-teal-400" />
|
|
220
|
-
<h4 className="font-bold text-xs uppercase tracking-wide text-teal-700 dark:text-teal-300">
|
|
221
|
-
Georeferencing
|
|
222
|
-
</h4>
|
|
223
|
-
</div>
|
|
224
|
-
</div>
|
|
225
|
-
<div className="divide-y divide-zinc-100 dark:divide-zinc-900">
|
|
226
|
-
{georef.projectedCRS?.name && (
|
|
227
|
-
<div className="flex items-center gap-3 px-3 py-2">
|
|
228
|
-
<span className="text-xs text-zinc-500 shrink-0">CRS</span>
|
|
229
|
-
<span className="text-xs font-mono text-teal-700 dark:text-teal-400 ml-auto truncate max-w-[65%]">
|
|
230
|
-
{georef.projectedCRS.name}
|
|
231
|
-
</span>
|
|
232
|
-
</div>
|
|
233
|
-
)}
|
|
234
|
-
{georef.projectedCRS?.geodeticDatum && (
|
|
235
|
-
<div className="flex items-center gap-3 px-3 py-2">
|
|
236
|
-
<span className="text-xs text-zinc-500 shrink-0">Geodetic Datum</span>
|
|
237
|
-
<span className="text-xs font-mono text-teal-700 dark:text-teal-400 ml-auto">
|
|
238
|
-
{georef.projectedCRS.geodeticDatum}
|
|
239
|
-
</span>
|
|
240
|
-
</div>
|
|
241
|
-
)}
|
|
242
|
-
{georef.projectedCRS?.mapProjection && (
|
|
243
|
-
<div className="flex items-center gap-3 px-3 py-2">
|
|
244
|
-
<span className="text-xs text-zinc-500 shrink-0">Projection</span>
|
|
245
|
-
<span className="text-xs font-mono text-teal-700 dark:text-teal-400 ml-auto truncate max-w-[65%]">
|
|
246
|
-
{georef.projectedCRS.mapProjection}
|
|
247
|
-
</span>
|
|
248
|
-
</div>
|
|
249
|
-
)}
|
|
250
|
-
{georef.mapConversion && (
|
|
251
|
-
<>
|
|
252
|
-
<div className="flex items-center gap-3 px-3 py-2">
|
|
253
|
-
<span className="text-xs text-zinc-500 shrink-0">Eastings</span>
|
|
254
|
-
<span className="text-xs font-mono text-teal-700 dark:text-teal-400 ml-auto tabular-nums">
|
|
255
|
-
{georef.mapConversion.eastings.toFixed(3)}
|
|
256
|
-
</span>
|
|
257
|
-
</div>
|
|
258
|
-
<div className="flex items-center gap-3 px-3 py-2">
|
|
259
|
-
<span className="text-xs text-zinc-500 shrink-0">Northings</span>
|
|
260
|
-
<span className="text-xs font-mono text-teal-700 dark:text-teal-400 ml-auto tabular-nums">
|
|
261
|
-
{georef.mapConversion.northings.toFixed(3)}
|
|
262
|
-
</span>
|
|
263
|
-
</div>
|
|
264
|
-
<div className="flex items-center gap-3 px-3 py-2">
|
|
265
|
-
<span className="text-xs text-zinc-500 shrink-0">Height</span>
|
|
266
|
-
<span className="text-xs font-mono text-teal-700 dark:text-teal-400 ml-auto tabular-nums">
|
|
267
|
-
{georef.mapConversion.orthogonalHeight.toFixed(3)}
|
|
268
|
-
</span>
|
|
269
|
-
</div>
|
|
270
|
-
{georef.mapConversion.scale != null && georef.mapConversion.scale !== 1.0 && (
|
|
271
|
-
<div className="flex items-center gap-3 px-3 py-2">
|
|
272
|
-
<span className="text-xs text-zinc-500 shrink-0">Scale</span>
|
|
273
|
-
<span className="text-xs font-mono text-teal-700 dark:text-teal-400 ml-auto">
|
|
274
|
-
{georef.mapConversion.scale}
|
|
275
|
-
</span>
|
|
276
|
-
</div>
|
|
277
|
-
)}
|
|
278
|
-
</>
|
|
279
|
-
)}
|
|
280
|
-
</div>
|
|
281
|
-
</div>
|
|
282
|
-
)}
|
|
215
|
+
<GeoreferencingPanel georef={georef} modelId={model.id} enableEditing schemaVersion={model.schemaVersion} coordinateInfo={model.geometryResult?.coordinateInfo} geometryResult={model.geometryResult} />
|
|
283
216
|
|
|
284
217
|
{/* IfcProject Data */}
|
|
285
218
|
{projectData && (
|
|
@@ -39,22 +39,23 @@ export async function handleSelectionClick(ctx: MouseHandlerContext, e: MouseEve
|
|
|
39
39
|
const now = Date.now();
|
|
40
40
|
const timeSinceLastClick = now - ctx.lastClickTimeRef.current;
|
|
41
41
|
const clickPos = { x, y };
|
|
42
|
-
|
|
43
42
|
if (ctx.lastClickPosRef.current &&
|
|
44
43
|
timeSinceLastClick < 300 &&
|
|
45
44
|
Math.abs(clickPos.x - ctx.lastClickPosRef.current.x) < 5 &&
|
|
46
45
|
Math.abs(clickPos.y - ctx.lastClickPosRef.current.y) < 5) {
|
|
46
|
+
const pickOptions = ctx.getPickOptions();
|
|
47
47
|
// Double-click - isolate element
|
|
48
48
|
// Uses visibility filtering so only visible elements can be selected
|
|
49
|
-
const pickResult = await renderer.pick(x, y,
|
|
49
|
+
const pickResult = await renderer.pick(x, y, pickOptions);
|
|
50
50
|
if (pickResult) {
|
|
51
51
|
ctx.handlePickForSelection(pickResult);
|
|
52
52
|
}
|
|
53
53
|
ctx.lastClickTimeRef.current = 0;
|
|
54
54
|
ctx.lastClickPosRef.current = null;
|
|
55
55
|
} else {
|
|
56
|
+
const pickOptions = ctx.getPickOptions();
|
|
56
57
|
// Single click - uses visibility filtering so only visible elements can be selected
|
|
57
|
-
const pickResult = await renderer.pick(x, y,
|
|
58
|
+
const pickResult = await renderer.pick(x, y, pickOptions);
|
|
58
59
|
|
|
59
60
|
// Multi-selection with Ctrl/Cmd
|
|
60
61
|
if (e.ctrlKey || e.metaKey) {
|
|
@@ -29,6 +29,8 @@ export interface UseAnimationLoopParams {
|
|
|
29
29
|
lastFrameTimeRef: MutableRefObject<number>;
|
|
30
30
|
mouseIsDraggingRef: MutableRefObject<boolean>;
|
|
31
31
|
activeToolRef: MutableRefObject<string>;
|
|
32
|
+
/** When set, clips model below this Y value (terrain clipping for Cesium overlay). */
|
|
33
|
+
terrainClipYRef: MutableRefObject<number | null>;
|
|
32
34
|
hiddenEntitiesRef: MutableRefObject<Set<number>>;
|
|
33
35
|
isolatedEntitiesRef: MutableRefObject<Set<number> | null>;
|
|
34
36
|
selectedEntityIdRef: MutableRefObject<number | null>;
|
|
@@ -62,6 +64,7 @@ export function useAnimationLoop(params: UseAnimationLoopParams): void {
|
|
|
62
64
|
lastFrameTimeRef,
|
|
63
65
|
mouseIsDraggingRef,
|
|
64
66
|
activeToolRef,
|
|
67
|
+
terrainClipYRef,
|
|
65
68
|
hiddenEntitiesRef,
|
|
66
69
|
isolatedEntitiesRef,
|
|
67
70
|
selectedEntityIdRef,
|
|
@@ -171,6 +174,7 @@ export function useAnimationLoop(params: UseAnimationLoopParams): void {
|
|
|
171
174
|
min: sectionRangeRef.current?.min,
|
|
172
175
|
max: sectionRangeRef.current?.max,
|
|
173
176
|
} : undefined,
|
|
177
|
+
terrainClipY: terrainClipYRef.current ?? undefined,
|
|
174
178
|
});
|
|
175
179
|
lastRenderTime = currentTime;
|
|
176
180
|
}
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
import { useEffect, useRef, type MutableRefObject } from 'react';
|
|
22
22
|
import type { Renderer } from '@ifc-lite/renderer';
|
|
23
23
|
import type { MeshData, CoordinateInfo } from '@ifc-lite/geometry';
|
|
24
|
+
import { logToDesktopTerminal } from '@/services/desktop-logger';
|
|
24
25
|
|
|
25
26
|
export interface UseGeometryStreamingParams {
|
|
26
27
|
rendererRef: MutableRefObject<Renderer | null>;
|
|
@@ -37,6 +38,8 @@ export interface UseGeometryStreamingParams {
|
|
|
37
38
|
clearPendingMeshColorUpdates: () => void;
|
|
38
39
|
clearPendingColorUpdates: () => void;
|
|
39
40
|
clearColorRef: MutableRefObject<[number, number, number, number]>;
|
|
41
|
+
releaseGeometryAfterFinalize?: boolean;
|
|
42
|
+
onGeometryReleased?: () => void;
|
|
40
43
|
}
|
|
41
44
|
|
|
42
45
|
// Default bounds used when geometry is cleared
|
|
@@ -47,6 +50,11 @@ const DEFAULT_BOUNDS = {
|
|
|
47
50
|
|
|
48
51
|
const MAX_VALID_COORD = 10000;
|
|
49
52
|
|
|
53
|
+
function traceGeometrySync(message: string): void {
|
|
54
|
+
console.log(`[GeomSync] ${message}`);
|
|
55
|
+
void logToDesktopTerminal('info', `[GeomSync] ${message}`);
|
|
56
|
+
}
|
|
57
|
+
|
|
50
58
|
export function useGeometryStreaming(params: UseGeometryStreamingParams): void {
|
|
51
59
|
const {
|
|
52
60
|
rendererRef,
|
|
@@ -61,6 +69,8 @@ export function useGeometryStreaming(params: UseGeometryStreamingParams): void {
|
|
|
61
69
|
clearPendingMeshColorUpdates,
|
|
62
70
|
clearPendingColorUpdates,
|
|
63
71
|
clearColorRef,
|
|
72
|
+
releaseGeometryAfterFinalize = false,
|
|
73
|
+
onGeometryReleased,
|
|
64
74
|
} = params;
|
|
65
75
|
|
|
66
76
|
// ─── Tracking refs ───────────────────────────────────────────────────
|
|
@@ -71,6 +81,33 @@ export function useGeometryStreaming(params: UseGeometryStreamingParams): void {
|
|
|
71
81
|
const finalBoundsRefittedRef = useRef(false);
|
|
72
82
|
const cameraSnapshotRef = useRef<{ px: number; py: number; pz: number; tx: number; ty: number; tz: number } | null>(null);
|
|
73
83
|
const prevIsStreamingRef = useRef(isStreaming);
|
|
84
|
+
const queuePumpTimerRef = useRef<ReturnType<typeof globalThis.setTimeout> | null>(null);
|
|
85
|
+
|
|
86
|
+
// Only activate the timer-based queue pump when the tab is background-throttled
|
|
87
|
+
// (rAF stops firing). In the foreground, the animation loop already drains the
|
|
88
|
+
// queue every frame — a parallel setTimeout(0) pump doubles the GPU work and
|
|
89
|
+
// hurts Chrome (Dawn) where each buffer op is an IPC round-trip.
|
|
90
|
+
const ensureQueuePump = () => {
|
|
91
|
+
if (queuePumpTimerRef.current !== null) return;
|
|
92
|
+
if (!globalThis.document?.hidden) return; // rAF is active — let the animation loop drain
|
|
93
|
+
queuePumpTimerRef.current = globalThis.setTimeout(() => {
|
|
94
|
+
queuePumpTimerRef.current = null;
|
|
95
|
+
const renderer = rendererRef.current;
|
|
96
|
+
if (!renderer || !isInitialized) return;
|
|
97
|
+
const device = renderer.getGPUDevice();
|
|
98
|
+
const pipeline = renderer.getPipeline();
|
|
99
|
+
const scene = renderer.getScene();
|
|
100
|
+
if (!device || !pipeline || !scene.hasQueuedMeshes()) return;
|
|
101
|
+
const flushed = scene.flushPending(device, pipeline);
|
|
102
|
+
if (flushed) {
|
|
103
|
+
renderer.clearCaches();
|
|
104
|
+
renderer.requestRender();
|
|
105
|
+
}
|
|
106
|
+
if (scene.hasQueuedMeshes()) {
|
|
107
|
+
ensureQueuePump();
|
|
108
|
+
}
|
|
109
|
+
}, 0);
|
|
110
|
+
};
|
|
74
111
|
|
|
75
112
|
// ─── Main geometry effect ────────────────────────────────────────────
|
|
76
113
|
// Runs on every geometry change (new file, incremental batch, visibility toggle).
|
|
@@ -81,6 +118,7 @@ export function useGeometryStreaming(params: UseGeometryStreamingParams): void {
|
|
|
81
118
|
// Geometry cleared/null — reset so next load is fresh
|
|
82
119
|
if (!geometry) {
|
|
83
120
|
if (lastGeometryLengthRef.current > 0 || lastGeometryRef.current !== null) {
|
|
121
|
+
traceGeometrySync(`geometry cleared lastLength=${lastGeometryLengthRef.current}`);
|
|
84
122
|
lastGeometryLengthRef.current = 0;
|
|
85
123
|
lastGeometryRef.current = null;
|
|
86
124
|
processedMeshIdsRef.current.clear();
|
|
@@ -121,7 +159,9 @@ export function useGeometryStreaming(params: UseGeometryStreamingParams): void {
|
|
|
121
159
|
}
|
|
122
160
|
|
|
123
161
|
if (isNewFile) {
|
|
162
|
+
traceGeometrySync(`new file currentLength=${currentLength} lastLength=${lastLength} releaseAfterFinalize=${releaseGeometryAfterFinalize}`);
|
|
124
163
|
scene.clear();
|
|
164
|
+
scene.setEphemeralStreamingMode(releaseGeometryAfterFinalize);
|
|
125
165
|
processedMeshIdsRef.current.clear();
|
|
126
166
|
cameraFittedRef.current = false;
|
|
127
167
|
finalBoundsRefittedRef.current = false;
|
|
@@ -132,14 +172,18 @@ export function useGeometryStreaming(params: UseGeometryStreamingParams): void {
|
|
|
132
172
|
geometryBoundsRef.current = { ...DEFAULT_BOUNDS };
|
|
133
173
|
} else if (!isIncremental && currentLength !== lastLength) {
|
|
134
174
|
if (currentLength < lastLength) {
|
|
175
|
+
traceGeometrySync(`geometry rebuilt after shrink currentLength=${currentLength} lastLength=${lastLength}`);
|
|
135
176
|
// Length decreased (model hidden) — rebuild scene, keep camera
|
|
136
177
|
scene.clear();
|
|
178
|
+
scene.setEphemeralStreamingMode(releaseGeometryAfterFinalize);
|
|
137
179
|
processedMeshIdsRef.current.clear();
|
|
138
180
|
lastGeometryLengthRef.current = 0;
|
|
139
181
|
lastGeometryRef.current = geometry;
|
|
140
182
|
} else {
|
|
183
|
+
traceGeometrySync(`geometry rebuilt after replace currentLength=${currentLength} lastLength=${lastLength} releaseAfterFinalize=${releaseGeometryAfterFinalize}`);
|
|
141
184
|
// New file while another was open — full reset
|
|
142
185
|
scene.clear();
|
|
186
|
+
scene.setEphemeralStreamingMode(releaseGeometryAfterFinalize);
|
|
143
187
|
processedMeshIdsRef.current.clear();
|
|
144
188
|
cameraFittedRef.current = false;
|
|
145
189
|
finalBoundsRefittedRef.current = false;
|
|
@@ -193,6 +237,10 @@ export function useGeometryStreaming(params: UseGeometryStreamingParams): void {
|
|
|
193
237
|
if (isStreaming) {
|
|
194
238
|
// Queue for the animation loop — zero GPU work here.
|
|
195
239
|
scene.queueMeshes(newMeshes);
|
|
240
|
+
// Desktop benchmark windows can become background-throttled, which
|
|
241
|
+
// stalls requestAnimationFrame-based draining. Keep a timer-based
|
|
242
|
+
// pump active so large native loads still finish offscreen.
|
|
243
|
+
ensureQueuePump();
|
|
196
244
|
} else {
|
|
197
245
|
// Non-streaming: process immediately (visibility toggles, etc.)
|
|
198
246
|
scene.appendToBatches(newMeshes, device, pipeline, false);
|
|
@@ -230,66 +278,105 @@ export function useGeometryStreaming(params: UseGeometryStreamingParams): void {
|
|
|
230
278
|
renderer.requestRender();
|
|
231
279
|
}, [geometry, geometryVersion, coordinateInfo, isInitialized, isStreaming]);
|
|
232
280
|
|
|
281
|
+
useEffect(() => {
|
|
282
|
+
return () => {
|
|
283
|
+
if (queuePumpTimerRef.current !== null) {
|
|
284
|
+
globalThis.clearTimeout(queuePumpTimerRef.current);
|
|
285
|
+
queuePumpTimerRef.current = null;
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
}, []);
|
|
289
|
+
|
|
233
290
|
// ─── Streaming complete: finalize + bounds refit ─────────────────────
|
|
234
291
|
useEffect(() => {
|
|
235
292
|
const renderer = rendererRef.current;
|
|
236
293
|
if (!renderer || !isInitialized) return;
|
|
237
294
|
|
|
238
295
|
if (prevIsStreamingRef.current && !isStreaming) {
|
|
239
|
-
// Flush any remaining queued meshes synchronously before finalize
|
|
240
|
-
const device = renderer.getGPUDevice();
|
|
241
|
-
const pipeline = renderer.getPipeline();
|
|
242
296
|
const scene = renderer.getScene();
|
|
243
|
-
|
|
244
|
-
scene.
|
|
245
|
-
|
|
246
|
-
|
|
297
|
+
traceGeometrySync(
|
|
298
|
+
`stream transition complete geometryLength=${geometry?.length ?? 0} queued=${scene.hasQueuedMeshes()} batches=${scene.getBatchedMeshes().length}`
|
|
299
|
+
);
|
|
247
300
|
renderer.requestRender();
|
|
248
301
|
|
|
249
|
-
// Defer heavy work so the browser processes pending input events first.
|
|
250
|
-
// Streaming fragments keep rendering until proper batches replace them.
|
|
251
302
|
const capturedGeometry = geometry;
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
303
|
+
let timeoutId: ReturnType<typeof globalThis.setTimeout> | null = null;
|
|
304
|
+
let rafId: number | null = null;
|
|
305
|
+
|
|
306
|
+
const startFinalize = () => {
|
|
307
|
+
timeoutId = globalThis.setTimeout(() => {
|
|
308
|
+
const r = rendererRef.current;
|
|
309
|
+
if (!r) return;
|
|
310
|
+
|
|
311
|
+
console.log('[GeomStream] Streaming ended — starting finalize');
|
|
312
|
+
traceGeometrySync(
|
|
313
|
+
`finalize start geometryLength=${capturedGeometry?.length ?? 0} releaseAfterFinalize=${releaseGeometryAfterFinalize}`
|
|
314
|
+
);
|
|
315
|
+
|
|
316
|
+
// Compute exact bounds and refit camera (fast ~15ms scan)
|
|
317
|
+
if (cameraFittedRef.current && !finalBoundsRefittedRef.current && capturedGeometry && capturedGeometry.length > 0) {
|
|
318
|
+
const t0 = performance.now();
|
|
319
|
+
const exactBounds = computeBounds(capturedGeometry);
|
|
320
|
+
console.log(`[GeomStream] computeBounds: ${(performance.now() - t0).toFixed(0)}ms`);
|
|
321
|
+
if (exactBounds) {
|
|
322
|
+
if (!userMovedCamera(r, cameraSnapshotRef.current)) {
|
|
323
|
+
r.getCamera().fitToBounds(exactBounds.min, exactBounds.max);
|
|
324
|
+
}
|
|
325
|
+
geometryBoundsRef.current = exactBounds;
|
|
326
|
+
finalBoundsRefittedRef.current = true;
|
|
266
327
|
}
|
|
267
|
-
geometryBoundsRef.current = exactBounds;
|
|
268
|
-
finalBoundsRefittedRef.current = true;
|
|
269
328
|
}
|
|
270
|
-
}
|
|
271
329
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
const t0 = performance.now();
|
|
277
|
-
r.getScene().finalizeStreamingAsync(dev, pipe).then(() => {
|
|
278
|
-
const batchCount = r.getScene().getBatchedMeshes().length;
|
|
279
|
-
let totalIdx = 0;
|
|
280
|
-
for (const b of r.getScene().getBatchedMeshes()) totalIdx += b.indexCount;
|
|
281
|
-
console.log(`[GeomStream] finalizeStreamingAsync complete: ${(performance.now() - t0).toFixed(0)}ms → ${batchCount} consolidated batches, ${(totalIdx / 3 / 1e6).toFixed(1)}M triangles`);
|
|
330
|
+
// Time-sliced finalize: rebuild proper batches in ~8ms chunks
|
|
331
|
+
if (releaseGeometryAfterFinalize) {
|
|
332
|
+
r.getScene().finishEphemeralStreaming();
|
|
333
|
+
onGeometryReleased?.();
|
|
282
334
|
r.clearCaches();
|
|
283
335
|
r.requestRender();
|
|
284
|
-
|
|
336
|
+
traceGeometrySync(`ephemeral finalize complete batches=${r.getScene().getBatchedMeshes().length}`);
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
const dev = r.getGPUDevice();
|
|
341
|
+
const pipe = r.getPipeline();
|
|
342
|
+
if (dev && pipe) {
|
|
343
|
+
const t0 = performance.now();
|
|
344
|
+
r.getScene().finalizeStreamingAsync(dev, pipe).then(() => {
|
|
345
|
+
const batchCount = r.getScene().getBatchedMeshes().length;
|
|
346
|
+
let totalIdx = 0;
|
|
347
|
+
for (const b of r.getScene().getBatchedMeshes()) totalIdx += b.indexCount;
|
|
348
|
+
console.log(`[GeomStream] finalizeStreamingAsync complete: ${(performance.now() - t0).toFixed(0)}ms → ${batchCount} consolidated batches, ${(totalIdx / 3 / 1e6).toFixed(1)}M triangles`);
|
|
349
|
+
traceGeometrySync(
|
|
350
|
+
`finalize complete elapsed=${(performance.now() - t0).toFixed(0)}ms batches=${batchCount} queued=${r.getScene().hasQueuedMeshes()}`
|
|
351
|
+
);
|
|
352
|
+
r.clearCaches();
|
|
353
|
+
r.requestRender();
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
}, 0);
|
|
357
|
+
};
|
|
358
|
+
|
|
359
|
+
const waitForQueueDrain = () => {
|
|
360
|
+
const currentRenderer = rendererRef.current;
|
|
361
|
+
if (!currentRenderer) return;
|
|
362
|
+
if (!currentRenderer.getScene().hasQueuedMeshes()) {
|
|
363
|
+
startFinalize();
|
|
364
|
+
return;
|
|
285
365
|
}
|
|
286
|
-
|
|
366
|
+
currentRenderer.requestRender();
|
|
367
|
+
rafId = requestAnimationFrame(waitForQueueDrain);
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
waitForQueueDrain();
|
|
287
371
|
|
|
288
372
|
prevIsStreamingRef.current = isStreaming;
|
|
289
|
-
return () =>
|
|
373
|
+
return () => {
|
|
374
|
+
if (timeoutId !== null) globalThis.clearTimeout(timeoutId);
|
|
375
|
+
if (rafId !== null) cancelAnimationFrame(rafId);
|
|
376
|
+
};
|
|
290
377
|
}
|
|
291
378
|
prevIsStreamingRef.current = isStreaming;
|
|
292
|
-
}, [isStreaming, isInitialized]);
|
|
379
|
+
}, [isStreaming, isInitialized, releaseGeometryAfterFinalize, onGeometryReleased]);
|
|
293
380
|
|
|
294
381
|
// ─── Mesh color updates (style/material deferred colors) ─────────────
|
|
295
382
|
useEffect(() => {
|
|
@@ -129,6 +129,8 @@ export interface UseMouseControlsParams {
|
|
|
129
129
|
RENDER_THROTTLE_MS_SMALL: number;
|
|
130
130
|
RENDER_THROTTLE_MS_LARGE: number;
|
|
131
131
|
RENDER_THROTTLE_MS_HUGE: number;
|
|
132
|
+
/** When true, wheel zoom uses unrestricted pure-dolly mode (Cesium) */
|
|
133
|
+
fastZoomRef: MutableRefObject<boolean>;
|
|
132
134
|
}
|
|
133
135
|
|
|
134
136
|
export function useMouseControls(params: UseMouseControlsParams): void {
|
|
@@ -476,7 +478,8 @@ export function useMouseControls(params: UseMouseControlsParams): void {
|
|
|
476
478
|
const rect = canvas.getBoundingClientRect();
|
|
477
479
|
const mouseX = e.clientX - rect.left;
|
|
478
480
|
const mouseY = e.clientY - rect.top;
|
|
479
|
-
|
|
481
|
+
const fastZoom = e.shiftKey || params.fastZoomRef.current;
|
|
482
|
+
camera.zoom(e.deltaY, false, mouseX, mouseY, canvas.width, canvas.height, fastZoom);
|
|
480
483
|
|
|
481
484
|
isInteractingRef.current = true;
|
|
482
485
|
renderer.requestRender();
|
package/src/hooks/bcfIdLookup.ts
CHANGED
|
@@ -9,7 +9,9 @@
|
|
|
9
9
|
* accounting for multi-model federation offsets and single-model fallback.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import type { FederatedModel
|
|
12
|
+
import type { FederatedModel } from '@/store/types';
|
|
13
|
+
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
14
|
+
import { fromGlobalIdFromModels, toGlobalIdFromModels } from '@/store/globalId';
|
|
13
15
|
|
|
14
16
|
export interface IdLookupResult {
|
|
15
17
|
expressId: number;
|
|
@@ -29,8 +31,10 @@ export function globalIdToExpressId(
|
|
|
29
31
|
for (const [modelId, model] of models.entries()) {
|
|
30
32
|
const localExpressId = model.ifcDataStore?.entities?.getExpressIdByGlobalId(globalIdString);
|
|
31
33
|
if (localExpressId !== undefined && localExpressId > 0) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
return {
|
|
35
|
+
expressId: toGlobalIdFromModels(models, modelId, localExpressId),
|
|
36
|
+
modelId,
|
|
37
|
+
};
|
|
34
38
|
}
|
|
35
39
|
}
|
|
36
40
|
// Single-model fallback
|
|
@@ -52,14 +56,12 @@ export function expressIdToGlobalId(
|
|
|
52
56
|
models: Map<string, FederatedModel>,
|
|
53
57
|
ifcDataStore: IfcDataStore | null | undefined,
|
|
54
58
|
): string | null {
|
|
55
|
-
// Multi-model path:
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
if (globalIdString) return globalIdString;
|
|
62
|
-
}
|
|
59
|
+
// Multi-model path: resolve through the centralized reverse conversion helper
|
|
60
|
+
const resolved = fromGlobalIdFromModels(models, expressId);
|
|
61
|
+
if (resolved && resolved.modelId !== 'legacy') {
|
|
62
|
+
const model = models.get(resolved.modelId);
|
|
63
|
+
const globalIdString = model?.ifcDataStore?.entities?.getGlobalId(resolved.expressId);
|
|
64
|
+
if (globalIdString) return globalIdString;
|
|
63
65
|
}
|
|
64
66
|
// Single-model fallback: use legacy ifcDataStore directly
|
|
65
67
|
if (models.size === 0 && ifcDataStore?.entities) {
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
import type { IDSValidationReport } from '@ifc-lite/ids';
|
|
13
13
|
import type { GeometryResult } from '@ifc-lite/geometry';
|
|
14
|
+
import { toGlobalIdFromModels } from '../../store/globalId.js';
|
|
14
15
|
|
|
15
16
|
/** RGBA color tuple in 0-1 range */
|
|
16
17
|
export type ColorTuple = [number, number, number, number];
|
|
@@ -66,10 +67,7 @@ export function buildValidationColorUpdates(
|
|
|
66
67
|
const globalIdsToUpdate = new Set<number>();
|
|
67
68
|
for (const specResult of report.specificationResults) {
|
|
68
69
|
for (const entityResult of specResult.entityResults) {
|
|
69
|
-
const
|
|
70
|
-
const globalId = model
|
|
71
|
-
? entityResult.expressId + (model.idOffset ?? 0)
|
|
72
|
-
: entityResult.expressId;
|
|
70
|
+
const globalId = toGlobalIdFromModels(models, entityResult.modelId, entityResult.expressId);
|
|
73
71
|
globalIdsToUpdate.add(globalId);
|
|
74
72
|
}
|
|
75
73
|
}
|
|
@@ -86,10 +84,7 @@ export function buildValidationColorUpdates(
|
|
|
86
84
|
// Process all entity results
|
|
87
85
|
for (const specResult of report.specificationResults) {
|
|
88
86
|
for (const entityResult of specResult.entityResults) {
|
|
89
|
-
const
|
|
90
|
-
const globalId = model
|
|
91
|
-
? entityResult.expressId + (model.idOffset ?? 0)
|
|
92
|
-
: entityResult.expressId;
|
|
87
|
+
const globalId = toGlobalIdFromModels(models, entityResult.modelId, entityResult.expressId);
|
|
93
88
|
|
|
94
89
|
if (entityResult.passed && displayOptions.highlightPassed) {
|
|
95
90
|
colorUpdates.set(globalId, passedClr);
|