@ifc-lite/viewer 1.21.0 → 1.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +91 -57
- package/CHANGELOG.md +33 -0
- package/dist/assets/__vite-browser-external-B1O5LaIO.js +1 -0
- package/dist/assets/arrow-CXWhTnNT.js +20 -0
- package/dist/assets/ascii-points-source-bTjLVmUX.js +1 -0
- package/dist/assets/{basketViewActivator-Bzw51jhm.js → basketViewActivator--cFpU2Q9.js} +14 -15
- package/dist/assets/bcf-Ba2CjHib.js +281 -0
- package/dist/assets/browser-DXS29_v9.js +695 -0
- package/dist/assets/cesium-BoVuJvTC.js +17850 -0
- package/dist/assets/decode-worker-CgM1iNSK.js +172 -0
- package/dist/assets/deflate-DCLbV4UE.js +1 -0
- package/dist/assets/{drawing-2d-Bjy8YPrg.js → drawing-2d-C71b8Ugx.js} +1 -1
- package/dist/assets/e57-source-CQHxE8n3.js +1 -0
- package/dist/assets/emscripten-module-B1g2L2eS.wasm +0 -0
- package/dist/assets/emscripten-module-DHbYPfAp.wasm +0 -0
- package/dist/assets/emscripten-module-ZrHFMo7O.wasm +0 -0
- package/dist/assets/emscripten-module-uFzwHH0Y.wasm +0 -0
- package/dist/assets/emscripten-module.browser-BLJD5hhE.js +1 -0
- package/dist/assets/{esbuild-Cpd5nU_H.wasm → esbuild-CzsZLPr0.wasm} +0 -0
- package/dist/assets/esbuild-FgU11_Eg.js +1 -0
- package/dist/assets/event-B0kAzHa-.js +1 -0
- package/dist/assets/exporters-Bf6PTtdW.js +5723 -0
- package/dist/assets/ffi-Boa1QuFa.js +1 -0
- package/dist/assets/geometry-controller.worker-CEr00X3X.js +7 -0
- package/dist/assets/geometry.worker-B4VPDkmL.js +1 -0
- package/dist/assets/geotiff-BN4J8Vt9.js +3354 -0
- package/dist/assets/{ids-B7AXEv7h.js → ids-XwxE1tK3.js} +7 -7
- package/dist/assets/ifc-lite-DNzkEkIb.js +7 -0
- package/dist/assets/ifc-lite_bg-1IiJN0Zg.wasm +0 -0
- package/dist/assets/ifc-lite_bg-B_eUD1Wy.wasm +0 -0
- package/dist/assets/index-DMho-JA0.js +6 -0
- package/dist/assets/index-DS_xJQfP.css +1 -0
- package/dist/assets/{index-DVNSvEMh.js → index-j2x5R7fb.js} +86695 -74779
- package/dist/assets/inline-worker-BpBzlmd6.js +1 -0
- package/dist/assets/jpeg-BUTmr0Bp.js +1 -0
- package/dist/assets/las-BW6LIc_j.js +1 -0
- package/dist/assets/las-source-C_IGrgRq.js +1 -0
- package/dist/assets/{laz-perf-DnSyzVYH.wasm → laz-perf-CFJp03W6.wasm} +0 -0
- package/dist/assets/laz-perf-DgUOSLeU.js +1 -0
- package/dist/assets/laz-source-BWjza0Iw.js +125 -0
- package/dist/assets/{lens-CSASnhAL.js → lens-CpjUdqpw.js} +1 -1
- package/dist/assets/lerc-DmzRHXn3.js +1 -0
- package/dist/assets/lzw-CgyIIzii.js +1 -0
- package/dist/assets/maplibre-gl-Do6O5tDc.js +800 -0
- package/dist/assets/{native-bridge-BiD01jI9.js → native-bridge-Q5ACp4QY.js} +6 -9
- package/dist/assets/packbits-C1r4AzHj.js +1 -0
- package/dist/assets/pako.esm-Cram60i4.js +1 -0
- package/dist/assets/parquet_wasm_bg-DcKVfvto.wasm +0 -0
- package/dist/assets/{parser.worker-Bnbrl6gy.js → parser.worker-Cl6XQcXA.js} +2 -2
- package/dist/assets/pcd-source-Ck0UnVDn.js +3 -0
- package/dist/assets/ply-source-C8jjyzxE.js +4 -0
- package/dist/assets/raw-ZqLh7kVQ.js +1 -0
- package/dist/assets/{exporters-u0sz2Upj.js → sandbox-Bju6ZKJK.js} +11869 -7414
- package/dist/assets/{server-client-DP8fMPY9.js → server-client-B8wi3CGx.js} +4 -4
- package/dist/assets/three-CQBzFWY2.js +4104 -0
- package/dist/assets/wasm-bridge-X-mWRA9Z.js +1 -0
- package/dist/assets/webimage-D0MbRMkU.js +1 -0
- package/dist/assets/{workerHelpers-CBbWSJmd.js → workerHelpers-DnNedVRr.js} +1 -1
- package/dist/assets/zip-BJqVbRkU.js +2 -0
- package/dist/assets/zstd-DA4VQ-ji.js +1 -0
- package/dist/cesium/{Workers/chunk-V7QEYVP3.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-236YIEYT.js} +2 -2
- package/dist/cesium/{Workers/chunk-5TJMAQVL.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-2ZYB3DYT.js} +2 -2
- package/dist/cesium/{Workers/chunk-UBOGZS7F.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-4M56RRIL.js} +2 -2
- package/dist/cesium/{Workers/chunk-OCWJRAXS.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-5BC2Q3QW.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-5XHUDY37.js +26 -0
- package/dist/cesium/{Workers/chunk-Z3QF2EHT.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-6WMLAJJP.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-72KUXMWU.js +26 -0
- package/dist/cesium/{Workers/chunk-EQ4YRVWL.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-7NQYTTAU.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-A35GG5WJ.js +26 -0
- package/dist/cesium/{Workers/chunk-FC4ZZ65J.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-AXNBHUAG.js} +2 -2
- package/dist/cesium/{Workers/chunk-BTSYJ5XU.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-DC3K7YTH.js} +2 -2
- package/dist/cesium/{Workers/chunk-SLT4J352.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-DRBPXGI7.js} +2 -2
- package/dist/cesium/{Workers/chunk-2MJIIVP4.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EARRZPMO.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EHC3BDVP.js +26 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EYZUSGKM.js +26 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EZSKHVA2.js +26 -0
- package/dist/cesium/{Workers/chunk-ICALLYLG.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-F3WJIFOO.js} +2 -2
- package/dist/cesium/{Workers/chunk-LSLE2RL4.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-FB7UV5BI.js} +2 -2
- package/dist/cesium/{Workers/chunk-CUUSNIVQ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-FC6IYMYF.js} +2 -2
- package/dist/cesium/{Workers/chunk-TNSUQXWK.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-GF67PEXE.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-GXEQRH2R.js +26 -0
- package/dist/cesium/{Workers/chunk-M4HLDBCG.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-I5NKQIWE.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IH7GXIUB.js +26 -0
- package/dist/cesium/{Workers/chunk-OIT7J4IC.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IPP3UFGH.js} +2 -2
- package/dist/cesium/{Workers/chunk-WWWZVEEH.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IYRGNBSH.js} +2 -2
- package/dist/cesium/{Workers/chunk-WPMZLB3Y.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-J6BM74AD.js} +2 -2
- package/dist/cesium/{Workers/chunk-QFM5DCMQ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-KG2GJUJT.js} +1 -1
- package/dist/cesium/{Workers/chunk-XQHLGIO7.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-L7UE5MMF.js} +2 -2
- package/dist/cesium/{Workers/chunk-EFBN7QNX.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LBZ34MHQ.js} +2 -2
- package/dist/cesium/{Workers/chunk-YP7I5QBZ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LOQDTQMX.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LYLRYC4L.js +29 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-MGPRMLLW.js +26 -0
- package/dist/cesium/{Workers/chunk-LI2ZSORM.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-NP26LKQA.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-OMUAZ3NM.js +26 -0
- package/dist/cesium/{Workers/chunk-S44JILQT.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PPFUDJN4.js} +2 -2
- package/dist/cesium/{Workers/chunk-EDVBB7SS.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PQ3V63XF.js} +2 -2
- package/dist/cesium/{Workers/chunk-Q5BPHJQF.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PWBQN4GK.js} +2 -2
- package/dist/cesium/{Workers/chunk-E7KYDCM5.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-QOTMLO2T.js} +2 -2
- package/dist/cesium/{Workers/chunk-XUSCFAVF.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-SP35IT73.js} +2 -2
- package/dist/cesium/{Workers/chunk-6BD4U3VO.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-T3ZGSZKA.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-TM6SYYHO.js +28 -0
- package/dist/cesium/{Workers/chunk-VUKYSU4H.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-TSGIJVWH.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-U3YGOX3C.js +63 -0
- package/dist/cesium/{Workers/chunk-7TVGLKQF.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VBYOXOSM.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VCOHJNKB.js +26 -0
- package/dist/cesium/{Workers/chunk-WBOV35NL.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VXAZXMUX.js} +2 -2
- package/dist/cesium/{Workers/chunk-IX4VMHEV.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VXCJOT4W.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-WPD3MB6X.js +26 -0
- package/dist/cesium/{Workers/chunk-V3OSTMM6.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-X4D5KUN5.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XEC656IT.js +26 -0
- package/dist/cesium/{Workers/chunk-MJHHSGEH.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XR53QRQS.js} +2 -2
- package/dist/cesium/{Workers/chunk-XFIQ5DEQ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XR7MN4PJ.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XU6O4MRS.js +26 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XZBHEBLF.js +29 -0
- package/dist/cesium/{Workers/chunk-OLZ3FYUM.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-Z2M4BF4E.js} +2 -2
- package/dist/cesium/{Workers/chunk-2ZBHLJST.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-Z4ERBZFB.js} +2 -2
- package/dist/cesium/{Workers/chunk-W37FE5GR.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-ZY2KCIWI.js} +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/combineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createBoxGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createBoxOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCircleGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCircleOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCoplanarPolygonGeometry.js +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCorridorGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCorridorOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCylinderGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCylinderOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipseGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipseOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipsoidGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipsoidOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createFrustumGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createFrustumOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createGeometry.js +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/createGroundPolylineGeometry.js +26 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPlaneGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPlaneOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolygonGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolygonOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolylineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolylineVolumeGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolylineVolumeOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createRectangleGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createRectangleOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createSimplePolylineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createSphereGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createSphereOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createTaskProcessorWorker.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTileClampedPolylines.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTileGeometries.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTilePoints.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTilePolygons.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTilePolylines.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromCesium3DTilesTerrain.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromGoogleEarthEnterpriseBuffer.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromHeightmap.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromQuantizedTerrainMesh.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createWallGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createWallOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/decodeDraco.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/decodeGoogleEarthEnterprisePacket.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/decodeI3S.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/gaussianSplatSorter.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/gaussianSplatTextureGenerator.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/incrementallyBuildTerrainPicker.js +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/transcodeKTX2.js +56 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/transferTypedArrayTest.js +1 -1
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/upsampleVerticesFromCesium3DTilesTerrain.js +2 -2
- package/dist/index.html +12 -14
- package/package.json +52 -45
- package/src/components/mcp/McpLanding.tsx +1 -1
- package/src/components/mcp/McpPlayground.tsx +1 -1
- package/src/components/mcp/PlaygroundChat.tsx +90 -52
- package/src/components/viewer/AddElementPanel.tsx +2 -2
- package/src/components/viewer/BasepointOverlay.tsx +239 -0
- package/src/components/viewer/CesiumOverlay.tsx +130 -115
- package/src/components/viewer/CesiumPlacementEditor.tsx +1024 -0
- package/src/components/viewer/ChatPanel.tsx +76 -93
- package/src/components/viewer/CommandPalette.tsx +25 -0
- package/src/components/viewer/EntityContextMenu.tsx +68 -10
- package/src/components/viewer/GeometryAxisRow.tsx +54 -0
- package/src/components/viewer/GeometryEditCard.tsx +392 -0
- package/src/components/viewer/HierarchyPanel.tsx +2 -2
- package/src/components/viewer/IDSAuditSummary.tsx +2 -2
- package/src/components/viewer/KeyboardShortcutsDialog.tsx +58 -4
- package/src/components/viewer/MainToolbar.tsx +308 -7
- package/src/components/viewer/PropertiesPanel.tsx +28 -31
- package/src/components/viewer/StatusBar.tsx +12 -0
- package/src/components/viewer/ToolOverlays.tsx +36 -0
- package/src/components/viewer/ViewerLayout.tsx +27 -0
- package/src/components/viewer/Viewport.tsx +49 -4
- package/src/components/viewer/ViewportContainer.tsx +158 -33
- package/src/components/viewer/ViewportOverlays.tsx +49 -106
- package/src/components/viewer/chat/ByokKeyModal.tsx +338 -0
- package/src/components/viewer/chat/ByokStreamingPill.tsx +62 -0
- package/src/components/viewer/chat/ByokTrustDiagram.tsx +192 -0
- package/src/components/viewer/properties/FederationAlignmentControls.tsx +180 -0
- package/src/components/viewer/properties/GeoreferencingPanel.tsx +55 -52
- package/src/components/viewer/properties/ModelMetadataPanel.tsx +55 -44
- package/src/components/viewer/properties/PrecisionGridBadge.tsx +125 -0
- package/src/components/viewer/properties/raw-step-format.ts +5 -3
- package/src/components/viewer/selectionHandlers.ts +308 -11
- package/src/components/viewer/tools/GizmoOverlay.tsx +322 -0
- package/src/components/viewer/tools/SplitNumericInput.tsx +225 -0
- package/src/components/viewer/tools/SplitOverlay.tsx +242 -0
- package/src/components/viewer/tools/WallEndpointOverlay.tsx +252 -0
- package/src/components/viewer/useGeometryStreaming.ts +100 -1
- package/src/components/viewer/useMouseControls.ts +8 -1
- package/src/hooks/useBCF.ts +6 -6
- package/src/hooks/useCameraTickSubscription.ts +62 -0
- package/src/hooks/useIfc.ts +4 -0
- package/src/hooks/useIfcFederation.ts +368 -20
- package/src/hooks/useKeyboardShortcuts.ts +86 -0
- package/src/hooks/useLevelDisplayEffect.ts +160 -0
- package/src/hooks/useViewerSelectors.ts +8 -0
- package/src/lib/__test__/stubs.ts +110 -0
- package/src/lib/geo/cesium-bridge.ts +86 -50
- package/src/lib/geo/cesium-placement.test.ts +260 -0
- package/src/lib/geo/cesium-placement.ts +237 -0
- package/src/lib/geo/effective-georef.test.ts +97 -8
- package/src/lib/geo/effective-georef.ts +40 -93
- package/src/lib/geo/geo-scale.ts +160 -0
- package/src/lib/geo/ifc-origin.test.ts +176 -0
- package/src/lib/geo/ifc-origin.ts +144 -0
- package/src/lib/geo/precision-grids.ts +444 -0
- package/src/lib/geo/reproject.test.ts +218 -0
- package/src/lib/geo/reproject.ts +199 -42
- package/src/lib/geo/terrain-elevation.ts +198 -89
- package/src/lib/lens/adapter.ts +52 -6
- package/src/lib/level-offsets.test.ts +153 -0
- package/src/lib/level-offsets.ts +140 -0
- package/src/lib/linear-element-edit.test.ts +220 -0
- package/src/lib/linear-element-edit.ts +327 -0
- package/src/lib/llm/clipboard-detect.test.ts +150 -0
- package/src/lib/llm/clipboard-detect.ts +90 -0
- package/src/lib/llm/models.ts +28 -0
- package/src/lib/llm/stream-direct.ts +16 -4
- package/src/lib/llm/types.ts +8 -0
- package/src/lib/metadata-clone.test.ts +173 -0
- package/src/lib/metadata-clone.ts +124 -0
- package/src/lib/placement-core.ts +340 -0
- package/src/lib/placement-edit.boot.ts +21 -0
- package/src/lib/placement-edit.test.ts +464 -0
- package/src/lib/placement-edit.ts +47 -0
- package/src/lib/polygon-clip.test.ts +193 -0
- package/src/lib/polygon-clip.ts +199 -0
- package/src/lib/slab-edit.test.ts +169 -0
- package/src/lib/slab-edit.ts +312 -0
- package/src/lib/wall-edit.ts +342 -0
- package/src/lib/wall-opening-reassign.test.ts +291 -0
- package/src/lib/wall-opening-reassign.ts +241 -0
- package/src/main.tsx +4 -0
- package/src/services/playground-model.ts +55 -0
- package/src/store/index.ts +11 -5
- package/src/store/slices/cesiumSlice.ts +154 -20
- package/src/store/slices/dataSlice.ts +80 -0
- package/src/store/slices/levelDisplaySlice.ts +105 -0
- package/src/store/slices/modelSlice.test.ts +19 -0
- package/src/store/slices/mutationSlice.ts +1138 -1
- package/src/store/slices/splitToolSlice.ts +165 -0
- package/src/store/slices/uiSlice.edit-mode.test.ts +210 -0
- package/src/store/slices/uiSlice.ts +78 -1
- package/src/store/types.ts +57 -2
- package/src/store.ts +3 -0
- package/src/utils/createBlankIfc.ts +37 -0
- package/tsconfig.json +1 -0
- package/.turbo/turbo-typecheck.log +0 -4
- package/dist/assets/arrow-CZ5kQ26f.js +0 -20
- package/dist/assets/arrow2_bg-BoXCojjR.wasm +0 -0
- package/dist/assets/bcf-4K724hw0.js +0 -281
- package/dist/assets/browser-C5TFR7sH.js +0 -694
- package/dist/assets/cesium-DUOzBlqv.js +0 -17817
- package/dist/assets/decode-worker-t2EGKAxO.js +0 -1708
- package/dist/assets/emscripten-module-BTRCZGcB.wasm +0 -0
- package/dist/assets/emscripten-module-CGIn_cMh.wasm +0 -0
- package/dist/assets/emscripten-module-DYvzWiHh.wasm +0 -0
- package/dist/assets/emscripten-module-NWak2PoB.wasm +0 -0
- package/dist/assets/emscripten-module.browser-CY5t0Vfq.js +0 -1
- package/dist/assets/esbuild-COv63sf-.js +0 -1
- package/dist/assets/event-DIOks52T.js +0 -1
- package/dist/assets/ffi-DlhRHxHv.js +0 -1
- package/dist/assets/geometry-controller.worker-NH8pZmrU.js +0 -7
- package/dist/assets/geometry.worker-Bp4rW_R1.js +0 -1
- package/dist/assets/ifc-lite-DfZHk36-.js +0 -7
- package/dist/assets/ifc-lite_bg-DlKs5-yM.wasm +0 -0
- package/dist/assets/ifc-lite_bg-PqmRe3Ph.wasm +0 -0
- package/dist/assets/index-CSWgTe1s.css +0 -1
- package/dist/assets/index-XwKzDuw6.js +0 -22
- package/dist/assets/laz-perf-Cvr_Lepg.js +0 -1
- package/dist/assets/maplibre-gl-CGLcoNXc.js +0 -811
- package/dist/assets/sandbox-DPD1ROr0.js +0 -9700
- package/dist/assets/three-CDRZThFA.js +0 -4057
- package/dist/assets/wasm-bridge-CErti6zX.js +0 -1
- package/dist/assets/zip-DBEtpeu6.js +0 -12
- package/dist/cesium/Workers/chunk-23ZQ2IVV.js +0 -29
- package/dist/cesium/Workers/chunk-2EQO3Q56.js +0 -26
- package/dist/cesium/Workers/chunk-2TE5NTVD.js +0 -26
- package/dist/cesium/Workers/chunk-BXMEEOCS.js +0 -63
- package/dist/cesium/Workers/chunk-BYLCY7GP.js +0 -29
- package/dist/cesium/Workers/chunk-CTHM3W6I.js +0 -26
- package/dist/cesium/Workers/chunk-E3JOOS3S.js +0 -26
- package/dist/cesium/Workers/chunk-F6PRE7D6.js +0 -26
- package/dist/cesium/Workers/chunk-FFBVWF2L.js +0 -26
- package/dist/cesium/Workers/chunk-GBAA6GVX.js +0 -26
- package/dist/cesium/Workers/chunk-ILRYTWTP.js +0 -26
- package/dist/cesium/Workers/chunk-IRNLBSEJ.js +0 -26
- package/dist/cesium/Workers/chunk-L6QHHACZ.js +0 -26
- package/dist/cesium/Workers/chunk-NMVKML6W.js +0 -26
- package/dist/cesium/Workers/chunk-OIRKANTH.js +0 -26
- package/dist/cesium/Workers/chunk-QKUIYMGC.js +0 -28
- package/dist/cesium/Workers/chunk-SQMIIXB7.js +0 -26
- package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +0 -26
- package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +0 -26
- package/dist/cesium/Workers/createGroundPolylineGeometry.js +0 -26
- package/dist/cesium/Workers/transcodeKTX2.js +0 -56
- package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +0 -26
- package/src/components/viewer/CesiumSettingsDialog.tsx +0 -100
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_0.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_1.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_10.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_11.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_12.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_13.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_14.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_15.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_16.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_17.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_18.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_19.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_2.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_20.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_21.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_22.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_23.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_24.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_25.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_26.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_27.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_3.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_4.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_5.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_6.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_7.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_8.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_9.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/bing_maps_credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/cesium_credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/google_earth_credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/ion-credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/LensFlare/DirtMask.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/LensFlare/StarBurst.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/0/0/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/0/1/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/0/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/0/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/1/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/1/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/2/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/2/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/3/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/3/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/tilemapresource.xml +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/airfield.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/airport.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/alcohol-shop.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/america-football.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/art-gallery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bakery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bank.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bar.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/baseball.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/basketball.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/beer.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bicycle.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/building.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bus.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cafe.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/camera.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/campsite.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/car.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cemetery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cesium.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/chemist.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cinema.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/circle-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/circle.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/city.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/clothing-store.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/college.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/commercial.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cricket.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cross.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/dam.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/danger.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/disability.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/dog-park.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/embassy.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/emergency-telephone.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/entrance.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/farm.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fast-food.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/ferry.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fire-station.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fuel.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/garden.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/gift.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/golf.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/grocery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/hairdresser.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/harbor.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/heart.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/heliport.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/hospital.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/ice-cream.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/industrial.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/land-use.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/laundry.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/library.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/lighthouse.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/lodging.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/logging.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/london-underground.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/marker-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/marker.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/minefield.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/mobilephone.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/monument.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/museum.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/music.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/oil-well.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/park.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/park2.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/parking-garage.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/parking.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/pharmacy.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/pitch.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/place-of-worship.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/playground.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/police.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/polling-place.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/post.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/prison.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-above.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-light.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-metro.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-underground.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-christian.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-jewish.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-muslim.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/restaurant.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/roadblock.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rocket.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/school.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/scooter.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/shop.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/skiing.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/slaughterhouse.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/soccer.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/square-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/square.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/star-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/star.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/suitcase.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/swimming.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/telephone.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/tennis.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/theatre.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/toilets.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/town-hall.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/town.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/triangle-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/triangle.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/village.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/warehouse.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/waste-basket.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/water.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/wetland.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/zoo.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/moonSmall.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/pin.svg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/waterNormals.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/waterNormalsSmall.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/approximateTerrainHeights.json +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/Workers/package.json +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/Workers/zip-web-worker.js +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/basis_transcoder.wasm +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/draco_decoder.wasm +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/google-earth-dbroot-parser.js +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/wasm_splats_bg.wasm +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/zip-module.wasm +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Animation/Animation.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Animation/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/BaseLayerPicker/BaseLayerPicker.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/BaseLayerPicker/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Cesium3DTilesInspector/Cesium3DTilesInspector.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumInspector/CesiumInspector.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumWidget/CesiumWidget.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumWidget/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/FullscreenButton/FullscreenButton.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Geocoder/Geocoder.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Geocoder/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/azureAerial.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/azureRoads.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingAerial.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingAerialLabels.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingRoads.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/blueMarble.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/earthAtNight.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleContour.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleRoadmap.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleSatellite.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxSatellite.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxStreets.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxTerrain.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/naturalEarthII.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/openStreetMap.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/sentinel-2.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stamenToner.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stamenWatercolor.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/Mouse.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseLeft.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseMiddle.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseRight.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/Touch.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchDrag.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchRotate.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchTilt.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchZoom.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TerrainProviders/Ellipsoid.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TimelineIcons.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/info-loading.gif +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/InfoBox/InfoBox.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/InfoBox/InfoBoxDescription.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/NavigationHelpButton/NavigationHelpButton.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/NavigationHelpButton/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/PerformanceWatchdog/PerformanceWatchdog.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/ProjectionPicker/ProjectionPicker.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/SceneModePicker/SceneModePicker.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/SelectionIndicator/SelectionIndicator.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Timeline/Timeline.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Timeline/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/VRButton/VRButton.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Viewer/Viewer.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/VoxelInspector/VoxelInspector.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/lighterShared.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/shared.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/widgets.css +0 -0
|
@@ -11,6 +11,19 @@ import {
|
|
|
11
11
|
type ProjectedCRS,
|
|
12
12
|
} from '@ifc-lite/parser';
|
|
13
13
|
import type { CoordinateInfo } from '@ifc-lite/geometry';
|
|
14
|
+
import {
|
|
15
|
+
detectScaleUnitMismatch,
|
|
16
|
+
getEffectiveHorizontalScale,
|
|
17
|
+
inferMapUnitScale,
|
|
18
|
+
type ScaleUnitMismatch,
|
|
19
|
+
} from './geo-scale';
|
|
20
|
+
|
|
21
|
+
export {
|
|
22
|
+
detectScaleUnitMismatch,
|
|
23
|
+
getEffectiveHorizontalScale,
|
|
24
|
+
inferMapUnitScale,
|
|
25
|
+
type ScaleUnitMismatch,
|
|
26
|
+
} from './geo-scale';
|
|
14
27
|
|
|
15
28
|
export interface GeorefMutationDataLike {
|
|
16
29
|
projectedCRS?: Partial<ProjectedCRS>;
|
|
@@ -23,102 +36,35 @@ export interface EffectiveGeoreference extends GeoreferenceInfo {
|
|
|
23
36
|
lengthUnitScale: number;
|
|
24
37
|
}
|
|
25
38
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
* The IFC formula is:
|
|
36
|
-
* E_map_units = Eastings + (X_local * absc - Y_local * ordi) * Scale
|
|
37
|
-
*
|
|
38
|
-
* To produce metres for proj4, we multiply by mapUnitScale; and X_local can be
|
|
39
|
-
* recovered from the metre-converted geometry as X_metres / lengthUnitScale.
|
|
40
|
-
* Substituting:
|
|
41
|
-
* E_metres = mapUnitScale * Eastings
|
|
42
|
-
* + (mapUnitScale * Scale / lengthUnitScale)
|
|
43
|
-
* * (X_metres * absc - Y_metres * ordi)
|
|
44
|
-
*
|
|
45
|
-
* So when geometry has already been converted to metres (as ifc-lite does),
|
|
46
|
-
* the effective horizontal scale is (Scale * mapUnitScale) / lengthUnitScale.
|
|
47
|
-
* For files where Scale is set per IFC spec to bridge the unit difference
|
|
48
|
-
* (Scale = lengthUnitScale / mapUnitScale), this evaluates to 1.0 and the
|
|
49
|
-
* geometry passes through unchanged. Applying the raw Scale would otherwise
|
|
50
|
-
* double-scale and shrink/expand the model — see issue #595.
|
|
51
|
-
*/
|
|
52
|
-
export function getEffectiveHorizontalScale(
|
|
53
|
-
ifcMapConversionScale: number | undefined,
|
|
54
|
-
mapUnitScale: number,
|
|
55
|
-
lengthUnitScale: number,
|
|
56
|
-
): number {
|
|
57
|
-
const scale = ifcMapConversionScale ?? 1.0;
|
|
58
|
-
const lus = lengthUnitScale > 0 ? lengthUnitScale : 1;
|
|
59
|
-
const mus = mapUnitScale > 0 ? mapUnitScale : 1;
|
|
60
|
-
return (scale * mus) / lus;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export interface ScaleUnitMismatch {
|
|
64
|
-
/** Effective horizontal scale applied to viewer-space (metre) geometry. */
|
|
65
|
-
effectiveScale: number;
|
|
66
|
-
/** Raw IfcMapConversion.Scale (or 1 if absent). */
|
|
67
|
-
rawScale: number;
|
|
68
|
-
/** Map unit → metres factor (e.g. 1 for METRE, 0.001 for MILLIMETRE). */
|
|
69
|
-
mapUnitScale: number;
|
|
70
|
-
/** Project length unit → metres factor. */
|
|
71
|
-
lengthUnitScale: number;
|
|
72
|
-
/**
|
|
73
|
-
* Scale value the file would need for the IFC formula to map local→map
|
|
74
|
-
* coordinates without any extra scaling (i.e. lengthUnitScale / mapUnitScale).
|
|
75
|
-
*/
|
|
76
|
-
expectedScale: number;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Detect when IfcMapConversion.Scale is inconsistent with the project and map
|
|
81
|
-
* units. Per the IFC schema, Scale × mapUnitScale should equal lengthUnitScale
|
|
82
|
-
* (i.e. effectiveScale = 1.0). A deviation usually means the authoring tool
|
|
83
|
-
* forgot to set Scale to bridge a unit difference (e.g. mm project + m map
|
|
84
|
-
* with Scale=1.0). Files like this render at the wrong size in any tool that
|
|
85
|
-
* follows the schema strictly — see issue #595.
|
|
86
|
-
*
|
|
87
|
-
* Returns null when the values are consistent (within 0.5% of 1.0); otherwise
|
|
88
|
-
* returns the diagnostic data so callers can surface a warning.
|
|
89
|
-
*/
|
|
90
|
-
export function detectScaleUnitMismatch(
|
|
91
|
-
ifcMapConversionScale: number | undefined,
|
|
92
|
-
mapUnitScale: number | undefined,
|
|
93
|
-
lengthUnitScale: number | undefined,
|
|
94
|
-
): ScaleUnitMismatch | null {
|
|
95
|
-
const lus = lengthUnitScale && lengthUnitScale > 0 ? lengthUnitScale : 1;
|
|
96
|
-
const mus = mapUnitScale && mapUnitScale > 0 ? mapUnitScale : 1;
|
|
97
|
-
const rawScale = ifcMapConversionScale ?? 1.0;
|
|
98
|
-
const effectiveScale = (rawScale * mus) / lus;
|
|
99
|
-
if (Math.abs(effectiveScale - 1) <= 0.005) return null;
|
|
100
|
-
return {
|
|
101
|
-
effectiveScale,
|
|
102
|
-
rawScale,
|
|
103
|
-
mapUnitScale: mus,
|
|
104
|
-
lengthUnitScale: lus,
|
|
105
|
-
expectedScale: lus / mus,
|
|
106
|
-
};
|
|
39
|
+
export function hasStandardGeoreferencing(
|
|
40
|
+
georef: Pick<GeoreferenceInfo, 'source' | 'projectedCRS' | 'mapConversion'> | null | undefined,
|
|
41
|
+
): boolean {
|
|
42
|
+
return Boolean(
|
|
43
|
+
georef
|
|
44
|
+
&& georef.source !== 'siteLocation'
|
|
45
|
+
&& georef.projectedCRS?.name
|
|
46
|
+
&& georef.mapConversion,
|
|
47
|
+
);
|
|
107
48
|
}
|
|
108
49
|
|
|
109
|
-
export function
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
50
|
+
export function supportsStandardGeoreferencing(
|
|
51
|
+
schemaVersion: string | undefined,
|
|
52
|
+
georef: Pick<GeoreferenceInfo, 'source' | 'projectedCRS' | 'mapConversion'> | null | undefined,
|
|
53
|
+
): boolean {
|
|
54
|
+
if (hasStandardGeoreferencing(georef)) return true;
|
|
55
|
+
// Any extracted IfcProjectedCRS / IfcMapConversion makes editing useful,
|
|
56
|
+
// regardless of the declared schema. IFC2X3 files commonly carry these
|
|
57
|
+
// via extensions; once we've parsed them, surface the full editor instead
|
|
58
|
+
// of hiding behind a schema-version notice that contradicts what the
|
|
59
|
+
// properties panel already shows for the same entities.
|
|
60
|
+
if (
|
|
61
|
+
georef
|
|
62
|
+
&& georef.source !== 'siteLocation'
|
|
63
|
+
&& (georef.projectedCRS?.name || georef.mapConversion)
|
|
64
|
+
) {
|
|
65
|
+
return true;
|
|
114
66
|
}
|
|
115
|
-
|
|
116
|
-
if (normalized.includes('MILLI')) return 0.001;
|
|
117
|
-
if (normalized.includes('CENTI')) return 0.01;
|
|
118
|
-
if (normalized.includes('DECI')) return 0.1;
|
|
119
|
-
if (normalized.includes('KILO')) return 1000;
|
|
120
|
-
if (normalized.includes('METRE') || normalized.includes('METER')) return 1;
|
|
121
|
-
return fallback;
|
|
67
|
+
return !schemaVersion?.toUpperCase().includes('2X3');
|
|
122
68
|
}
|
|
123
69
|
|
|
124
70
|
export function getIfcLengthUnitScale(dataStore: IfcDataStore | null | undefined): number {
|
|
@@ -189,6 +135,7 @@ export function getEffectiveGeoreference(
|
|
|
189
135
|
mapConversion,
|
|
190
136
|
coordinateInfo,
|
|
191
137
|
lengthUnitScale,
|
|
138
|
+
source: original?.source,
|
|
192
139
|
transformMatrix: original?.transformMatrix,
|
|
193
140
|
};
|
|
194
141
|
}
|
|
@@ -0,0 +1,160 @@
|
|
|
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
|
+
* Compute the effective horizontal scale to apply to viewer-space coordinates
|
|
7
|
+
* (which are already in metres) when transforming through IfcMapConversion.
|
|
8
|
+
*
|
|
9
|
+
* Per the IFC schema, IfcMapConversion.Scale converts LOCAL ENGINEERING
|
|
10
|
+
* coordinates (in the project's length unit) to MAP coordinates (in the map
|
|
11
|
+
* CRS unit). For a typical file with mm project units and m map units, the
|
|
12
|
+
* Scale attribute is 0.001.
|
|
13
|
+
*
|
|
14
|
+
* The IFC formula is:
|
|
15
|
+
* E_map_units = Eastings + (X_local * absc - Y_local * ordi) * Scale
|
|
16
|
+
*
|
|
17
|
+
* To produce metres for proj4, we multiply by mapUnitScale; and X_local can be
|
|
18
|
+
* recovered from the metre-converted geometry as X_metres / lengthUnitScale.
|
|
19
|
+
* Substituting:
|
|
20
|
+
* E_metres = mapUnitScale * Eastings
|
|
21
|
+
* + (mapUnitScale * Scale / lengthUnitScale)
|
|
22
|
+
* * (X_metres * absc - Y_metres * ordi)
|
|
23
|
+
*
|
|
24
|
+
* So when geometry has already been converted to metres (as ifc-lite does),
|
|
25
|
+
* the effective horizontal scale is (Scale * mapUnitScale) / lengthUnitScale.
|
|
26
|
+
* For files where Scale is set per IFC spec to bridge the unit difference
|
|
27
|
+
* (Scale = lengthUnitScale / mapUnitScale), this evaluates to 1.0 and the
|
|
28
|
+
* geometry passes through unchanged. Applying the raw Scale would otherwise
|
|
29
|
+
* double-scale and shrink/expand the model — see issue #595.
|
|
30
|
+
*/
|
|
31
|
+
export function getEffectiveHorizontalScale(
|
|
32
|
+
ifcMapConversionScale: number | undefined,
|
|
33
|
+
mapUnitScale: number,
|
|
34
|
+
lengthUnitScale: number,
|
|
35
|
+
): number {
|
|
36
|
+
const lus = lengthUnitScale > 0 ? lengthUnitScale : 1;
|
|
37
|
+
const mus = mapUnitScale > 0 ? mapUnitScale : 1;
|
|
38
|
+
const specEffective = ((ifcMapConversionScale ?? 1.0) * mus) / lus;
|
|
39
|
+
|
|
40
|
+
// Heuristic for files that don't follow the IFC schema's unit-bridging rule.
|
|
41
|
+
//
|
|
42
|
+
// Spec: IfcMapConversion.Scale converts LOCAL ENGINEERING coords (in the
|
|
43
|
+
// project length unit) to MAP coords (in MapUnit). So a file with mm
|
|
44
|
+
// project units + m map units MUST set Scale=0.001 to bridge the gap, and
|
|
45
|
+
// (Scale * mapUnitScale) / lengthUnitScale evaluates to 1 — geometry passes
|
|
46
|
+
// through unchanged.
|
|
47
|
+
//
|
|
48
|
+
// Reality: Bonsai/IfcOpenShell, Revit's IFC exporter, and many CAD tools
|
|
49
|
+
// either leave Scale unset (default 1.0) or hard-code Scale=1 regardless of
|
|
50
|
+
// unit pairing. The author's intent in those cases is "geometry and offsets
|
|
51
|
+
// share the same metric unit", but the spec-strict formula then multiplies
|
|
52
|
+
// viewer-space metres by 1/lengthUnitScale (e.g. 1000x for mm projects),
|
|
53
|
+
// inflating the model so far that proj4 extrapolates to the projection's
|
|
54
|
+
// antipode (Hans's `IXAS_KW 018_georeffed.ifc`: 126500/480000 RD offsets +
|
|
55
|
+
// mm units + Scale unset → South Pacific instead of the Netherlands).
|
|
56
|
+
//
|
|
57
|
+
// When the file's Scale is unset or exactly 1 AND the units don't match,
|
|
58
|
+
// honour the practical intent: behave as if Scale had been set per spec
|
|
59
|
+
// (effectiveScale = 1) so the metre-converted geometry passes through.
|
|
60
|
+
// Files that genuinely use Scale ≠ 1 (e.g. units bridging a foot/metre
|
|
61
|
+
// gap with Scale=0.3048) are left alone — they followed the spec.
|
|
62
|
+
const rawScaleProvided = ifcMapConversionScale != null
|
|
63
|
+
&& Math.abs(ifcMapConversionScale - 1) > 1e-9;
|
|
64
|
+
if (!rawScaleProvided && Math.abs(mus - lus) > 1e-9) {
|
|
65
|
+
return 1;
|
|
66
|
+
}
|
|
67
|
+
return specEffective;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface ScaleUnitMismatch {
|
|
71
|
+
/** Effective horizontal scale applied to viewer-space (metre) geometry. */
|
|
72
|
+
effectiveScale: number;
|
|
73
|
+
/** Raw IfcMapConversion.Scale (or 1 if absent). */
|
|
74
|
+
rawScale: number;
|
|
75
|
+
/** Map unit → metres factor (e.g. 1 for METRE, 0.001 for MILLIMETRE). */
|
|
76
|
+
mapUnitScale: number;
|
|
77
|
+
/** Project length unit → metres factor. */
|
|
78
|
+
lengthUnitScale: number;
|
|
79
|
+
/**
|
|
80
|
+
* Scale value the file would need for the IFC formula to map local→map
|
|
81
|
+
* coordinates without any extra scaling (i.e. lengthUnitScale / mapUnitScale).
|
|
82
|
+
*/
|
|
83
|
+
expectedScale: number;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Detect when IfcMapConversion.Scale is inconsistent with the project and map
|
|
88
|
+
* units. Per the IFC schema, Scale × mapUnitScale should equal lengthUnitScale
|
|
89
|
+
* (i.e. effectiveScale = 1.0). A deviation usually means the authoring tool
|
|
90
|
+
* forgot to set Scale to bridge a unit difference (e.g. mm project + m map
|
|
91
|
+
* with Scale=1.0). Files like this render at the wrong size in any tool that
|
|
92
|
+
* follows the schema strictly — see issue #595.
|
|
93
|
+
*
|
|
94
|
+
* Returns null when the values are consistent (within 0.5% of 1.0); otherwise
|
|
95
|
+
* returns the diagnostic data so callers can surface a warning.
|
|
96
|
+
*/
|
|
97
|
+
export function detectScaleUnitMismatch(
|
|
98
|
+
ifcMapConversionScale: number | undefined,
|
|
99
|
+
mapUnitScale: number | undefined,
|
|
100
|
+
lengthUnitScale: number | undefined,
|
|
101
|
+
): ScaleUnitMismatch | null {
|
|
102
|
+
const lus = lengthUnitScale && lengthUnitScale > 0 ? lengthUnitScale : 1;
|
|
103
|
+
const mus = mapUnitScale && mapUnitScale > 0 ? mapUnitScale : 1;
|
|
104
|
+
const rawScale = ifcMapConversionScale ?? 1.0;
|
|
105
|
+
const effectiveScale = (rawScale * mus) / lus;
|
|
106
|
+
if (Math.abs(effectiveScale - 1) <= 0.005) return null;
|
|
107
|
+
return {
|
|
108
|
+
effectiveScale,
|
|
109
|
+
rawScale,
|
|
110
|
+
mapUnitScale: mus,
|
|
111
|
+
lengthUnitScale: lus,
|
|
112
|
+
expectedScale: lus / mus,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function inferMapUnitScale(
|
|
117
|
+
mapUnit: string | undefined,
|
|
118
|
+
fallback?: number,
|
|
119
|
+
): number | undefined {
|
|
120
|
+
if (!mapUnit) return fallback;
|
|
121
|
+
const normalized = mapUnit.toUpperCase();
|
|
122
|
+
if (normalized.includes('US') && (normalized.includes('SURVEY') || normalized.includes('FTUS'))) {
|
|
123
|
+
return 0.3048006096;
|
|
124
|
+
}
|
|
125
|
+
if (normalized.includes('FOOT') || normalized.includes('FEET')) return 0.3048;
|
|
126
|
+
if (normalized.includes('MILLI')) return 0.001;
|
|
127
|
+
if (normalized.includes('CENTI')) return 0.01;
|
|
128
|
+
if (normalized.includes('DECI')) return 0.1;
|
|
129
|
+
if (normalized.includes('KILO')) return 1000;
|
|
130
|
+
if (normalized.includes('METRE') || normalized.includes('METER')) return 1;
|
|
131
|
+
return fallback;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Resolve the scale factor converting `IfcMapConversion.eastings/northings/
|
|
136
|
+
* orthogonalHeight` into metres (the unit proj4 expects).
|
|
137
|
+
*
|
|
138
|
+
* IFC4 spec: those offsets are in `IfcProjectedCRS.MapUnit`, falling back to
|
|
139
|
+
* the project's `IfcUnitAssignment` LengthUnit when MapUnit is absent.
|
|
140
|
+
*
|
|
141
|
+
* Real-world practice diverges: Bonsai, IfcOpenShell, and most surveying
|
|
142
|
+
* pipelines emit metre values regardless of the project's length unit because
|
|
143
|
+
* survey CRS offsets come in metres. When MapUnit is absent AND the project
|
|
144
|
+
* unit isn't metres, applying the spec interpretation pushes coords miles
|
|
145
|
+
* outside the CRS's valid range, and projections like RD New / OSGB / Lambert
|
|
146
|
+
* extrapolate to the projection's antipode (e.g. an RD easting of `126500`
|
|
147
|
+
* read as mm = `126.5 m` → South Pacific instead of the Netherlands).
|
|
148
|
+
*
|
|
149
|
+
* Heuristic: when no explicit MapUnit is set, treat the offsets as metres.
|
|
150
|
+
* Files that genuinely use non-metre offsets can set MapUnit explicitly
|
|
151
|
+
* (e.g. `IfcProjectedCRS.MapUnit = MILLIMETRE`) to opt out.
|
|
152
|
+
*/
|
|
153
|
+
export function resolveMapUnitToMetreScale(
|
|
154
|
+
mapUnitScaleFromCrs: number | undefined,
|
|
155
|
+
lengthUnitScale: number,
|
|
156
|
+
): number {
|
|
157
|
+
if (mapUnitScaleFromCrs && mapUnitScaleFromCrs > 0) return mapUnitScaleFromCrs;
|
|
158
|
+
void lengthUnitScale; // parameter kept for future spec-strict override
|
|
159
|
+
return 1;
|
|
160
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
|
|
5
|
+
import { describe, it } from 'node:test';
|
|
6
|
+
import assert from 'node:assert';
|
|
7
|
+
|
|
8
|
+
import { computeIfcOriginViewerPosition, type ModelGeorefInput } from './ifc-origin.js';
|
|
9
|
+
import type { MapConversion, ProjectedCRS } from '@ifc-lite/parser';
|
|
10
|
+
import type { CoordinateInfo } from '@ifc-lite/geometry';
|
|
11
|
+
|
|
12
|
+
function rdCrs(): ProjectedCRS {
|
|
13
|
+
return { id: 1, name: 'EPSG:28992', mapUnit: 'METRE', mapUnitScale: 1 };
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function utm31Crs(): ProjectedCRS {
|
|
17
|
+
return { id: 2, name: 'EPSG:25831', mapUnit: 'METRE', mapUnitScale: 1 };
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function makeConversion(eastings: number, northings: number, height = 0): MapConversion {
|
|
21
|
+
return {
|
|
22
|
+
id: 100,
|
|
23
|
+
sourceCRS: 10,
|
|
24
|
+
targetCRS: 1,
|
|
25
|
+
eastings,
|
|
26
|
+
northings,
|
|
27
|
+
orthogonalHeight: height,
|
|
28
|
+
xAxisAbscissa: 1,
|
|
29
|
+
xAxisOrdinate: 0,
|
|
30
|
+
scale: 1,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function emptyCoordinateInfo(): CoordinateInfo {
|
|
35
|
+
return {
|
|
36
|
+
originShift: { x: 0, y: 0, z: 0 },
|
|
37
|
+
originalBounds: { min: { x: 0, y: 0, z: 0 }, max: { x: 0, y: 0, z: 0 } },
|
|
38
|
+
shiftedBounds: { min: { x: 0, y: 0, z: 0 }, max: { x: 0, y: 0, z: 0 } },
|
|
39
|
+
hasLargeCoordinates: false,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
describe('computeIfcOriginViewerPosition', () => {
|
|
44
|
+
it('returns -shift - rtcYup for a standalone model (no anchor)', async () => {
|
|
45
|
+
const model: ModelGeorefInput = {
|
|
46
|
+
coordinateInfo: {
|
|
47
|
+
...emptyCoordinateInfo(),
|
|
48
|
+
originShift: { x: 50, y: 3, z: -20 },
|
|
49
|
+
wasmRtcOffset: { x: 10, y: 7, z: -4 },
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
const out = await computeIfcOriginViewerPosition(model, null);
|
|
53
|
+
assert.ok(out);
|
|
54
|
+
assert.strictEqual(out!.source, 'self');
|
|
55
|
+
// rtcYup = (10, -4, -7); total offset (60, -1, -27); negated = (-60, 1, 27)
|
|
56
|
+
assert.strictEqual(out!.viewer.x, -60);
|
|
57
|
+
assert.strictEqual(out!.viewer.y, 1);
|
|
58
|
+
assert.strictEqual(out!.viewer.z, 27);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('treats the anchor model as its own frame even with georef present', async () => {
|
|
62
|
+
const conversion = makeConversion(155000, 463000);
|
|
63
|
+
const model: ModelGeorefInput = {
|
|
64
|
+
coordinateInfo: { ...emptyCoordinateInfo(), originShift: { x: 1, y: 2, z: 3 } },
|
|
65
|
+
mapConversion: conversion,
|
|
66
|
+
projectedCRS: rdCrs(),
|
|
67
|
+
lengthUnitScale: 1,
|
|
68
|
+
};
|
|
69
|
+
const out = await computeIfcOriginViewerPosition(model, model);
|
|
70
|
+
assert.ok(out);
|
|
71
|
+
assert.strictEqual(out!.source, 'self');
|
|
72
|
+
assert.strictEqual(out!.viewer.x, -1);
|
|
73
|
+
assert.strictEqual(out!.viewer.y, -2);
|
|
74
|
+
assert.strictEqual(out!.viewer.z, -3);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('places a same-CRS non-anchor model relative to the anchor by easting/northing diff', async () => {
|
|
78
|
+
// Anchor IFC origin sits at (eastings=124000, northings=477000, h=0) in RD.
|
|
79
|
+
// A second model with eastings=124100, northings=477050 should land in
|
|
80
|
+
// the anchor's viewer-Y-up space at (Δeasting, Δheight, -Δnorthing) =
|
|
81
|
+
// (100, 0, -50) after accounting for the IFC Z-up → viewer Y-up swap,
|
|
82
|
+
// minus the anchor's shift.
|
|
83
|
+
const anchorConv = makeConversion(124000, 477000);
|
|
84
|
+
const anchor: ModelGeorefInput = {
|
|
85
|
+
coordinateInfo: emptyCoordinateInfo(),
|
|
86
|
+
mapConversion: anchorConv,
|
|
87
|
+
projectedCRS: rdCrs(),
|
|
88
|
+
lengthUnitScale: 1,
|
|
89
|
+
};
|
|
90
|
+
const otherConv = makeConversion(124100, 477050);
|
|
91
|
+
const other: ModelGeorefInput = {
|
|
92
|
+
coordinateInfo: emptyCoordinateInfo(),
|
|
93
|
+
mapConversion: otherConv,
|
|
94
|
+
projectedCRS: rdCrs(),
|
|
95
|
+
lengthUnitScale: 1,
|
|
96
|
+
};
|
|
97
|
+
const out = await computeIfcOriginViewerPosition(other, anchor);
|
|
98
|
+
assert.ok(out);
|
|
99
|
+
assert.strictEqual(out!.source, 'anchor');
|
|
100
|
+
// ifcX = +100, ifcY = +50 (Δnorthing positive); viewer Z = -ifcY = -50
|
|
101
|
+
assert.ok(Math.abs(out!.viewer.x - 100) < 1e-9, `viewer.x = ${out!.viewer.x}`);
|
|
102
|
+
assert.ok(Math.abs(out!.viewer.y - 0) < 1e-9, `viewer.y = ${out!.viewer.y}`);
|
|
103
|
+
assert.ok(Math.abs(out!.viewer.z - -50) < 1e-9, `viewer.z = ${out!.viewer.z}`);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('accounts for orthogonalHeight differences (vertical offset)', async () => {
|
|
107
|
+
const anchor: ModelGeorefInput = {
|
|
108
|
+
coordinateInfo: emptyCoordinateInfo(),
|
|
109
|
+
mapConversion: makeConversion(0, 0, 100),
|
|
110
|
+
projectedCRS: rdCrs(),
|
|
111
|
+
lengthUnitScale: 1,
|
|
112
|
+
};
|
|
113
|
+
const other: ModelGeorefInput = {
|
|
114
|
+
coordinateInfo: emptyCoordinateInfo(),
|
|
115
|
+
mapConversion: makeConversion(0, 0, 150),
|
|
116
|
+
projectedCRS: rdCrs(),
|
|
117
|
+
lengthUnitScale: 1,
|
|
118
|
+
};
|
|
119
|
+
const out = await computeIfcOriginViewerPosition(other, anchor);
|
|
120
|
+
assert.ok(out);
|
|
121
|
+
// Δheight = +50, viewer Y is vertical → y = 50.
|
|
122
|
+
assert.ok(Math.abs(out!.viewer.y - 50) < 1e-9, `viewer.y = ${out!.viewer.y}`);
|
|
123
|
+
assert.ok(Math.abs(out!.viewer.x) < 1e-9);
|
|
124
|
+
assert.ok(Math.abs(out!.viewer.z) < 1e-9);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('reprojects across CRSs (RD New ↔ UTM zone 31N) within a few metres', async () => {
|
|
128
|
+
// Anchor in RD at (155000, 463000) — Amersfoort tower origin.
|
|
129
|
+
// Same physical location, expressed in UTM 31N, is roughly (660000, 5780000).
|
|
130
|
+
// Use proj4 to get the exact expected UTM coords, then verify the function
|
|
131
|
+
// brings the second model's origin to the anchor's IFC (0,0,0) (i.e. viewer 0,0,0)
|
|
132
|
+
// within a small tolerance.
|
|
133
|
+
const proj4 = (await import('proj4')).default;
|
|
134
|
+
const rdDef = '+proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.4171,50.3319,465.5524,1.9342,-1.6677,9.1019,4.0725 +units=m +no_defs';
|
|
135
|
+
const utmDef = '+proj=utm +zone=31 +datum=WGS84 +units=m +no_defs';
|
|
136
|
+
const [utmE, utmN] = proj4(rdDef, utmDef, [155000, 463000]);
|
|
137
|
+
|
|
138
|
+
const anchor: ModelGeorefInput = {
|
|
139
|
+
coordinateInfo: emptyCoordinateInfo(),
|
|
140
|
+
mapConversion: makeConversion(155000, 463000),
|
|
141
|
+
projectedCRS: rdCrs(),
|
|
142
|
+
lengthUnitScale: 1,
|
|
143
|
+
};
|
|
144
|
+
const other: ModelGeorefInput = {
|
|
145
|
+
coordinateInfo: emptyCoordinateInfo(),
|
|
146
|
+
mapConversion: makeConversion(utmE, utmN),
|
|
147
|
+
projectedCRS: utm31Crs(),
|
|
148
|
+
lengthUnitScale: 1,
|
|
149
|
+
};
|
|
150
|
+
const out = await computeIfcOriginViewerPosition(other, anchor);
|
|
151
|
+
assert.ok(out);
|
|
152
|
+
assert.strictEqual(out!.source, 'anchor');
|
|
153
|
+
// Round-trip should land at the anchor origin within a small tolerance.
|
|
154
|
+
// Both directions go through +towgs84 approximations, so a few metres of
|
|
155
|
+
// residual is acceptable.
|
|
156
|
+
assert.ok(Math.abs(out!.viewer.x) < 5, `viewer.x residual = ${out!.viewer.x}`);
|
|
157
|
+
assert.ok(Math.abs(out!.viewer.z) < 5, `viewer.z residual = ${out!.viewer.z}`);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
it('falls back to the model own frame when the anchor lacks georef', async () => {
|
|
161
|
+
const model: ModelGeorefInput = {
|
|
162
|
+
coordinateInfo: { ...emptyCoordinateInfo(), originShift: { x: 99, y: 1, z: 2 } },
|
|
163
|
+
mapConversion: makeConversion(1, 2),
|
|
164
|
+
projectedCRS: rdCrs(),
|
|
165
|
+
lengthUnitScale: 1,
|
|
166
|
+
};
|
|
167
|
+
const anchorWithoutGeoref: ModelGeorefInput = {
|
|
168
|
+
coordinateInfo: emptyCoordinateInfo(),
|
|
169
|
+
// No mapConversion / projectedCRS — represents a model loaded without georef.
|
|
170
|
+
};
|
|
171
|
+
const out = await computeIfcOriginViewerPosition(model, anchorWithoutGeoref);
|
|
172
|
+
assert.ok(out);
|
|
173
|
+
assert.strictEqual(out!.source, 'fallback');
|
|
174
|
+
assert.strictEqual(out!.viewer.x, -99);
|
|
175
|
+
});
|
|
176
|
+
});
|
|
@@ -0,0 +1,144 @@
|
|
|
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
|
+
* Compute the viewer-space position where a model's IFC (0,0,0) point
|
|
7
|
+
* currently sits — the "true" IFC origin, regardless of any federation
|
|
8
|
+
* alignment that re-baked the vertices.
|
|
9
|
+
*
|
|
10
|
+
* Standalone load or this model is the federation anchor:
|
|
11
|
+
* viewer = -(originShift + wasmRtcOffset_Yup)
|
|
12
|
+
*
|
|
13
|
+
* Non-anchor federated model:
|
|
14
|
+
* 1. IFC (0,0,0) → model projected coords (E_m, N_m, H_m) [the pivot,
|
|
15
|
+
* so MapConversion rotation/scale collapses to the offsets]
|
|
16
|
+
* 2. model projected → anchor projected via proj4 (identity if same CRS)
|
|
17
|
+
* 3. anchor projected → anchor IFC frame via inverse MapConversion
|
|
18
|
+
* 4. anchor IFC (Z-up) → world Y-up via axis swap
|
|
19
|
+
* 5. subtract anchor's shift + rtc to land in anchor viewer-local space
|
|
20
|
+
*
|
|
21
|
+
* This works for both same-CRS arithmetic alignment and cross-CRS proj4
|
|
22
|
+
* alignment without depending on stored alignment transforms or vertex
|
|
23
|
+
* snapshots — it derives everything from the MapConversion + ProjectedCRS
|
|
24
|
+
* the IFC file declares.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import proj4 from 'proj4';
|
|
28
|
+
import type { MapConversion, ProjectedCRS } from '@ifc-lite/parser';
|
|
29
|
+
import type { CoordinateInfo } from '@ifc-lite/geometry';
|
|
30
|
+
import { resolveProjection } from './reproject';
|
|
31
|
+
import { getEffectiveHorizontalScale, resolveMapUnitToMetreScale } from './geo-scale';
|
|
32
|
+
|
|
33
|
+
export interface IfcOriginPlacement {
|
|
34
|
+
/** Viewer-local position (Y-up) where this model's IFC (0,0,0) currently sits. */
|
|
35
|
+
viewer: { x: number; y: number; z: number };
|
|
36
|
+
/**
|
|
37
|
+
* How the position was computed:
|
|
38
|
+
* - `'self'` — model is its own frame (standalone or anchor)
|
|
39
|
+
* - `'anchor'` — projected from model georef → anchor georef
|
|
40
|
+
* - `'fallback'` — anchor has no usable georef; used model's own
|
|
41
|
+
* pre-alignment frame as a best-effort guess
|
|
42
|
+
*/
|
|
43
|
+
source: 'self' | 'anchor' | 'fallback';
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface ModelGeorefInput {
|
|
47
|
+
coordinateInfo?: CoordinateInfo;
|
|
48
|
+
mapConversion?: MapConversion;
|
|
49
|
+
projectedCRS?: ProjectedCRS;
|
|
50
|
+
lengthUnitScale?: number;
|
|
51
|
+
preAlignmentCoordinateInfo?: CoordinateInfo;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function totalYupOffset(info?: CoordinateInfo): { x: number; y: number; z: number } {
|
|
55
|
+
const shift = info?.originShift ?? { x: 0, y: 0, z: 0 };
|
|
56
|
+
const rtc = info?.wasmRtcOffset;
|
|
57
|
+
const rtcYup = rtc ? { x: rtc.x, y: rtc.z, z: -rtc.y } : { x: 0, y: 0, z: 0 };
|
|
58
|
+
return { x: shift.x + rtcYup.x, y: shift.y + rtcYup.y, z: shift.z + rtcYup.z };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export async function computeIfcOriginViewerPosition(
|
|
62
|
+
model: ModelGeorefInput,
|
|
63
|
+
anchor?: ModelGeorefInput | null,
|
|
64
|
+
): Promise<IfcOriginPlacement | null> {
|
|
65
|
+
// Standalone load, or model has no georef → its own frame.
|
|
66
|
+
if (!anchor || !model.mapConversion || !model.projectedCRS) {
|
|
67
|
+
const off = totalYupOffset(model.coordinateInfo);
|
|
68
|
+
return { viewer: { x: -off.x, y: -off.y, z: -off.z }, source: 'self' };
|
|
69
|
+
}
|
|
70
|
+
if (model === anchor) {
|
|
71
|
+
const off = totalYupOffset(anchor.coordinateInfo);
|
|
72
|
+
return { viewer: { x: -off.x, y: -off.y, z: -off.z }, source: 'self' };
|
|
73
|
+
}
|
|
74
|
+
if (!anchor.mapConversion || !anchor.projectedCRS) {
|
|
75
|
+
// Anchor has no usable georef. The model's geometry was either left in
|
|
76
|
+
// its own frame or aligned via RTC-only — fall back to pre-alignment.
|
|
77
|
+
const off = totalYupOffset(model.preAlignmentCoordinateInfo ?? model.coordinateInfo);
|
|
78
|
+
return { viewer: { x: -off.x, y: -off.y, z: -off.z }, source: 'fallback' };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Step 1: model IFC (0,0,0) → model projected. At the pivot, rotation+scale
|
|
82
|
+
// multiply zero — only the eastings/northings/orthogonalHeight remain.
|
|
83
|
+
const modelLengthScale = model.lengthUnitScale ?? 1;
|
|
84
|
+
const modelMapUnitScale = resolveMapUnitToMetreScale(model.projectedCRS.mapUnitScale, modelLengthScale);
|
|
85
|
+
const eM = model.mapConversion.eastings * modelMapUnitScale;
|
|
86
|
+
const nM = model.mapConversion.northings * modelMapUnitScale;
|
|
87
|
+
const hM = model.mapConversion.orthogonalHeight * modelMapUnitScale;
|
|
88
|
+
|
|
89
|
+
// Step 2: same CRS → identity; different CRS → proj4 hop.
|
|
90
|
+
let eA = eM;
|
|
91
|
+
let nA = nM;
|
|
92
|
+
const sameCrs = (model.projectedCRS.name ?? '').toUpperCase()
|
|
93
|
+
=== (anchor.projectedCRS.name ?? '').toUpperCase();
|
|
94
|
+
if (!sameCrs) {
|
|
95
|
+
const srcDef = await resolveProjection(model.projectedCRS);
|
|
96
|
+
const refDef = await resolveProjection(anchor.projectedCRS);
|
|
97
|
+
if (!srcDef || !refDef) return null;
|
|
98
|
+
try {
|
|
99
|
+
const result = proj4(srcDef, refDef, [eM, nM]);
|
|
100
|
+
eA = result[0];
|
|
101
|
+
nA = result[1];
|
|
102
|
+
} catch (error) {
|
|
103
|
+
console.warn(
|
|
104
|
+
`[ifc-origin] proj4 reprojection failed (${model.projectedCRS.name} → ${anchor.projectedCRS.name}) for [${eM}, ${nM}]:`,
|
|
105
|
+
error,
|
|
106
|
+
);
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const hA = hM; // No vertical datum transform in browser.
|
|
111
|
+
|
|
112
|
+
// Step 3: anchor projected → anchor IFC (invert anchor's MapConversion).
|
|
113
|
+
const anchorLengthScale = anchor.lengthUnitScale ?? 1;
|
|
114
|
+
const anchorMapUnitScale = resolveMapUnitToMetreScale(anchor.projectedCRS.mapUnitScale, anchorLengthScale);
|
|
115
|
+
const eAnchor = anchor.mapConversion.eastings * anchorMapUnitScale;
|
|
116
|
+
const nAnchor = anchor.mapConversion.northings * anchorMapUnitScale;
|
|
117
|
+
const hAnchor = anchor.mapConversion.orthogonalHeight * anchorMapUnitScale;
|
|
118
|
+
const anchorAbsc = anchor.mapConversion.xAxisAbscissa ?? 1;
|
|
119
|
+
const anchorOrd = anchor.mapConversion.xAxisOrdinate ?? 0;
|
|
120
|
+
const anchorScale = getEffectiveHorizontalScale(
|
|
121
|
+
anchor.mapConversion.scale,
|
|
122
|
+
anchorMapUnitScale,
|
|
123
|
+
anchorLengthScale,
|
|
124
|
+
);
|
|
125
|
+
const anchorDenom = anchorScale * Math.max(anchorAbsc * anchorAbsc + anchorOrd * anchorOrd, 1e-12);
|
|
126
|
+
if (Math.abs(anchorDenom) < 1e-12) return null;
|
|
127
|
+
const invDenom = 1 / anchorDenom;
|
|
128
|
+
const dE = eA - eAnchor;
|
|
129
|
+
const dN = nA - nAnchor;
|
|
130
|
+
const ifcX = invDenom * (anchorAbsc * dE + anchorOrd * dN);
|
|
131
|
+
const ifcY = invDenom * (-anchorOrd * dE + anchorAbsc * dN);
|
|
132
|
+
const ifcZ = hA - hAnchor;
|
|
133
|
+
|
|
134
|
+
// Step 4 + 5: IFC Z-up → world Y-up → anchor viewer-local
|
|
135
|
+
const anchorOff = totalYupOffset(anchor.coordinateInfo);
|
|
136
|
+
return {
|
|
137
|
+
viewer: {
|
|
138
|
+
x: ifcX - anchorOff.x,
|
|
139
|
+
y: ifcZ - anchorOff.y,
|
|
140
|
+
z: -ifcY - anchorOff.z,
|
|
141
|
+
},
|
|
142
|
+
source: 'anchor',
|
|
143
|
+
};
|
|
144
|
+
}
|