@ifc-lite/viewer 1.22.0 → 1.23.0
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 +71 -44
- package/CHANGELOG.md +73 -0
- package/dist/assets/__vite-browser-external-B1O5LaIO.js +1 -0
- package/dist/assets/{arrow-fie-E7fe.js → arrow-CXWhTnNT.js} +1 -1
- package/dist/assets/{basketViewActivator-EHAhHlwN.js → basketViewActivator-Dn_bHUl2.js} +10 -10
- package/dist/assets/{bcf-Bhx-K17f.js → bcf-B9SFl84i.js} +2 -2
- package/dist/assets/browser-DXS29_v9.js +695 -0
- package/dist/assets/{cesium-B4ZIU9jS.js → cesium-BoVuJvTC.js} +5838 -5730
- package/dist/assets/{decode-worker-CYqSjk1n.js → decode-worker-CgM1iNSK.js} +1 -1
- package/dist/assets/deflate-yMpdCIqk.js +1 -0
- package/dist/assets/{drawing-2d-Bjy8YPrg.js → drawing-2d-C71b8Ugx.js} +1 -1
- 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-KTio0Tdm.js → exporters-D-BvrNIg.js} +1361 -1330
- package/dist/assets/ffi-Boa1QuFa.js +1 -0
- package/dist/assets/{geometry-controller.worker-Cm2P_EJr.js → geometry-controller.worker-Cm5pvyR6.js} +2 -2
- package/dist/assets/geometry.worker-ClNvXIrj.js +1 -0
- package/dist/assets/geotiff-D1tvcDCb.js +3354 -0
- package/dist/assets/{ids-CS7VCFin.js → ids-DZLs0snJ.js} +6 -6
- package/dist/assets/{ifc-lite-C6wEhXa6.js → ifc-lite-BDg0iIbj.js} +2 -2
- package/dist/assets/ifc-lite_bg-BIryVCXQ.wasm +0 -0
- package/dist/assets/ifc-lite_bg-DyHX37GQ.wasm +0 -0
- package/dist/assets/{index-8k9h-ANq.js → index-CXSBhkcJ.js} +64181 -52931
- package/dist/assets/index-DMho-JA0.js +6 -0
- package/dist/assets/index-DS_xJQfP.css +1 -0
- package/dist/assets/jpeg-DUMcZp24.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-jj3xI5Y4.js → laz-source-BWjza0Iw.js} +2 -2
- package/dist/assets/{lens-CSASnhAL.js → lens-CpjUdqpw.js} +1 -1
- package/dist/assets/lerc-IN4uWojP.js +1 -0
- package/dist/assets/lzw-Cnw0hH-m.js +1 -0
- package/dist/assets/maplibre-gl-Do6O5tDc.js +800 -0
- package/dist/assets/{native-bridge-DNrEhx2R.js → native-bridge-BVf2uzoH.js} +3 -3
- package/dist/assets/packbits-BskJCwk0.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-BcjkIo89.js → parser.worker-BdtkkaGf.js} +3 -3
- package/dist/assets/raw-DzTtEZIY.js +1 -0
- package/dist/assets/{sandbox-BSn5MyEJ.js → sandbox-VLI_y7cl.js} +1664 -1542
- package/dist/assets/{server-client-D-kU2XAF.js → server-client-BLcKaWQB.js} +4 -4
- package/dist/assets/three-CQBzFWY2.js +4104 -0
- package/dist/assets/wasm-bridge-BAfZh7YT.js +1 -0
- package/dist/assets/webimage-Db2xzze3.js +1 -0
- package/dist/assets/{workerHelpers-pUUnk9Wc.js → workerHelpers--sAYm9yN.js} +1 -1
- package/dist/assets/zstd-BDToOQyD.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 +11 -11
- package/package.json +52 -45
- package/src/components/mcp/McpLanding.tsx +1 -1
- package/src/components/mcp/McpPlayground.tsx +1 -1
- package/src/components/viewer/AddElementPanel.tsx +2 -2
- package/src/components/viewer/BasepointOverlay.tsx +239 -0
- package/src/components/viewer/CesiumOverlay.tsx +15 -59
- package/src/components/viewer/CesiumPlacementEditor.tsx +16 -1
- package/src/components/viewer/CommandPalette.tsx +25 -0
- package/src/components/viewer/GLBExportDialog.tsx +389 -0
- 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 +292 -29
- 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 +88 -17
- package/src/components/viewer/ViewportOverlays.tsx +50 -11
- package/src/components/viewer/chat/ByokKeyModal.tsx +1 -1
- package/src/components/viewer/properties/FederationAlignmentControls.tsx +180 -0
- package/src/components/viewer/properties/GeoreferencingPanel.tsx +6 -0
- 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 +301 -10
- 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 +3 -3
- package/src/lib/geo/cesium-placement.test.ts +28 -12
- package/src/lib/geo/cesium-placement.ts +16 -10
- package/src/lib/geo/effective-georef.test.ts +23 -7
- package/src/lib/geo/geo-scale.ts +58 -2
- 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 +88 -0
- package/src/lib/geo/reproject.ts +168 -36
- 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/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/store/index.ts +7 -0
- package/src/store/slices/cesiumSlice.ts +61 -8
- 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/utils/createBlankIfc.ts +37 -0
- package/tsconfig.json +1 -0
- package/.turbo/turbo-typecheck.log +0 -4
- package/dist/assets/arrow2_bg-BoXCojjR.wasm +0 -0
- package/dist/assets/browser-CVf8ATeW.js +0 -694
- 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-DcFZLAUx.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.worker-DchLBqZ8.js +0 -1
- package/dist/assets/ifc-lite_bg-CSeT3fNI.wasm +0 -0
- package/dist/assets/ifc-lite_bg-ns4cSnX2.wasm +0 -0
- package/dist/assets/index-BZC2YaOP.css +0 -1
- package/dist/assets/index-HqAIQkr6.js +0 -22
- package/dist/assets/laz-perf-Cvr_Lepg.js +0 -1
- package/dist/assets/maplibre-gl-C4LXKM6c.js +0 -808
- package/dist/assets/three-DwNDHx9-.js +0 -4049
- package/dist/assets/wasm-bridge-Cha08LdC.js +0 -1
- 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/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
package/src/lib/geo/reproject.ts
CHANGED
|
@@ -18,8 +18,9 @@
|
|
|
18
18
|
import proj4 from 'proj4';
|
|
19
19
|
import type { MapConversion, ProjectedCRS } from '@ifc-lite/parser';
|
|
20
20
|
import type { CoordinateInfo } from '@ifc-lite/geometry';
|
|
21
|
-
import {
|
|
22
|
-
import { getEffectiveHorizontalScale } from './geo-scale';
|
|
21
|
+
import { lookupEpsgByCode } from '@ifc-lite/data';
|
|
22
|
+
import { getEffectiveHorizontalScale, resolveMapUnitToMetreScale } from './geo-scale';
|
|
23
|
+
import { resolvePrecisionDef } from './precision-grids';
|
|
23
24
|
|
|
24
25
|
export interface LatLon {
|
|
25
26
|
lat: number;
|
|
@@ -29,6 +30,9 @@ export interface LatLon {
|
|
|
29
30
|
// Cache resolved projection definitions (from any source).
|
|
30
31
|
const projDefCache = new Map<string, string | null>();
|
|
31
32
|
const approxDatumWarningCache = new Set<string>();
|
|
33
|
+
// Track datums where the bundled proj4 lacked any datum-shift parameters and we
|
|
34
|
+
// couldn't supply a fallback — surfaced via diagnostics, warned once per datum.
|
|
35
|
+
const unknownDatumWarningCache = new Set<string>();
|
|
32
36
|
|
|
33
37
|
/**
|
|
34
38
|
* Extract EPSG numeric code from a CRS name like "EPSG:32632" or "EPSG 2056".
|
|
@@ -40,9 +44,14 @@ function extractEpsgCode(crs: ProjectedCRS): string | null {
|
|
|
40
44
|
|
|
41
45
|
/**
|
|
42
46
|
* Well-known CRS names that IFC authoring tools set without an EPSG: prefix.
|
|
43
|
-
* Maps normalised name → EPSG code.
|
|
47
|
+
* Maps normalised name → EPSG code. Keys are lowercased before lookup.
|
|
48
|
+
*
|
|
49
|
+
* Authoring tools across regions emit different local conventions for the same
|
|
50
|
+
* national grid; covering the common ones lets ifc-lite resolve a projection
|
|
51
|
+
* for files that omit the "EPSG:" prefix entirely.
|
|
44
52
|
*/
|
|
45
53
|
const WELL_KNOWN_CRS: Record<string, string> = {
|
|
54
|
+
// Global / generic
|
|
46
55
|
'wgs 84': '4326',
|
|
47
56
|
'wgs84': '4326',
|
|
48
57
|
'wgs-84': '4326',
|
|
@@ -51,6 +60,53 @@ const WELL_KNOWN_CRS: Record<string, string> = {
|
|
|
51
60
|
'etrs89': '4258',
|
|
52
61
|
'gcs_wgs_1984': '4326', // ArcGIS / Revit export alias
|
|
53
62
|
'gcs_north_american_1983': '4269',
|
|
63
|
+
|
|
64
|
+
// Netherlands — Rijksdriehoeksmeting (RD New, EPSG:28992)
|
|
65
|
+
'rd': '28992',
|
|
66
|
+
'rd new': '28992',
|
|
67
|
+
'amersfoort / rd new': '28992',
|
|
68
|
+
'amersfoort rd new': '28992',
|
|
69
|
+
'stelsel van de rijksdriehoeksmeting': '28992',
|
|
70
|
+
'rijksdriehoeksmeting': '28992',
|
|
71
|
+
'nl_rd': '28992',
|
|
72
|
+
// RD/NAP compound (horizontal RD + vertical NAP)
|
|
73
|
+
'rd new + nap height': '7415',
|
|
74
|
+
'amersfoort / rd new + nap height': '7415',
|
|
75
|
+
|
|
76
|
+
// United Kingdom — Ordnance Survey GB (BNG, EPSG:27700)
|
|
77
|
+
'osgb 1936 / british national grid': '27700',
|
|
78
|
+
'osgb36 / british national grid': '27700',
|
|
79
|
+
'british national grid': '27700',
|
|
80
|
+
'bng': '27700',
|
|
81
|
+
|
|
82
|
+
// Germany — DHDN / Gauss-Kruger zones + ETRS89 / UTM (most common)
|
|
83
|
+
'dhdn / gauss-kruger zone 2': '31466',
|
|
84
|
+
'dhdn / gauss-kruger zone 3': '31467',
|
|
85
|
+
'dhdn / gauss-kruger zone 4': '31468',
|
|
86
|
+
'dhdn / gauss-kruger zone 5': '31469',
|
|
87
|
+
'etrs89 / utm zone 32n': '25832',
|
|
88
|
+
'etrs89 / utm zone 33n': '25833',
|
|
89
|
+
|
|
90
|
+
// Austria — MGI Lambert / Austrian Grid (EPSG:31287)
|
|
91
|
+
'mgi / austria lambert': '31287',
|
|
92
|
+
'austria lambert': '31287',
|
|
93
|
+
|
|
94
|
+
// Switzerland — CH1903+ / LV95 (EPSG:2056) and legacy LV03 (EPSG:21781)
|
|
95
|
+
'ch1903+ / lv95': '2056',
|
|
96
|
+
'lv95': '2056',
|
|
97
|
+
'ch1903 / lv03': '21781',
|
|
98
|
+
'lv03': '21781',
|
|
99
|
+
|
|
100
|
+
// Belgium — Lambert 2008 (EPSG:3812) and legacy Lambert 72 (EPSG:31370)
|
|
101
|
+
'belge 1972 / belgian lambert 72': '31370',
|
|
102
|
+
'belgian lambert 72': '31370',
|
|
103
|
+
'etrs89 / belgian lambert 2008': '3812',
|
|
104
|
+
|
|
105
|
+
// France — RGF93 / Lambert-93 (EPSG:2154)
|
|
106
|
+
'rgf93 / lambert-93': '2154',
|
|
107
|
+
'rgf93 v1 / lambert-93': '2154',
|
|
108
|
+
'lambert-93': '2154',
|
|
109
|
+
'lambert 93': '2154',
|
|
54
110
|
};
|
|
55
111
|
|
|
56
112
|
/**
|
|
@@ -74,41 +130,92 @@ function utmProj4String(zone: string): string | null {
|
|
|
74
130
|
}
|
|
75
131
|
|
|
76
132
|
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
133
|
+
* Datum-keyed +towgs84 approximations for CRSs whose canonical definition
|
|
134
|
+
* relies on browser-unavailable grid files (NTv2, NADCON, etc.). Each entry
|
|
135
|
+
* is the published Bursa-Wolf 7-parameter set for that specific datum, in
|
|
136
|
+
* the Position Vector convention proj4 expects, with rotations in arc-seconds.
|
|
137
|
+
*
|
|
138
|
+
* Keys are lowercased datum names as they appear in EpsgIndexEntry.datum. A
|
|
139
|
+
* lookup miss is intentional — it forces sanitizeProj4 to emit a diagnostic
|
|
140
|
+
* rather than silently substitute parameters for the wrong region (an earlier
|
|
141
|
+
* version of this table was keyed by ellipsoid alone, which caused every
|
|
142
|
+
* Bessel-1841 CRS — RD/NL, Hermannskogel/AT, S-JTSK/CZ — to inherit Germany's
|
|
143
|
+
* DHDN shift). Accuracy is typically ~1-5 m, sufficient for map display.
|
|
80
144
|
*/
|
|
81
145
|
const DATUM_TOWGS84: Record<string, string> = {
|
|
82
|
-
|
|
83
|
-
'
|
|
84
|
-
|
|
85
|
-
'
|
|
86
|
-
'
|
|
87
|
-
|
|
146
|
+
// United Kingdom — OSGB36 (Airy 1830)
|
|
147
|
+
'osgb 1936': '+towgs84=446.448,-125.157,542.06,0.15,0.247,0.842,-20.489',
|
|
148
|
+
// North America — NAD27 (Clarke 1866)
|
|
149
|
+
'north american datum 1927': '+towgs84=-8,160,176,0,0,0,0',
|
|
150
|
+
'nad27': '+towgs84=-8,160,176,0,0,0,0',
|
|
151
|
+
// NAD83 ≈ WGS84 to within ~1 m; identity is the standard browser approximation.
|
|
152
|
+
'north american datum 1983': '+towgs84=0,0,0,0,0,0,0',
|
|
153
|
+
'nad83': '+towgs84=0,0,0,0,0,0,0',
|
|
154
|
+
// Germany — DHDN (Bessel 1841)
|
|
155
|
+
'deutsches hauptdreiecksnetz': '+towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7',
|
|
156
|
+
'dhdn': '+towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7',
|
|
157
|
+
// Netherlands — Amersfoort (Bessel 1841). The bundled EPSG:28992 already
|
|
158
|
+
// ships with the higher-precision Kadaster +towgs84, so this fires only
|
|
159
|
+
// when a derived/compound CRS lacks it (e.g. some compound RD/NAP cases).
|
|
160
|
+
'amersfoort': '+towgs84=565.4171,50.3319,465.5524,1.9342,-1.6677,9.1019,4.0725',
|
|
161
|
+
// Austria — MGI (Bessel 1841)
|
|
162
|
+
'militar-geographische institut': '+towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232',
|
|
163
|
+
'mgi': '+towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232',
|
|
164
|
+
// Czech Republic — S-JTSK (Bessel 1841)
|
|
165
|
+
'system of the unified trigonometrical cadastral network': '+towgs84=570.8,85.7,462.8,4.998,1.587,5.261,3.56',
|
|
166
|
+
's-jtsk': '+towgs84=570.8,85.7,462.8,4.998,1.587,5.261,3.56',
|
|
167
|
+
// New Zealand — NZGD49 (International 1924)
|
|
168
|
+
'new zealand geodetic datum 1949': '+towgs84=59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993',
|
|
169
|
+
'nzgd49': '+towgs84=59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993',
|
|
170
|
+
// Australia — AGD84 (Australian National Spheroid)
|
|
171
|
+
'australian geodetic datum 1984': '+towgs84=-117.763,-51.51,139.061,0.292,0.443,0.277,-0.191',
|
|
172
|
+
'agd84': '+towgs84=-117.763,-51.51,139.061,0.292,0.443,0.277,-0.191',
|
|
88
173
|
};
|
|
89
174
|
|
|
90
175
|
/**
|
|
91
176
|
* Strip +nadgrids=... from a proj4 string and add a +towgs84 approximation
|
|
92
|
-
*
|
|
177
|
+
* keyed by the datum name from the bundled EPSG index. Grid files cannot be
|
|
178
|
+
* loaded in the browser; +towgs84 is the standard fallback.
|
|
179
|
+
*
|
|
180
|
+
* Skipped (returns input verbatim) when:
|
|
181
|
+
* - No +nadgrids reference (or it's the no-op `@null`)
|
|
182
|
+
* - A +towgs84 is already present (proj4 will honour it)
|
|
93
183
|
*/
|
|
94
|
-
function sanitizeProj4(def: string, code?: string | null): string {
|
|
184
|
+
function sanitizeProj4(def: string, code?: string | null, datumName?: string | null): string {
|
|
95
185
|
if (!def.includes('+nadgrids') || def.includes('+nadgrids=@null')) return def;
|
|
186
|
+
if (/\+towgs84=/.test(def)) {
|
|
187
|
+
// Strip the unusable grid reference but keep the existing datum shift.
|
|
188
|
+
return def.replace(/\+nadgrids=\S+/g, '').replace(/\s+/g, ' ').trim();
|
|
189
|
+
}
|
|
96
190
|
|
|
97
|
-
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
191
|
+
const datumKey = datumName?.trim().toLowerCase() ?? '';
|
|
192
|
+
const towgs84 = datumKey ? DATUM_TOWGS84[datumKey] : undefined;
|
|
193
|
+
|
|
194
|
+
if (!towgs84) {
|
|
195
|
+
if (datumKey && !unknownDatumWarningCache.has(datumKey)) {
|
|
196
|
+
unknownDatumWarningCache.add(datumKey);
|
|
197
|
+
console.warn(
|
|
198
|
+
`[reproject] EPSG:${code ?? '?'} ("${datumName}") needs browser-unavailable `
|
|
199
|
+
+ 'datum grids and has no known +towgs84 fallback for its datum. '
|
|
200
|
+
+ 'Positions will be aligned to the source CRS but may be tens of metres '
|
|
201
|
+
+ 'off relative to WGS84/basemaps. Consider adding the datum to '
|
|
202
|
+
+ 'DATUM_TOWGS84 in apps/viewer/src/lib/geo/reproject.ts.',
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
// Strip the grid reference; let proj4 fall through with no datum shift
|
|
206
|
+
// rather than silently substitute a wrong-region transform.
|
|
207
|
+
return def.replace(/\+nadgrids=\S+/g, '').replace(/\s+/g, ' ').trim();
|
|
208
|
+
}
|
|
101
209
|
|
|
102
210
|
if (code && !approxDatumWarningCache.has(code)) {
|
|
103
211
|
approxDatumWarningCache.add(code);
|
|
104
212
|
console.warn(
|
|
105
213
|
`[reproject] EPSG:${code} requires browser-unavailable datum grids; `
|
|
106
|
-
+
|
|
214
|
+
+ `using approximate +towgs84 for "${datumName}" instead. `
|
|
107
215
|
+ 'Expect metre-level XY differences for some locations.',
|
|
108
216
|
);
|
|
109
217
|
}
|
|
110
218
|
|
|
111
|
-
// Remove +nadgrids=... and add +towgs84
|
|
112
219
|
return def.replace(/\+nadgrids=\S+/g, '').replace(/\s+/g, ' ').trim() + ' ' + towgs84;
|
|
113
220
|
}
|
|
114
221
|
|
|
@@ -134,10 +241,13 @@ async function fetchProj4Def(epsgCode: string): Promise<string | null> {
|
|
|
134
241
|
*
|
|
135
242
|
* Resolution order:
|
|
136
243
|
* 1. Cache hit
|
|
137
|
-
* 2.
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
244
|
+
* 2. Precision grid (NTv2/GeoTIFF) for codes where +towgs84 is too coarse
|
|
245
|
+
* (RD/NL, OSGB/UK, BD72/BE) — fetched once from cdn.proj.org, gives
|
|
246
|
+
* sub-decimeter accuracy. Falls through to (3) if the fetch fails.
|
|
247
|
+
* 3. Bundled EPSG index (7000+ codes with proj4 strings)
|
|
248
|
+
* 4. Well-known CRS name lookup (e.g. "WGS 84" → EPSG:4326)
|
|
249
|
+
* 5. UTM zone heuristic (from CRS metadata — mapZone, name, description, mapProjection)
|
|
250
|
+
* 6. Fetch from epsg.io (network fallback)
|
|
141
251
|
*/
|
|
142
252
|
export async function resolveProjection(crs: ProjectedCRS): Promise<string | null> {
|
|
143
253
|
let code = extractEpsgCode(crs);
|
|
@@ -147,12 +257,29 @@ export async function resolveProjection(crs: ProjectedCRS): Promise<string | nul
|
|
|
147
257
|
return projDefCache.get(code) ?? null;
|
|
148
258
|
}
|
|
149
259
|
|
|
150
|
-
// 2.
|
|
260
|
+
// 2. Precision grid (NTv2/GeoTIFF). For Bessel-based national grids
|
|
261
|
+
// (RD/NL, BD72/BE, OSGB/UK), the +towgs84 approximation that the bundled
|
|
262
|
+
// entries carry is off by 80-200 m. proj4js can consume PROJ's GeoTIFF
|
|
263
|
+
// datum-shift grids — load and register, then use a +nadgrids-based
|
|
264
|
+
// proj4 string for sub-decimeter accuracy.
|
|
265
|
+
if (code) {
|
|
266
|
+
try {
|
|
267
|
+
const precisionDef = await resolvePrecisionDef(code);
|
|
268
|
+
if (precisionDef) {
|
|
269
|
+
projDefCache.set(code, precisionDef);
|
|
270
|
+
return precisionDef;
|
|
271
|
+
}
|
|
272
|
+
} catch (error) {
|
|
273
|
+
console.warn(`[reproject] precision grid resolution failed for EPSG:${code}, falling back`, error);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// 3. Bundled EPSG index (primary source — all 7000+ codes)
|
|
151
278
|
if (code) {
|
|
152
279
|
try {
|
|
153
|
-
const
|
|
154
|
-
if (
|
|
155
|
-
const sanitized = sanitizeProj4(
|
|
280
|
+
const entry = await lookupEpsgByCode(code);
|
|
281
|
+
if (entry?.proj4) {
|
|
282
|
+
const sanitized = sanitizeProj4(entry.proj4, code, entry.datum);
|
|
156
283
|
projDefCache.set(code, sanitized);
|
|
157
284
|
return sanitized;
|
|
158
285
|
}
|
|
@@ -161,7 +288,7 @@ export async function resolveProjection(crs: ProjectedCRS): Promise<string | nul
|
|
|
161
288
|
}
|
|
162
289
|
}
|
|
163
290
|
|
|
164
|
-
// 3. Well-known CRS name → EPSG code (handles "WGS 84", "NAD83", etc.)
|
|
291
|
+
// 3. Well-known CRS name → EPSG code (handles "WGS 84", "NAD83", "RD New", etc.)
|
|
165
292
|
if (!code) {
|
|
166
293
|
const normalised = crs.name?.trim().toLowerCase() ?? '';
|
|
167
294
|
const wellKnownCode = WELL_KNOWN_CRS[normalised];
|
|
@@ -171,9 +298,9 @@ export async function resolveProjection(crs: ProjectedCRS): Promise<string | nul
|
|
|
171
298
|
return projDefCache.get(code) ?? null;
|
|
172
299
|
}
|
|
173
300
|
try {
|
|
174
|
-
const
|
|
175
|
-
if (
|
|
176
|
-
const sanitized = sanitizeProj4(
|
|
301
|
+
const entry = await lookupEpsgByCode(code);
|
|
302
|
+
if (entry?.proj4) {
|
|
303
|
+
const sanitized = sanitizeProj4(entry.proj4, code, entry.datum);
|
|
177
304
|
projDefCache.set(code, sanitized);
|
|
178
305
|
// For geographic CRS (longlat), check if we can infer a projected CRS
|
|
179
306
|
// from the UTM zone metadata — a projected CRS is much more useful.
|
|
@@ -215,7 +342,12 @@ export async function resolveProjection(crs: ProjectedCRS): Promise<string | nul
|
|
|
215
342
|
// 5. Network fallback — fetch from epsg.io
|
|
216
343
|
if (code) {
|
|
217
344
|
const raw = await fetchProj4Def(code);
|
|
218
|
-
|
|
345
|
+
// We don't have a bundled EpsgIndexEntry here (otherwise we'd have hit
|
|
346
|
+
// step 2), so fall back to parsing the datum name out of the proj4
|
|
347
|
+
// string itself when possible. `+datum=` is rare in modern proj4 output;
|
|
348
|
+
// the typical hint is `+ellps=` which we already accept as a weak signal
|
|
349
|
+
// inside DATUM_TOWGS84 keys above.
|
|
350
|
+
const fetched = raw ? sanitizeProj4(raw, code, null) : null;
|
|
219
351
|
projDefCache.set(code, fetched);
|
|
220
352
|
return fetched;
|
|
221
353
|
}
|
|
@@ -295,7 +427,7 @@ export async function reprojectToLatLon(
|
|
|
295
427
|
|
|
296
428
|
// MapConversion values use the unit from IfcProjectedCRS.MapUnit. If MapUnit
|
|
297
429
|
// is not specified, the IFC spec defaults to the project's length unit.
|
|
298
|
-
const mapScale = crs.mapUnitScale
|
|
430
|
+
const mapScale = resolveMapUnitToMetreScale(crs.mapUnitScale, lengthUnitScale);
|
|
299
431
|
const { easting, northing } = computeProjectedCenter(conversion, coordinateInfo, mapScale, lengthUnitScale);
|
|
300
432
|
|
|
301
433
|
try {
|
|
@@ -369,7 +501,7 @@ export async function reprojectFromLatLon(
|
|
|
369
501
|
|
|
370
502
|
// Convert projected metres back to MapConversion's unit.
|
|
371
503
|
// Geometry offsets (ifcX/Y) are already in metres.
|
|
372
|
-
const mapScale = crs.mapUnitScale
|
|
504
|
+
const mapScale = resolveMapUnitToMetreScale(crs.mapUnitScale, lengthUnitScale);
|
|
373
505
|
const invScale = mapScale !== 0 ? 1 / mapScale : 1;
|
|
374
506
|
const { ifcX, ifcY } = computeModelCenterInIfcMeters(coordinateInfo);
|
|
375
507
|
// Effective horizontal scale for metre-converted geometry — see issue #595.
|
|
@@ -419,7 +551,7 @@ export async function computeFootprintGeoJSON(
|
|
|
419
551
|
}
|
|
420
552
|
|
|
421
553
|
// Effective horizontal scale for metre-converted geometry — see issue #595.
|
|
422
|
-
const mapScale = crs.mapUnitScale
|
|
554
|
+
const mapScale = resolveMapUnitToMetreScale(crs.mapUnitScale, lengthUnitScale);
|
|
423
555
|
const scale = getEffectiveHorizontalScale(conversion.scale, mapScale, lengthUnitScale);
|
|
424
556
|
const abscissa = conversion.xAxisAbscissa ?? 1.0;
|
|
425
557
|
const ordinate = conversion.xAxisOrdinate ?? 0.0;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
|
|
5
|
+
import { describe, it } from 'node:test';
|
|
6
|
+
import assert from 'node:assert';
|
|
7
|
+
import {
|
|
8
|
+
computeStoreyOffsets,
|
|
9
|
+
diffStoreyOffsets,
|
|
10
|
+
entitiesInStorey,
|
|
11
|
+
buildEntityTranslations,
|
|
12
|
+
} from './level-offsets.js';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Build a stub IfcDataStore with just the spatialHierarchy bits
|
|
16
|
+
* the offset helpers read. Other fields are typed as `unknown` so
|
|
17
|
+
* the cast doesn't pollute production code with test shims.
|
|
18
|
+
*/
|
|
19
|
+
function makeStore(
|
|
20
|
+
storeyElevations: Map<number, number>,
|
|
21
|
+
elementToStorey?: Map<number, number>,
|
|
22
|
+
): Parameters<typeof computeStoreyOffsets>[0] {
|
|
23
|
+
return {
|
|
24
|
+
spatialHierarchy: {
|
|
25
|
+
storeyElevations,
|
|
26
|
+
elementToStorey: elementToStorey ?? new Map(),
|
|
27
|
+
},
|
|
28
|
+
} as unknown as Parameters<typeof computeStoreyOffsets>[0];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
describe('level-offsets', () => {
|
|
32
|
+
describe('computeStoreyOffsets', () => {
|
|
33
|
+
it('returns empty for a missing data store', () => {
|
|
34
|
+
assert.strictEqual(computeStoreyOffsets(undefined, 4).size, 0);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('returns empty when gap is zero', () => {
|
|
38
|
+
const store = makeStore(new Map([[1, 0], [2, 3]]));
|
|
39
|
+
assert.strictEqual(computeStoreyOffsets(store, 0).size, 0);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('lifts higher storeys to index * gap', () => {
|
|
43
|
+
// Three storeys at elevations 0, 3, 6; with gap=5 they
|
|
44
|
+
// should land at 0, 5, 10 (offsets 0, +2, +4).
|
|
45
|
+
const store = makeStore(new Map([[10, 0], [20, 3], [30, 6]]));
|
|
46
|
+
const offsets = computeStoreyOffsets(store, 5);
|
|
47
|
+
assert.strictEqual(offsets.get(10), undefined); // zero — omitted
|
|
48
|
+
assert.strictEqual(offsets.get(20), 2);
|
|
49
|
+
assert.strictEqual(offsets.get(30), 4);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('handles basement-style negative elevations', () => {
|
|
53
|
+
// Storeys at -3, 0, 3 with gap=4 → indices 0,1,2 → targets
|
|
54
|
+
// -3, 1, 5. Offsets 0, +1, +2.
|
|
55
|
+
const store = makeStore(new Map([[1, -3], [2, 0], [3, 3]]));
|
|
56
|
+
const offsets = computeStoreyOffsets(store, 4);
|
|
57
|
+
assert.strictEqual(offsets.get(1), undefined);
|
|
58
|
+
assert.strictEqual(offsets.get(2), 1);
|
|
59
|
+
assert.strictEqual(offsets.get(3), 2);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('preserves elevation ordering with equal gaps', () => {
|
|
63
|
+
// Storeys with non-uniform original spacing should still
|
|
64
|
+
// become uniformly spaced under Exploded.
|
|
65
|
+
const store = makeStore(new Map([[1, 0], [2, 4], [3, 5], [4, 12]]));
|
|
66
|
+
const offsets = computeStoreyOffsets(store, 3);
|
|
67
|
+
// Targets: 0, 3, 6, 9. Deltas: 0, -1, +1, -3.
|
|
68
|
+
assert.strictEqual(offsets.get(1), undefined);
|
|
69
|
+
assert.strictEqual(offsets.get(2), -1);
|
|
70
|
+
assert.strictEqual(offsets.get(3), 1);
|
|
71
|
+
assert.strictEqual(offsets.get(4), -3);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
describe('diffStoreyOffsets', () => {
|
|
76
|
+
it('returns the per-storey delta between target and previous', () => {
|
|
77
|
+
const target = new Map([[1, 2], [2, 5]]);
|
|
78
|
+
const previous = new Map([[1, 1], [2, 6]]);
|
|
79
|
+
const diff = diffStoreyOffsets(target, previous);
|
|
80
|
+
assert.strictEqual(diff.get(1), 1); // 2 - 1
|
|
81
|
+
assert.strictEqual(diff.get(2), -1); // 5 - 6
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('treats missing target as revert to zero', () => {
|
|
85
|
+
const target = new Map<number, number>();
|
|
86
|
+
const previous = new Map([[1, 3], [2, 4]]);
|
|
87
|
+
const diff = diffStoreyOffsets(target, previous);
|
|
88
|
+
assert.strictEqual(diff.get(1), -3);
|
|
89
|
+
assert.strictEqual(diff.get(2), -4);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('treats new target with no previous as full lift', () => {
|
|
93
|
+
const target = new Map([[1, 5]]);
|
|
94
|
+
const previous = new Map<number, number>();
|
|
95
|
+
const diff = diffStoreyOffsets(target, previous);
|
|
96
|
+
assert.strictEqual(diff.get(1), 5);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('omits zero-delta entries', () => {
|
|
100
|
+
const target = new Map([[1, 3]]);
|
|
101
|
+
const previous = new Map([[1, 3]]);
|
|
102
|
+
const diff = diffStoreyOffsets(target, previous);
|
|
103
|
+
assert.strictEqual(diff.size, 0);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
describe('entitiesInStorey', () => {
|
|
108
|
+
it('returns globalIds of every entity in the storey', () => {
|
|
109
|
+
const store = makeStore(
|
|
110
|
+
new Map(),
|
|
111
|
+
new Map([
|
|
112
|
+
[100, 1],
|
|
113
|
+
[101, 1],
|
|
114
|
+
[200, 2],
|
|
115
|
+
]),
|
|
116
|
+
);
|
|
117
|
+
const ids = entitiesInStorey(store, 1, (id) => id + 10000);
|
|
118
|
+
ids.sort();
|
|
119
|
+
assert.deepStrictEqual(ids, [10100, 10101]);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('returns empty when the storey has no children', () => {
|
|
123
|
+
const store = makeStore(new Map(), new Map([[100, 2]]));
|
|
124
|
+
assert.deepStrictEqual(entitiesInStorey(store, 1, (id) => id), []);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
describe('buildEntityTranslations', () => {
|
|
129
|
+
it('emits per-entity Y deltas for every entity in an offset-bearing storey', () => {
|
|
130
|
+
const store = makeStore(
|
|
131
|
+
new Map(),
|
|
132
|
+
new Map([
|
|
133
|
+
[100, 1], // storey 1, dy=2
|
|
134
|
+
[101, 1],
|
|
135
|
+
[200, 2], // storey 2, dy=5
|
|
136
|
+
[300, 3], // storey 3, no offset → skipped
|
|
137
|
+
]),
|
|
138
|
+
);
|
|
139
|
+
const offsets = new Map([[1, 2], [2, 5]]);
|
|
140
|
+
const translations = buildEntityTranslations(store, offsets, (id) => id + 1000);
|
|
141
|
+
assert.deepStrictEqual(translations.get(1100), [0, 2, 0]);
|
|
142
|
+
assert.deepStrictEqual(translations.get(1101), [0, 2, 0]);
|
|
143
|
+
assert.deepStrictEqual(translations.get(1200), [0, 5, 0]);
|
|
144
|
+
assert.strictEqual(translations.get(1300), undefined);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it('omits zero offsets', () => {
|
|
148
|
+
const store = makeStore(new Map(), new Map([[100, 1]]));
|
|
149
|
+
const offsets = new Map([[1, 0]]);
|
|
150
|
+
assert.strictEqual(buildEntityTranslations(store, offsets, (id) => id).size, 0);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
});
|
|
@@ -0,0 +1,140 @@
|
|
|
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
|
+
* Pure offset math for the Exploded level-display mode.
|
|
7
|
+
*
|
|
8
|
+
* Given a model's spatial hierarchy, computes the Y offset (in
|
|
9
|
+
* world / renderer frame) each storey should receive at a given
|
|
10
|
+
* `gap`. Index 0 stays at its native elevation; subsequent
|
|
11
|
+
* storeys (sorted by elevation ascending) lift by
|
|
12
|
+
* `(index - 0) × gap - elevationDelta` so they end up at
|
|
13
|
+
* `index × gap` relative to the lowest storey's Y.
|
|
14
|
+
*
|
|
15
|
+
* The output is `Map<storeyId, deltaY>` — pure data, no
|
|
16
|
+
* side-effects — so callers can:
|
|
17
|
+
*
|
|
18
|
+
* 1. Compute the target offsets
|
|
19
|
+
* 2. Subtract the previously-applied offsets
|
|
20
|
+
* 3. Push the delta into `pendingMeshTranslations`
|
|
21
|
+
*
|
|
22
|
+
* That subtraction is what makes mode toggles + gap changes
|
|
23
|
+
* reversible without re-loading geometry.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
27
|
+
|
|
28
|
+
export type StoreyOffsets = Map<number /* storey express id */, number /* renderer Y offset, m */>;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Compute target offsets for `gap` based on the model's spatial
|
|
32
|
+
* hierarchy. Returns an empty map for models with no storeys, or
|
|
33
|
+
* with `gap = 0` (which is Stacked semantics).
|
|
34
|
+
*
|
|
35
|
+
* IFC convention: storey elevations are in the model's storey-
|
|
36
|
+
* local frame (Z-up). The renderer is Y-up, so an IFC elevation
|
|
37
|
+
* `e` translates to renderer Y `e` (the geometry pipeline already
|
|
38
|
+
* applies the swap when meshes are built).
|
|
39
|
+
*/
|
|
40
|
+
export function computeStoreyOffsets(
|
|
41
|
+
dataStore: IfcDataStore | undefined,
|
|
42
|
+
gap: number,
|
|
43
|
+
): StoreyOffsets {
|
|
44
|
+
if (!dataStore || !Number.isFinite(gap) || gap <= 0) return new Map();
|
|
45
|
+
const elevations = dataStore.spatialHierarchy?.storeyElevations;
|
|
46
|
+
if (!elevations || elevations.size === 0) return new Map();
|
|
47
|
+
|
|
48
|
+
// Sort storeys by elevation ascending so the lowest storey
|
|
49
|
+
// keeps its native Y and everything above lifts.
|
|
50
|
+
const sorted = [...elevations.entries()].sort((a, b) => a[1] - b[1]);
|
|
51
|
+
const baseElevation = sorted[0][1];
|
|
52
|
+
const out: StoreyOffsets = new Map();
|
|
53
|
+
for (let i = 0; i < sorted.length; i++) {
|
|
54
|
+
const [storeyId, elevation] = sorted[i];
|
|
55
|
+
const targetY = baseElevation + i * gap;
|
|
56
|
+
const offset = targetY - elevation;
|
|
57
|
+
if (offset !== 0) out.set(storeyId, offset);
|
|
58
|
+
}
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Diff a target offset map against the previously-applied map.
|
|
64
|
+
* Result: `Map<storeyId, deltaY>` such that
|
|
65
|
+
*
|
|
66
|
+
* newAppliedY = oldAppliedY + delta = targetY
|
|
67
|
+
*
|
|
68
|
+
* Storeys present in `previous` but not `target` get a delta of
|
|
69
|
+
* `-previous[storeyId]` (they're reverting to Stacked). Storeys
|
|
70
|
+
* in `target` but not `previous` get `+target[storeyId]` (they're
|
|
71
|
+
* lifting fresh). Storeys in both get the difference.
|
|
72
|
+
*
|
|
73
|
+
* Zero deltas are omitted so the caller doesn't push no-ops.
|
|
74
|
+
*/
|
|
75
|
+
export function diffStoreyOffsets(
|
|
76
|
+
target: StoreyOffsets,
|
|
77
|
+
previous: StoreyOffsets,
|
|
78
|
+
): StoreyOffsets {
|
|
79
|
+
const out: StoreyOffsets = new Map();
|
|
80
|
+
for (const [storeyId, prev] of previous) {
|
|
81
|
+
const next = target.get(storeyId) ?? 0;
|
|
82
|
+
const delta = next - prev;
|
|
83
|
+
if (delta !== 0) out.set(storeyId, delta);
|
|
84
|
+
}
|
|
85
|
+
for (const [storeyId, next] of target) {
|
|
86
|
+
if (previous.has(storeyId)) continue;
|
|
87
|
+
if (next !== 0) out.set(storeyId, next);
|
|
88
|
+
}
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Resolve every entity in a storey to its globalId for the given
|
|
94
|
+
* model index. Walks `spatialHierarchy.elementToStorey` and
|
|
95
|
+
* filters to entries matching `storeyExpressId`. Returns an empty
|
|
96
|
+
* array when the hierarchy is missing.
|
|
97
|
+
*
|
|
98
|
+
* `toGlobalId` is injected so the helper stays free of
|
|
99
|
+
* FederationRegistry imports (keeps it test-friendly).
|
|
100
|
+
*/
|
|
101
|
+
export function entitiesInStorey(
|
|
102
|
+
dataStore: IfcDataStore | undefined,
|
|
103
|
+
storeyExpressId: number,
|
|
104
|
+
toGlobalId: (localExpressId: number) => number,
|
|
105
|
+
): number[] {
|
|
106
|
+
if (!dataStore) return [];
|
|
107
|
+
const map = dataStore.spatialHierarchy?.elementToStorey;
|
|
108
|
+
if (!map) return [];
|
|
109
|
+
const out: number[] = [];
|
|
110
|
+
for (const [elementId, sid] of map) {
|
|
111
|
+
if (sid !== storeyExpressId) continue;
|
|
112
|
+
out.push(toGlobalId(elementId));
|
|
113
|
+
}
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Build a per-entity-globalId translation map for a model from a
|
|
119
|
+
* storey-offset map. Used by the level-display effect to push
|
|
120
|
+
* into `pendingMeshTranslations`. The translation is along world
|
|
121
|
+
* +Y only (storey lift) so the X/Z components are zero.
|
|
122
|
+
*
|
|
123
|
+
* `toGlobalId` is injected for the same reason as above.
|
|
124
|
+
*/
|
|
125
|
+
export function buildEntityTranslations(
|
|
126
|
+
dataStore: IfcDataStore | undefined,
|
|
127
|
+
offsetsByStorey: StoreyOffsets,
|
|
128
|
+
toGlobalId: (localExpressId: number) => number,
|
|
129
|
+
): Map<number, [number, number, number]> {
|
|
130
|
+
const out = new Map<number, [number, number, number]>();
|
|
131
|
+
if (!dataStore || offsetsByStorey.size === 0) return out;
|
|
132
|
+
const elementToStorey = dataStore.spatialHierarchy?.elementToStorey;
|
|
133
|
+
if (!elementToStorey) return out;
|
|
134
|
+
for (const [elementId, storeyId] of elementToStorey) {
|
|
135
|
+
const dy = offsetsByStorey.get(storeyId);
|
|
136
|
+
if (dy === undefined || dy === 0) continue;
|
|
137
|
+
out.set(toGlobalId(elementId), [0, dy, 0]);
|
|
138
|
+
}
|
|
139
|
+
return out;
|
|
140
|
+
}
|