@ifc-lite/viewer 1.21.0 → 1.22.1
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 +91 -57
- package/CHANGELOG.md +33 -0
- package/dist/assets/__vite-browser-external-B1O5LaIO.js +1 -0
- package/dist/assets/arrow-CXWhTnNT.js +20 -0
- package/dist/assets/ascii-points-source-bTjLVmUX.js +1 -0
- package/dist/assets/{basketViewActivator-Bzw51jhm.js → basketViewActivator--cFpU2Q9.js} +14 -15
- package/dist/assets/bcf-Ba2CjHib.js +281 -0
- package/dist/assets/browser-DXS29_v9.js +695 -0
- package/dist/assets/cesium-BoVuJvTC.js +17850 -0
- package/dist/assets/decode-worker-CgM1iNSK.js +172 -0
- package/dist/assets/deflate-DCLbV4UE.js +1 -0
- package/dist/assets/{drawing-2d-Bjy8YPrg.js → drawing-2d-C71b8Ugx.js} +1 -1
- package/dist/assets/e57-source-CQHxE8n3.js +1 -0
- package/dist/assets/emscripten-module-B1g2L2eS.wasm +0 -0
- package/dist/assets/emscripten-module-DHbYPfAp.wasm +0 -0
- package/dist/assets/emscripten-module-ZrHFMo7O.wasm +0 -0
- package/dist/assets/emscripten-module-uFzwHH0Y.wasm +0 -0
- package/dist/assets/emscripten-module.browser-BLJD5hhE.js +1 -0
- package/dist/assets/{esbuild-Cpd5nU_H.wasm → esbuild-CzsZLPr0.wasm} +0 -0
- package/dist/assets/esbuild-FgU11_Eg.js +1 -0
- package/dist/assets/event-B0kAzHa-.js +1 -0
- package/dist/assets/exporters-Bf6PTtdW.js +5723 -0
- package/dist/assets/ffi-Boa1QuFa.js +1 -0
- package/dist/assets/geometry-controller.worker-CEr00X3X.js +7 -0
- package/dist/assets/geometry.worker-B4VPDkmL.js +1 -0
- package/dist/assets/geotiff-BN4J8Vt9.js +3354 -0
- package/dist/assets/{ids-B7AXEv7h.js → ids-XwxE1tK3.js} +7 -7
- package/dist/assets/ifc-lite-DNzkEkIb.js +7 -0
- package/dist/assets/ifc-lite_bg-1IiJN0Zg.wasm +0 -0
- package/dist/assets/ifc-lite_bg-B_eUD1Wy.wasm +0 -0
- package/dist/assets/index-DMho-JA0.js +6 -0
- package/dist/assets/index-DS_xJQfP.css +1 -0
- package/dist/assets/{index-DVNSvEMh.js → index-j2x5R7fb.js} +86695 -74779
- package/dist/assets/inline-worker-BpBzlmd6.js +1 -0
- package/dist/assets/jpeg-BUTmr0Bp.js +1 -0
- package/dist/assets/las-BW6LIc_j.js +1 -0
- package/dist/assets/las-source-C_IGrgRq.js +1 -0
- package/dist/assets/{laz-perf-DnSyzVYH.wasm → laz-perf-CFJp03W6.wasm} +0 -0
- package/dist/assets/laz-perf-DgUOSLeU.js +1 -0
- package/dist/assets/laz-source-BWjza0Iw.js +125 -0
- package/dist/assets/{lens-CSASnhAL.js → lens-CpjUdqpw.js} +1 -1
- package/dist/assets/lerc-DmzRHXn3.js +1 -0
- package/dist/assets/lzw-CgyIIzii.js +1 -0
- package/dist/assets/maplibre-gl-Do6O5tDc.js +800 -0
- package/dist/assets/{native-bridge-BiD01jI9.js → native-bridge-Q5ACp4QY.js} +6 -9
- package/dist/assets/packbits-C1r4AzHj.js +1 -0
- package/dist/assets/pako.esm-Cram60i4.js +1 -0
- package/dist/assets/parquet_wasm_bg-DcKVfvto.wasm +0 -0
- package/dist/assets/{parser.worker-Bnbrl6gy.js → parser.worker-Cl6XQcXA.js} +2 -2
- package/dist/assets/pcd-source-Ck0UnVDn.js +3 -0
- package/dist/assets/ply-source-C8jjyzxE.js +4 -0
- package/dist/assets/raw-ZqLh7kVQ.js +1 -0
- package/dist/assets/{exporters-u0sz2Upj.js → sandbox-Bju6ZKJK.js} +11869 -7414
- package/dist/assets/{server-client-DP8fMPY9.js → server-client-B8wi3CGx.js} +4 -4
- package/dist/assets/three-CQBzFWY2.js +4104 -0
- package/dist/assets/wasm-bridge-X-mWRA9Z.js +1 -0
- package/dist/assets/webimage-D0MbRMkU.js +1 -0
- package/dist/assets/{workerHelpers-CBbWSJmd.js → workerHelpers-DnNedVRr.js} +1 -1
- package/dist/assets/zip-BJqVbRkU.js +2 -0
- package/dist/assets/zstd-DA4VQ-ji.js +1 -0
- package/dist/cesium/{Workers/chunk-V7QEYVP3.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-236YIEYT.js} +2 -2
- package/dist/cesium/{Workers/chunk-5TJMAQVL.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-2ZYB3DYT.js} +2 -2
- package/dist/cesium/{Workers/chunk-UBOGZS7F.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-4M56RRIL.js} +2 -2
- package/dist/cesium/{Workers/chunk-OCWJRAXS.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-5BC2Q3QW.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-5XHUDY37.js +26 -0
- package/dist/cesium/{Workers/chunk-Z3QF2EHT.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-6WMLAJJP.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-72KUXMWU.js +26 -0
- package/dist/cesium/{Workers/chunk-EQ4YRVWL.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-7NQYTTAU.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-A35GG5WJ.js +26 -0
- package/dist/cesium/{Workers/chunk-FC4ZZ65J.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-AXNBHUAG.js} +2 -2
- package/dist/cesium/{Workers/chunk-BTSYJ5XU.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-DC3K7YTH.js} +2 -2
- package/dist/cesium/{Workers/chunk-SLT4J352.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-DRBPXGI7.js} +2 -2
- package/dist/cesium/{Workers/chunk-2MJIIVP4.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EARRZPMO.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EHC3BDVP.js +26 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EYZUSGKM.js +26 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EZSKHVA2.js +26 -0
- package/dist/cesium/{Workers/chunk-ICALLYLG.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-F3WJIFOO.js} +2 -2
- package/dist/cesium/{Workers/chunk-LSLE2RL4.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-FB7UV5BI.js} +2 -2
- package/dist/cesium/{Workers/chunk-CUUSNIVQ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-FC6IYMYF.js} +2 -2
- package/dist/cesium/{Workers/chunk-TNSUQXWK.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-GF67PEXE.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-GXEQRH2R.js +26 -0
- package/dist/cesium/{Workers/chunk-M4HLDBCG.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-I5NKQIWE.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IH7GXIUB.js +26 -0
- package/dist/cesium/{Workers/chunk-OIT7J4IC.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IPP3UFGH.js} +2 -2
- package/dist/cesium/{Workers/chunk-WWWZVEEH.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IYRGNBSH.js} +2 -2
- package/dist/cesium/{Workers/chunk-WPMZLB3Y.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-J6BM74AD.js} +2 -2
- package/dist/cesium/{Workers/chunk-QFM5DCMQ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-KG2GJUJT.js} +1 -1
- package/dist/cesium/{Workers/chunk-XQHLGIO7.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-L7UE5MMF.js} +2 -2
- package/dist/cesium/{Workers/chunk-EFBN7QNX.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LBZ34MHQ.js} +2 -2
- package/dist/cesium/{Workers/chunk-YP7I5QBZ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LOQDTQMX.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LYLRYC4L.js +29 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-MGPRMLLW.js +26 -0
- package/dist/cesium/{Workers/chunk-LI2ZSORM.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-NP26LKQA.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-OMUAZ3NM.js +26 -0
- package/dist/cesium/{Workers/chunk-S44JILQT.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PPFUDJN4.js} +2 -2
- package/dist/cesium/{Workers/chunk-EDVBB7SS.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PQ3V63XF.js} +2 -2
- package/dist/cesium/{Workers/chunk-Q5BPHJQF.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PWBQN4GK.js} +2 -2
- package/dist/cesium/{Workers/chunk-E7KYDCM5.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-QOTMLO2T.js} +2 -2
- package/dist/cesium/{Workers/chunk-XUSCFAVF.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-SP35IT73.js} +2 -2
- package/dist/cesium/{Workers/chunk-6BD4U3VO.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-T3ZGSZKA.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-TM6SYYHO.js +28 -0
- package/dist/cesium/{Workers/chunk-VUKYSU4H.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-TSGIJVWH.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-U3YGOX3C.js +63 -0
- package/dist/cesium/{Workers/chunk-7TVGLKQF.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VBYOXOSM.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VCOHJNKB.js +26 -0
- package/dist/cesium/{Workers/chunk-WBOV35NL.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VXAZXMUX.js} +2 -2
- package/dist/cesium/{Workers/chunk-IX4VMHEV.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VXCJOT4W.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-WPD3MB6X.js +26 -0
- package/dist/cesium/{Workers/chunk-V3OSTMM6.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-X4D5KUN5.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XEC656IT.js +26 -0
- package/dist/cesium/{Workers/chunk-MJHHSGEH.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XR53QRQS.js} +2 -2
- package/dist/cesium/{Workers/chunk-XFIQ5DEQ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XR7MN4PJ.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XU6O4MRS.js +26 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XZBHEBLF.js +29 -0
- package/dist/cesium/{Workers/chunk-OLZ3FYUM.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-Z2M4BF4E.js} +2 -2
- package/dist/cesium/{Workers/chunk-2ZBHLJST.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-Z4ERBZFB.js} +2 -2
- package/dist/cesium/{Workers/chunk-W37FE5GR.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-ZY2KCIWI.js} +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/combineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createBoxGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createBoxOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCircleGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCircleOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCoplanarPolygonGeometry.js +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCorridorGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCorridorOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCylinderGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCylinderOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipseGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipseOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipsoidGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipsoidOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createFrustumGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createFrustumOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createGeometry.js +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/createGroundPolylineGeometry.js +26 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPlaneGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPlaneOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolygonGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolygonOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolylineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolylineVolumeGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolylineVolumeOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createRectangleGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createRectangleOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createSimplePolylineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createSphereGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createSphereOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createTaskProcessorWorker.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTileClampedPolylines.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTileGeometries.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTilePoints.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTilePolygons.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTilePolylines.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromCesium3DTilesTerrain.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromGoogleEarthEnterpriseBuffer.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromHeightmap.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromQuantizedTerrainMesh.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createWallGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createWallOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/decodeDraco.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/decodeGoogleEarthEnterprisePacket.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/decodeI3S.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/gaussianSplatSorter.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/gaussianSplatTextureGenerator.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/incrementallyBuildTerrainPicker.js +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/transcodeKTX2.js +56 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/transferTypedArrayTest.js +1 -1
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/upsampleVerticesFromCesium3DTilesTerrain.js +2 -2
- package/dist/index.html +12 -14
- package/package.json +52 -45
- package/src/components/mcp/McpLanding.tsx +1 -1
- package/src/components/mcp/McpPlayground.tsx +1 -1
- package/src/components/mcp/PlaygroundChat.tsx +90 -52
- package/src/components/viewer/AddElementPanel.tsx +2 -2
- package/src/components/viewer/BasepointOverlay.tsx +239 -0
- package/src/components/viewer/CesiumOverlay.tsx +130 -115
- package/src/components/viewer/CesiumPlacementEditor.tsx +1024 -0
- package/src/components/viewer/ChatPanel.tsx +76 -93
- package/src/components/viewer/CommandPalette.tsx +25 -0
- package/src/components/viewer/EntityContextMenu.tsx +68 -10
- package/src/components/viewer/GeometryAxisRow.tsx +54 -0
- package/src/components/viewer/GeometryEditCard.tsx +392 -0
- package/src/components/viewer/HierarchyPanel.tsx +2 -2
- package/src/components/viewer/IDSAuditSummary.tsx +2 -2
- package/src/components/viewer/KeyboardShortcutsDialog.tsx +58 -4
- package/src/components/viewer/MainToolbar.tsx +308 -7
- package/src/components/viewer/PropertiesPanel.tsx +28 -31
- package/src/components/viewer/StatusBar.tsx +12 -0
- package/src/components/viewer/ToolOverlays.tsx +36 -0
- package/src/components/viewer/ViewerLayout.tsx +27 -0
- package/src/components/viewer/Viewport.tsx +49 -4
- package/src/components/viewer/ViewportContainer.tsx +158 -33
- package/src/components/viewer/ViewportOverlays.tsx +49 -106
- package/src/components/viewer/chat/ByokKeyModal.tsx +338 -0
- package/src/components/viewer/chat/ByokStreamingPill.tsx +62 -0
- package/src/components/viewer/chat/ByokTrustDiagram.tsx +192 -0
- package/src/components/viewer/properties/FederationAlignmentControls.tsx +180 -0
- package/src/components/viewer/properties/GeoreferencingPanel.tsx +55 -52
- package/src/components/viewer/properties/ModelMetadataPanel.tsx +55 -44
- package/src/components/viewer/properties/PrecisionGridBadge.tsx +125 -0
- package/src/components/viewer/properties/raw-step-format.ts +5 -3
- package/src/components/viewer/selectionHandlers.ts +308 -11
- package/src/components/viewer/tools/GizmoOverlay.tsx +322 -0
- package/src/components/viewer/tools/SplitNumericInput.tsx +225 -0
- package/src/components/viewer/tools/SplitOverlay.tsx +242 -0
- package/src/components/viewer/tools/WallEndpointOverlay.tsx +252 -0
- package/src/components/viewer/useGeometryStreaming.ts +100 -1
- package/src/components/viewer/useMouseControls.ts +8 -1
- package/src/hooks/useBCF.ts +6 -6
- package/src/hooks/useCameraTickSubscription.ts +62 -0
- package/src/hooks/useIfc.ts +4 -0
- package/src/hooks/useIfcFederation.ts +368 -20
- package/src/hooks/useKeyboardShortcuts.ts +86 -0
- package/src/hooks/useLevelDisplayEffect.ts +160 -0
- package/src/hooks/useViewerSelectors.ts +8 -0
- package/src/lib/__test__/stubs.ts +110 -0
- package/src/lib/geo/cesium-bridge.ts +86 -50
- package/src/lib/geo/cesium-placement.test.ts +260 -0
- package/src/lib/geo/cesium-placement.ts +237 -0
- package/src/lib/geo/effective-georef.test.ts +97 -8
- package/src/lib/geo/effective-georef.ts +40 -93
- package/src/lib/geo/geo-scale.ts +160 -0
- package/src/lib/geo/ifc-origin.test.ts +176 -0
- package/src/lib/geo/ifc-origin.ts +144 -0
- package/src/lib/geo/precision-grids.ts +444 -0
- package/src/lib/geo/reproject.test.ts +218 -0
- package/src/lib/geo/reproject.ts +199 -42
- package/src/lib/geo/terrain-elevation.ts +198 -89
- package/src/lib/lens/adapter.ts +52 -6
- package/src/lib/level-offsets.test.ts +153 -0
- package/src/lib/level-offsets.ts +140 -0
- package/src/lib/linear-element-edit.test.ts +220 -0
- package/src/lib/linear-element-edit.ts +327 -0
- package/src/lib/llm/clipboard-detect.test.ts +150 -0
- package/src/lib/llm/clipboard-detect.ts +90 -0
- package/src/lib/llm/models.ts +28 -0
- package/src/lib/llm/stream-direct.ts +16 -4
- package/src/lib/llm/types.ts +8 -0
- package/src/lib/metadata-clone.test.ts +173 -0
- package/src/lib/metadata-clone.ts +124 -0
- package/src/lib/placement-core.ts +340 -0
- package/src/lib/placement-edit.boot.ts +21 -0
- package/src/lib/placement-edit.test.ts +464 -0
- package/src/lib/placement-edit.ts +47 -0
- package/src/lib/polygon-clip.test.ts +193 -0
- package/src/lib/polygon-clip.ts +199 -0
- package/src/lib/slab-edit.test.ts +169 -0
- package/src/lib/slab-edit.ts +312 -0
- package/src/lib/wall-edit.ts +342 -0
- package/src/lib/wall-opening-reassign.test.ts +291 -0
- package/src/lib/wall-opening-reassign.ts +241 -0
- package/src/main.tsx +4 -0
- package/src/services/playground-model.ts +55 -0
- package/src/store/index.ts +11 -5
- package/src/store/slices/cesiumSlice.ts +154 -20
- package/src/store/slices/dataSlice.ts +80 -0
- package/src/store/slices/levelDisplaySlice.ts +105 -0
- package/src/store/slices/modelSlice.test.ts +19 -0
- package/src/store/slices/mutationSlice.ts +1138 -1
- package/src/store/slices/splitToolSlice.ts +165 -0
- package/src/store/slices/uiSlice.edit-mode.test.ts +210 -0
- package/src/store/slices/uiSlice.ts +78 -1
- package/src/store/types.ts +57 -2
- package/src/store.ts +3 -0
- package/src/utils/createBlankIfc.ts +37 -0
- package/tsconfig.json +1 -0
- package/.turbo/turbo-typecheck.log +0 -4
- package/dist/assets/arrow-CZ5kQ26f.js +0 -20
- package/dist/assets/arrow2_bg-BoXCojjR.wasm +0 -0
- package/dist/assets/bcf-4K724hw0.js +0 -281
- package/dist/assets/browser-C5TFR7sH.js +0 -694
- package/dist/assets/cesium-DUOzBlqv.js +0 -17817
- package/dist/assets/decode-worker-t2EGKAxO.js +0 -1708
- package/dist/assets/emscripten-module-BTRCZGcB.wasm +0 -0
- package/dist/assets/emscripten-module-CGIn_cMh.wasm +0 -0
- package/dist/assets/emscripten-module-DYvzWiHh.wasm +0 -0
- package/dist/assets/emscripten-module-NWak2PoB.wasm +0 -0
- package/dist/assets/emscripten-module.browser-CY5t0Vfq.js +0 -1
- package/dist/assets/esbuild-COv63sf-.js +0 -1
- package/dist/assets/event-DIOks52T.js +0 -1
- package/dist/assets/ffi-DlhRHxHv.js +0 -1
- package/dist/assets/geometry-controller.worker-NH8pZmrU.js +0 -7
- package/dist/assets/geometry.worker-Bp4rW_R1.js +0 -1
- package/dist/assets/ifc-lite-DfZHk36-.js +0 -7
- package/dist/assets/ifc-lite_bg-DlKs5-yM.wasm +0 -0
- package/dist/assets/ifc-lite_bg-PqmRe3Ph.wasm +0 -0
- package/dist/assets/index-CSWgTe1s.css +0 -1
- package/dist/assets/index-XwKzDuw6.js +0 -22
- package/dist/assets/laz-perf-Cvr_Lepg.js +0 -1
- package/dist/assets/maplibre-gl-CGLcoNXc.js +0 -811
- package/dist/assets/sandbox-DPD1ROr0.js +0 -9700
- package/dist/assets/three-CDRZThFA.js +0 -4057
- package/dist/assets/wasm-bridge-CErti6zX.js +0 -1
- package/dist/assets/zip-DBEtpeu6.js +0 -12
- package/dist/cesium/Workers/chunk-23ZQ2IVV.js +0 -29
- package/dist/cesium/Workers/chunk-2EQO3Q56.js +0 -26
- package/dist/cesium/Workers/chunk-2TE5NTVD.js +0 -26
- package/dist/cesium/Workers/chunk-BXMEEOCS.js +0 -63
- package/dist/cesium/Workers/chunk-BYLCY7GP.js +0 -29
- package/dist/cesium/Workers/chunk-CTHM3W6I.js +0 -26
- package/dist/cesium/Workers/chunk-E3JOOS3S.js +0 -26
- package/dist/cesium/Workers/chunk-F6PRE7D6.js +0 -26
- package/dist/cesium/Workers/chunk-FFBVWF2L.js +0 -26
- package/dist/cesium/Workers/chunk-GBAA6GVX.js +0 -26
- package/dist/cesium/Workers/chunk-ILRYTWTP.js +0 -26
- package/dist/cesium/Workers/chunk-IRNLBSEJ.js +0 -26
- package/dist/cesium/Workers/chunk-L6QHHACZ.js +0 -26
- package/dist/cesium/Workers/chunk-NMVKML6W.js +0 -26
- package/dist/cesium/Workers/chunk-OIRKANTH.js +0 -26
- package/dist/cesium/Workers/chunk-QKUIYMGC.js +0 -28
- package/dist/cesium/Workers/chunk-SQMIIXB7.js +0 -26
- package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +0 -26
- package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +0 -26
- package/dist/cesium/Workers/createGroundPolylineGeometry.js +0 -26
- package/dist/cesium/Workers/transcodeKTX2.js +0 -56
- package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +0 -26
- package/src/components/viewer/CesiumSettingsDialog.tsx +0 -100
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_0.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_1.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_10.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_11.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_12.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_13.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_14.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_15.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_16.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_17.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_18.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_19.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_2.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_20.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_21.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_22.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_23.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_24.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_25.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_26.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_27.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_3.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_4.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_5.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_6.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_7.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_8.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_9.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/bing_maps_credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/cesium_credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/google_earth_credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/ion-credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/LensFlare/DirtMask.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/LensFlare/StarBurst.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/0/0/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/0/1/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/0/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/0/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/1/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/1/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/2/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/2/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/3/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/3/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/tilemapresource.xml +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/airfield.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/airport.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/alcohol-shop.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/america-football.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/art-gallery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bakery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bank.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bar.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/baseball.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/basketball.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/beer.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bicycle.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/building.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bus.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cafe.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/camera.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/campsite.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/car.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cemetery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cesium.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/chemist.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cinema.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/circle-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/circle.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/city.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/clothing-store.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/college.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/commercial.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cricket.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cross.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/dam.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/danger.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/disability.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/dog-park.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/embassy.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/emergency-telephone.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/entrance.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/farm.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fast-food.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/ferry.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fire-station.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fuel.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/garden.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/gift.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/golf.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/grocery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/hairdresser.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/harbor.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/heart.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/heliport.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/hospital.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/ice-cream.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/industrial.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/land-use.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/laundry.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/library.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/lighthouse.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/lodging.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/logging.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/london-underground.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/marker-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/marker.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/minefield.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/mobilephone.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/monument.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/museum.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/music.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/oil-well.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/park.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/park2.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/parking-garage.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/parking.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/pharmacy.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/pitch.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/place-of-worship.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/playground.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/police.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/polling-place.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/post.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/prison.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-above.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-light.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-metro.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-underground.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-christian.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-jewish.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-muslim.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/restaurant.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/roadblock.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rocket.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/school.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/scooter.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/shop.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/skiing.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/slaughterhouse.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/soccer.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/square-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/square.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/star-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/star.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/suitcase.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/swimming.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/telephone.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/tennis.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/theatre.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/toilets.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/town-hall.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/town.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/triangle-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/triangle.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/village.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/warehouse.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/waste-basket.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/water.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/wetland.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/zoo.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/moonSmall.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/pin.svg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/waterNormals.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/waterNormalsSmall.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/approximateTerrainHeights.json +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/Workers/package.json +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/Workers/zip-web-worker.js +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/basis_transcoder.wasm +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/draco_decoder.wasm +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/google-earth-dbroot-parser.js +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/wasm_splats_bg.wasm +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/zip-module.wasm +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Animation/Animation.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Animation/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/BaseLayerPicker/BaseLayerPicker.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/BaseLayerPicker/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Cesium3DTilesInspector/Cesium3DTilesInspector.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumInspector/CesiumInspector.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumWidget/CesiumWidget.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumWidget/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/FullscreenButton/FullscreenButton.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Geocoder/Geocoder.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Geocoder/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/azureAerial.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/azureRoads.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingAerial.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingAerialLabels.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingRoads.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/blueMarble.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/earthAtNight.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleContour.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleRoadmap.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleSatellite.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxSatellite.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxStreets.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxTerrain.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/naturalEarthII.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/openStreetMap.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/sentinel-2.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stamenToner.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stamenWatercolor.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/Mouse.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseLeft.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseMiddle.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseRight.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/Touch.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchDrag.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchRotate.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchTilt.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchZoom.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TerrainProviders/Ellipsoid.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TimelineIcons.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/info-loading.gif +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/InfoBox/InfoBox.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/InfoBox/InfoBoxDescription.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/NavigationHelpButton/NavigationHelpButton.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/NavigationHelpButton/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/PerformanceWatchdog/PerformanceWatchdog.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/ProjectionPicker/ProjectionPicker.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/SceneModePicker/SceneModePicker.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/SelectionIndicator/SelectionIndicator.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Timeline/Timeline.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Timeline/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/VRButton/VRButton.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Viewer/Viewer.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/VoxelInspector/VoxelInspector.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/lighterShared.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/shared.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/widgets.css +0 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Federation alignment controls — surfaces per-model alignment status, anchor
|
|
7
|
+
* selection, and an explicit "Re-align federation" action.
|
|
8
|
+
*
|
|
9
|
+
* Lives inside GeoreferencingPanel (one instance per model). When only one
|
|
10
|
+
* model is loaded the controls are hidden — alignment is a federation concept.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
14
|
+
import { Anchor, RefreshCw, AlertTriangle, Check } from 'lucide-react';
|
|
15
|
+
import { useViewerStore } from '@/store';
|
|
16
|
+
import { useIfc } from '@/hooks/useIfc';
|
|
17
|
+
import { toast } from '@/components/ui/toast';
|
|
18
|
+
import { getEffectiveGeoreference } from '@/lib/geo/effective-georef';
|
|
19
|
+
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
20
|
+
import type { FederatedModel } from '@/store/types';
|
|
21
|
+
|
|
22
|
+
export interface FederationAlignmentControlsProps {
|
|
23
|
+
modelId: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function statusLabel(status: FederatedModel['federationAlignmentStatus']): {
|
|
27
|
+
text: string;
|
|
28
|
+
tone: 'anchor' | 'ok' | 'warn' | 'neutral';
|
|
29
|
+
icon: typeof Check;
|
|
30
|
+
} {
|
|
31
|
+
switch (status) {
|
|
32
|
+
case 'anchor':
|
|
33
|
+
return { text: 'Federation anchor', tone: 'anchor', icon: Anchor };
|
|
34
|
+
case 'same-crs':
|
|
35
|
+
return { text: 'Aligned (same CRS)', tone: 'ok', icon: Check };
|
|
36
|
+
case 'reprojected':
|
|
37
|
+
return { text: 'Reprojected to anchor CRS', tone: 'ok', icon: Check };
|
|
38
|
+
case 'identity':
|
|
39
|
+
return { text: 'Aligned (identity)', tone: 'ok', icon: Check };
|
|
40
|
+
case 'failed':
|
|
41
|
+
return { text: 'Alignment failed', tone: 'warn', icon: AlertTriangle };
|
|
42
|
+
case 'none':
|
|
43
|
+
case undefined:
|
|
44
|
+
return { text: 'Not aligned', tone: 'neutral', icon: Anchor };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const toneClasses = {
|
|
49
|
+
anchor: 'border-amber-300 dark:border-amber-700 bg-amber-50 dark:bg-amber-950/40 text-amber-800 dark:text-amber-200',
|
|
50
|
+
ok: 'border-emerald-300 dark:border-emerald-700 bg-emerald-50 dark:bg-emerald-950/40 text-emerald-800 dark:text-emerald-200',
|
|
51
|
+
warn: 'border-red-300 dark:border-red-700 bg-red-50 dark:bg-red-950/40 text-red-800 dark:text-red-200',
|
|
52
|
+
neutral: 'border-zinc-300 dark:border-zinc-700 bg-zinc-50 dark:bg-zinc-900 text-zinc-600 dark:text-zinc-400',
|
|
53
|
+
} as const;
|
|
54
|
+
|
|
55
|
+
export function FederationAlignmentControls({ modelId }: FederationAlignmentControlsProps) {
|
|
56
|
+
const models = useViewerStore((s) => s.models);
|
|
57
|
+
const anchorModelIdOverride = useViewerStore((s) => s.anchorModelIdOverride);
|
|
58
|
+
const setAnchorModelIdOverride = useViewerStore((s) => s.setAnchorModelIdOverride);
|
|
59
|
+
const georefMutations = useViewerStore((s) => s.georefMutations);
|
|
60
|
+
useViewerStore((s) => s.mutationVersion);
|
|
61
|
+
const { realignFederation } = useIfc();
|
|
62
|
+
const [busy, setBusy] = useState(false);
|
|
63
|
+
|
|
64
|
+
// The "effective anchor" matches findReferenceGeorefModel in useIfcFederation:
|
|
65
|
+
// honour the override if it points to a model with a valid (non-site) georef,
|
|
66
|
+
// otherwise pick the earliest-loaded model with one. Federation status alone
|
|
67
|
+
// is not enough — a model can be loaded standalone with status='none' and
|
|
68
|
+
// would otherwise show up as a fake anchor in the badge.
|
|
69
|
+
const hasValidGeoref = useCallback(
|
|
70
|
+
(model: FederatedModel | undefined): boolean => {
|
|
71
|
+
if (!model?.ifcDataStore) return false;
|
|
72
|
+
const eff = getEffectiveGeoreference(
|
|
73
|
+
model.ifcDataStore as IfcDataStore,
|
|
74
|
+
model.geometryResult?.coordinateInfo,
|
|
75
|
+
georefMutations.get(model.id),
|
|
76
|
+
);
|
|
77
|
+
return Boolean(
|
|
78
|
+
eff?.projectedCRS?.name && eff.mapConversion && eff.source !== 'siteLocation',
|
|
79
|
+
);
|
|
80
|
+
},
|
|
81
|
+
[georefMutations],
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
const effectiveAnchorId = useMemo<string | null>(() => {
|
|
85
|
+
if (anchorModelIdOverride && hasValidGeoref(models.get(anchorModelIdOverride))) {
|
|
86
|
+
return anchorModelIdOverride;
|
|
87
|
+
}
|
|
88
|
+
const sorted = Array.from(models.entries()).sort(
|
|
89
|
+
([, a], [, b]) => (a.loadedAt ?? 0) - (b.loadedAt ?? 0),
|
|
90
|
+
);
|
|
91
|
+
for (const [id, model] of sorted) {
|
|
92
|
+
if (hasValidGeoref(model)) return id;
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
}, [models, anchorModelIdOverride, hasValidGeoref]);
|
|
96
|
+
|
|
97
|
+
const thisModel = models.get(modelId);
|
|
98
|
+
if (!thisModel) return null;
|
|
99
|
+
if (models.size < 2) return null;
|
|
100
|
+
|
|
101
|
+
const isAnchor = effectiveAnchorId === modelId;
|
|
102
|
+
const status: FederatedModel['federationAlignmentStatus'] = isAnchor
|
|
103
|
+
? 'anchor'
|
|
104
|
+
: thisModel.federationAlignmentStatus ?? 'none';
|
|
105
|
+
const badge = statusLabel(status);
|
|
106
|
+
const Icon = badge.icon;
|
|
107
|
+
|
|
108
|
+
const handleSetAnchor = useCallback(() => {
|
|
109
|
+
setAnchorModelIdOverride(modelId);
|
|
110
|
+
}, [modelId, setAnchorModelIdOverride]);
|
|
111
|
+
|
|
112
|
+
const handleClearAnchor = useCallback(() => {
|
|
113
|
+
setAnchorModelIdOverride(null);
|
|
114
|
+
}, [setAnchorModelIdOverride]);
|
|
115
|
+
|
|
116
|
+
const handleRealign = useCallback(async () => {
|
|
117
|
+
setBusy(true);
|
|
118
|
+
try {
|
|
119
|
+
await realignFederation();
|
|
120
|
+
} catch (error) {
|
|
121
|
+
// realignFederation's happy path uses toast for per-model status; if
|
|
122
|
+
// the orchestrator itself throws (e.g. proj4 grid loader rejects), the
|
|
123
|
+
// async click handler would otherwise surface an unhandled rejection
|
|
124
|
+
// with no user feedback. Catch + log + toast so the failure mode is
|
|
125
|
+
// visible and the spinner clears.
|
|
126
|
+
console.error('[FederationAlignmentControls] re-align failed:', error);
|
|
127
|
+
toast.error(
|
|
128
|
+
error instanceof Error
|
|
129
|
+
? `Re-align failed: ${error.message}`
|
|
130
|
+
: 'Re-align failed.',
|
|
131
|
+
);
|
|
132
|
+
} finally {
|
|
133
|
+
setBusy(false);
|
|
134
|
+
}
|
|
135
|
+
}, [realignFederation]);
|
|
136
|
+
|
|
137
|
+
return (
|
|
138
|
+
<div className="px-2 py-1.5 border-b border-zinc-100 dark:border-zinc-900">
|
|
139
|
+
<div className="flex items-center gap-2 flex-wrap">
|
|
140
|
+
<div
|
|
141
|
+
className={`inline-flex items-center gap-1 px-1.5 py-0.5 border text-[10px] font-medium ${toneClasses[badge.tone]}`}
|
|
142
|
+
>
|
|
143
|
+
<Icon className="h-2.5 w-2.5" />
|
|
144
|
+
<span>{badge.text}</span>
|
|
145
|
+
</div>
|
|
146
|
+
{!isAnchor && (
|
|
147
|
+
<button
|
|
148
|
+
type="button"
|
|
149
|
+
onClick={handleSetAnchor}
|
|
150
|
+
className="inline-flex items-center gap-1 px-1.5 py-0.5 text-[10px] text-teal-600 dark:text-teal-400 hover:text-teal-800 dark:hover:text-teal-300 border border-teal-300/50 dark:border-teal-700/50 hover:bg-teal-50 dark:hover:bg-teal-950/50 transition-colors"
|
|
151
|
+
title="Use this model as the federation anchor. Click 'Re-align' afterwards to apply."
|
|
152
|
+
>
|
|
153
|
+
<Anchor className="h-2.5 w-2.5" />
|
|
154
|
+
Make anchor
|
|
155
|
+
</button>
|
|
156
|
+
)}
|
|
157
|
+
{isAnchor && anchorModelIdOverride === modelId && (
|
|
158
|
+
<button
|
|
159
|
+
type="button"
|
|
160
|
+
onClick={handleClearAnchor}
|
|
161
|
+
className="inline-flex items-center gap-1 px-1.5 py-0.5 text-[10px] text-zinc-600 dark:text-zinc-400 hover:text-zinc-800 dark:hover:text-zinc-200 border border-zinc-300/50 dark:border-zinc-700/50 hover:bg-zinc-50 dark:hover:bg-zinc-900 transition-colors"
|
|
162
|
+
title="Stop pinning this model as the anchor; revert to the default (earliest-loaded with georef)."
|
|
163
|
+
>
|
|
164
|
+
Unpin
|
|
165
|
+
</button>
|
|
166
|
+
)}
|
|
167
|
+
<button
|
|
168
|
+
type="button"
|
|
169
|
+
onClick={handleRealign}
|
|
170
|
+
disabled={busy}
|
|
171
|
+
className="inline-flex items-center gap-1 px-1.5 py-0.5 text-[10px] text-zinc-700 dark:text-zinc-300 hover:text-zinc-900 dark:hover:text-zinc-100 border border-zinc-300/50 dark:border-zinc-700/50 hover:bg-zinc-50 dark:hover:bg-zinc-900 transition-colors disabled:opacity-50 disabled:cursor-not-allowed ml-auto"
|
|
172
|
+
title="Re-bake every model's geometry against the current anchor."
|
|
173
|
+
>
|
|
174
|
+
<RefreshCw className={`h-2.5 w-2.5 ${busy ? 'animate-spin' : ''}`} />
|
|
175
|
+
Re-align
|
|
176
|
+
</button>
|
|
177
|
+
</div>
|
|
178
|
+
</div>
|
|
179
|
+
);
|
|
180
|
+
}
|
|
@@ -15,9 +15,16 @@ import { computeAngleToGridNorth, type GeoreferenceInfo, type MapConversion, typ
|
|
|
15
15
|
import { useViewerStore } from '@/store';
|
|
16
16
|
import type { CoordinateInfo, GeometryResult } from '@ifc-lite/geometry';
|
|
17
17
|
import { EpsgLookupDialog, type EpsgResult } from './EpsgLookupDialog';
|
|
18
|
+
import { FederationAlignmentControls } from './FederationAlignmentControls';
|
|
19
|
+
import { PrecisionGridBadge } from './PrecisionGridBadge';
|
|
18
20
|
import { LocationMap, type PickedPosition } from './LocationMap';
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
+
import { computeOrthogonalHeightForBaseAltitude } from '@/lib/geo/cesium-placement';
|
|
22
|
+
import {
|
|
23
|
+
detectScaleUnitMismatch,
|
|
24
|
+
mergeMapConversion,
|
|
25
|
+
mergeProjectedCRS,
|
|
26
|
+
supportsStandardGeoreferencing,
|
|
27
|
+
} from '@/lib/geo/effective-georef';
|
|
21
28
|
import { useIfc } from '@/hooks/useIfc';
|
|
22
29
|
import { toast } from '@/components/ui/toast';
|
|
23
30
|
|
|
@@ -335,9 +342,8 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
|
|
|
335
342
|
const setGeorefField = useViewerStore(s => s.setGeorefField);
|
|
336
343
|
const setGeorefFields = useViewerStore(s => s.setGeorefFields);
|
|
337
344
|
const cesiumEnabled = useViewerStore(s => s.cesiumEnabled);
|
|
338
|
-
const terrainClamp = useViewerStore(s => s.cesiumTerrainClamp);
|
|
339
|
-
const setCesiumTerrainClamp = useViewerStore(s => s.setCesiumTerrainClamp);
|
|
340
345
|
const cesiumTerrainHeight = useViewerStore(s => s.cesiumTerrainHeight);
|
|
346
|
+
const cesiumTerrainSource = useViewerStore(s => s.cesiumTerrainSource);
|
|
341
347
|
const cesiumSourceModelId = useViewerStore(s => s.cesiumSourceModelId);
|
|
342
348
|
const models = useViewerStore(s => s.models);
|
|
343
349
|
const loading = useViewerStore(s => s.loading);
|
|
@@ -351,7 +357,8 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
|
|
|
351
357
|
useViewerStore(s => s.mutationVersion);
|
|
352
358
|
|
|
353
359
|
const mutations = modelId ? georefMutations?.get(modelId) : undefined;
|
|
354
|
-
const
|
|
360
|
+
const isLegacySiteGeoreference = georef?.source === 'siteLocation';
|
|
361
|
+
const canUseStandardGeoreferencing = supportsStandardGeoreferencing(schemaVersion, georef);
|
|
355
362
|
|
|
356
363
|
const mergedCRS = useMemo((): ProjectedCRS | undefined => {
|
|
357
364
|
return mergeProjectedCRS(georef?.projectedCRS, mutations?.projectedCRS, lengthUnitScale ?? 1);
|
|
@@ -382,13 +389,6 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
|
|
|
382
389
|
return 'm';
|
|
383
390
|
}, [mergedCRS?.mapUnit]);
|
|
384
391
|
|
|
385
|
-
// Convert meters to map units (Cesium always returns meters)
|
|
386
|
-
const metersToMapUnit = useCallback((meters: number): number => {
|
|
387
|
-
if (mapUnitSuffix === 'ftUS') return meters / 0.3048006096;
|
|
388
|
-
if (mapUnitSuffix === 'ft') return meters / 0.3048;
|
|
389
|
-
return meters; // already meters
|
|
390
|
-
}, [mapUnitSuffix]);
|
|
391
|
-
|
|
392
392
|
/**
|
|
393
393
|
* Given a target world altitude (metres) for the model's ground floor
|
|
394
394
|
* (the storey nearest elevation 0, falling back to bounds.min.y when
|
|
@@ -400,14 +400,14 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
|
|
|
400
400
|
* world position as toggling the clamp.
|
|
401
401
|
*/
|
|
402
402
|
const oHeightForBaseAltitude = useCallback((targetBaseAltitude: number): number => {
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
}, [coordinateInfo,
|
|
403
|
+
return computeOrthogonalHeightForBaseAltitude({
|
|
404
|
+
coordinateInfo,
|
|
405
|
+
projectedCRS: mergedCRS,
|
|
406
|
+
lengthUnitScale: lengthUnitScale ?? 1,
|
|
407
|
+
storeyElevations,
|
|
408
|
+
targetBaseAltitude,
|
|
409
|
+
});
|
|
410
|
+
}, [coordinateInfo, mergedCRS, lengthUnitScale, storeyElevations]);
|
|
411
411
|
|
|
412
412
|
const isMutated = useCallback((entity: 'projectedCRS' | 'mapConversion', field: string): boolean => {
|
|
413
413
|
if (!mutations) return false;
|
|
@@ -467,14 +467,8 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
|
|
|
467
467
|
? mergedCRS?.[field as keyof ProjectedCRS]
|
|
468
468
|
: mergedConversion?.[field as keyof MapConversion];
|
|
469
469
|
setGeorefField(modelId, entity, field, value, oldValue as string | number | undefined);
|
|
470
|
-
// Editing OrthogonalHeight implies "I want this exact altitude" — auto
|
|
471
|
-
// -release the terrain clamp so the new value actually takes effect
|
|
472
|
-
// (with clamp on, placement is locked to terrain regardless of oHeight).
|
|
473
|
-
if (entity === 'mapConversion' && field === 'orthogonalHeight' && terrainClamp) {
|
|
474
|
-
setCesiumTerrainClamp(false);
|
|
475
|
-
}
|
|
476
470
|
requestAlignmentReload();
|
|
477
|
-
}, [modelId, setGeorefField, mergedCRS, mergedConversion, requestAlignmentReload
|
|
471
|
+
}, [modelId, setGeorefField, mergedCRS, mergedConversion, requestAlignmentReload]);
|
|
478
472
|
|
|
479
473
|
// Handle angle edit: compute and set both XAxisAbscissa and XAxisOrdinate
|
|
480
474
|
const handleAngleChange = useCallback((abscissa: number, ordinate: number) => {
|
|
@@ -557,18 +551,7 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
|
|
|
557
551
|
}, [modelId, setGeorefFields, mergedCRS, mergedConversion, mutations, initializeMapConversionDefaults, requestAlignmentReload]);
|
|
558
552
|
|
|
559
553
|
const hasData = mergedCRS || mergedConversion;
|
|
560
|
-
const editable = enableEditing && !!modelId &&
|
|
561
|
-
|
|
562
|
-
if (enableEditing && !supportsStandardGeoreferencing) {
|
|
563
|
-
return (
|
|
564
|
-
<div className="px-2 py-1.5 flex items-center gap-2">
|
|
565
|
-
<Globe className="h-3 w-3 text-zinc-400" />
|
|
566
|
-
<span className="text-[10px] text-zinc-500 dark:text-zinc-400">
|
|
567
|
-
Georeferencing editing requires IFC4 or newer. IFC2X3 does not support IfcProjectedCRS or IfcMapConversion.
|
|
568
|
-
</span>
|
|
569
|
-
</div>
|
|
570
|
-
);
|
|
571
|
-
}
|
|
554
|
+
const editable = enableEditing && !!modelId && canUseStandardGeoreferencing;
|
|
572
555
|
|
|
573
556
|
// When no georef data exists, show "Add Georeferencing" in edit mode
|
|
574
557
|
if (!hasData && !georef?.hasGeoreference) {
|
|
@@ -616,6 +599,24 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
|
|
|
616
599
|
</div>
|
|
617
600
|
</div>
|
|
618
601
|
)}
|
|
602
|
+
{/* Only flag the legacy-site / unsupported-schema state when there is
|
|
603
|
+
actually nothing extractable to show. If we have a projectedCRS or
|
|
604
|
+
mapConversion (even partially), the data sections below speak for
|
|
605
|
+
themselves — the schema notice is just noise that contradicts the
|
|
606
|
+
live data the properties panel already renders. */}
|
|
607
|
+
{!canUseStandardGeoreferencing && !mergedCRS && !mergedConversion && (
|
|
608
|
+
<div className="px-3 py-1.5 flex items-center gap-2 border-b border-zinc-100 dark:border-zinc-900">
|
|
609
|
+
<Globe className="h-3 w-3 text-zinc-400 shrink-0" />
|
|
610
|
+
<span className="text-[10px] text-zinc-500 dark:text-zinc-400">
|
|
611
|
+
{isLegacySiteGeoreference
|
|
612
|
+
? 'Showing legacy IfcSite geolocation from IFC2X3. This view is read-only.'
|
|
613
|
+
: 'Georeferencing editing requires IFC4 or newer. IFC2X3 does not support IfcProjectedCRS or IfcMapConversion.'}
|
|
614
|
+
</span>
|
|
615
|
+
</div>
|
|
616
|
+
)}
|
|
617
|
+
{/* Federation alignment badge + anchor / re-align controls.
|
|
618
|
+
Hidden when only one model is loaded — alignment is a federation concept. */}
|
|
619
|
+
{modelId && models.size > 1 && <FederationAlignmentControls modelId={modelId} />}
|
|
619
620
|
{/* CRS summary — always visible */}
|
|
620
621
|
<div className="px-2 py-1.5 flex items-center gap-2">
|
|
621
622
|
<Globe className="h-3 w-3 text-teal-500 shrink-0" />
|
|
@@ -628,6 +629,7 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
|
|
|
628
629
|
{mergedCRS?.description && (
|
|
629
630
|
<span className="text-[10px] font-mono text-teal-500/60 truncate">{mergedCRS.description}</span>
|
|
630
631
|
)}
|
|
632
|
+
{mergedCRS?.name && <PrecisionGridBadge crsName={mergedCRS.name} />}
|
|
631
633
|
{editable && (
|
|
632
634
|
<EpsgLookupDialog onSelect={handleEpsgSelect}>
|
|
633
635
|
<button className="flex items-center gap-1 text-[9px] text-teal-500 hover:text-teal-700 dark:hover:text-teal-300 transition-colors ml-auto shrink-0">
|
|
@@ -751,28 +753,25 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
|
|
|
751
753
|
</div>
|
|
752
754
|
)}
|
|
753
755
|
|
|
754
|
-
{/*
|
|
756
|
+
{/* Sampled surface height — only when Cesium overlay is active */}
|
|
755
757
|
{cesiumEnabled && isActiveCesiumModel && mergedConversion && (
|
|
756
758
|
<div className="px-3 py-1.5 border-t border-zinc-100 dark:border-zinc-900 space-y-1">
|
|
757
759
|
<div className="flex items-center gap-2">
|
|
758
760
|
<Mountain className="h-3 w-3 text-teal-500 shrink-0" />
|
|
759
|
-
<
|
|
760
|
-
<input
|
|
761
|
-
type="checkbox"
|
|
762
|
-
checked={terrainClamp}
|
|
763
|
-
onChange={(e) => setCesiumTerrainClamp(e.target.checked)}
|
|
764
|
-
className="accent-teal-500 h-3 w-3"
|
|
765
|
-
/>
|
|
766
|
-
<span className="text-[10px] text-zinc-600 dark:text-zinc-400">Clamp to terrain</span>
|
|
767
|
-
</label>
|
|
761
|
+
<span className="text-[10px] text-zinc-600 dark:text-zinc-400 flex-1">Visible surface height</span>
|
|
768
762
|
{cesiumTerrainHeight !== null ? (
|
|
769
|
-
<span className="text-[9px] font-mono text-teal-500">
|
|
763
|
+
<span className="text-[9px] font-mono text-teal-500" title={cesiumTerrainSource ?? undefined}>
|
|
770
764
|
{cesiumTerrainHeight.toFixed(1)} m
|
|
771
765
|
</span>
|
|
772
766
|
) : (
|
|
773
767
|
<span className="text-[9px] font-mono text-zinc-400">querying...</span>
|
|
774
768
|
)}
|
|
775
769
|
</div>
|
|
770
|
+
{cesiumTerrainSource && (
|
|
771
|
+
<div className="ml-5 text-[9px] text-zinc-500 dark:text-zinc-400">
|
|
772
|
+
sampled via {cesiumTerrainSource}
|
|
773
|
+
</div>
|
|
774
|
+
)}
|
|
776
775
|
{cesiumTerrainHeight !== null && editable && modelId && (
|
|
777
776
|
<div className="flex items-center gap-1 ml-5">
|
|
778
777
|
<button
|
|
@@ -780,7 +779,7 @@ export function GeoreferencingPanel({ georef, modelId, enableEditing, schemaVers
|
|
|
780
779
|
className="text-[9px] text-teal-500 hover:text-teal-700 dark:hover:text-teal-300 transition-colors flex items-center gap-0.5"
|
|
781
780
|
>
|
|
782
781
|
<Mountain className="h-2.5 w-2.5" />
|
|
783
|
-
Set OrthogonalHeight to {cesiumTerrainHeight.toFixed(1)} m
|
|
782
|
+
Set OrthogonalHeight to sampled terrain height ({cesiumTerrainHeight.toFixed(1)} m)
|
|
784
783
|
</button>
|
|
785
784
|
</div>
|
|
786
785
|
)}
|
|
@@ -809,6 +808,7 @@ function TerrainHeightButton({ modelId, editable, onApply }: {
|
|
|
809
808
|
}) {
|
|
810
809
|
const cesiumEnabled = useViewerStore(s => s.cesiumEnabled);
|
|
811
810
|
const terrainHeight = useViewerStore(s => s.cesiumTerrainHeight);
|
|
811
|
+
const terrainSource = useViewerStore(s => s.cesiumTerrainSource);
|
|
812
812
|
const sourceModelId = useViewerStore(s => s.cesiumSourceModelId);
|
|
813
813
|
|
|
814
814
|
// Only show when this panel's model is the active Cesium model
|
|
@@ -828,7 +828,10 @@ function TerrainHeightButton({ modelId, editable, onApply }: {
|
|
|
828
828
|
<span>{terrainHeight.toFixed(1)} m</span>
|
|
829
829
|
</button>
|
|
830
830
|
</TooltipTrigger>
|
|
831
|
-
<TooltipContent>
|
|
831
|
+
<TooltipContent>
|
|
832
|
+
Set OrthogonalHeight to sampled terrain height ({terrainHeight.toFixed(1)} m
|
|
833
|
+
{terrainSource ? ` via ${terrainSource}` : ''})
|
|
834
|
+
</TooltipContent>
|
|
832
835
|
</Tooltip>
|
|
833
836
|
);
|
|
834
837
|
}
|
|
@@ -124,7 +124,12 @@ export function ModelMetadataPanel({ model }: { model: FederatedModel }) {
|
|
|
124
124
|
</div>
|
|
125
125
|
</div>
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
{/* `min-h-0` is required: without it `flex-1` falls back to
|
|
128
|
+
min-height:auto and the ScrollArea grows past the panel's
|
|
129
|
+
height instead of constraining the inner viewport, so the map
|
|
130
|
+
(and any tall content underneath) overflowed past the right
|
|
131
|
+
panel's clip box. */}
|
|
132
|
+
<ScrollArea className="flex-1 min-h-0">
|
|
128
133
|
{/* File Information */}
|
|
129
134
|
<div className="border-b border-zinc-200 dark:border-zinc-800">
|
|
130
135
|
<div className="p-3 bg-zinc-50 dark:bg-zinc-900/50">
|
|
@@ -172,49 +177,11 @@ export function ModelMetadataPanel({ model }: { model: FederatedModel }) {
|
|
|
172
177
|
</div>
|
|
173
178
|
)}
|
|
174
179
|
|
|
175
|
-
{/*
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
</h4>
|
|
181
|
-
</div>
|
|
182
|
-
<div className="divide-y divide-zinc-100 dark:divide-zinc-900">
|
|
183
|
-
<div className="flex items-center gap-3 px-3 py-2">
|
|
184
|
-
<Database className="h-3.5 w-3.5 text-zinc-400 shrink-0" />
|
|
185
|
-
<span className="text-xs text-zinc-500">Total Entities</span>
|
|
186
|
-
<span className="text-xs font-mono text-zinc-900 dark:text-zinc-100 ml-auto">
|
|
187
|
-
{dataStore?.entityCount?.toLocaleString() ?? 'N/A'}
|
|
188
|
-
</span>
|
|
189
|
-
</div>
|
|
190
|
-
<div className="flex items-center gap-3 px-3 py-2">
|
|
191
|
-
<Layers className="h-3.5 w-3.5 text-zinc-400 shrink-0" />
|
|
192
|
-
<span className="text-xs text-zinc-500">Building Storeys</span>
|
|
193
|
-
<span className="text-xs font-mono text-zinc-900 dark:text-zinc-100 ml-auto">
|
|
194
|
-
{stats.storeys}
|
|
195
|
-
</span>
|
|
196
|
-
</div>
|
|
197
|
-
<div className="flex items-center gap-3 px-3 py-2">
|
|
198
|
-
<Building2 className="h-3.5 w-3.5 text-zinc-400 shrink-0" />
|
|
199
|
-
<span className="text-xs text-zinc-500">Elements with Geometry</span>
|
|
200
|
-
<span className="text-xs font-mono text-zinc-900 dark:text-zinc-100 ml-auto">
|
|
201
|
-
{stats.elementsWithGeometry.toLocaleString()}
|
|
202
|
-
</span>
|
|
203
|
-
</div>
|
|
204
|
-
<div className="flex items-center gap-3 px-3 py-2">
|
|
205
|
-
<Hash className="h-3.5 w-3.5 text-zinc-400 shrink-0" />
|
|
206
|
-
<span className="text-xs text-zinc-500">Max Express ID</span>
|
|
207
|
-
<span className="text-xs font-mono text-zinc-900 dark:text-zinc-100 ml-auto">
|
|
208
|
-
{model.maxExpressId.toLocaleString()}
|
|
209
|
-
</span>
|
|
210
|
-
</div>
|
|
211
|
-
</div>
|
|
212
|
-
</div>
|
|
213
|
-
|
|
214
|
-
{/* Georeferencing */}
|
|
215
|
-
<GeoreferencingPanel georef={georef} modelId={model.id} enableEditing schemaVersion={model.schemaVersion} coordinateInfo={model.geometryResult?.coordinateInfo} geometryResult={model.geometryResult} lengthUnitScale={unitInfo?.scale} />
|
|
216
|
-
|
|
217
|
-
{/* IfcProject Data */}
|
|
180
|
+
{/* IfcProject Data — placed near the top so the model's name,
|
|
181
|
+
description, and project-level psets are the first thing users
|
|
182
|
+
see after file info. Previously the section was at the bottom
|
|
183
|
+
of the panel (below the map), which buried critical project
|
|
184
|
+
identity below scrollable georeferencing content. */}
|
|
218
185
|
{projectData && (
|
|
219
186
|
<div className="border-b border-zinc-200 dark:border-zinc-800">
|
|
220
187
|
<div className="p-3 bg-zinc-50 dark:bg-zinc-900/50">
|
|
@@ -262,6 +229,50 @@ export function ModelMetadataPanel({ model }: { model: FederatedModel }) {
|
|
|
262
229
|
)}
|
|
263
230
|
</div>
|
|
264
231
|
)}
|
|
232
|
+
|
|
233
|
+
{/* Entity Statistics */}
|
|
234
|
+
<div className="border-b border-zinc-200 dark:border-zinc-800">
|
|
235
|
+
<div className="p-3 bg-zinc-50 dark:bg-zinc-900/50">
|
|
236
|
+
<h4 className="font-bold text-xs uppercase tracking-wide text-zinc-700 dark:text-zinc-300">
|
|
237
|
+
Statistics
|
|
238
|
+
</h4>
|
|
239
|
+
</div>
|
|
240
|
+
<div className="divide-y divide-zinc-100 dark:divide-zinc-900">
|
|
241
|
+
<div className="flex items-center gap-3 px-3 py-2">
|
|
242
|
+
<Database className="h-3.5 w-3.5 text-zinc-400 shrink-0" />
|
|
243
|
+
<span className="text-xs text-zinc-500">Total Entities</span>
|
|
244
|
+
<span className="text-xs font-mono text-zinc-900 dark:text-zinc-100 ml-auto">
|
|
245
|
+
{dataStore?.entityCount?.toLocaleString() ?? 'N/A'}
|
|
246
|
+
</span>
|
|
247
|
+
</div>
|
|
248
|
+
<div className="flex items-center gap-3 px-3 py-2">
|
|
249
|
+
<Layers className="h-3.5 w-3.5 text-zinc-400 shrink-0" />
|
|
250
|
+
<span className="text-xs text-zinc-500">Building Storeys</span>
|
|
251
|
+
<span className="text-xs font-mono text-zinc-900 dark:text-zinc-100 ml-auto">
|
|
252
|
+
{stats.storeys}
|
|
253
|
+
</span>
|
|
254
|
+
</div>
|
|
255
|
+
<div className="flex items-center gap-3 px-3 py-2">
|
|
256
|
+
<Building2 className="h-3.5 w-3.5 text-zinc-400 shrink-0" />
|
|
257
|
+
<span className="text-xs text-zinc-500">Elements with Geometry</span>
|
|
258
|
+
<span className="text-xs font-mono text-zinc-900 dark:text-zinc-100 ml-auto">
|
|
259
|
+
{stats.elementsWithGeometry.toLocaleString()}
|
|
260
|
+
</span>
|
|
261
|
+
</div>
|
|
262
|
+
<div className="flex items-center gap-3 px-3 py-2">
|
|
263
|
+
<Hash className="h-3.5 w-3.5 text-zinc-400 shrink-0" />
|
|
264
|
+
<span className="text-xs text-zinc-500">Max Express ID</span>
|
|
265
|
+
<span className="text-xs font-mono text-zinc-900 dark:text-zinc-100 ml-auto">
|
|
266
|
+
{model.maxExpressId.toLocaleString()}
|
|
267
|
+
</span>
|
|
268
|
+
</div>
|
|
269
|
+
</div>
|
|
270
|
+
</div>
|
|
271
|
+
|
|
272
|
+
{/* Georeferencing — kept at the bottom because it embeds a
|
|
273
|
+
tall location map; placing it earlier would push the
|
|
274
|
+
statistics + project metadata below the fold. */}
|
|
275
|
+
<GeoreferencingPanel georef={georef} modelId={model.id} enableEditing schemaVersion={model.schemaVersion} coordinateInfo={model.geometryResult?.coordinateInfo} geometryResult={model.geometryResult} lengthUnitScale={unitInfo?.scale} />
|
|
265
276
|
</ScrollArea>
|
|
266
277
|
</div>
|
|
267
278
|
);
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Small badge in the GeoreferencingPanel header that tells the user
|
|
7
|
+
* whether their CRS is using a precision NTv2/GeoTIFF datum-shift grid
|
|
8
|
+
* (sub-decimeter accuracy) or the +towgs84 fallback (up to ~120 m error
|
|
9
|
+
* for Bessel-based national grids like RD/NL, OSGB/UK, MGI/AT).
|
|
10
|
+
*
|
|
11
|
+
* Re-checks on a short interval so it flips from "loading" → "loaded"
|
|
12
|
+
* after the grid finishes downloading without forcing the parent to
|
|
13
|
+
* re-render.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { useEffect, useState } from 'react';
|
|
17
|
+
import { CheckCircle2, AlertTriangle, Loader2 } from 'lucide-react';
|
|
18
|
+
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
|
|
19
|
+
import {
|
|
20
|
+
PRECISION_GRIDS,
|
|
21
|
+
hasFailedPrecisionGrid,
|
|
22
|
+
hasLoadedPrecisionGrid,
|
|
23
|
+
} from '@/lib/geo/precision-grids';
|
|
24
|
+
|
|
25
|
+
interface PrecisionGridBadgeProps {
|
|
26
|
+
crsName: string | undefined;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function extractEpsgCode(crsName: string | undefined): string | null {
|
|
30
|
+
if (!crsName) return null;
|
|
31
|
+
const match = crsName.match(/EPSG[:\s]*(\d+)/i);
|
|
32
|
+
return match ? match[1] : null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
type BadgeState = 'loading' | 'loaded' | 'failed';
|
|
36
|
+
|
|
37
|
+
export function PrecisionGridBadge({ crsName }: PrecisionGridBadgeProps) {
|
|
38
|
+
const code = extractEpsgCode(crsName);
|
|
39
|
+
const spec = code ? PRECISION_GRIDS[code] : undefined;
|
|
40
|
+
const [state, setState] = useState<BadgeState>(() => {
|
|
41
|
+
if (!spec) return 'loading';
|
|
42
|
+
if (hasLoadedPrecisionGrid(code!)) return 'loaded';
|
|
43
|
+
if (hasFailedPrecisionGrid(code!)) return 'failed';
|
|
44
|
+
return 'loading';
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (!spec || state !== 'loading') return;
|
|
49
|
+
// Poll every 250ms until the grid loader settles (success or failure).
|
|
50
|
+
// Cheap — PRECISION_GRIDS lookup is O(1) and most CRSs never trigger
|
|
51
|
+
// this path. Stops as soon as the grid resolves or the component
|
|
52
|
+
// unmounts.
|
|
53
|
+
const id = setInterval(() => {
|
|
54
|
+
if (hasLoadedPrecisionGrid(code!)) {
|
|
55
|
+
setState('loaded');
|
|
56
|
+
} else if (hasFailedPrecisionGrid(code!)) {
|
|
57
|
+
setState('failed');
|
|
58
|
+
}
|
|
59
|
+
}, 250);
|
|
60
|
+
return () => clearInterval(id);
|
|
61
|
+
}, [spec, state, code]);
|
|
62
|
+
|
|
63
|
+
// CRS without a registered precision grid — accuracy depends entirely on
|
|
64
|
+
// whether its +towgs84 is good (ETRS89/WGS84-aligned CRSs: yes; old
|
|
65
|
+
// Bessel/Airy national grids: no). Don't show a badge for these.
|
|
66
|
+
if (!spec) return null;
|
|
67
|
+
|
|
68
|
+
if (state === 'loaded') {
|
|
69
|
+
return (
|
|
70
|
+
<Tooltip>
|
|
71
|
+
<TooltipTrigger asChild>
|
|
72
|
+
<span className="inline-flex items-center gap-1 px-1.5 py-0.5 text-[9px] font-medium border border-emerald-300/60 dark:border-emerald-700/60 bg-emerald-50 dark:bg-emerald-950/40 text-emerald-700 dark:text-emerald-300 shrink-0">
|
|
73
|
+
<CheckCircle2 className="h-2.5 w-2.5" />
|
|
74
|
+
grid
|
|
75
|
+
</span>
|
|
76
|
+
</TooltipTrigger>
|
|
77
|
+
<TooltipContent side="bottom" className="text-xs max-w-xs">
|
|
78
|
+
<div>Precision NTv2/GeoTIFF grid loaded for {spec.region}.</div>
|
|
79
|
+
<div className="mt-1 text-[10px] opacity-80">
|
|
80
|
+
Sub-decimeter datum-shift accuracy via{' '}
|
|
81
|
+
<code className="font-mono">{spec.filename}</code>.
|
|
82
|
+
</div>
|
|
83
|
+
</TooltipContent>
|
|
84
|
+
</Tooltip>
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (state === 'failed') {
|
|
89
|
+
return (
|
|
90
|
+
<Tooltip>
|
|
91
|
+
<TooltipTrigger asChild>
|
|
92
|
+
<span className="inline-flex items-center gap-1 px-1.5 py-0.5 text-[9px] font-medium border border-red-300/60 dark:border-red-700/60 bg-red-50 dark:bg-red-950/40 text-red-700 dark:text-red-300 shrink-0">
|
|
93
|
+
<AlertTriangle className="h-2.5 w-2.5" />
|
|
94
|
+
grid failed
|
|
95
|
+
</span>
|
|
96
|
+
</TooltipTrigger>
|
|
97
|
+
<TooltipContent side="bottom" className="text-xs max-w-xs">
|
|
98
|
+
<div>Precision grid fetch failed for {spec.region}.</div>
|
|
99
|
+
<div className="mt-1 text-[10px] opacity-80">
|
|
100
|
+
Falling back to +towgs84 approximation. Check network access to{' '}
|
|
101
|
+
<code className="font-mono">cdn.proj.org</code>.
|
|
102
|
+
</div>
|
|
103
|
+
</TooltipContent>
|
|
104
|
+
</Tooltip>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return (
|
|
109
|
+
<Tooltip>
|
|
110
|
+
<TooltipTrigger asChild>
|
|
111
|
+
<span className="inline-flex items-center gap-1 px-1.5 py-0.5 text-[9px] font-medium border border-amber-300/60 dark:border-amber-700/60 bg-amber-50 dark:bg-amber-950/40 text-amber-700 dark:text-amber-300 shrink-0">
|
|
112
|
+
<Loader2 className="h-2.5 w-2.5 animate-spin" />
|
|
113
|
+
loading grid
|
|
114
|
+
</span>
|
|
115
|
+
</TooltipTrigger>
|
|
116
|
+
<TooltipContent side="bottom" className="text-xs max-w-xs">
|
|
117
|
+
<div>Fetching precision grid for {spec.region}…</div>
|
|
118
|
+
<div className="mt-1 text-[10px] opacity-80">
|
|
119
|
+
Until it arrives, placement uses the +towgs84 approximation (off by
|
|
120
|
+
up to ~120 m for this CRS).
|
|
121
|
+
</div>
|
|
122
|
+
</TooltipContent>
|
|
123
|
+
</Tooltip>
|
|
124
|
+
);
|
|
125
|
+
}
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
import type { IfcAttributeValue } from '@ifc-lite/mutations';
|
|
25
|
+
import { safeUtf8Decode } from '@ifc-lite/data';
|
|
25
26
|
|
|
26
27
|
/**
|
|
27
28
|
* Tokenize the inside of a STEP entity body (`,`-separated arguments)
|
|
@@ -86,9 +87,10 @@ export function extractRawStepTokens(
|
|
|
86
87
|
byteLength: number,
|
|
87
88
|
): string[] | null {
|
|
88
89
|
if (byteLength <= 0) return null;
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
)
|
|
90
|
+
// safeUtf8Decode handles SAB-backed source buffers (the parser
|
|
91
|
+
// keeps `dataStore.source` SAB-backed for zero-copy worker sharing,
|
|
92
|
+
// and Firefox/Chrome reject `TextDecoder.decode()` on SAB views).
|
|
93
|
+
const text = safeUtf8Decode(buffer, byteOffset, byteOffset + byteLength);
|
|
92
94
|
// Match #N=TYPE( ... ) — the trailing `;` is optional in case the
|
|
93
95
|
// ref slice doesn't include it.
|
|
94
96
|
const match = text.match(/^#\d+\s*=\s*[A-Z0-9_]+\(([\s\S]*)\)\s*;?\s*$/i);
|