@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
|
@@ -27,11 +27,13 @@ import { ScrollArea } from '@/components/ui/scroll-area';
|
|
|
27
27
|
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible';
|
|
28
28
|
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
|
|
29
29
|
import { useViewerStore } from '@/store';
|
|
30
|
+
import { toGlobalIdFromModels } from '@/store/globalId';
|
|
30
31
|
import { useIfc } from '@/hooks/useIfc';
|
|
32
|
+
import { getNativeEntityDetails } from '@/services/desktop-native-metadata';
|
|
31
33
|
import { configureMutationView } from '@/utils/configureMutationView';
|
|
32
34
|
import { IfcQuery } from '@ifc-lite/query';
|
|
33
35
|
import { MutablePropertyView } from '@ifc-lite/mutations';
|
|
34
|
-
import { extractClassificationsOnDemand, extractMaterialsOnDemand, extractTypePropertiesOnDemand, extractTypeEntityOwnProperties, extractDocumentsOnDemand, extractRelationshipsOnDemand, type IfcDataStore } from '@ifc-lite/parser';
|
|
36
|
+
import { extractClassificationsOnDemand, extractMaterialsOnDemand, extractTypePropertiesOnDemand, extractTypeEntityOwnProperties, extractDocumentsOnDemand, extractRelationshipsOnDemand, extractGeoreferencingOnDemand, type IfcDataStore } from '@ifc-lite/parser';
|
|
35
37
|
import { EntityFlags, RelationshipType, isSpatialStructureTypeName, isStoreyLikeSpatialTypeName } from '@ifc-lite/data';
|
|
36
38
|
import type { EntityRef, FederatedModel } from '@/store/types';
|
|
37
39
|
|
|
@@ -45,6 +47,7 @@ import { DocumentCard } from './properties/DocumentCard';
|
|
|
45
47
|
import { RelationshipsCard } from './properties/RelationshipsCard';
|
|
46
48
|
import type { PropertySet, QuantitySet } from './properties/encodingUtils';
|
|
47
49
|
import { BsddCard } from './properties/BsddCard';
|
|
50
|
+
import { GeoreferencingPanel } from './properties/GeoreferencingPanel';
|
|
48
51
|
|
|
49
52
|
type DisplayProperty = { name: string; value: unknown; isMutated: boolean };
|
|
50
53
|
type DisplayPropertySet = {
|
|
@@ -101,7 +104,7 @@ export function PropertiesPanel() {
|
|
|
101
104
|
const m = models.get(selectedEntity.modelId);
|
|
102
105
|
if (m) {
|
|
103
106
|
return {
|
|
104
|
-
modelQuery: new IfcQuery(m.ifcDataStore),
|
|
107
|
+
modelQuery: m.nativeMetadata ? null : (m.ifcDataStore ? new IfcQuery(m.ifcDataStore) : null),
|
|
105
108
|
model: m,
|
|
106
109
|
};
|
|
107
110
|
}
|
|
@@ -121,7 +124,7 @@ export function PropertiesPanel() {
|
|
|
121
124
|
|
|
122
125
|
// Ensure mutation view exists for editing - creates it on-demand if needed
|
|
123
126
|
useEffect(() => {
|
|
124
|
-
if (!model || !selectedEntity || selectedEntity.modelId === 'legacy') return;
|
|
127
|
+
if (!model || !model.ifcDataStore || !selectedEntity || selectedEntity.modelId === 'legacy') return;
|
|
125
128
|
|
|
126
129
|
const modelId = selectedEntity.modelId;
|
|
127
130
|
let mutationView = getMutationView(modelId);
|
|
@@ -140,10 +143,38 @@ export function PropertiesPanel() {
|
|
|
140
143
|
const [copied, setCopied] = useState(false);
|
|
141
144
|
const [coordCopied, setCoordCopied] = useState<string | null>(null);
|
|
142
145
|
const [coordOpen, setCoordOpen] = useState(false);
|
|
146
|
+
const [nativeDetails, setNativeDetails] = useState<import('@/store/types').NativeMetadataEntityDetails | null>(null);
|
|
147
|
+
const [nativeDetailsState, setNativeDetailsState] = useState<'idle' | 'loading' | 'error'>('idle');
|
|
143
148
|
|
|
144
149
|
// Edit mode toggle - allows inline property editing
|
|
145
150
|
const [editMode, setEditMode] = useState(false);
|
|
146
151
|
|
|
152
|
+
useEffect(() => {
|
|
153
|
+
if (!selectedEntity || !model?.nativeMetadata) {
|
|
154
|
+
setNativeDetails(null);
|
|
155
|
+
setNativeDetailsState('idle');
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
let cancelled = false;
|
|
159
|
+
setNativeDetailsState('loading');
|
|
160
|
+
void getNativeEntityDetails(model.nativeMetadata.cacheKey, selectedEntity.expressId)
|
|
161
|
+
.then((details) => {
|
|
162
|
+
if (!cancelled) {
|
|
163
|
+
setNativeDetails(details);
|
|
164
|
+
setNativeDetailsState('idle');
|
|
165
|
+
}
|
|
166
|
+
})
|
|
167
|
+
.catch(() => {
|
|
168
|
+
if (!cancelled) {
|
|
169
|
+
setNativeDetails(null);
|
|
170
|
+
setNativeDetailsState('error');
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
return () => {
|
|
174
|
+
cancelled = true;
|
|
175
|
+
};
|
|
176
|
+
}, [selectedEntity, model?.nativeMetadata]);
|
|
177
|
+
|
|
147
178
|
const copyToClipboard = useCallback((text: string) => {
|
|
148
179
|
navigator.clipboard.writeText(text);
|
|
149
180
|
setCopied(true);
|
|
@@ -247,7 +278,7 @@ export function PropertiesPanel() {
|
|
|
247
278
|
if (!geoResult?.meshes?.length) return null;
|
|
248
279
|
|
|
249
280
|
// In multi-model mode, meshes use globalIds (originalExpressId + idOffset)
|
|
250
|
-
const targetExpressId = selectedEntity.expressId
|
|
281
|
+
const targetExpressId = toGlobalIdFromModels(models, selectedEntity.modelId, selectedEntity.expressId);
|
|
251
282
|
|
|
252
283
|
// Compute bounding box from matching mesh positions
|
|
253
284
|
let minX = Infinity, minY = Infinity, minZ = Infinity;
|
|
@@ -515,6 +546,14 @@ export function PropertiesPanel() {
|
|
|
515
546
|
return totalCount > 0 ? rels : null;
|
|
516
547
|
}, [selectedEntity, model, ifcDataStore]);
|
|
517
548
|
|
|
549
|
+
// Extract georeferencing info for the model (used in coordinates section)
|
|
550
|
+
const georef = useMemo(() => {
|
|
551
|
+
const dataStore = model?.ifcDataStore ?? ifcDataStore;
|
|
552
|
+
if (!dataStore) return null;
|
|
553
|
+
const info = extractGeoreferencingOnDemand(dataStore as IfcDataStore);
|
|
554
|
+
return info?.hasGeoreference ? info : null;
|
|
555
|
+
}, [model, ifcDataStore]);
|
|
556
|
+
|
|
518
557
|
// Extract type-level properties (e.g., from IfcWallType's HasPropertySets)
|
|
519
558
|
const typeProperties = useMemo(() => {
|
|
520
559
|
if (!selectedEntity) return null;
|
|
@@ -644,8 +683,8 @@ export function PropertiesPanel() {
|
|
|
644
683
|
|
|
645
684
|
// Separate occurrence (instance) and inherited type properties.
|
|
646
685
|
// Occurrence properties are displayed first, type properties in a separate section.
|
|
647
|
-
//
|
|
648
|
-
//
|
|
686
|
+
// All type property sets are always shown in the inherited section so users can see
|
|
687
|
+
// what the type defines, even when the same pset exists at occurrence level.
|
|
649
688
|
const { occurrenceProperties, inheritedTypeProperties } = useMemo(() => {
|
|
650
689
|
const occ: PropertySet[] = properties.map(p => ({ ...p, source: 'instance' as const }));
|
|
651
690
|
|
|
@@ -653,23 +692,10 @@ export function PropertiesPanel() {
|
|
|
653
692
|
return { occurrenceProperties: occ, inheritedTypeProperties: [] as PropertySet[] };
|
|
654
693
|
}
|
|
655
694
|
|
|
656
|
-
const
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
if (instanceByName.has(typePset.name)) {
|
|
661
|
-
// Pset exists at instance level - add type-only props that aren't overridden
|
|
662
|
-
const instancePset = properties.find(p => p.name === typePset.name)!;
|
|
663
|
-
const instancePropNames = new Set(instancePset.properties.map(p => p.name));
|
|
664
|
-
const extraProps = typePset.properties.filter(p => !instancePropNames.has(p.name));
|
|
665
|
-
if (extraProps.length > 0) {
|
|
666
|
-
inherited.push({ ...typePset, properties: extraProps, source: 'type' });
|
|
667
|
-
}
|
|
668
|
-
} else {
|
|
669
|
-
// Type-only pset - show fully in inherited section
|
|
670
|
-
inherited.push({ ...typePset, source: 'type' });
|
|
671
|
-
}
|
|
672
|
-
}
|
|
695
|
+
const inherited: PropertySet[] = typeProperties.psets.map(typePset => ({
|
|
696
|
+
...typePset,
|
|
697
|
+
source: 'type' as const,
|
|
698
|
+
}));
|
|
673
699
|
|
|
674
700
|
return { occurrenceProperties: occ, inheritedTypeProperties: inherited };
|
|
675
701
|
}, [properties, typeProperties]);
|
|
@@ -750,6 +776,114 @@ export function PropertiesPanel() {
|
|
|
750
776
|
return names;
|
|
751
777
|
}, [attributes]);
|
|
752
778
|
|
|
779
|
+
const isNativeLazySelection = Boolean(selectedEntity && model?.nativeMetadata);
|
|
780
|
+
|
|
781
|
+
useEffect(() => {
|
|
782
|
+
if (isNativeLazySelection && editMode) {
|
|
783
|
+
setEditMode(false);
|
|
784
|
+
}
|
|
785
|
+
}, [isNativeLazySelection, editMode]);
|
|
786
|
+
|
|
787
|
+
const nativeSpatialInfo = useMemo(() => {
|
|
788
|
+
if (!nativeDetails?.spatial?.storeyName) return null;
|
|
789
|
+
return {
|
|
790
|
+
storeyId: nativeDetails.spatial.storeyId ?? undefined,
|
|
791
|
+
storeyName: nativeDetails.spatial.storeyName,
|
|
792
|
+
elevation: nativeDetails.spatial.elevation ?? undefined,
|
|
793
|
+
height: nativeDetails.spatial.height ?? undefined,
|
|
794
|
+
};
|
|
795
|
+
}, [nativeDetails]);
|
|
796
|
+
|
|
797
|
+
const nativeOccurrenceProperties = useMemo<PropertySet[]>(() => {
|
|
798
|
+
if (!nativeDetails) return [];
|
|
799
|
+
return nativeDetails.properties.map((pset) => ({
|
|
800
|
+
name: pset.name,
|
|
801
|
+
properties: pset.properties.map((property) => ({
|
|
802
|
+
name: property.name,
|
|
803
|
+
value: property.value,
|
|
804
|
+
isMutated: false,
|
|
805
|
+
})),
|
|
806
|
+
isNewPset: false,
|
|
807
|
+
source: 'instance' as const,
|
|
808
|
+
}));
|
|
809
|
+
}, [nativeDetails]);
|
|
810
|
+
|
|
811
|
+
const nativeQuantities = useMemo<QuantitySet[]>(() => {
|
|
812
|
+
if (!nativeDetails) return [];
|
|
813
|
+
return nativeDetails.quantities.map((qset) => ({
|
|
814
|
+
name: qset.name,
|
|
815
|
+
quantities: qset.quantities.map((quantity) => ({
|
|
816
|
+
name: quantity.name,
|
|
817
|
+
value: quantity.value,
|
|
818
|
+
type: quantity.type ?? 0,
|
|
819
|
+
})),
|
|
820
|
+
}));
|
|
821
|
+
}, [nativeDetails]);
|
|
822
|
+
|
|
823
|
+
const renderedEntityType = isNativeLazySelection
|
|
824
|
+
? (nativeDetails?.summary.type ?? 'Loading...')
|
|
825
|
+
: (entityNode?.type ?? 'Unknown');
|
|
826
|
+
const renderedEntityName = isNativeLazySelection
|
|
827
|
+
? (nativeDetails?.summary.name ?? `#${selectedEntity?.expressId ?? ''}`)
|
|
828
|
+
: entityNode?.name;
|
|
829
|
+
const renderedEntityGlobalId = isNativeLazySelection
|
|
830
|
+
? (nativeDetails?.summary.globalId ?? null)
|
|
831
|
+
: entityNode?.globalId;
|
|
832
|
+
const renderedEntityDescription = isNativeLazySelection ? undefined : entityNode?.description;
|
|
833
|
+
const renderedEntityObjectType = isNativeLazySelection ? undefined : entityNode?.objectType;
|
|
834
|
+
const renderedSpatialInfo = isNativeLazySelection ? nativeSpatialInfo : spatialInfo;
|
|
835
|
+
const renderedOccurrenceProperties = isNativeLazySelection ? nativeOccurrenceProperties : occurrenceProperties;
|
|
836
|
+
const renderedInheritedTypeProperties = isNativeLazySelection ? [] : inheritedTypeProperties;
|
|
837
|
+
const renderedMergedProperties = isNativeLazySelection
|
|
838
|
+
? nativeOccurrenceProperties
|
|
839
|
+
: mergedProperties;
|
|
840
|
+
const renderedQuantities = isNativeLazySelection ? nativeQuantities : quantities;
|
|
841
|
+
const renderedAttributes = isNativeLazySelection ? [] : attributes;
|
|
842
|
+
const renderedClassifications = isNativeLazySelection ? [] : classifications;
|
|
843
|
+
const renderedMaterialInfo = isNativeLazySelection ? null : materialInfo;
|
|
844
|
+
const renderedDocuments = isNativeLazySelection ? [] : documents;
|
|
845
|
+
const renderedEntityRelationships = isNativeLazySelection ? null : entityRelationships;
|
|
846
|
+
const renderedGeoref = isNativeLazySelection ? null : georef;
|
|
847
|
+
const renderedSpatialContainment = isNativeLazySelection ? null : spatialContainment;
|
|
848
|
+
const renderedTypeProperties = isNativeLazySelection
|
|
849
|
+
? (nativeDetails?.typeSummary
|
|
850
|
+
? {
|
|
851
|
+
typeName: nativeDetails.typeSummary.name,
|
|
852
|
+
typeId: nativeDetails.typeSummary.expressId,
|
|
853
|
+
psets: [] as PropertySet[],
|
|
854
|
+
}
|
|
855
|
+
: null)
|
|
856
|
+
: typeProperties;
|
|
857
|
+
const renderedTypeEditImpact = isNativeLazySelection ? null : typeEditImpact;
|
|
858
|
+
const renderedIsTypeEntity = isNativeLazySelection
|
|
859
|
+
? ((nativeDetails?.summary.type ?? '').endsWith('Type'))
|
|
860
|
+
: isTypeEntity;
|
|
861
|
+
const renderedExistingProps = useMemo(() => {
|
|
862
|
+
const keys = new Set<string>();
|
|
863
|
+
for (const pset of renderedMergedProperties) {
|
|
864
|
+
for (const prop of pset.properties) {
|
|
865
|
+
keys.add(`${pset.name}:${prop.name}`);
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
return keys;
|
|
869
|
+
}, [renderedMergedProperties]);
|
|
870
|
+
const renderedExistingQuants = useMemo(() => {
|
|
871
|
+
const keys = new Set<string>();
|
|
872
|
+
for (const qset of renderedQuantities) {
|
|
873
|
+
for (const q of qset.quantities) {
|
|
874
|
+
keys.add(`${qset.name}:${q.name}`);
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
return keys;
|
|
878
|
+
}, [renderedQuantities]);
|
|
879
|
+
const renderedExistingAttributeNames = useMemo(() => {
|
|
880
|
+
const names = new Set<string>();
|
|
881
|
+
for (const attr of renderedAttributes) {
|
|
882
|
+
if (attr.value) names.add(attr.name);
|
|
883
|
+
}
|
|
884
|
+
return names;
|
|
885
|
+
}, [renderedAttributes]);
|
|
886
|
+
|
|
753
887
|
// Model metadata display (when clicking top-level model in hierarchy)
|
|
754
888
|
if (selectedModelId) {
|
|
755
889
|
const selectedModel = models.get(selectedModelId);
|
|
@@ -769,7 +903,24 @@ export function PropertiesPanel() {
|
|
|
769
903
|
);
|
|
770
904
|
}
|
|
771
905
|
|
|
772
|
-
if (!selectedEntityId || !modelQuery || !entityNode) {
|
|
906
|
+
if (!selectedEntityId || (!isNativeLazySelection && (!modelQuery || !entityNode))) {
|
|
907
|
+
// Show model metadata when a single legacy model is loaded and nothing selected
|
|
908
|
+
if (ifcDataStore && models.size === 0 && geometryResult) {
|
|
909
|
+
const legacyModel: FederatedModel = {
|
|
910
|
+
id: '__legacy__',
|
|
911
|
+
name: 'Model',
|
|
912
|
+
ifcDataStore: ifcDataStore as IfcDataStore,
|
|
913
|
+
geometryResult,
|
|
914
|
+
visible: true,
|
|
915
|
+
collapsed: false,
|
|
916
|
+
schemaVersion: ((ifcDataStore as IfcDataStore).schemaVersion ?? 'IFC4') as FederatedModel['schemaVersion'],
|
|
917
|
+
loadedAt: Date.now(),
|
|
918
|
+
fileSize: (ifcDataStore as IfcDataStore).fileSize ?? 0,
|
|
919
|
+
idOffset: 0,
|
|
920
|
+
maxExpressId: (ifcDataStore as IfcDataStore).entityCount ?? 0,
|
|
921
|
+
};
|
|
922
|
+
return <ModelMetadataPanel model={legacyModel} />;
|
|
923
|
+
}
|
|
773
924
|
return (
|
|
774
925
|
<div className="h-full flex flex-col border-l-2 border-zinc-200 dark:border-zinc-800 bg-zinc-50 dark:bg-black">
|
|
775
926
|
<div className="p-3 border-b-2 border-zinc-200 dark:border-zinc-800 bg-white dark:bg-black">
|
|
@@ -781,7 +932,7 @@ export function PropertiesPanel() {
|
|
|
781
932
|
</div>
|
|
782
933
|
<p className="font-bold uppercase text-zinc-900 dark:text-zinc-100 mb-2">No Selection</p>
|
|
783
934
|
<p className="text-xs font-mono text-zinc-500 dark:text-zinc-400 max-w-[150px]">
|
|
784
|
-
Select an element to view details
|
|
935
|
+
{models.size > 1 ? 'Select a model or element to view details' : 'Select an element to view details'}
|
|
785
936
|
</p>
|
|
786
937
|
</div>
|
|
787
938
|
</div>
|
|
@@ -789,11 +940,11 @@ export function PropertiesPanel() {
|
|
|
789
940
|
}
|
|
790
941
|
|
|
791
942
|
// These are safe to access after the early return check (entityNode is confirmed non-null above)
|
|
792
|
-
const entityType =
|
|
793
|
-
const entityName =
|
|
794
|
-
const entityGlobalId =
|
|
795
|
-
const entityDescription =
|
|
796
|
-
const entityObjectType =
|
|
943
|
+
const entityType = renderedEntityType;
|
|
944
|
+
const entityName = renderedEntityName;
|
|
945
|
+
const entityGlobalId = renderedEntityGlobalId;
|
|
946
|
+
const entityDescription = renderedEntityDescription;
|
|
947
|
+
const entityObjectType = renderedEntityObjectType;
|
|
797
948
|
|
|
798
949
|
return (
|
|
799
950
|
<div className="h-full flex flex-col border-l-2 border-zinc-200 dark:border-zinc-800 bg-white dark:bg-black">
|
|
@@ -808,6 +959,13 @@ export function PropertiesPanel() {
|
|
|
808
959
|
{entityName || `${entityType}`}
|
|
809
960
|
</h3>
|
|
810
961
|
<p className="text-xs font-mono text-zinc-500 dark:text-zinc-400">{entityType}</p>
|
|
962
|
+
{/* Show associated type entity for occurrences */}
|
|
963
|
+
{!renderedIsTypeEntity && renderedTypeProperties && (
|
|
964
|
+
<p className="text-[11px] font-mono text-indigo-500 dark:text-indigo-400 truncate" title={`${activeDataStore?.entities.getTypeName(renderedTypeProperties.typeId) || 'Type'}: ${renderedTypeProperties.typeName}`}>
|
|
965
|
+
<Building2 className="inline h-3 w-3 mr-1 -mt-0.5" />
|
|
966
|
+
{activeDataStore?.entities.getTypeName(renderedTypeProperties.typeId) || 'Type'}: {renderedTypeProperties.typeName}
|
|
967
|
+
</p>
|
|
968
|
+
)}
|
|
811
969
|
</div>
|
|
812
970
|
<div className="flex gap-1 shrink-0">
|
|
813
971
|
<Tooltip>
|
|
@@ -851,19 +1009,21 @@ export function PropertiesPanel() {
|
|
|
851
1009
|
</TooltipContent>
|
|
852
1010
|
</Tooltip>
|
|
853
1011
|
{/* Edit mode toggle */}
|
|
854
|
-
|
|
855
|
-
<
|
|
856
|
-
<
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
1012
|
+
{!isNativeLazySelection && (
|
|
1013
|
+
<Tooltip>
|
|
1014
|
+
<TooltipTrigger asChild>
|
|
1015
|
+
<Button
|
|
1016
|
+
variant={editMode ? 'default' : 'ghost'}
|
|
1017
|
+
size="icon-xs"
|
|
1018
|
+
className={`rounded-none ${editMode ? 'bg-purple-600 hover:bg-purple-700 text-white' : 'hover:bg-zinc-200 dark:hover:bg-zinc-700'}`}
|
|
1019
|
+
onClick={() => setEditMode(!editMode)}
|
|
1020
|
+
>
|
|
1021
|
+
<PenLine className="h-3.5 w-3.5" />
|
|
1022
|
+
</Button>
|
|
1023
|
+
</TooltipTrigger>
|
|
1024
|
+
<TooltipContent>{editMode ? 'Exit Edit Mode' : 'Edit Properties'}</TooltipContent>
|
|
1025
|
+
</Tooltip>
|
|
1026
|
+
)}
|
|
867
1027
|
</div>
|
|
868
1028
|
</div>
|
|
869
1029
|
|
|
@@ -897,34 +1057,34 @@ export function PropertiesPanel() {
|
|
|
897
1057
|
)}
|
|
898
1058
|
|
|
899
1059
|
{/* Spatial Location */}
|
|
900
|
-
{
|
|
1060
|
+
{renderedSpatialInfo && (
|
|
901
1061
|
<div className="flex items-center gap-2 text-xs border border-emerald-500/30 bg-emerald-50/50 dark:bg-emerald-900/10 px-2 py-1.5 text-emerald-800 dark:text-emerald-400 min-w-0">
|
|
902
1062
|
<Layers className="h-3.5 w-3.5 shrink-0" />
|
|
903
|
-
<span className="font-bold uppercase tracking-wide truncate min-w-0 flex-1">{
|
|
1063
|
+
<span className="font-bold uppercase tracking-wide truncate min-w-0 flex-1">{renderedSpatialInfo.storeyName}</span>
|
|
904
1064
|
<div className="flex items-center gap-1.5 shrink-0">
|
|
905
|
-
{
|
|
1065
|
+
{renderedSpatialInfo.elevation !== undefined && (
|
|
906
1066
|
<Tooltip>
|
|
907
1067
|
<TooltipTrigger asChild>
|
|
908
1068
|
<span className="text-emerald-600/70 dark:text-emerald-500/70 font-mono whitespace-nowrap">
|
|
909
|
-
{
|
|
1069
|
+
{renderedSpatialInfo.elevation >= 0 ? '+' : ''}{renderedSpatialInfo.elevation.toFixed(2)}m
|
|
910
1070
|
</span>
|
|
911
1071
|
</TooltipTrigger>
|
|
912
1072
|
<TooltipContent>
|
|
913
|
-
<p className="text-xs">Elevation: {
|
|
1073
|
+
<p className="text-xs">Elevation: {renderedSpatialInfo.elevation >= 0 ? '+' : ''}{renderedSpatialInfo.elevation.toFixed(2)}m from ground</p>
|
|
914
1074
|
</TooltipContent>
|
|
915
1075
|
</Tooltip>
|
|
916
1076
|
)}
|
|
917
|
-
{
|
|
1077
|
+
{renderedSpatialInfo.height !== undefined && (
|
|
918
1078
|
<Tooltip>
|
|
919
1079
|
<TooltipTrigger asChild>
|
|
920
1080
|
<span className="flex items-center gap-1 text-emerald-500/60 dark:text-emerald-400/60 font-mono text-[10px] whitespace-nowrap">
|
|
921
1081
|
<ArrowUpDown className="h-2.5 w-2.5 shrink-0" />
|
|
922
|
-
<span className="hidden sm:inline">{
|
|
923
|
-
<span className="sm:hidden">{
|
|
1082
|
+
<span className="hidden sm:inline">{renderedSpatialInfo.height.toFixed(2)}m</span>
|
|
1083
|
+
<span className="sm:hidden">{renderedSpatialInfo.height.toFixed(1)}m</span>
|
|
924
1084
|
</span>
|
|
925
1085
|
</TooltipTrigger>
|
|
926
1086
|
<TooltipContent>
|
|
927
|
-
<p className="text-xs">Height: {
|
|
1087
|
+
<p className="text-xs">Height: {renderedSpatialInfo.height.toFixed(2)}m to next storey</p>
|
|
928
1088
|
</TooltipContent>
|
|
929
1089
|
</Tooltip>
|
|
930
1090
|
)}
|
|
@@ -932,55 +1092,70 @@ export function PropertiesPanel() {
|
|
|
932
1092
|
</div>
|
|
933
1093
|
)}
|
|
934
1094
|
|
|
935
|
-
{/*
|
|
936
|
-
{entityCoordinates && (
|
|
1095
|
+
{/* World coordinates + Georeferencing — single consolidated section */}
|
|
1096
|
+
{(entityCoordinates || renderedGeoref || editMode) && (
|
|
937
1097
|
<Collapsible open={coordOpen} onOpenChange={setCoordOpen}>
|
|
938
1098
|
<CollapsibleTrigger className="flex items-center gap-2 w-full text-xs border border-teal-500/30 px-2 py-1.5 text-teal-800 dark:text-teal-400 min-w-0 text-left group/coord">
|
|
939
1099
|
<Crosshair className="h-3.5 w-3.5 shrink-0" />
|
|
940
1100
|
<span className="font-bold uppercase tracking-wide shrink-0">World</span>
|
|
941
1101
|
{!coordOpen && (
|
|
942
1102
|
<>
|
|
943
|
-
|
|
944
|
-
<
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
1103
|
+
{entityCoordinates && (
|
|
1104
|
+
<span className="font-mono text-[10px] text-teal-600/70 dark:text-teal-500/70 truncate min-w-0 flex-1 tabular-nums">
|
|
1105
|
+
<CoordVal axis="E" value={entityCoordinates.worldZup.center.x} />{' '}
|
|
1106
|
+
<CoordVal axis="N" value={entityCoordinates.worldZup.center.y} />{' '}
|
|
1107
|
+
<CoordVal axis="Z" value={entityCoordinates.worldZup.center.z} />
|
|
1108
|
+
</span>
|
|
1109
|
+
)}
|
|
1110
|
+
{renderedGeoref?.projectedCRS?.name && (
|
|
1111
|
+
<span className="font-mono text-[9px] text-teal-500/60 shrink-0">{renderedGeoref.projectedCRS.name}</span>
|
|
1112
|
+
)}
|
|
948
1113
|
<span className="text-[9px] text-teal-500/0 group-hover/coord:text-teal-500/40 transition-colors shrink-0">details</span>
|
|
949
1114
|
</>
|
|
950
1115
|
)}
|
|
951
1116
|
</CollapsibleTrigger>
|
|
952
1117
|
<CollapsibleContent>
|
|
953
|
-
|
|
954
|
-
<
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
{
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
{
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
<
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
1118
|
+
{entityCoordinates && (
|
|
1119
|
+
<div className="px-2 py-1.5 space-y-0.5">
|
|
1120
|
+
<CoordRow
|
|
1121
|
+
label=""
|
|
1122
|
+
values={[
|
|
1123
|
+
{ axis: 'E', value: entityCoordinates.worldZup.center.x },
|
|
1124
|
+
{ axis: 'N', value: entityCoordinates.worldZup.center.y },
|
|
1125
|
+
{ axis: 'Z', value: entityCoordinates.worldZup.center.z },
|
|
1126
|
+
]}
|
|
1127
|
+
primary
|
|
1128
|
+
copyLabel="world"
|
|
1129
|
+
coordCopied={coordCopied}
|
|
1130
|
+
onCopy={copyCoords}
|
|
1131
|
+
/>
|
|
1132
|
+
<CoordRow
|
|
1133
|
+
label="Local"
|
|
1134
|
+
values={[
|
|
1135
|
+
{ axis: 'X', value: entityCoordinates.local.center.x },
|
|
1136
|
+
{ axis: 'Y', value: entityCoordinates.local.center.y },
|
|
1137
|
+
{ axis: 'Z', value: entityCoordinates.local.center.z },
|
|
1138
|
+
]}
|
|
1139
|
+
copyLabel="local"
|
|
1140
|
+
coordCopied={coordCopied}
|
|
1141
|
+
onCopy={copyCoords}
|
|
1142
|
+
/>
|
|
1143
|
+
<div className="flex items-start gap-1.5">
|
|
1144
|
+
<span className="text-[9px] font-medium text-muted-foreground/50 uppercase tracking-wider w-[34px] shrink-0 pt-px">Size</span>
|
|
1145
|
+
<span className="font-mono text-[10px] text-muted-foreground/50 tabular-nums">
|
|
1146
|
+
{(entityCoordinates.local.max.x - entityCoordinates.local.min.x).toFixed(2)} x {(entityCoordinates.local.max.y - entityCoordinates.local.min.y).toFixed(2)} x {(entityCoordinates.local.max.z - entityCoordinates.local.min.z).toFixed(2)}
|
|
1147
|
+
</span>
|
|
1148
|
+
</div>
|
|
982
1149
|
</div>
|
|
983
|
-
|
|
1150
|
+
)}
|
|
1151
|
+
<GeoreferencingPanel
|
|
1152
|
+
georef={renderedGeoref}
|
|
1153
|
+
modelId={selectedEntity?.modelId === 'legacy' ? '__legacy__' : (model?.id ?? selectedEntity?.modelId)}
|
|
1154
|
+
enableEditing
|
|
1155
|
+
schemaVersion={activeDataStore?.schemaVersion}
|
|
1156
|
+
coordinateInfo={(model?.geometryResult ?? geometryResult)?.coordinateInfo}
|
|
1157
|
+
geometryResult={model?.geometryResult ?? geometryResult}
|
|
1158
|
+
/>
|
|
984
1159
|
</CollapsibleContent>
|
|
985
1160
|
</Collapsible>
|
|
986
1161
|
)}
|
|
@@ -995,17 +1170,17 @@ export function PropertiesPanel() {
|
|
|
995
1170
|
</div>
|
|
996
1171
|
|
|
997
1172
|
{/* IFC Attributes */}
|
|
998
|
-
{
|
|
1173
|
+
{renderedAttributes.length > 0 && (
|
|
999
1174
|
<Collapsible defaultOpen className="border-b">
|
|
1000
1175
|
<CollapsibleTrigger className="flex items-center gap-2 w-full p-3 hover:bg-muted/50 text-left">
|
|
1001
1176
|
<Tag className="h-4 w-4 text-muted-foreground" />
|
|
1002
1177
|
<span className="font-medium text-sm">Attributes</span>
|
|
1003
1178
|
{editMode && <PenLine className="h-3 w-3 text-purple-500 ml-1" />}
|
|
1004
|
-
<span className="text-xs text-muted-foreground ml-auto">{
|
|
1179
|
+
<span className="text-xs text-muted-foreground ml-auto">{renderedAttributes.length}</span>
|
|
1005
1180
|
</CollapsibleTrigger>
|
|
1006
1181
|
<CollapsibleContent>
|
|
1007
1182
|
<div className="divide-y border-t">
|
|
1008
|
-
{
|
|
1183
|
+
{renderedAttributes.map((attr) => (
|
|
1009
1184
|
<div key={attr.name} className="grid grid-cols-[minmax(80px,1fr)_minmax(0,2fr)] gap-2 px-3 py-1.5 text-sm">
|
|
1010
1185
|
<span className="text-muted-foreground truncate" title={attr.name}>{attr.name}</span>
|
|
1011
1186
|
{editMode && selectedEntity ? (
|
|
@@ -1030,16 +1205,16 @@ export function PropertiesPanel() {
|
|
|
1030
1205
|
)}
|
|
1031
1206
|
|
|
1032
1207
|
{/* Spatial Containment - for spatial containers (Project, Site, Building, Storey) */}
|
|
1033
|
-
{
|
|
1208
|
+
{renderedSpatialContainment && (
|
|
1034
1209
|
<Collapsible defaultOpen className="border-b">
|
|
1035
1210
|
<CollapsibleTrigger className="flex items-center gap-2 w-full p-3 hover:bg-muted/50 text-left">
|
|
1036
1211
|
<Layers className="h-4 w-4 text-emerald-600" />
|
|
1037
1212
|
<span className="font-medium text-sm">Structure</span>
|
|
1038
|
-
<span className="text-xs text-muted-foreground ml-auto">{
|
|
1213
|
+
<span className="text-xs text-muted-foreground ml-auto">{renderedSpatialContainment.length}</span>
|
|
1039
1214
|
</CollapsibleTrigger>
|
|
1040
1215
|
<CollapsibleContent>
|
|
1041
1216
|
<div className="divide-y border-t">
|
|
1042
|
-
{
|
|
1217
|
+
{renderedSpatialContainment.map((item) => (
|
|
1043
1218
|
<div key={item.label} className="grid grid-cols-[minmax(80px,1fr)_minmax(0,2fr)] gap-2 px-3 py-1.5 text-sm">
|
|
1044
1219
|
<span className="text-muted-foreground truncate" title={item.label}>{item.label}</span>
|
|
1045
1220
|
<span className="font-medium font-mono">{item.value}</span>
|
|
@@ -1082,26 +1257,26 @@ export function PropertiesPanel() {
|
|
|
1082
1257
|
<ScrollArea className="flex-1 bg-white dark:bg-black">
|
|
1083
1258
|
<TabsContent value="properties" className="m-0 p-3 overflow-hidden">
|
|
1084
1259
|
{/* Edit toolbar - only shown when edit mode is active */}
|
|
1085
|
-
{editMode && selectedEntity && (
|
|
1260
|
+
{editMode && selectedEntity && !isNativeLazySelection && (
|
|
1086
1261
|
<EditToolbar
|
|
1087
1262
|
modelId={selectedEntity.modelId}
|
|
1088
1263
|
entityId={selectedEntity.expressId}
|
|
1089
1264
|
entityType={entityType}
|
|
1090
|
-
existingPsets={
|
|
1091
|
-
existingQtos={
|
|
1265
|
+
existingPsets={renderedMergedProperties.map(p => p.name)}
|
|
1266
|
+
existingQtos={renderedQuantities.map(q => q.name)}
|
|
1092
1267
|
schemaVersion={activeDataStore?.schemaVersion}
|
|
1093
1268
|
/>
|
|
1094
1269
|
)}
|
|
1095
|
-
{
|
|
1270
|
+
{renderedMergedProperties.length === 0 && renderedClassifications.length === 0 && !renderedMaterialInfo && renderedDocuments.length === 0 ? (
|
|
1096
1271
|
<p className="text-sm text-zinc-500 dark:text-zinc-500 text-center py-8 font-mono">No property sets</p>
|
|
1097
1272
|
) : (
|
|
1098
1273
|
<div className="space-y-3 w-full overflow-hidden">
|
|
1099
1274
|
{/* Occurrence/Type Properties (based on whether entity itself is a type) */}
|
|
1100
|
-
{
|
|
1275
|
+
{renderedOccurrenceProperties.length > 0 && (
|
|
1101
1276
|
<>
|
|
1102
|
-
{(
|
|
1277
|
+
{(renderedIsTypeEntity || (renderedTypeProperties && renderedTypeProperties.psets.length > 0)) && (
|
|
1103
1278
|
<div className="flex items-center gap-2 px-1 pb-0.5 text-[11px] text-zinc-500 dark:text-zinc-400 uppercase tracking-wider font-semibold">
|
|
1104
|
-
{
|
|
1279
|
+
{renderedIsTypeEntity ? (
|
|
1105
1280
|
<>
|
|
1106
1281
|
<Building2 className="h-3 w-3 shrink-0 text-indigo-500" />
|
|
1107
1282
|
Type Properties:
|
|
@@ -1109,83 +1284,83 @@ export function PropertiesPanel() {
|
|
|
1109
1284
|
) : 'Occurrence Properties:'}
|
|
1110
1285
|
</div>
|
|
1111
1286
|
)}
|
|
1112
|
-
{
|
|
1287
|
+
{renderedOccurrenceProperties.map((pset: PropertySet) => (
|
|
1113
1288
|
<PropertySetCard
|
|
1114
1289
|
key={`occ-${pset.name}`}
|
|
1115
1290
|
pset={pset}
|
|
1116
1291
|
modelId={selectedEntity?.modelId}
|
|
1117
1292
|
entityId={selectedEntity?.expressId}
|
|
1118
|
-
enableEditing={editMode}
|
|
1119
|
-
isTypeProperty={
|
|
1120
|
-
typeEditScope={
|
|
1293
|
+
enableEditing={editMode && !isNativeLazySelection}
|
|
1294
|
+
isTypeProperty={renderedIsTypeEntity}
|
|
1295
|
+
typeEditScope={renderedIsTypeEntity ? renderedTypeEditImpact ?? undefined : undefined}
|
|
1121
1296
|
/>
|
|
1122
1297
|
))}
|
|
1123
1298
|
</>
|
|
1124
1299
|
)}
|
|
1125
1300
|
|
|
1126
1301
|
{/* Inherited Type Properties */}
|
|
1127
|
-
{
|
|
1302
|
+
{renderedInheritedTypeProperties.length > 0 && renderedTypeProperties && (
|
|
1128
1303
|
<>
|
|
1129
|
-
{
|
|
1304
|
+
{renderedOccurrenceProperties.length > 0 && (
|
|
1130
1305
|
<div className="border-t border-indigo-200 dark:border-indigo-800/50 pt-2 mt-2" />
|
|
1131
1306
|
)}
|
|
1132
1307
|
<div className="flex items-center gap-2 px-1 pb-0.5 text-[11px] text-indigo-600/70 dark:text-indigo-400/60 uppercase tracking-wider font-semibold">
|
|
1133
1308
|
<Building2 className="h-3 w-3 shrink-0" />
|
|
1134
|
-
<span className="truncate">
|
|
1309
|
+
<span className="truncate">Type Properties ({renderedTypeProperties.typeName})</span>
|
|
1135
1310
|
</div>
|
|
1136
|
-
{
|
|
1311
|
+
{renderedInheritedTypeProperties.map((pset: PropertySet) => (
|
|
1137
1312
|
<PropertySetCard
|
|
1138
1313
|
key={`type-${pset.name}`}
|
|
1139
1314
|
pset={pset}
|
|
1140
1315
|
modelId={selectedEntity?.modelId}
|
|
1141
|
-
entityId={
|
|
1142
|
-
enableEditing={editMode}
|
|
1316
|
+
entityId={renderedTypeProperties.typeId}
|
|
1317
|
+
enableEditing={editMode && !isNativeLazySelection}
|
|
1143
1318
|
isTypeProperty
|
|
1144
|
-
typeEditScope={
|
|
1319
|
+
typeEditScope={renderedTypeEditImpact?.mode === 'inherited' ? renderedTypeEditImpact : undefined}
|
|
1145
1320
|
/>
|
|
1146
1321
|
))}
|
|
1147
1322
|
</>
|
|
1148
1323
|
)}
|
|
1149
1324
|
|
|
1150
1325
|
{/* Classifications */}
|
|
1151
|
-
{
|
|
1326
|
+
{renderedClassifications.length > 0 && (
|
|
1152
1327
|
<>
|
|
1153
|
-
{
|
|
1328
|
+
{renderedMergedProperties.length > 0 && (
|
|
1154
1329
|
<div className="border-t border-zinc-200 dark:border-zinc-800 pt-2 mt-2" />
|
|
1155
1330
|
)}
|
|
1156
|
-
{
|
|
1331
|
+
{renderedClassifications.map((classification, i) => (
|
|
1157
1332
|
<ClassificationCard key={`class-${i}`} classification={classification} />
|
|
1158
1333
|
))}
|
|
1159
1334
|
</>
|
|
1160
1335
|
)}
|
|
1161
1336
|
|
|
1162
1337
|
{/* Materials */}
|
|
1163
|
-
{
|
|
1338
|
+
{renderedMaterialInfo && (
|
|
1164
1339
|
<>
|
|
1165
|
-
{(
|
|
1340
|
+
{(renderedMergedProperties.length > 0 || renderedClassifications.length > 0) && (
|
|
1166
1341
|
<div className="border-t border-zinc-200 dark:border-zinc-800 pt-2 mt-2" />
|
|
1167
1342
|
)}
|
|
1168
|
-
<MaterialCard material={
|
|
1343
|
+
<MaterialCard material={renderedMaterialInfo} />
|
|
1169
1344
|
</>
|
|
1170
1345
|
)}
|
|
1171
1346
|
|
|
1172
1347
|
{/* Documents */}
|
|
1173
|
-
{
|
|
1348
|
+
{renderedDocuments.length > 0 && (
|
|
1174
1349
|
<>
|
|
1175
|
-
{(
|
|
1350
|
+
{(renderedMergedProperties.length > 0 || renderedClassifications.length > 0 || renderedMaterialInfo) && (
|
|
1176
1351
|
<div className="border-t border-zinc-200 dark:border-zinc-800 pt-2 mt-2" />
|
|
1177
1352
|
)}
|
|
1178
|
-
{
|
|
1353
|
+
{renderedDocuments.map((doc, i) => (
|
|
1179
1354
|
<DocumentCard key={`doc-${i}`} document={doc} />
|
|
1180
1355
|
))}
|
|
1181
1356
|
</>
|
|
1182
1357
|
)}
|
|
1183
1358
|
|
|
1184
1359
|
{/* Relationships */}
|
|
1185
|
-
{
|
|
1360
|
+
{renderedEntityRelationships && (
|
|
1186
1361
|
<>
|
|
1187
1362
|
<div className="border-t border-zinc-200 dark:border-zinc-800 pt-2 mt-2" />
|
|
1188
|
-
<RelationshipsCard relationships={
|
|
1363
|
+
<RelationshipsCard relationships={renderedEntityRelationships} />
|
|
1189
1364
|
</>
|
|
1190
1365
|
)}
|
|
1191
1366
|
</div>
|
|
@@ -1193,11 +1368,11 @@ export function PropertiesPanel() {
|
|
|
1193
1368
|
</TabsContent>
|
|
1194
1369
|
|
|
1195
1370
|
<TabsContent value="quantities" className="m-0 p-3 overflow-hidden">
|
|
1196
|
-
{
|
|
1371
|
+
{renderedQuantities.length === 0 ? (
|
|
1197
1372
|
<p className="text-sm text-zinc-500 dark:text-zinc-500 text-center py-8 font-mono">No quantities</p>
|
|
1198
1373
|
) : (
|
|
1199
1374
|
<div className="space-y-3 w-full overflow-hidden">
|
|
1200
|
-
{
|
|
1375
|
+
{renderedQuantities.map((qset: QuantitySet) => (
|
|
1201
1376
|
<QuantitySetCard key={qset.name} qset={qset} />
|
|
1202
1377
|
))}
|
|
1203
1378
|
</div>
|
|
@@ -1210,11 +1385,11 @@ export function PropertiesPanel() {
|
|
|
1210
1385
|
entityType={entityType}
|
|
1211
1386
|
modelId={selectedEntity.modelId}
|
|
1212
1387
|
entityId={selectedEntity.expressId}
|
|
1213
|
-
existingPsets={
|
|
1214
|
-
existingProps={
|
|
1215
|
-
existingQsets={
|
|
1216
|
-
existingQuants={
|
|
1217
|
-
existingAttributes={
|
|
1388
|
+
existingPsets={renderedMergedProperties.map(p => p.name)}
|
|
1389
|
+
existingProps={renderedExistingProps}
|
|
1390
|
+
existingQsets={renderedQuantities.map(q => q.name)}
|
|
1391
|
+
existingQuants={renderedExistingQuants}
|
|
1392
|
+
existingAttributes={renderedExistingAttributeNames}
|
|
1218
1393
|
/>
|
|
1219
1394
|
)}
|
|
1220
1395
|
</TabsContent>
|