@ifc-lite/viewer 1.22.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 +71 -44
- package/CHANGELOG.md +23 -0
- package/dist/assets/__vite-browser-external-B1O5LaIO.js +1 -0
- package/dist/assets/{arrow-fie-E7fe.js → arrow-CXWhTnNT.js} +1 -1
- package/dist/assets/{basketViewActivator-EHAhHlwN.js → basketViewActivator--cFpU2Q9.js} +10 -10
- package/dist/assets/{bcf-Bhx-K17f.js → bcf-Ba2CjHib.js} +2 -2
- package/dist/assets/browser-DXS29_v9.js +695 -0
- package/dist/assets/{cesium-B4ZIU9jS.js → cesium-BoVuJvTC.js} +5838 -5730
- package/dist/assets/{decode-worker-CYqSjk1n.js → decode-worker-CgM1iNSK.js} +1 -1
- package/dist/assets/deflate-DCLbV4UE.js +1 -0
- package/dist/assets/{drawing-2d-Bjy8YPrg.js → drawing-2d-C71b8Ugx.js} +1 -1
- package/dist/assets/emscripten-module-B1g2L2eS.wasm +0 -0
- package/dist/assets/emscripten-module-DHbYPfAp.wasm +0 -0
- package/dist/assets/emscripten-module-ZrHFMo7O.wasm +0 -0
- package/dist/assets/emscripten-module-uFzwHH0Y.wasm +0 -0
- package/dist/assets/emscripten-module.browser-BLJD5hhE.js +1 -0
- package/dist/assets/{esbuild-Cpd5nU_H.wasm → esbuild-CzsZLPr0.wasm} +0 -0
- package/dist/assets/esbuild-FgU11_Eg.js +1 -0
- package/dist/assets/event-B0kAzHa-.js +1 -0
- package/dist/assets/{exporters-KTio0Tdm.js → exporters-Bf6PTtdW.js} +1011 -1011
- package/dist/assets/ffi-Boa1QuFa.js +1 -0
- package/dist/assets/{geometry-controller.worker-Cm2P_EJr.js → geometry-controller.worker-CEr00X3X.js} +2 -2
- package/dist/assets/{geometry.worker-DchLBqZ8.js → geometry.worker-B4VPDkmL.js} +1 -1
- package/dist/assets/geotiff-BN4J8Vt9.js +3354 -0
- package/dist/assets/{ids-CS7VCFin.js → ids-XwxE1tK3.js} +6 -6
- package/dist/assets/{ifc-lite-C6wEhXa6.js → ifc-lite-DNzkEkIb.js} +2 -2
- 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-8k9h-ANq.js → index-j2x5R7fb.js} +66047 -55202
- package/dist/assets/jpeg-BUTmr0Bp.js +1 -0
- package/dist/assets/{laz-perf-DnSyzVYH.wasm → laz-perf-CFJp03W6.wasm} +0 -0
- package/dist/assets/laz-perf-DgUOSLeU.js +1 -0
- package/dist/assets/{laz-source-jj3xI5Y4.js → laz-source-BWjza0Iw.js} +2 -2
- package/dist/assets/{lens-CSASnhAL.js → lens-CpjUdqpw.js} +1 -1
- package/dist/assets/lerc-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-DNrEhx2R.js → native-bridge-Q5ACp4QY.js} +3 -3
- 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-BcjkIo89.js → parser.worker-Cl6XQcXA.js} +2 -2
- package/dist/assets/raw-ZqLh7kVQ.js +1 -0
- package/dist/assets/{sandbox-BSn5MyEJ.js → sandbox-Bju6ZKJK.js} +1664 -1542
- package/dist/assets/{server-client-D-kU2XAF.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-pUUnk9Wc.js → workerHelpers-DnNedVRr.js} +1 -1
- 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 +11 -11
- package/package.json +52 -45
- package/src/components/mcp/McpLanding.tsx +1 -1
- package/src/components/mcp/McpPlayground.tsx +1 -1
- package/src/components/viewer/AddElementPanel.tsx +2 -2
- package/src/components/viewer/BasepointOverlay.tsx +239 -0
- package/src/components/viewer/CesiumOverlay.tsx +15 -59
- package/src/components/viewer/CesiumPlacementEditor.tsx +16 -1
- package/src/components/viewer/CommandPalette.tsx +25 -0
- package/src/components/viewer/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 +275 -4
- package/src/components/viewer/PropertiesPanel.tsx +28 -31
- package/src/components/viewer/StatusBar.tsx +12 -0
- package/src/components/viewer/ToolOverlays.tsx +36 -0
- package/src/components/viewer/ViewerLayout.tsx +27 -0
- package/src/components/viewer/Viewport.tsx +49 -4
- package/src/components/viewer/ViewportContainer.tsx +88 -17
- package/src/components/viewer/ViewportOverlays.tsx +50 -11
- package/src/components/viewer/chat/ByokKeyModal.tsx +1 -1
- package/src/components/viewer/properties/FederationAlignmentControls.tsx +180 -0
- package/src/components/viewer/properties/GeoreferencingPanel.tsx +6 -0
- package/src/components/viewer/properties/PrecisionGridBadge.tsx +125 -0
- package/src/components/viewer/properties/raw-step-format.ts +5 -3
- package/src/components/viewer/selectionHandlers.ts +301 -10
- package/src/components/viewer/tools/GizmoOverlay.tsx +322 -0
- package/src/components/viewer/tools/SplitNumericInput.tsx +225 -0
- package/src/components/viewer/tools/SplitOverlay.tsx +242 -0
- package/src/components/viewer/tools/WallEndpointOverlay.tsx +252 -0
- package/src/components/viewer/useGeometryStreaming.ts +100 -1
- package/src/components/viewer/useMouseControls.ts +8 -1
- package/src/hooks/useBCF.ts +6 -6
- package/src/hooks/useCameraTickSubscription.ts +62 -0
- package/src/hooks/useIfc.ts +4 -0
- package/src/hooks/useIfcFederation.ts +368 -20
- package/src/hooks/useKeyboardShortcuts.ts +86 -0
- package/src/hooks/useLevelDisplayEffect.ts +160 -0
- package/src/hooks/useViewerSelectors.ts +8 -0
- package/src/lib/__test__/stubs.ts +110 -0
- package/src/lib/geo/cesium-bridge.ts +3 -3
- package/src/lib/geo/cesium-placement.test.ts +28 -12
- package/src/lib/geo/cesium-placement.ts +16 -10
- package/src/lib/geo/effective-georef.test.ts +23 -7
- package/src/lib/geo/geo-scale.ts +58 -2
- package/src/lib/geo/ifc-origin.test.ts +176 -0
- package/src/lib/geo/ifc-origin.ts +144 -0
- package/src/lib/geo/precision-grids.ts +444 -0
- package/src/lib/geo/reproject.test.ts +88 -0
- package/src/lib/geo/reproject.ts +168 -36
- package/src/lib/level-offsets.test.ts +153 -0
- package/src/lib/level-offsets.ts +140 -0
- package/src/lib/linear-element-edit.test.ts +220 -0
- package/src/lib/linear-element-edit.ts +327 -0
- package/src/lib/metadata-clone.test.ts +173 -0
- package/src/lib/metadata-clone.ts +124 -0
- package/src/lib/placement-core.ts +340 -0
- package/src/lib/placement-edit.boot.ts +21 -0
- package/src/lib/placement-edit.test.ts +464 -0
- package/src/lib/placement-edit.ts +47 -0
- package/src/lib/polygon-clip.test.ts +193 -0
- package/src/lib/polygon-clip.ts +199 -0
- package/src/lib/slab-edit.test.ts +169 -0
- package/src/lib/slab-edit.ts +312 -0
- package/src/lib/wall-edit.ts +342 -0
- package/src/lib/wall-opening-reassign.test.ts +291 -0
- package/src/lib/wall-opening-reassign.ts +241 -0
- package/src/main.tsx +4 -0
- package/src/store/index.ts +7 -0
- package/src/store/slices/cesiumSlice.ts +61 -8
- package/src/store/slices/dataSlice.ts +80 -0
- package/src/store/slices/levelDisplaySlice.ts +105 -0
- package/src/store/slices/modelSlice.test.ts +19 -0
- package/src/store/slices/mutationSlice.ts +1138 -1
- package/src/store/slices/splitToolSlice.ts +165 -0
- package/src/store/slices/uiSlice.edit-mode.test.ts +210 -0
- package/src/store/slices/uiSlice.ts +78 -1
- package/src/store/types.ts +57 -2
- package/src/utils/createBlankIfc.ts +37 -0
- package/tsconfig.json +1 -0
- package/.turbo/turbo-typecheck.log +0 -4
- package/dist/assets/arrow2_bg-BoXCojjR.wasm +0 -0
- package/dist/assets/browser-CVf8ATeW.js +0 -694
- package/dist/assets/emscripten-module-BTRCZGcB.wasm +0 -0
- package/dist/assets/emscripten-module-CGIn_cMh.wasm +0 -0
- package/dist/assets/emscripten-module-DYvzWiHh.wasm +0 -0
- package/dist/assets/emscripten-module-NWak2PoB.wasm +0 -0
- package/dist/assets/emscripten-module.browser-DcFZLAUx.js +0 -1
- package/dist/assets/esbuild-COv63sf-.js +0 -1
- package/dist/assets/event-DIOks52T.js +0 -1
- package/dist/assets/ffi-DlhRHxHv.js +0 -1
- package/dist/assets/ifc-lite_bg-CSeT3fNI.wasm +0 -0
- package/dist/assets/ifc-lite_bg-ns4cSnX2.wasm +0 -0
- package/dist/assets/index-BZC2YaOP.css +0 -1
- package/dist/assets/index-HqAIQkr6.js +0 -22
- package/dist/assets/laz-perf-Cvr_Lepg.js +0 -1
- package/dist/assets/maplibre-gl-C4LXKM6c.js +0 -808
- package/dist/assets/three-DwNDHx9-.js +0 -4049
- package/dist/assets/wasm-bridge-Cha08LdC.js +0 -1
- package/dist/cesium/Workers/chunk-23ZQ2IVV.js +0 -29
- package/dist/cesium/Workers/chunk-2EQO3Q56.js +0 -26
- package/dist/cesium/Workers/chunk-2TE5NTVD.js +0 -26
- package/dist/cesium/Workers/chunk-BXMEEOCS.js +0 -63
- package/dist/cesium/Workers/chunk-BYLCY7GP.js +0 -29
- package/dist/cesium/Workers/chunk-CTHM3W6I.js +0 -26
- package/dist/cesium/Workers/chunk-E3JOOS3S.js +0 -26
- package/dist/cesium/Workers/chunk-F6PRE7D6.js +0 -26
- package/dist/cesium/Workers/chunk-FFBVWF2L.js +0 -26
- package/dist/cesium/Workers/chunk-GBAA6GVX.js +0 -26
- package/dist/cesium/Workers/chunk-ILRYTWTP.js +0 -26
- package/dist/cesium/Workers/chunk-IRNLBSEJ.js +0 -26
- package/dist/cesium/Workers/chunk-L6QHHACZ.js +0 -26
- package/dist/cesium/Workers/chunk-NMVKML6W.js +0 -26
- package/dist/cesium/Workers/chunk-OIRKANTH.js +0 -26
- package/dist/cesium/Workers/chunk-QKUIYMGC.js +0 -28
- package/dist/cesium/Workers/chunk-SQMIIXB7.js +0 -26
- package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +0 -26
- package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +0 -26
- package/dist/cesium/Workers/createGroundPolylineGeometry.js +0 -26
- package/dist/cesium/Workers/transcodeKTX2.js +0 -56
- package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +0 -26
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_0.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_1.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_10.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_11.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_12.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_13.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_14.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_15.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_16.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_17.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_18.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_19.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_2.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_20.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_21.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_22.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_23.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_24.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_25.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_26.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_27.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_3.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_4.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_5.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_6.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_7.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_8.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_9.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/bing_maps_credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/cesium_credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/google_earth_credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/ion-credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/LensFlare/DirtMask.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/LensFlare/StarBurst.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/0/0/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/0/1/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/0/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/0/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/1/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/1/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/2/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/2/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/3/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/3/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/tilemapresource.xml +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/airfield.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/airport.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/alcohol-shop.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/america-football.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/art-gallery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bakery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bank.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bar.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/baseball.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/basketball.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/beer.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bicycle.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/building.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bus.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cafe.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/camera.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/campsite.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/car.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cemetery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cesium.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/chemist.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cinema.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/circle-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/circle.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/city.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/clothing-store.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/college.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/commercial.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cricket.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cross.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/dam.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/danger.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/disability.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/dog-park.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/embassy.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/emergency-telephone.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/entrance.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/farm.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fast-food.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/ferry.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fire-station.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fuel.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/garden.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/gift.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/golf.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/grocery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/hairdresser.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/harbor.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/heart.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/heliport.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/hospital.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/ice-cream.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/industrial.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/land-use.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/laundry.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/library.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/lighthouse.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/lodging.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/logging.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/london-underground.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/marker-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/marker.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/minefield.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/mobilephone.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/monument.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/museum.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/music.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/oil-well.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/park.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/park2.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/parking-garage.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/parking.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/pharmacy.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/pitch.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/place-of-worship.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/playground.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/police.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/polling-place.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/post.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/prison.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-above.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-light.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-metro.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-underground.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-christian.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-jewish.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-muslim.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/restaurant.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/roadblock.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rocket.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/school.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/scooter.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/shop.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/skiing.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/slaughterhouse.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/soccer.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/square-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/square.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/star-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/star.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/suitcase.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/swimming.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/telephone.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/tennis.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/theatre.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/toilets.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/town-hall.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/town.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/triangle-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/triangle.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/village.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/warehouse.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/waste-basket.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/water.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/wetland.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/zoo.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/moonSmall.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/pin.svg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/waterNormals.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/waterNormalsSmall.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/approximateTerrainHeights.json +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/Workers/package.json +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/Workers/zip-web-worker.js +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/basis_transcoder.wasm +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/draco_decoder.wasm +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/google-earth-dbroot-parser.js +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/wasm_splats_bg.wasm +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/zip-module.wasm +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Animation/Animation.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Animation/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/BaseLayerPicker/BaseLayerPicker.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/BaseLayerPicker/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Cesium3DTilesInspector/Cesium3DTilesInspector.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumInspector/CesiumInspector.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumWidget/CesiumWidget.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumWidget/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/FullscreenButton/FullscreenButton.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Geocoder/Geocoder.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Geocoder/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/azureAerial.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/azureRoads.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingAerial.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingAerialLabels.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingRoads.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/blueMarble.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/earthAtNight.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleContour.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleRoadmap.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleSatellite.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxSatellite.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxStreets.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxTerrain.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/naturalEarthII.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/openStreetMap.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/sentinel-2.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stamenToner.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stamenWatercolor.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/Mouse.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseLeft.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseMiddle.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseRight.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/Touch.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchDrag.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchRotate.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchTilt.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchZoom.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TerrainProviders/Ellipsoid.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TimelineIcons.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/info-loading.gif +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/InfoBox/InfoBox.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/InfoBox/InfoBoxDescription.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/NavigationHelpButton/NavigationHelpButton.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/NavigationHelpButton/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/PerformanceWatchdog/PerformanceWatchdog.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/ProjectionPicker/ProjectionPicker.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/SceneModePicker/SceneModePicker.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/SelectionIndicator/SelectionIndicator.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Timeline/Timeline.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Timeline/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/VRButton/VRButton.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Viewer/Viewer.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/VoxelInspector/VoxelInspector.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/lighterShared.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/shared.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/widgets.css +0 -0
|
@@ -48,6 +48,7 @@ export function useKeyboardShortcuts(options: KeyboardShortcutsOptions = {}) {
|
|
|
48
48
|
const hideEntities = useViewerStore((s) => s.hideEntities);
|
|
49
49
|
const toggleTheme = useViewerStore((s) => s.toggleTheme);
|
|
50
50
|
const toggleBasketPresentationVisible = useViewerStore((s) => s.toggleBasketPresentationVisible);
|
|
51
|
+
const toggleEditEnabled = useViewerStore((s) => s.toggleEditEnabled);
|
|
51
52
|
|
|
52
53
|
// Measure tool specific actions
|
|
53
54
|
const activeMeasurement = useViewerStore((s) => s.activeMeasurement);
|
|
@@ -71,6 +72,19 @@ export function useKeyboardShortcuts(options: KeyboardShortcutsOptions = {}) {
|
|
|
71
72
|
const shift = e.shiftKey;
|
|
72
73
|
const key = e.key.toLowerCase();
|
|
73
74
|
|
|
75
|
+
// Undo / Redo — Ctrl/Cmd+Z and Ctrl/Cmd+Shift+Z, scoped to the
|
|
76
|
+
// active model's mutation stack. Always available regardless
|
|
77
|
+
// of edit mode so the user can recover from any change.
|
|
78
|
+
if (key === 'z' && ctrl) {
|
|
79
|
+
e.preventDefault();
|
|
80
|
+
const state = useViewerStore.getState();
|
|
81
|
+
const activeModelId = state.activeModelId;
|
|
82
|
+
if (!activeModelId) return;
|
|
83
|
+
if (shift) state.redo(activeModelId);
|
|
84
|
+
else state.undo(activeModelId);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
74
88
|
// Navigation tools
|
|
75
89
|
if (key === 'v' && !ctrl && !shift) {
|
|
76
90
|
e.preventDefault();
|
|
@@ -93,6 +107,60 @@ export function useKeyboardShortcuts(options: KeyboardShortcutsOptions = {}) {
|
|
|
93
107
|
setActiveTool('annotate');
|
|
94
108
|
}
|
|
95
109
|
|
|
110
|
+
// Global edit-mode pill — unlocks inline property/attribute
|
|
111
|
+
// editors, add-element draw tools, georeference placement, and
|
|
112
|
+
// future geometry manipulators. Toggle from anywhere outside an
|
|
113
|
+
// input field.
|
|
114
|
+
if (key === 'e' && !ctrl && !shift) {
|
|
115
|
+
e.preventDefault();
|
|
116
|
+
toggleEditEnabled();
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// K = knife / Split. Operates only on the currently selected
|
|
120
|
+
// entity — there's no free-roam "hover anything and split" mode
|
|
121
|
+
// any more. If there's no selection, the keypress is a no-op
|
|
122
|
+
// (a toast would be noisy; the user can see no entity is
|
|
123
|
+
// selected). The action also pre-arms the splitTarget so the
|
|
124
|
+
// overlay knows what to draw the moment Split engages.
|
|
125
|
+
if (key === 'k' && !ctrl && !shift) {
|
|
126
|
+
e.preventDefault();
|
|
127
|
+
const state = useViewerStore.getState();
|
|
128
|
+
if (state.activeTool === 'split') {
|
|
129
|
+
state.clearSplitHover();
|
|
130
|
+
state.setActiveTool('select');
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const sel = state.selectedEntity;
|
|
134
|
+
if (!sel) return;
|
|
135
|
+
state.setSplitTarget(sel.modelId, sel.expressId);
|
|
136
|
+
state.setActiveTool('split');
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// R / Shift+R = rotate selected entity ±15° about the storey-up
|
|
140
|
+
// Z axis. Only fires while edit mode is on and a single entity
|
|
141
|
+
// is selected. The rotateEntity action handles the placement
|
|
142
|
+
// chain walk + undo registration.
|
|
143
|
+
if (key === 'r' && !ctrl) {
|
|
144
|
+
const state = useViewerStore.getState();
|
|
145
|
+
if (state.editEnabled && state.selectedEntity) {
|
|
146
|
+
e.preventDefault();
|
|
147
|
+
const deltaDeg = shift ? -15 : 15;
|
|
148
|
+
const result = state.rotateEntity(
|
|
149
|
+
state.selectedEntity.modelId,
|
|
150
|
+
state.selectedEntity.expressId,
|
|
151
|
+
(deltaDeg * Math.PI) / 180,
|
|
152
|
+
);
|
|
153
|
+
if (!result.ok) {
|
|
154
|
+
// Surface the reason via the existing toast helper rather
|
|
155
|
+
// than a console warning — the user just pressed a key and
|
|
156
|
+
// deserves immediate feedback.
|
|
157
|
+
void import('@/components/ui/toast').then((m) => {
|
|
158
|
+
m.toast.error(`Couldn't rotate: ${result.reason}`);
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
96
164
|
// Basket controls (automatic context source)
|
|
97
165
|
// I = Isolate from current context
|
|
98
166
|
if (key === 'i' && !ctrl && !shift) {
|
|
@@ -154,6 +222,18 @@ export function useKeyboardShortcuts(options: KeyboardShortcutsOptions = {}) {
|
|
|
154
222
|
resetVisibilityForHomeFromStore();
|
|
155
223
|
}
|
|
156
224
|
|
|
225
|
+
// Split tool — Esc exits Split and returns to Select. We catch
|
|
226
|
+
// it here before the global Esc handler so the user gets a
|
|
227
|
+
// gentle exit (clear hover, swap tool) rather than the global
|
|
228
|
+
// "clear all selection + visibility" cascade.
|
|
229
|
+
if (activeTool === 'split' && key === 'escape') {
|
|
230
|
+
e.preventDefault();
|
|
231
|
+
const state = useViewerStore.getState();
|
|
232
|
+
state.clearSplitHover();
|
|
233
|
+
state.setActiveTool('select');
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
|
|
157
237
|
// Add-element tool shortcuts — Enter commits an in-progress slab
|
|
158
238
|
// polygon; Esc clears any pending points before falling through to
|
|
159
239
|
// the global Esc handler (which exits the tool).
|
|
@@ -250,6 +330,7 @@ export function useKeyboardShortcuts(options: KeyboardShortcutsOptions = {}) {
|
|
|
250
330
|
cancelMeasurement,
|
|
251
331
|
clearMeasurements,
|
|
252
332
|
toggleSnap,
|
|
333
|
+
toggleEditEnabled,
|
|
253
334
|
]);
|
|
254
335
|
|
|
255
336
|
useEffect(() => {
|
|
@@ -264,11 +345,16 @@ export function useKeyboardShortcuts(options: KeyboardShortcutsOptions = {}) {
|
|
|
264
345
|
|
|
265
346
|
// Export shortcut definitions for UI display
|
|
266
347
|
export const KEYBOARD_SHORTCUTS = [
|
|
348
|
+
{ key: 'Ctrl+Z / Cmd+Z', description: 'Undo last authoring change for the active model', category: 'Editing' },
|
|
349
|
+
{ key: 'Ctrl+Shift+Z / Cmd+Shift+Z', description: 'Redo last undone change', category: 'Editing' },
|
|
267
350
|
{ key: 'V', description: 'Select tool', category: 'Tools' },
|
|
268
351
|
{ key: 'C', description: 'Walk mode', category: 'Tools' },
|
|
269
352
|
{ key: 'M', description: 'Measure tool', category: 'Tools' },
|
|
270
353
|
{ key: 'P', description: 'Annotate tool — drop a pin with a note', category: 'Tools' },
|
|
271
354
|
{ key: 'X', description: 'Section tool', category: 'Tools' },
|
|
355
|
+
{ key: 'E', description: 'Toggle edit mode (unlocks property + geometry edits)', category: 'Tools' },
|
|
356
|
+
{ key: 'K', description: 'Split the selected entity (requires a selection)', category: 'Tools' },
|
|
357
|
+
{ key: 'R / Shift+R', description: 'Rotate selected entity ±15° about Z (requires edit mode)', category: 'Tools' },
|
|
272
358
|
{ key: 'S', description: 'Toggle snapping (Measure tool)', category: 'Tools' },
|
|
273
359
|
{ key: 'Esc', description: 'Cancel measurement (Measure tool)', category: 'Tools' },
|
|
274
360
|
{ key: 'Ctrl+C', description: 'Clear measurements (Measure tool)', category: 'Tools' },
|
|
@@ -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
|
+
* Drive Exploded / Solo level display modes from the slice state.
|
|
7
|
+
*
|
|
8
|
+
* Stacked:
|
|
9
|
+
* - Subtract any previously-applied Exploded offsets so the
|
|
10
|
+
* renderer's mesh positions revert to their loaded values.
|
|
11
|
+
* - Clear isolation if we're coming out of Solo.
|
|
12
|
+
*
|
|
13
|
+
* Exploded:
|
|
14
|
+
* - Compute per-storey offsets via `computeStoreyOffsets` for
|
|
15
|
+
* each loaded model.
|
|
16
|
+
* - Diff against the per-model `appliedStoreyOffsets` and push
|
|
17
|
+
* the deltas into `pendingMeshTranslations` so the renderer
|
|
18
|
+
* applies them on the next frame.
|
|
19
|
+
* - Stash the new applied offsets on the slice so the next
|
|
20
|
+
* toggle / gap change knows what to subtract.
|
|
21
|
+
*
|
|
22
|
+
* Solo:
|
|
23
|
+
* - Use the existing `setIsolatedEntities` channel to gate
|
|
24
|
+
* visibility to the chosen storey's entities (resolved to
|
|
25
|
+
* federation global ids).
|
|
26
|
+
*
|
|
27
|
+
* The hook reads from a slim selector (`useViewerStore`) and only
|
|
28
|
+
* runs its work when `levelDisplayMode`, `explodedGap`, or the
|
|
29
|
+
* set of loaded models changes. No per-frame work.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
import { useEffect, useRef } from 'react';
|
|
33
|
+
import { useViewerStore } from '@/store';
|
|
34
|
+
import { toGlobalIdFromModels } from '@/store/globalId';
|
|
35
|
+
import {
|
|
36
|
+
computeStoreyOffsets,
|
|
37
|
+
diffStoreyOffsets,
|
|
38
|
+
buildEntityTranslations,
|
|
39
|
+
entitiesInStorey,
|
|
40
|
+
type StoreyOffsets,
|
|
41
|
+
} from '@/lib/level-offsets';
|
|
42
|
+
|
|
43
|
+
export function useLevelDisplayEffect(): void {
|
|
44
|
+
const levelDisplayMode = useViewerStore((s) => s.levelDisplayMode);
|
|
45
|
+
const explodedGap = useViewerStore((s) => s.explodedGap);
|
|
46
|
+
const soloStorey = useViewerStore((s) => s.soloStorey);
|
|
47
|
+
const models = useViewerStore((s) => s.models);
|
|
48
|
+
const activeModelId = useViewerStore((s) => s.activeModelId);
|
|
49
|
+
const appliedStoreyOffsets = useViewerStore((s) => s.appliedStoreyOffsets);
|
|
50
|
+
const setAppliedStoreyOffsets = useViewerStore((s) => s.setAppliedStoreyOffsets);
|
|
51
|
+
const setPendingMeshTranslations = useViewerStore((s) => s.setPendingMeshTranslations);
|
|
52
|
+
const setIsolatedEntities = useViewerStore((s) => s.setIsolatedEntities);
|
|
53
|
+
|
|
54
|
+
// Track the last-applied mode so the cleanup logic can tell
|
|
55
|
+
// "user is exiting Exploded" from "user is changing gap inside
|
|
56
|
+
// Exploded". Without this, the diff math handles both, but
|
|
57
|
+
// having a discrete flag makes it cheap to skip Solo→Solo
|
|
58
|
+
// re-entry without touching translations.
|
|
59
|
+
const lastModeRef = useRef(levelDisplayMode);
|
|
60
|
+
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
// Compute the target Exploded offsets per model. `target` is
|
|
63
|
+
// empty when Exploded isn't active — diff against the
|
|
64
|
+
// previously-applied offsets will revert any lifts.
|
|
65
|
+
const target: typeof appliedStoreyOffsets = new Map();
|
|
66
|
+
if (levelDisplayMode === 'exploded') {
|
|
67
|
+
for (const [modelId, model] of models) {
|
|
68
|
+
if (!model.ifcDataStore) continue;
|
|
69
|
+
const offsets = computeStoreyOffsets(model.ifcDataStore, explodedGap);
|
|
70
|
+
if (offsets.size > 0) target.set(modelId, offsets);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Build the renderer-frame translation map by diffing the
|
|
75
|
+
// target against the slice's applied snapshot, per model. Sum
|
|
76
|
+
// into a single Map<globalId, [dx,dy,dz]> so one push covers
|
|
77
|
+
// the whole scene.
|
|
78
|
+
const aggregated = new Map<number, [number, number, number]>();
|
|
79
|
+
const modelIds = new Set<string>([
|
|
80
|
+
...models.keys(),
|
|
81
|
+
...appliedStoreyOffsets.keys(),
|
|
82
|
+
]);
|
|
83
|
+
for (const modelId of modelIds) {
|
|
84
|
+
const targetMap: StoreyOffsets = target.get(modelId) ?? new Map();
|
|
85
|
+
const previousMap: StoreyOffsets = appliedStoreyOffsets.get(modelId) ?? new Map();
|
|
86
|
+
const diff = diffStoreyOffsets(targetMap, previousMap);
|
|
87
|
+
if (diff.size === 0) continue;
|
|
88
|
+
const dataStore = models.get(modelId)?.ifcDataStore;
|
|
89
|
+
if (!dataStore) continue;
|
|
90
|
+
const toGlobalId = (localExpressId: number): number =>
|
|
91
|
+
toGlobalIdFromModels(models, modelId, localExpressId);
|
|
92
|
+
const perEntity = buildEntityTranslations(dataStore, diff, toGlobalId);
|
|
93
|
+
for (const [id, delta] of perEntity) {
|
|
94
|
+
const existing = aggregated.get(id);
|
|
95
|
+
if (existing) {
|
|
96
|
+
aggregated.set(id, [existing[0] + delta[0], existing[1] + delta[1], existing[2] + delta[2]]);
|
|
97
|
+
} else {
|
|
98
|
+
aggregated.set(id, [delta[0], delta[1], delta[2]]);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (aggregated.size > 0) {
|
|
103
|
+
setPendingMeshTranslations(aggregated);
|
|
104
|
+
}
|
|
105
|
+
setAppliedStoreyOffsets(target);
|
|
106
|
+
|
|
107
|
+
// Solo isolation. Resolve against the (modelId, expressId)
|
|
108
|
+
// pair the slice stores so federated scenes with overlapping
|
|
109
|
+
// storey express-ids isolate the right one. Slice default is
|
|
110
|
+
// null → pick the lowest-elevation storey of the active model.
|
|
111
|
+
if (levelDisplayMode === 'solo') {
|
|
112
|
+
let targetModelId: string | null = soloStorey?.modelId ?? null;
|
|
113
|
+
let storeyId: number | null = soloStorey?.expressId ?? null;
|
|
114
|
+
if (targetModelId === null || storeyId === null) {
|
|
115
|
+
// Cold-start default — fall back to the active model's
|
|
116
|
+
// lowest storey ONLY when the slice has no explicit pick.
|
|
117
|
+
const fallbackModelId = activeModelId ?? models.keys().next().value ?? null;
|
|
118
|
+
const fallbackStore = fallbackModelId ? models.get(fallbackModelId)?.ifcDataStore : undefined;
|
|
119
|
+
if (fallbackModelId && fallbackStore) {
|
|
120
|
+
const elevations = fallbackStore.spatialHierarchy?.storeyElevations;
|
|
121
|
+
if (elevations && elevations.size > 0) {
|
|
122
|
+
const lowest = [...elevations.entries()].sort((a, b) => a[1] - b[1])[0][0];
|
|
123
|
+
targetModelId = fallbackModelId;
|
|
124
|
+
storeyId = lowest;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const targetStore = targetModelId ? models.get(targetModelId)?.ifcDataStore : undefined;
|
|
129
|
+
if (targetModelId !== null && storeyId !== null && targetStore) {
|
|
130
|
+
const resolvedModelId = targetModelId;
|
|
131
|
+
const toGlobalId = (localExpressId: number): number =>
|
|
132
|
+
toGlobalIdFromModels(models, resolvedModelId, localExpressId);
|
|
133
|
+
const ids = entitiesInStorey(targetStore, storeyId, toGlobalId);
|
|
134
|
+
setIsolatedEntities(new Set(ids));
|
|
135
|
+
} else {
|
|
136
|
+
setIsolatedEntities(null);
|
|
137
|
+
}
|
|
138
|
+
} else if (lastModeRef.current === 'solo') {
|
|
139
|
+
// Leaving Solo → drop isolation. (User may have manually
|
|
140
|
+
// re-isolated via the basket; we still clear because the
|
|
141
|
+
// Solo cleanup should be predictable. Tradeoff documented.)
|
|
142
|
+
setIsolatedEntities(null);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
lastModeRef.current = levelDisplayMode;
|
|
146
|
+
// appliedStoreyOffsets is intentionally NOT a dep — we write
|
|
147
|
+
// to it as a side effect; depending on it would loop. The
|
|
148
|
+
// ref-based last-mode check covers the Solo→other case.
|
|
149
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
150
|
+
}, [
|
|
151
|
+
levelDisplayMode,
|
|
152
|
+
explodedGap,
|
|
153
|
+
soloStorey,
|
|
154
|
+
models,
|
|
155
|
+
activeModelId,
|
|
156
|
+
setPendingMeshTranslations,
|
|
157
|
+
setIsolatedEntities,
|
|
158
|
+
setAppliedStoreyOffsets,
|
|
159
|
+
]);
|
|
160
|
+
}
|
|
@@ -212,14 +212,22 @@ export function useContextMenuState() {
|
|
|
212
212
|
export function useColorUpdateState() {
|
|
213
213
|
const pendingColorUpdates = useViewerStore((state) => state.pendingColorUpdates);
|
|
214
214
|
const pendingMeshColorUpdates = useViewerStore((state) => state.pendingMeshColorUpdates);
|
|
215
|
+
const pendingMeshRemovals = useViewerStore((state) => state.pendingMeshRemovals);
|
|
216
|
+
const pendingMeshTranslations = useViewerStore((state) => state.pendingMeshTranslations);
|
|
215
217
|
const clearPendingColorUpdates = useViewerStore((state) => state.clearPendingColorUpdates);
|
|
216
218
|
const clearPendingMeshColorUpdates = useViewerStore((state) => state.clearPendingMeshColorUpdates);
|
|
219
|
+
const clearPendingMeshRemovals = useViewerStore((state) => state.clearPendingMeshRemovals);
|
|
220
|
+
const clearPendingMeshTranslations = useViewerStore((state) => state.clearPendingMeshTranslations);
|
|
217
221
|
|
|
218
222
|
return {
|
|
219
223
|
pendingColorUpdates,
|
|
220
224
|
pendingMeshColorUpdates,
|
|
225
|
+
pendingMeshRemovals,
|
|
226
|
+
pendingMeshTranslations,
|
|
221
227
|
clearPendingColorUpdates,
|
|
222
228
|
clearPendingMeshColorUpdates,
|
|
229
|
+
clearPendingMeshRemovals,
|
|
230
|
+
clearPendingMeshTranslations,
|
|
223
231
|
};
|
|
224
232
|
}
|
|
225
233
|
|
|
@@ -0,0 +1,110 @@
|
|
|
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
|
+
* Test stubs shared across the lib/ helper test suites. Each
|
|
7
|
+
* helper that walks the IFC attribute graph
|
|
8
|
+
* (placement-core / wall-edit / slab-edit / linear-element-edit /
|
|
9
|
+
* metadata-clone / wall-opening-reassign) wants the same minimal
|
|
10
|
+
* mocks: an in-memory `StoreEditor` that returns overlay entities
|
|
11
|
+
* + records positional writes, a `MutablePropertyView` whose
|
|
12
|
+
* `getPositionalMutationsForEntity` is a no-op, and an
|
|
13
|
+
* `IfcDataStore` shim with a `entityIndex.byType` map for the
|
|
14
|
+
* helpers that scan by type. Centralising them here removes the
|
|
15
|
+
* five-way duplication and keeps the harness consistent when one
|
|
16
|
+
* helper's contract evolves.
|
|
17
|
+
*
|
|
18
|
+
* Production code never imports from this module — the lib/
|
|
19
|
+
* helpers take their dependencies via constructor / parameter so
|
|
20
|
+
* the real `@ifc-lite/mutations` + `@ifc-lite/parser` types slot
|
|
21
|
+
* in at runtime.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import type { reassignWallOpenings } from '../wall-opening-reassign.js';
|
|
25
|
+
|
|
26
|
+
export interface OverlayEntity {
|
|
27
|
+
expressId: number;
|
|
28
|
+
type: string;
|
|
29
|
+
attributes: unknown[];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Minimal `StoreEditor` stand-in. Records positional writes by
|
|
34
|
+
* mutating the matching overlay entity's `attributes` array (same
|
|
35
|
+
* effect the real editor has via the property view). `addEntity`
|
|
36
|
+
* mirrors the real editor for tests that exercise creation paths
|
|
37
|
+
* (rotation IfcDirection materialise, etc.).
|
|
38
|
+
*/
|
|
39
|
+
export class StubStoreEditor {
|
|
40
|
+
private overlay = new Map<number, OverlayEntity>();
|
|
41
|
+
private positional = new Map<number, Map<number, unknown>>();
|
|
42
|
+
private nextId: number;
|
|
43
|
+
|
|
44
|
+
constructor(initial: OverlayEntity[]) {
|
|
45
|
+
for (const e of initial) this.overlay.set(e.expressId, e);
|
|
46
|
+
this.nextId = Math.max(0, ...initial.map((e) => e.expressId)) + 1;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
getNewEntity(id: number): OverlayEntity | null {
|
|
50
|
+
return this.overlay.get(id) ?? null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
setPositionalAttribute(id: number, index: number, value: unknown): void {
|
|
54
|
+
let entry = this.positional.get(id);
|
|
55
|
+
if (!entry) {
|
|
56
|
+
entry = new Map();
|
|
57
|
+
this.positional.set(id, entry);
|
|
58
|
+
}
|
|
59
|
+
entry.set(index, value);
|
|
60
|
+
const ent = this.overlay.get(id);
|
|
61
|
+
if (ent) ent.attributes[index] = value;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
addEntity(type: string, attributes: unknown[]): { expressId: number } {
|
|
65
|
+
const id = this.nextId++;
|
|
66
|
+
this.overlay.set(id, { expressId: id, type, attributes: attributes.slice() });
|
|
67
|
+
return { expressId: id };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Minimal `MutablePropertyView` stand-in. Returns no positional
|
|
73
|
+
* overrides by default. Tests that need pre-mutation state can
|
|
74
|
+
* call `setPositionalForTest` to seed an override; the helper
|
|
75
|
+
* then reads it back via `getPositionalMutationsForEntity`.
|
|
76
|
+
*/
|
|
77
|
+
export class StubView {
|
|
78
|
+
private positional = new Map<number, Map<number, unknown>>();
|
|
79
|
+
|
|
80
|
+
getPositionalMutationsForEntity(id: number): Map<number, unknown> | null {
|
|
81
|
+
return this.positional.get(id) ?? null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
setPositionalForTest(id: number, index: number, value: unknown): void {
|
|
85
|
+
let entry = this.positional.get(id);
|
|
86
|
+
if (!entry) {
|
|
87
|
+
entry = new Map();
|
|
88
|
+
this.positional.set(id, entry);
|
|
89
|
+
}
|
|
90
|
+
entry.set(index, value);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Stub `IfcDataStore` — only the `entityIndex.byType` map is
|
|
96
|
+
* meaningfully populated. `source` is an empty buffer; `byId` is
|
|
97
|
+
* an empty map so the parser-backed source reader (registered via
|
|
98
|
+
* `setSourceAttrsReader` in production) never matches anything,
|
|
99
|
+
* which is correct for overlay-only test fixtures.
|
|
100
|
+
*
|
|
101
|
+
* Pass `byType: new Map([['IFCRELDEFINESBYPROPERTIES', [50]]])`
|
|
102
|
+
* to expose rels for `cloneElementMetadata` /
|
|
103
|
+
* `reassignWallOpenings` style tests.
|
|
104
|
+
*/
|
|
105
|
+
export function makeStubDataStore(byType: Map<string, number[]> = new Map()): Parameters<typeof reassignWallOpenings>[0] {
|
|
106
|
+
return {
|
|
107
|
+
source: new Uint8Array(),
|
|
108
|
+
entityIndex: { byId: new Map(), byType },
|
|
109
|
+
} as unknown as Parameters<typeof reassignWallOpenings>[0];
|
|
110
|
+
}
|
|
@@ -34,7 +34,7 @@ import {
|
|
|
34
34
|
type ResolveTerrainElevationOptions,
|
|
35
35
|
type TerrainElevationSample,
|
|
36
36
|
} from './terrain-elevation';
|
|
37
|
-
import { getEffectiveHorizontalScale } from './geo-scale';
|
|
37
|
+
import { getEffectiveHorizontalScale, resolveMapUnitToMetreScale } from './geo-scale';
|
|
38
38
|
|
|
39
39
|
export interface GeodesicPosition {
|
|
40
40
|
longitude: number;
|
|
@@ -94,7 +94,7 @@ export async function computeCesiumModelOrigin(
|
|
|
94
94
|
const absc = mapConversion.xAxisAbscissa ?? 1.0;
|
|
95
95
|
const ordi = mapConversion.xAxisOrdinate ?? 0.0;
|
|
96
96
|
const center = computeModelCenterInIfcMeters(coordinateInfo);
|
|
97
|
-
const mapScale = projectedCRS.mapUnitScale
|
|
97
|
+
const mapScale = resolveMapUnitToMetreScale(projectedCRS.mapUnitScale, lengthUnitScale);
|
|
98
98
|
const horizontalScale = getEffectiveHorizontalScale(
|
|
99
99
|
mapConversion.scale,
|
|
100
100
|
mapScale,
|
|
@@ -169,7 +169,7 @@ export async function createCesiumBridge(
|
|
|
169
169
|
height: origin.height,
|
|
170
170
|
};
|
|
171
171
|
const hScale = origin.horizontalScale;
|
|
172
|
-
const mapScale = projectedCRS.mapUnitScale
|
|
172
|
+
const mapScale = resolveMapUnitToMetreScale(projectedCRS.mapUnitScale, lengthUnitScale);
|
|
173
173
|
const oHeight = origin.height;
|
|
174
174
|
const originLon = origin.longitude;
|
|
175
175
|
const originLat = origin.latitude;
|
|
@@ -20,9 +20,19 @@ import {
|
|
|
20
20
|
} from './cesium-placement.js';
|
|
21
21
|
|
|
22
22
|
describe('cesium placement helpers', () => {
|
|
23
|
-
it('
|
|
24
|
-
|
|
23
|
+
it('defaults to METRES when MapUnit is absent (overrides project length unit)', () => {
|
|
24
|
+
// Per IFC4 spec, missing MapUnit falls back to the project's length unit.
|
|
25
|
+
// In practice (Bonsai/IfcOpenShell/Revit), MapConversion offsets are
|
|
26
|
+
// authored in METRES regardless of project unit. Honouring the spec
|
|
27
|
+
// pushes offsets thousands of km out of the CRS's valid range and lands
|
|
28
|
+
// models at the projection's antipode (Hans's IXAS_KW 018 file: mm
|
|
29
|
+
// project + MapConversion (126500, 480000) → South Pacific instead of
|
|
30
|
+
// Netherlands). See `resolveMapUnitToMetreScale` rationale.
|
|
31
|
+
assert.strictEqual(getMapUnitScale(undefined, 0.001), 1);
|
|
25
32
|
assert.strictEqual(getMapUnitScale({ mapUnitScale: 1 }, 0.001), 1);
|
|
33
|
+
// Explicit non-metre MapUnit still wins — the heuristic only fires when
|
|
34
|
+
// MapUnit is unset.
|
|
35
|
+
assert.strictEqual(getMapUnitScale({ mapUnitScale: 0.3048006096 }, 1), 0.3048006096);
|
|
26
36
|
});
|
|
27
37
|
|
|
28
38
|
it('converts between metres and map units using ProjectedCRS.mapUnitScale', () => {
|
|
@@ -41,7 +51,9 @@ describe('cesium placement helpers', () => {
|
|
|
41
51
|
assert.strictEqual(shouldPreferOrthometricTerrain(undefined), false);
|
|
42
52
|
});
|
|
43
53
|
|
|
44
|
-
it('
|
|
54
|
+
it('places the model at its authored IFC height — no terrain/storey clamp', () => {
|
|
55
|
+
// Model placement is purely IfcMapConversion.OrthogonalHeight + the
|
|
56
|
+
// geometry origin. Terrain and storey data never move the model.
|
|
45
57
|
const placement = computeCesiumPlacement({
|
|
46
58
|
coordinateInfo: {
|
|
47
59
|
originShift: { x: 0, y: 0, z: 0 },
|
|
@@ -61,21 +73,25 @@ describe('cesium placement helpers', () => {
|
|
|
61
73
|
storeyElevations: new Map([[1, -3], [2, 0], [3, 3]]),
|
|
62
74
|
});
|
|
63
75
|
|
|
76
|
+
// placementHeight == authored ifcOriginHeight, NOT terrain+anchorOffset.
|
|
77
|
+
assert.strictEqual(placement.placementHeight, 244);
|
|
78
|
+
// clampAnchorY / anchorOffset are still derived (gizmo + clip math use
|
|
79
|
+
// them) but no longer feed placementHeight.
|
|
64
80
|
assert.strictEqual(placement.clampAnchorY, 0);
|
|
65
81
|
assert.strictEqual(placement.anchorOffset, 3);
|
|
66
|
-
assert.strictEqual(placement.placementHeight, 248);
|
|
67
|
-
assert.strictEqual(placement.terrainClipY, 0);
|
|
68
82
|
assert.strictEqual(placement.preferOrthometricTerrain, true);
|
|
69
83
|
});
|
|
70
84
|
|
|
71
|
-
it('
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
});
|
|
85
|
+
it('keeps the authored height whether it is above OR below terrain', () => {
|
|
86
|
+
// Above terrain — unchanged.
|
|
87
|
+
const above = computeCesiumPlacement({ ifcOriginHeight: 244, terrainHeight: 195.4 });
|
|
88
|
+
assert.strictEqual(above.placementHeight, 244);
|
|
76
89
|
|
|
77
|
-
|
|
78
|
-
|
|
90
|
+
// Below terrain — the model stays sub-grade, NOT lifted to terrain.
|
|
91
|
+
// (Regression: the old Math.max floor pinned it to terrain, which froze
|
|
92
|
+
// the vertical placement gizmo and lifted basements above ground.)
|
|
93
|
+
const below = computeCesiumPlacement({ ifcOriginHeight: -20, terrainHeight: 70.61 });
|
|
94
|
+
assert.strictEqual(below.placementHeight, -20);
|
|
79
95
|
});
|
|
80
96
|
|
|
81
97
|
it('computes OrthogonalHeight from target base altitude with shift and RTC', () => {
|
|
@@ -7,15 +7,13 @@ import type { MapConversion, ProjectedCRS } from '@ifc-lite/parser';
|
|
|
7
7
|
|
|
8
8
|
import { findClampAnchorY } from './clamp-anchor';
|
|
9
9
|
import { computeModelCenterInIfcMeters } from './reproject';
|
|
10
|
-
import { getEffectiveHorizontalScale } from './geo-scale';
|
|
10
|
+
import { getEffectiveHorizontalScale, resolveMapUnitToMetreScale } from './geo-scale';
|
|
11
11
|
|
|
12
12
|
export function getMapUnitScale(
|
|
13
13
|
projectedCRS: Pick<ProjectedCRS, 'mapUnitScale'> | undefined,
|
|
14
14
|
lengthUnitScale: number,
|
|
15
15
|
): number {
|
|
16
|
-
|
|
17
|
-
if (typeof mapUnitScale === 'number' && mapUnitScale > 0) return mapUnitScale;
|
|
18
|
-
return lengthUnitScale > 0 ? lengthUnitScale : 1;
|
|
16
|
+
return resolveMapUnitToMetreScale(projectedCRS?.mapUnitScale, lengthUnitScale);
|
|
19
17
|
}
|
|
20
18
|
|
|
21
19
|
export function mapUnitsToMeters(
|
|
@@ -60,6 +58,18 @@ export interface CesiumPlacementResult {
|
|
|
60
58
|
preferOrthometricTerrain: boolean;
|
|
61
59
|
}
|
|
62
60
|
|
|
61
|
+
/**
|
|
62
|
+
* Resolve where the model sits in Cesium.
|
|
63
|
+
*
|
|
64
|
+
* Placement is PURELY the IFC's authored altitude — `ifcOriginHeight`
|
|
65
|
+
* (IfcMapConversion.OrthogonalHeight + the geometry origin). There is NO
|
|
66
|
+
* automatic terrain or storey clamp: the model goes exactly where the file
|
|
67
|
+
* says, full stop. Terrain is queried only to inform the camera and the
|
|
68
|
+
* optional below-terrain clip plane; it never moves the model.
|
|
69
|
+
*
|
|
70
|
+
* `clampAnchorY` / `anchorOffset` are still derived (the placement gizmo and
|
|
71
|
+
* the clip-plane math consume them) but they no longer feed `placementHeight`.
|
|
72
|
+
*/
|
|
63
73
|
export function computeCesiumPlacement({
|
|
64
74
|
coordinateInfo,
|
|
65
75
|
projectedCRS,
|
|
@@ -72,12 +82,8 @@ export function computeCesiumPlacement({
|
|
|
72
82
|
const minY = bounds?.min.y ?? 0;
|
|
73
83
|
const clampAnchorY = findClampAnchorY(bounds, storeyElevations);
|
|
74
84
|
const anchorOffset = modelCenterY - clampAnchorY;
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
: null;
|
|
78
|
-
const placementHeight = terrainPlacementHeight !== null
|
|
79
|
-
? Math.max(ifcOriginHeight, terrainPlacementHeight)
|
|
80
|
-
: ifcOriginHeight;
|
|
85
|
+
// Model placement = authored IFC altitude. No clamp. No auto-adjust.
|
|
86
|
+
const placementHeight = ifcOriginHeight;
|
|
81
87
|
|
|
82
88
|
return {
|
|
83
89
|
clampAnchorY,
|
|
@@ -166,13 +166,29 @@ describe('effective georeferencing', () => {
|
|
|
166
166
|
assert.strictEqual(getEffectiveHorizontalScale(2, 1, 1), 2);
|
|
167
167
|
});
|
|
168
168
|
|
|
169
|
-
it('
|
|
170
|
-
// Project mm, map m, Scale undefined
|
|
171
|
-
//
|
|
172
|
-
//
|
|
173
|
-
//
|
|
174
|
-
//
|
|
175
|
-
|
|
169
|
+
it('treats Scale=undefined + unit mismatch as author-meant-Scale=1/lus (Bonsai heuristic)', () => {
|
|
170
|
+
// Project mm, map m, Scale undefined. Spec-strict effective = 1 * 1 /
|
|
171
|
+
// 0.001 = 1000 would inflate metre-converted geometry 1000x, pushing
|
|
172
|
+
// proj4 inputs miles outside the CRS valid range — the model lands at
|
|
173
|
+
// the projection's antipode (Hans's IXAS_KW 018_georeffed.ifc bug).
|
|
174
|
+
// Bonsai/IfcOpenShell/Revit exports routinely omit Scale; the author's
|
|
175
|
+
// intent is "geometry and offsets share the same metric unit", which
|
|
176
|
+
// corresponds to Scale=lengthUnitScale/mapUnitScale per spec → effective 1.
|
|
177
|
+
assert.strictEqual(getEffectiveHorizontalScale(undefined, 1, 0.001), 1);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it('treats Scale=1 + unit mismatch the same as Scale=undefined (heuristic also fires)', () => {
|
|
181
|
+
// Same situation as above, but the file wrote Scale=1 explicitly (also
|
|
182
|
+
// common — Revit's IFC exporter does this). The heuristic must catch
|
|
183
|
+
// both the missing-Scale and the wrong-Scale=1 cases.
|
|
184
|
+
assert.strictEqual(getEffectiveHorizontalScale(1, 1, 0.001), 1);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it('preserves spec-strict math when Scale ≠ 1 (the author opted in to a real scaling)', () => {
|
|
188
|
+
// Scale=2 with mm project + m map says "multiply X_local by 2 when
|
|
189
|
+
// adding to map offsets" — deliberate, not a unit-bridging mistake.
|
|
190
|
+
// Effective = (2 * 1) / 0.001 = 2000.
|
|
191
|
+
assert.strictEqual(getEffectiveHorizontalScale(2, 1, 0.001), 2000);
|
|
176
192
|
});
|
|
177
193
|
|
|
178
194
|
it('falls back to 1 for non-positive lengthUnitScale or mapUnitScale', () => {
|