@ifc-lite/viewer 1.22.0 → 1.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +71 -44
- package/CHANGELOG.md +73 -0
- package/dist/assets/__vite-browser-external-B1O5LaIO.js +1 -0
- package/dist/assets/{arrow-fie-E7fe.js → arrow-CXWhTnNT.js} +1 -1
- package/dist/assets/{basketViewActivator-EHAhHlwN.js → basketViewActivator-Dn_bHUl2.js} +10 -10
- package/dist/assets/{bcf-Bhx-K17f.js → bcf-B9SFl84i.js} +2 -2
- package/dist/assets/browser-DXS29_v9.js +695 -0
- package/dist/assets/{cesium-B4ZIU9jS.js → cesium-BoVuJvTC.js} +5838 -5730
- package/dist/assets/{decode-worker-CYqSjk1n.js → decode-worker-CgM1iNSK.js} +1 -1
- package/dist/assets/deflate-yMpdCIqk.js +1 -0
- package/dist/assets/{drawing-2d-Bjy8YPrg.js → drawing-2d-C71b8Ugx.js} +1 -1
- package/dist/assets/emscripten-module-B1g2L2eS.wasm +0 -0
- package/dist/assets/emscripten-module-DHbYPfAp.wasm +0 -0
- package/dist/assets/emscripten-module-ZrHFMo7O.wasm +0 -0
- package/dist/assets/emscripten-module-uFzwHH0Y.wasm +0 -0
- package/dist/assets/emscripten-module.browser-BLJD5hhE.js +1 -0
- package/dist/assets/{esbuild-Cpd5nU_H.wasm → esbuild-CzsZLPr0.wasm} +0 -0
- package/dist/assets/esbuild-FgU11_Eg.js +1 -0
- package/dist/assets/event-B0kAzHa-.js +1 -0
- package/dist/assets/{exporters-KTio0Tdm.js → exporters-D-BvrNIg.js} +1361 -1330
- package/dist/assets/ffi-Boa1QuFa.js +1 -0
- package/dist/assets/{geometry-controller.worker-Cm2P_EJr.js → geometry-controller.worker-Cm5pvyR6.js} +2 -2
- package/dist/assets/geometry.worker-ClNvXIrj.js +1 -0
- package/dist/assets/geotiff-D1tvcDCb.js +3354 -0
- package/dist/assets/{ids-CS7VCFin.js → ids-DZLs0snJ.js} +6 -6
- package/dist/assets/{ifc-lite-C6wEhXa6.js → ifc-lite-BDg0iIbj.js} +2 -2
- package/dist/assets/ifc-lite_bg-BIryVCXQ.wasm +0 -0
- package/dist/assets/ifc-lite_bg-DyHX37GQ.wasm +0 -0
- package/dist/assets/{index-8k9h-ANq.js → index-CXSBhkcJ.js} +64181 -52931
- package/dist/assets/index-DMho-JA0.js +6 -0
- package/dist/assets/index-DS_xJQfP.css +1 -0
- package/dist/assets/jpeg-DUMcZp24.js +1 -0
- package/dist/assets/{laz-perf-DnSyzVYH.wasm → laz-perf-CFJp03W6.wasm} +0 -0
- package/dist/assets/laz-perf-DgUOSLeU.js +1 -0
- package/dist/assets/{laz-source-jj3xI5Y4.js → laz-source-BWjza0Iw.js} +2 -2
- package/dist/assets/{lens-CSASnhAL.js → lens-CpjUdqpw.js} +1 -1
- package/dist/assets/lerc-IN4uWojP.js +1 -0
- package/dist/assets/lzw-Cnw0hH-m.js +1 -0
- package/dist/assets/maplibre-gl-Do6O5tDc.js +800 -0
- package/dist/assets/{native-bridge-DNrEhx2R.js → native-bridge-BVf2uzoH.js} +3 -3
- package/dist/assets/packbits-BskJCwk0.js +1 -0
- package/dist/assets/pako.esm-Cram60i4.js +1 -0
- package/dist/assets/parquet_wasm_bg-DcKVfvto.wasm +0 -0
- package/dist/assets/{parser.worker-BcjkIo89.js → parser.worker-BdtkkaGf.js} +3 -3
- package/dist/assets/raw-DzTtEZIY.js +1 -0
- package/dist/assets/{sandbox-BSn5MyEJ.js → sandbox-VLI_y7cl.js} +1664 -1542
- package/dist/assets/{server-client-D-kU2XAF.js → server-client-BLcKaWQB.js} +4 -4
- package/dist/assets/three-CQBzFWY2.js +4104 -0
- package/dist/assets/wasm-bridge-BAfZh7YT.js +1 -0
- package/dist/assets/webimage-Db2xzze3.js +1 -0
- package/dist/assets/{workerHelpers-pUUnk9Wc.js → workerHelpers--sAYm9yN.js} +1 -1
- package/dist/assets/zstd-BDToOQyD.js +1 -0
- package/dist/cesium/{Workers/chunk-V7QEYVP3.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-236YIEYT.js} +2 -2
- package/dist/cesium/{Workers/chunk-5TJMAQVL.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-2ZYB3DYT.js} +2 -2
- package/dist/cesium/{Workers/chunk-UBOGZS7F.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-4M56RRIL.js} +2 -2
- package/dist/cesium/{Workers/chunk-OCWJRAXS.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-5BC2Q3QW.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-5XHUDY37.js +26 -0
- package/dist/cesium/{Workers/chunk-Z3QF2EHT.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-6WMLAJJP.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-72KUXMWU.js +26 -0
- package/dist/cesium/{Workers/chunk-EQ4YRVWL.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-7NQYTTAU.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-A35GG5WJ.js +26 -0
- package/dist/cesium/{Workers/chunk-FC4ZZ65J.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-AXNBHUAG.js} +2 -2
- package/dist/cesium/{Workers/chunk-BTSYJ5XU.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-DC3K7YTH.js} +2 -2
- package/dist/cesium/{Workers/chunk-SLT4J352.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-DRBPXGI7.js} +2 -2
- package/dist/cesium/{Workers/chunk-2MJIIVP4.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EARRZPMO.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EHC3BDVP.js +26 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EYZUSGKM.js +26 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EZSKHVA2.js +26 -0
- package/dist/cesium/{Workers/chunk-ICALLYLG.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-F3WJIFOO.js} +2 -2
- package/dist/cesium/{Workers/chunk-LSLE2RL4.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-FB7UV5BI.js} +2 -2
- package/dist/cesium/{Workers/chunk-CUUSNIVQ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-FC6IYMYF.js} +2 -2
- package/dist/cesium/{Workers/chunk-TNSUQXWK.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-GF67PEXE.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-GXEQRH2R.js +26 -0
- package/dist/cesium/{Workers/chunk-M4HLDBCG.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-I5NKQIWE.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IH7GXIUB.js +26 -0
- package/dist/cesium/{Workers/chunk-OIT7J4IC.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IPP3UFGH.js} +2 -2
- package/dist/cesium/{Workers/chunk-WWWZVEEH.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IYRGNBSH.js} +2 -2
- package/dist/cesium/{Workers/chunk-WPMZLB3Y.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-J6BM74AD.js} +2 -2
- package/dist/cesium/{Workers/chunk-QFM5DCMQ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-KG2GJUJT.js} +1 -1
- package/dist/cesium/{Workers/chunk-XQHLGIO7.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-L7UE5MMF.js} +2 -2
- package/dist/cesium/{Workers/chunk-EFBN7QNX.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LBZ34MHQ.js} +2 -2
- package/dist/cesium/{Workers/chunk-YP7I5QBZ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LOQDTQMX.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LYLRYC4L.js +29 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-MGPRMLLW.js +26 -0
- package/dist/cesium/{Workers/chunk-LI2ZSORM.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-NP26LKQA.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-OMUAZ3NM.js +26 -0
- package/dist/cesium/{Workers/chunk-S44JILQT.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PPFUDJN4.js} +2 -2
- package/dist/cesium/{Workers/chunk-EDVBB7SS.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PQ3V63XF.js} +2 -2
- package/dist/cesium/{Workers/chunk-Q5BPHJQF.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PWBQN4GK.js} +2 -2
- package/dist/cesium/{Workers/chunk-E7KYDCM5.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-QOTMLO2T.js} +2 -2
- package/dist/cesium/{Workers/chunk-XUSCFAVF.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-SP35IT73.js} +2 -2
- package/dist/cesium/{Workers/chunk-6BD4U3VO.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-T3ZGSZKA.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-TM6SYYHO.js +28 -0
- package/dist/cesium/{Workers/chunk-VUKYSU4H.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-TSGIJVWH.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-U3YGOX3C.js +63 -0
- package/dist/cesium/{Workers/chunk-7TVGLKQF.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VBYOXOSM.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VCOHJNKB.js +26 -0
- package/dist/cesium/{Workers/chunk-WBOV35NL.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VXAZXMUX.js} +2 -2
- package/dist/cesium/{Workers/chunk-IX4VMHEV.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VXCJOT4W.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-WPD3MB6X.js +26 -0
- package/dist/cesium/{Workers/chunk-V3OSTMM6.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-X4D5KUN5.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XEC656IT.js +26 -0
- package/dist/cesium/{Workers/chunk-MJHHSGEH.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XR53QRQS.js} +2 -2
- package/dist/cesium/{Workers/chunk-XFIQ5DEQ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XR7MN4PJ.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XU6O4MRS.js +26 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XZBHEBLF.js +29 -0
- package/dist/cesium/{Workers/chunk-OLZ3FYUM.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-Z2M4BF4E.js} +2 -2
- package/dist/cesium/{Workers/chunk-2ZBHLJST.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-Z4ERBZFB.js} +2 -2
- package/dist/cesium/{Workers/chunk-W37FE5GR.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-ZY2KCIWI.js} +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/combineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createBoxGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createBoxOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCircleGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCircleOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCoplanarPolygonGeometry.js +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCorridorGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCorridorOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCylinderGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCylinderOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipseGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipseOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipsoidGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipsoidOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createFrustumGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createFrustumOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createGeometry.js +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/createGroundPolylineGeometry.js +26 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPlaneGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPlaneOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolygonGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolygonOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolylineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolylineVolumeGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolylineVolumeOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createRectangleGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createRectangleOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createSimplePolylineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createSphereGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createSphereOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createTaskProcessorWorker.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTileClampedPolylines.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTileGeometries.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTilePoints.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTilePolygons.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTilePolylines.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromCesium3DTilesTerrain.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromGoogleEarthEnterpriseBuffer.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromHeightmap.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromQuantizedTerrainMesh.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createWallGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createWallOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/decodeDraco.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/decodeGoogleEarthEnterprisePacket.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/decodeI3S.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/gaussianSplatSorter.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/gaussianSplatTextureGenerator.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/incrementallyBuildTerrainPicker.js +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/transcodeKTX2.js +56 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/transferTypedArrayTest.js +1 -1
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/upsampleVerticesFromCesium3DTilesTerrain.js +2 -2
- package/dist/index.html +11 -11
- package/package.json +52 -45
- package/src/components/mcp/McpLanding.tsx +1 -1
- package/src/components/mcp/McpPlayground.tsx +1 -1
- package/src/components/viewer/AddElementPanel.tsx +2 -2
- package/src/components/viewer/BasepointOverlay.tsx +239 -0
- package/src/components/viewer/CesiumOverlay.tsx +15 -59
- package/src/components/viewer/CesiumPlacementEditor.tsx +16 -1
- package/src/components/viewer/CommandPalette.tsx +25 -0
- package/src/components/viewer/GLBExportDialog.tsx +389 -0
- package/src/components/viewer/GeometryAxisRow.tsx +54 -0
- package/src/components/viewer/GeometryEditCard.tsx +392 -0
- package/src/components/viewer/HierarchyPanel.tsx +2 -2
- package/src/components/viewer/IDSAuditSummary.tsx +2 -2
- package/src/components/viewer/KeyboardShortcutsDialog.tsx +58 -4
- package/src/components/viewer/MainToolbar.tsx +292 -29
- package/src/components/viewer/PropertiesPanel.tsx +28 -31
- package/src/components/viewer/StatusBar.tsx +12 -0
- package/src/components/viewer/ToolOverlays.tsx +36 -0
- package/src/components/viewer/ViewerLayout.tsx +27 -0
- package/src/components/viewer/Viewport.tsx +49 -4
- package/src/components/viewer/ViewportContainer.tsx +88 -17
- package/src/components/viewer/ViewportOverlays.tsx +50 -11
- package/src/components/viewer/chat/ByokKeyModal.tsx +1 -1
- package/src/components/viewer/properties/FederationAlignmentControls.tsx +180 -0
- package/src/components/viewer/properties/GeoreferencingPanel.tsx +6 -0
- package/src/components/viewer/properties/PrecisionGridBadge.tsx +125 -0
- package/src/components/viewer/properties/raw-step-format.ts +5 -3
- package/src/components/viewer/selectionHandlers.ts +301 -10
- package/src/components/viewer/tools/GizmoOverlay.tsx +322 -0
- package/src/components/viewer/tools/SplitNumericInput.tsx +225 -0
- package/src/components/viewer/tools/SplitOverlay.tsx +242 -0
- package/src/components/viewer/tools/WallEndpointOverlay.tsx +252 -0
- package/src/components/viewer/useGeometryStreaming.ts +100 -1
- package/src/components/viewer/useMouseControls.ts +8 -1
- package/src/hooks/useBCF.ts +6 -6
- package/src/hooks/useCameraTickSubscription.ts +62 -0
- package/src/hooks/useIfc.ts +4 -0
- package/src/hooks/useIfcFederation.ts +368 -20
- package/src/hooks/useKeyboardShortcuts.ts +86 -0
- package/src/hooks/useLevelDisplayEffect.ts +160 -0
- package/src/hooks/useViewerSelectors.ts +8 -0
- package/src/lib/__test__/stubs.ts +110 -0
- package/src/lib/geo/cesium-bridge.ts +3 -3
- package/src/lib/geo/cesium-placement.test.ts +28 -12
- package/src/lib/geo/cesium-placement.ts +16 -10
- package/src/lib/geo/effective-georef.test.ts +23 -7
- package/src/lib/geo/geo-scale.ts +58 -2
- package/src/lib/geo/ifc-origin.test.ts +176 -0
- package/src/lib/geo/ifc-origin.ts +144 -0
- package/src/lib/geo/precision-grids.ts +444 -0
- package/src/lib/geo/reproject.test.ts +88 -0
- package/src/lib/geo/reproject.ts +168 -36
- package/src/lib/level-offsets.test.ts +153 -0
- package/src/lib/level-offsets.ts +140 -0
- package/src/lib/linear-element-edit.test.ts +220 -0
- package/src/lib/linear-element-edit.ts +327 -0
- package/src/lib/metadata-clone.test.ts +173 -0
- package/src/lib/metadata-clone.ts +124 -0
- package/src/lib/placement-core.ts +340 -0
- package/src/lib/placement-edit.boot.ts +21 -0
- package/src/lib/placement-edit.test.ts +464 -0
- package/src/lib/placement-edit.ts +47 -0
- package/src/lib/polygon-clip.test.ts +193 -0
- package/src/lib/polygon-clip.ts +199 -0
- package/src/lib/slab-edit.test.ts +169 -0
- package/src/lib/slab-edit.ts +312 -0
- package/src/lib/wall-edit.ts +342 -0
- package/src/lib/wall-opening-reassign.test.ts +291 -0
- package/src/lib/wall-opening-reassign.ts +241 -0
- package/src/main.tsx +4 -0
- package/src/store/index.ts +7 -0
- package/src/store/slices/cesiumSlice.ts +61 -8
- package/src/store/slices/dataSlice.ts +80 -0
- package/src/store/slices/levelDisplaySlice.ts +105 -0
- package/src/store/slices/modelSlice.test.ts +19 -0
- package/src/store/slices/mutationSlice.ts +1138 -1
- package/src/store/slices/splitToolSlice.ts +165 -0
- package/src/store/slices/uiSlice.edit-mode.test.ts +210 -0
- package/src/store/slices/uiSlice.ts +78 -1
- package/src/store/types.ts +57 -2
- package/src/utils/createBlankIfc.ts +37 -0
- package/tsconfig.json +1 -0
- package/.turbo/turbo-typecheck.log +0 -4
- package/dist/assets/arrow2_bg-BoXCojjR.wasm +0 -0
- package/dist/assets/browser-CVf8ATeW.js +0 -694
- package/dist/assets/emscripten-module-BTRCZGcB.wasm +0 -0
- package/dist/assets/emscripten-module-CGIn_cMh.wasm +0 -0
- package/dist/assets/emscripten-module-DYvzWiHh.wasm +0 -0
- package/dist/assets/emscripten-module-NWak2PoB.wasm +0 -0
- package/dist/assets/emscripten-module.browser-DcFZLAUx.js +0 -1
- package/dist/assets/esbuild-COv63sf-.js +0 -1
- package/dist/assets/event-DIOks52T.js +0 -1
- package/dist/assets/ffi-DlhRHxHv.js +0 -1
- package/dist/assets/geometry.worker-DchLBqZ8.js +0 -1
- package/dist/assets/ifc-lite_bg-CSeT3fNI.wasm +0 -0
- package/dist/assets/ifc-lite_bg-ns4cSnX2.wasm +0 -0
- package/dist/assets/index-BZC2YaOP.css +0 -1
- package/dist/assets/index-HqAIQkr6.js +0 -22
- package/dist/assets/laz-perf-Cvr_Lepg.js +0 -1
- package/dist/assets/maplibre-gl-C4LXKM6c.js +0 -808
- package/dist/assets/three-DwNDHx9-.js +0 -4049
- package/dist/assets/wasm-bridge-Cha08LdC.js +0 -1
- package/dist/cesium/Workers/chunk-23ZQ2IVV.js +0 -29
- package/dist/cesium/Workers/chunk-2EQO3Q56.js +0 -26
- package/dist/cesium/Workers/chunk-2TE5NTVD.js +0 -26
- package/dist/cesium/Workers/chunk-BXMEEOCS.js +0 -63
- package/dist/cesium/Workers/chunk-BYLCY7GP.js +0 -29
- package/dist/cesium/Workers/chunk-CTHM3W6I.js +0 -26
- package/dist/cesium/Workers/chunk-E3JOOS3S.js +0 -26
- package/dist/cesium/Workers/chunk-F6PRE7D6.js +0 -26
- package/dist/cesium/Workers/chunk-FFBVWF2L.js +0 -26
- package/dist/cesium/Workers/chunk-GBAA6GVX.js +0 -26
- package/dist/cesium/Workers/chunk-ILRYTWTP.js +0 -26
- package/dist/cesium/Workers/chunk-IRNLBSEJ.js +0 -26
- package/dist/cesium/Workers/chunk-L6QHHACZ.js +0 -26
- package/dist/cesium/Workers/chunk-NMVKML6W.js +0 -26
- package/dist/cesium/Workers/chunk-OIRKANTH.js +0 -26
- package/dist/cesium/Workers/chunk-QKUIYMGC.js +0 -28
- package/dist/cesium/Workers/chunk-SQMIIXB7.js +0 -26
- package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +0 -26
- package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +0 -26
- package/dist/cesium/Workers/createGroundPolylineGeometry.js +0 -26
- package/dist/cesium/Workers/transcodeKTX2.js +0 -56
- package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +0 -26
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_0.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_1.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_10.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_11.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_12.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_13.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_14.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_15.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_16.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_17.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_18.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_19.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_2.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_20.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_21.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_22.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_23.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_24.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_25.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_26.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_27.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_3.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_4.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_5.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_6.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_7.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_8.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_9.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/bing_maps_credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/cesium_credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/google_earth_credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/ion-credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/LensFlare/DirtMask.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/LensFlare/StarBurst.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/0/0/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/0/1/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/0/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/0/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/1/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/1/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/2/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/2/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/3/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/3/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/tilemapresource.xml +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/airfield.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/airport.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/alcohol-shop.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/america-football.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/art-gallery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bakery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bank.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bar.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/baseball.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/basketball.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/beer.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bicycle.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/building.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bus.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cafe.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/camera.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/campsite.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/car.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cemetery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cesium.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/chemist.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cinema.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/circle-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/circle.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/city.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/clothing-store.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/college.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/commercial.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cricket.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cross.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/dam.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/danger.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/disability.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/dog-park.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/embassy.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/emergency-telephone.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/entrance.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/farm.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fast-food.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/ferry.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fire-station.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fuel.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/garden.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/gift.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/golf.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/grocery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/hairdresser.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/harbor.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/heart.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/heliport.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/hospital.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/ice-cream.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/industrial.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/land-use.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/laundry.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/library.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/lighthouse.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/lodging.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/logging.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/london-underground.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/marker-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/marker.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/minefield.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/mobilephone.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/monument.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/museum.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/music.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/oil-well.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/park.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/park2.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/parking-garage.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/parking.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/pharmacy.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/pitch.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/place-of-worship.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/playground.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/police.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/polling-place.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/post.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/prison.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-above.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-light.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-metro.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-underground.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-christian.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-jewish.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-muslim.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/restaurant.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/roadblock.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rocket.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/school.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/scooter.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/shop.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/skiing.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/slaughterhouse.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/soccer.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/square-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/square.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/star-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/star.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/suitcase.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/swimming.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/telephone.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/tennis.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/theatre.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/toilets.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/town-hall.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/town.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/triangle-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/triangle.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/village.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/warehouse.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/waste-basket.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/water.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/wetland.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/zoo.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/moonSmall.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/pin.svg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/waterNormals.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/waterNormalsSmall.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/approximateTerrainHeights.json +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/Workers/package.json +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/Workers/zip-web-worker.js +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/basis_transcoder.wasm +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/draco_decoder.wasm +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/google-earth-dbroot-parser.js +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/wasm_splats_bg.wasm +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/zip-module.wasm +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Animation/Animation.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Animation/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/BaseLayerPicker/BaseLayerPicker.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/BaseLayerPicker/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Cesium3DTilesInspector/Cesium3DTilesInspector.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumInspector/CesiumInspector.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumWidget/CesiumWidget.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumWidget/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/FullscreenButton/FullscreenButton.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Geocoder/Geocoder.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Geocoder/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/azureAerial.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/azureRoads.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingAerial.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingAerialLabels.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingRoads.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/blueMarble.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/earthAtNight.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleContour.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleRoadmap.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleSatellite.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxSatellite.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxStreets.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxTerrain.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/naturalEarthII.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/openStreetMap.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/sentinel-2.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stamenToner.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stamenWatercolor.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/Mouse.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseLeft.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseMiddle.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseRight.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/Touch.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchDrag.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchRotate.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchTilt.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchZoom.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TerrainProviders/Ellipsoid.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TimelineIcons.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/info-loading.gif +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/InfoBox/InfoBox.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/InfoBox/InfoBoxDescription.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/NavigationHelpButton/NavigationHelpButton.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/NavigationHelpButton/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/PerformanceWatchdog/PerformanceWatchdog.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/ProjectionPicker/ProjectionPicker.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/SceneModePicker/SceneModePicker.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/SelectionIndicator/SelectionIndicator.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Timeline/Timeline.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Timeline/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/VRButton/VRButton.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Viewer/Viewer.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/VoxelInspector/VoxelInspector.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/lighterShared.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/shared.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/widgets.css +0 -0
|
@@ -0,0 +1,241 @@
|
|
|
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
|
+
* When a wall is split, openings hosted on it (doors, windows,
|
|
7
|
+
* generic voids) need to move to whichever half they geometrically
|
|
8
|
+
* belong to — otherwise both halves carry the same void
|
|
9
|
+
* relationship and the export double-counts.
|
|
10
|
+
*
|
|
11
|
+
* IFC structure:
|
|
12
|
+
*
|
|
13
|
+
* IfcWall ──IfcRelVoidsElement──► IfcOpeningElement
|
|
14
|
+
* │
|
|
15
|
+
* └── (optional) IfcRelFillsElement
|
|
16
|
+
* ──► IfcDoor / IfcWindow
|
|
17
|
+
*
|
|
18
|
+
* The opening has its own `ObjectPlacement` whose `PlacementRelTo`
|
|
19
|
+
* points back at the wall's placement (per IFC convention). Its
|
|
20
|
+
* `RelativePlacement.Location.Coordinates` are in wall-local 3D,
|
|
21
|
+
* with X = distance along the wall axis. That distance is what
|
|
22
|
+
* decides the half:
|
|
23
|
+
*
|
|
24
|
+
* if local-X < splitDistance ─► left half (no offset)
|
|
25
|
+
* else ─► right half (subtract splitDistance from local-X
|
|
26
|
+
* + repoint PlacementRelTo)
|
|
27
|
+
*
|
|
28
|
+
* Doors/windows hosted in an opening (via IfcRelFillsElement) are
|
|
29
|
+
* positioned relative to the opening, so they move along with it
|
|
30
|
+
* without any extra work.
|
|
31
|
+
*
|
|
32
|
+
* Source-wall openings whose placement does NOT match this
|
|
33
|
+
* canonical shape (e.g. world-absolute openings, openings with
|
|
34
|
+
* non-Cartesian placements, source-buffer entities with mapped
|
|
35
|
+
* representations) are skipped with a returned `skippedReasons`
|
|
36
|
+
* tally so the caller can surface a warning toast.
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
40
|
+
import type { IfcAttributeValue, MutablePropertyView, StoreEditor } from '@ifc-lite/mutations';
|
|
41
|
+
import { asExpressIdRef, asCoordinateTriple, readAttributes, resolvePlacementChain } from './placement-core.js';
|
|
42
|
+
|
|
43
|
+
export interface OpeningReassignSummary {
|
|
44
|
+
/** Openings successfully moved onto the left half. */
|
|
45
|
+
toLeft: number;
|
|
46
|
+
/** Openings successfully moved onto the right half. */
|
|
47
|
+
toRight: number;
|
|
48
|
+
/** Openings whose placement we couldn't interpret; left attached
|
|
49
|
+
* to the (tombstoned) source. */
|
|
50
|
+
skipped: number;
|
|
51
|
+
/** Diagnostic reasons for the skips — small enum so the UI can
|
|
52
|
+
* group them in a single toast rather than one per opening. */
|
|
53
|
+
skipReasons: Map<string, number>;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function bumpReason(map: Map<string, number>, reason: string): void {
|
|
57
|
+
map.set(reason, (map.get(reason) ?? 0) + 1);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Rewrite `IfcRelVoidsElement.RelatingBuildingElement` to a new
|
|
62
|
+
* wall id, preserving the reference's form (`#X` strings vs bare
|
|
63
|
+
* numbers — the StoreEditor exports either; we don't want to
|
|
64
|
+
* accidentally normalise overlay refs into numbers).
|
|
65
|
+
*/
|
|
66
|
+
function rewriteRelTarget(
|
|
67
|
+
raw: unknown,
|
|
68
|
+
newTargetId: number,
|
|
69
|
+
): IfcAttributeValue {
|
|
70
|
+
if (typeof raw === 'string' && raw.startsWith('#')) {
|
|
71
|
+
return `#${newTargetId}` as IfcAttributeValue;
|
|
72
|
+
}
|
|
73
|
+
return newTargetId as IfcAttributeValue;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Walk every `IfcRelVoidsElement` whose RelatingBuildingElement is
|
|
78
|
+
* `sourceWallId`. For each one:
|
|
79
|
+
*
|
|
80
|
+
* 1. Resolve the opening's wall-local X coord (= distance along
|
|
81
|
+
* the wall axis).
|
|
82
|
+
* 2. Decide left / right by comparison to `splitDistance`.
|
|
83
|
+
* 3. Rewrite the rel's RelatingBuildingElement (attr 4) to the
|
|
84
|
+
* chosen half.
|
|
85
|
+
* 4. Rewrite the opening's IfcLocalPlacement.PlacementRelTo
|
|
86
|
+
* (attr 0) to the chosen half's placement.
|
|
87
|
+
* 5. For right-half openings, subtract `splitDistance` from the
|
|
88
|
+
* opening's local-X coordinate so its world position stays
|
|
89
|
+
* the same after the placement reparent.
|
|
90
|
+
*
|
|
91
|
+
* The split distance is in metres along the source wall's axis,
|
|
92
|
+
* measured from the source's start (matches
|
|
93
|
+
* `computeWallSplitGeometry`'s `distance` parameter).
|
|
94
|
+
*/
|
|
95
|
+
export function reassignWallOpenings(
|
|
96
|
+
dataStore: IfcDataStore,
|
|
97
|
+
view: MutablePropertyView,
|
|
98
|
+
editor: StoreEditor,
|
|
99
|
+
sourceWallId: number,
|
|
100
|
+
leftWallId: number,
|
|
101
|
+
rightWallId: number,
|
|
102
|
+
splitDistance: number,
|
|
103
|
+
/** `IfcLocalPlacement` ids for the two halves — needed because
|
|
104
|
+
* the opening's `PlacementRelTo` must point at the half's
|
|
105
|
+
* placement, not the half's IfcWall entity. */
|
|
106
|
+
leftPlacementId: number,
|
|
107
|
+
rightPlacementId: number,
|
|
108
|
+
): OpeningReassignSummary {
|
|
109
|
+
const summary: OpeningReassignSummary = {
|
|
110
|
+
toLeft: 0,
|
|
111
|
+
toRight: 0,
|
|
112
|
+
skipped: 0,
|
|
113
|
+
skipReasons: new Map(),
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
// Resolve the source wall's IfcLocalPlacement so we can verify
|
|
117
|
+
// each opening was actually placed relative to it. Openings with
|
|
118
|
+
// world-absolute placements (PlacementRelTo = null) or placements
|
|
119
|
+
// relative to some other entity must NOT be reassigned — silently
|
|
120
|
+
// rewriting their PlacementRelTo would teleport them.
|
|
121
|
+
const sourceChain = resolvePlacementChain(dataStore, view, editor, sourceWallId);
|
|
122
|
+
if (!sourceChain) {
|
|
123
|
+
summary.skipped++;
|
|
124
|
+
bumpReason(summary.skipReasons, 'source wall placement unresolvable');
|
|
125
|
+
return summary;
|
|
126
|
+
}
|
|
127
|
+
const sourceWallPlacementId = sourceChain.localPlacementId;
|
|
128
|
+
|
|
129
|
+
const relIds = dataStore.entityIndex.byType.get('IFCRELVOIDSELEMENT') ?? [];
|
|
130
|
+
for (const relId of relIds) {
|
|
131
|
+
const relAttrs = readAttributes(dataStore, view, editor, relId);
|
|
132
|
+
if (!relAttrs) {
|
|
133
|
+
summary.skipped++;
|
|
134
|
+
bumpReason(summary.skipReasons, 'unreadable rel');
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
// IfcRelVoidsElement attrs (IFC4): [GlobalId, OwnerHistory,
|
|
138
|
+
// Name, Description, RelatingBuildingElement, RelatedOpeningElement]
|
|
139
|
+
const relatingBuilding = asExpressIdRef(relAttrs[4]);
|
|
140
|
+
if (relatingBuilding !== sourceWallId) continue;
|
|
141
|
+
const openingId = asExpressIdRef(relAttrs[5]);
|
|
142
|
+
if (openingId === null) {
|
|
143
|
+
summary.skipped++;
|
|
144
|
+
bumpReason(summary.skipReasons, 'missing opening ref');
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Walk the opening's placement chain to its local-X coord.
|
|
149
|
+
const openingAttrs = readAttributes(dataStore, view, editor, openingId);
|
|
150
|
+
if (!openingAttrs) {
|
|
151
|
+
summary.skipped++;
|
|
152
|
+
bumpReason(summary.skipReasons, 'unreadable opening');
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const localPlacementId = asExpressIdRef(openingAttrs[5]); // ObjectPlacement
|
|
156
|
+
if (localPlacementId === null) {
|
|
157
|
+
summary.skipped++;
|
|
158
|
+
bumpReason(summary.skipReasons, 'no ObjectPlacement');
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
const localPlacementAttrs = readAttributes(dataStore, view, editor, localPlacementId);
|
|
162
|
+
if (!localPlacementAttrs) {
|
|
163
|
+
summary.skipped++;
|
|
164
|
+
bumpReason(summary.skipReasons, 'unreadable IfcLocalPlacement');
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
// Verify the opening's PlacementRelTo points at THIS source
|
|
168
|
+
// wall. Openings placed absolutely (PlacementRelTo === null)
|
|
169
|
+
// or relative to some other entity must be left alone —
|
|
170
|
+
// rewriting their parent placement would teleport them.
|
|
171
|
+
const placementRelTo = asExpressIdRef(localPlacementAttrs[0]);
|
|
172
|
+
if (placementRelTo !== sourceWallPlacementId) {
|
|
173
|
+
summary.skipped++;
|
|
174
|
+
bumpReason(summary.skipReasons, 'opening not placed relative to source wall');
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
const relativePlacementId = asExpressIdRef(localPlacementAttrs[1]);
|
|
178
|
+
if (relativePlacementId === null) {
|
|
179
|
+
summary.skipped++;
|
|
180
|
+
bumpReason(summary.skipReasons, 'no RelativePlacement');
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
const axisAttrs = readAttributes(dataStore, view, editor, relativePlacementId);
|
|
184
|
+
if (!axisAttrs) {
|
|
185
|
+
summary.skipped++;
|
|
186
|
+
bumpReason(summary.skipReasons, 'unreadable IfcAxis2Placement3D');
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
const cartesianId = asExpressIdRef(axisAttrs[0]);
|
|
190
|
+
if (cartesianId === null) {
|
|
191
|
+
summary.skipped++;
|
|
192
|
+
bumpReason(summary.skipReasons, 'no Location');
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
const pointAttrs = readAttributes(dataStore, view, editor, cartesianId);
|
|
196
|
+
if (!pointAttrs) {
|
|
197
|
+
summary.skipped++;
|
|
198
|
+
bumpReason(summary.skipReasons, 'unreadable IfcCartesianPoint');
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
const coords = asCoordinateTriple(pointAttrs[0]);
|
|
202
|
+
if (!coords) {
|
|
203
|
+
summary.skipped++;
|
|
204
|
+
bumpReason(summary.skipReasons, 'invalid Coordinates');
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const localX = coords[0];
|
|
209
|
+
const onLeft = localX < splitDistance;
|
|
210
|
+
if (onLeft) {
|
|
211
|
+
// Reassign to left half. Left's placement coincides with
|
|
212
|
+
// source's, so the opening's local coords don't change.
|
|
213
|
+
editor.setPositionalAttribute(relId, 4, rewriteRelTarget(relAttrs[4], leftWallId));
|
|
214
|
+
editor.setPositionalAttribute(
|
|
215
|
+
localPlacementId,
|
|
216
|
+
0,
|
|
217
|
+
rewriteRelTarget(localPlacementAttrs[0], leftPlacementId),
|
|
218
|
+
);
|
|
219
|
+
summary.toLeft++;
|
|
220
|
+
} else {
|
|
221
|
+
// Reassign to right half. Right's placement is offset along
|
|
222
|
+
// the wall axis by `splitDistance` — so the opening's local-X
|
|
223
|
+
// shifts by `-splitDistance` to keep its world position fixed.
|
|
224
|
+
editor.setPositionalAttribute(relId, 4, rewriteRelTarget(relAttrs[4], rightWallId));
|
|
225
|
+
editor.setPositionalAttribute(
|
|
226
|
+
localPlacementId,
|
|
227
|
+
0,
|
|
228
|
+
rewriteRelTarget(localPlacementAttrs[0], rightPlacementId),
|
|
229
|
+
);
|
|
230
|
+
const newCoords: [number, number, number] = [
|
|
231
|
+
localX - splitDistance,
|
|
232
|
+
coords[1],
|
|
233
|
+
coords[2],
|
|
234
|
+
];
|
|
235
|
+
editor.setPositionalAttribute(cartesianId, 0, newCoords);
|
|
236
|
+
summary.toRight++;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
return summary;
|
|
241
|
+
}
|
package/src/main.tsx
CHANGED
|
@@ -11,6 +11,10 @@ import ReactDOM from 'react-dom/client';
|
|
|
11
11
|
import { App } from './App';
|
|
12
12
|
import './index.css';
|
|
13
13
|
import 'maplibre-gl/dist/maplibre-gl.css';
|
|
14
|
+
// Wire the placement-edit helpers' parser-backed source reader. Pure
|
|
15
|
+
// side-effect import; keeps `@ifc-lite/parser` out of placement-edit
|
|
16
|
+
// itself so its overlay-path logic stays unit-testable.
|
|
17
|
+
import './lib/placement-edit.boot';
|
|
14
18
|
|
|
15
19
|
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
16
20
|
<React.StrictMode>
|
package/src/store/index.ts
CHANGED
|
@@ -42,6 +42,8 @@ import { createOverlaySlice, type OverlaySlice } from './slices/overlaySlice.js'
|
|
|
42
42
|
import { createSearchSlice, type SearchSlice } from './slices/searchSlice.js';
|
|
43
43
|
import { createAnnotationsSlice, type AnnotationsSlice } from './slices/annotationsSlice.js';
|
|
44
44
|
import { createAddElementSlice, type AddElementSlice } from './slices/addElementSlice.js';
|
|
45
|
+
import { createSplitToolSlice, type SplitToolSlice } from './slices/splitToolSlice.js';
|
|
46
|
+
import { createLevelDisplaySlice, type LevelDisplaySlice } from './slices/levelDisplaySlice.js';
|
|
45
47
|
import { createPointCloudSlice, type PointCloudSlice, POINT_CLOUD_DEFAULTS } from './slices/pointCloudSlice.js';
|
|
46
48
|
import { invalidateVisibleBasketCache } from './basketVisibleSet.js';
|
|
47
49
|
|
|
@@ -136,6 +138,8 @@ export type ViewerState = LoadingSlice &
|
|
|
136
138
|
SearchSlice &
|
|
137
139
|
AnnotationsSlice &
|
|
138
140
|
AddElementSlice &
|
|
141
|
+
SplitToolSlice &
|
|
142
|
+
LevelDisplaySlice &
|
|
139
143
|
PointCloudSlice & {
|
|
140
144
|
resetViewerState: () => void;
|
|
141
145
|
};
|
|
@@ -173,6 +177,8 @@ const createViewerStore = () => create<ViewerState>()((...args) => ({
|
|
|
173
177
|
...createSearchSlice(...args),
|
|
174
178
|
...createAnnotationsSlice(...args),
|
|
175
179
|
...createAddElementSlice(...args),
|
|
180
|
+
...createSplitToolSlice(...args),
|
|
181
|
+
...createLevelDisplaySlice(...args),
|
|
176
182
|
...createPointCloudSlice(...args),
|
|
177
183
|
|
|
178
184
|
// Reset all viewer state when loading new file
|
|
@@ -256,6 +262,7 @@ const createViewerStore = () => create<ViewerState>()((...args) => ({
|
|
|
256
262
|
|
|
257
263
|
// UI
|
|
258
264
|
activeTool: UI_DEFAULTS.ACTIVE_TOOL,
|
|
265
|
+
editEnabled: false,
|
|
259
266
|
visualEnhancementsEnabled: UI_DEFAULTS.VISUAL_ENHANCEMENTS_ENABLED,
|
|
260
267
|
edgeContrastEnabled: UI_DEFAULTS.EDGE_CONTRAST_ENABLED,
|
|
261
268
|
edgeContrastIntensity: UI_DEFAULTS.EDGE_CONTRAST_INTENSITY,
|
|
@@ -45,6 +45,26 @@ export interface CesiumSlice {
|
|
|
45
45
|
cesiumTerrainSource: string | null;
|
|
46
46
|
/** Model ID that the Cesium overlay is currently displaying. */
|
|
47
47
|
cesiumSourceModelId: string | null;
|
|
48
|
+
/**
|
|
49
|
+
* User-selected federation anchor model.
|
|
50
|
+
*
|
|
51
|
+
* When multiple georeferenced models are loaded, federation alignment rebakes
|
|
52
|
+
* every other model's geometry into this model's viewer-space frame so they
|
|
53
|
+
* land in the right relative real-world positions. The Cesium bridge also
|
|
54
|
+
* uses this model's IfcMapConversion to anchor the viewer→ECEF transform.
|
|
55
|
+
*
|
|
56
|
+
* `null` selects the default anchor (earliest `loadedAt` with a valid georef).
|
|
57
|
+
* Setting an override fires a `RECOMPUTE_FEDERATION_ALIGNMENT` re-bake.
|
|
58
|
+
*/
|
|
59
|
+
anchorModelIdOverride: string | null;
|
|
60
|
+
/**
|
|
61
|
+
* When true, the viewport renders a small XYZ triad + label at each loaded
|
|
62
|
+
* model's true IFC (0,0,0) point — useful for debugging federation
|
|
63
|
+
* alignment. Origin positions are derived from each model's IfcMapConversion
|
|
64
|
+
* and the anchor's MapConversion, so the markers stay correct after re-aligns
|
|
65
|
+
* and across cross-CRS reprojections.
|
|
66
|
+
*/
|
|
67
|
+
showModelBasepoints: boolean;
|
|
48
68
|
/** Terrain clip Y position in viewer space. When set, fragments below this Y are discarded. */
|
|
49
69
|
cesiumTerrainClipY: number | null;
|
|
50
70
|
/** Whether the GLB model has been loaded into Cesium (hides WebGPU overlay). */
|
|
@@ -66,6 +86,9 @@ export interface CesiumSlice {
|
|
|
66
86
|
setCesiumTerrainHeight: (height: number | null) => void;
|
|
67
87
|
setCesiumTerrainSource: (source: string | null) => void;
|
|
68
88
|
setCesiumSourceModelId: (modelId: string | null) => void;
|
|
89
|
+
setAnchorModelIdOverride: (modelId: string | null) => void;
|
|
90
|
+
setShowModelBasepoints: (show: boolean) => void;
|
|
91
|
+
toggleShowModelBasepoints: () => void;
|
|
69
92
|
setCesiumTerrainClipY: (y: number | null) => void;
|
|
70
93
|
setCesiumGlbLoaded: (loaded: boolean) => void;
|
|
71
94
|
setCesiumPlacementEditMode: (enabled: boolean) => void;
|
|
@@ -113,7 +136,17 @@ function resolveIonToken(): string {
|
|
|
113
136
|
return userToken || DEFAULT_ION_TOKEN;
|
|
114
137
|
}
|
|
115
138
|
|
|
116
|
-
|
|
139
|
+
/**
|
|
140
|
+
* Cross-slice surface CesiumSlice writes into. `editEnabled` lives on
|
|
141
|
+
* UISlice — turning on the placement editor implies global edit mode,
|
|
142
|
+
* so the slice writes it directly here to keep the toolbar pill in
|
|
143
|
+
* sync atomically.
|
|
144
|
+
*/
|
|
145
|
+
export interface CesiumCrossSliceState {
|
|
146
|
+
editEnabled: boolean;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export const createCesiumSlice: StateCreator<CesiumSlice & CesiumCrossSliceState, [], [], CesiumSlice> = (set) => ({
|
|
117
150
|
cesiumAvailable: false,
|
|
118
151
|
cesiumEnabled: false,
|
|
119
152
|
cesiumDataSource: loadDataSource(),
|
|
@@ -122,6 +155,8 @@ export const createCesiumSlice: StateCreator<CesiumSlice, [], [], CesiumSlice> =
|
|
|
122
155
|
cesiumTerrainHeight: null,
|
|
123
156
|
cesiumTerrainSource: null,
|
|
124
157
|
cesiumSourceModelId: null,
|
|
158
|
+
anchorModelIdOverride: null,
|
|
159
|
+
showModelBasepoints: false,
|
|
125
160
|
cesiumTerrainClipY: null,
|
|
126
161
|
cesiumGlbLoaded: false,
|
|
127
162
|
cesiumPlacementEditMode: false,
|
|
@@ -172,18 +207,36 @@ export const createCesiumSlice: StateCreator<CesiumSlice, [], [], CesiumSlice> =
|
|
|
172
207
|
setCesiumTerrainHeight: (height) => set({ cesiumTerrainHeight: height }),
|
|
173
208
|
setCesiumTerrainSource: (source) => set({ cesiumTerrainSource: source }),
|
|
174
209
|
setCesiumSourceModelId: (modelId) => set({ cesiumSourceModelId: modelId }),
|
|
210
|
+
setAnchorModelIdOverride: (modelId) => set({ anchorModelIdOverride: modelId }),
|
|
211
|
+
setShowModelBasepoints: (show) => set({ showModelBasepoints: show }),
|
|
212
|
+
toggleShowModelBasepoints: () => set((s) => ({ showModelBasepoints: !s.showModelBasepoints })),
|
|
175
213
|
setCesiumTerrainClipY: (y) => set({ cesiumTerrainClipY: y }),
|
|
176
214
|
setCesiumGlbLoaded: (loaded) => set({ cesiumGlbLoaded: loaded }),
|
|
177
|
-
setCesiumPlacementEditMode: (enabled) => set(
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
215
|
+
setCesiumPlacementEditMode: (enabled) => set(
|
|
216
|
+
// Turning the placement editor on implies global edit mode — keeps
|
|
217
|
+
// the toolbar pill in sync so the user can't end up "moving the
|
|
218
|
+
// georef" while the rest of the UI claims it's read-only. Turning
|
|
219
|
+
// it off does *not* exit global edit; other sub-tools (properties,
|
|
220
|
+
// geometry) may still be in use — but we DO clear the placement
|
|
221
|
+
// draft so callers exiting via the setter don't leave stale draft
|
|
222
|
+
// state behind (matches the toggle's disable branch).
|
|
223
|
+
enabled
|
|
224
|
+
? { cesiumPlacementEditMode: true, editEnabled: true }
|
|
182
225
|
: {
|
|
226
|
+
cesiumPlacementEditMode: false,
|
|
183
227
|
cesiumPlacementDraftModelId: null,
|
|
184
228
|
cesiumPlacementDraft: null,
|
|
185
|
-
}
|
|
186
|
-
|
|
229
|
+
},
|
|
230
|
+
),
|
|
231
|
+
toggleCesiumPlacementEditMode: () => set((s) => (
|
|
232
|
+
s.cesiumPlacementEditMode
|
|
233
|
+
? {
|
|
234
|
+
cesiumPlacementEditMode: false,
|
|
235
|
+
cesiumPlacementDraftModelId: null,
|
|
236
|
+
cesiumPlacementDraft: null,
|
|
237
|
+
}
|
|
238
|
+
: { cesiumPlacementEditMode: true, editEnabled: true }
|
|
239
|
+
)),
|
|
187
240
|
beginCesiumPlacementDraft: (modelId, conversion) => set({
|
|
188
241
|
cesiumPlacementDraftModelId: modelId,
|
|
189
242
|
cesiumPlacementDraft: {
|
|
@@ -30,6 +30,14 @@ export interface DataSlice {
|
|
|
30
30
|
ifcDataStore: IfcDataStore | null;
|
|
31
31
|
geometryResult: GeometryResult | null;
|
|
32
32
|
geometryUpdateTick: number;
|
|
33
|
+
/**
|
|
34
|
+
* Monotonic counter bumped whenever existing mesh vertex/normal data has
|
|
35
|
+
* been mutated in-place (e.g. by `realignFederation`). Length/visibility
|
|
36
|
+
* triggers don't catch in-place mutation, so this is a separate signal that
|
|
37
|
+
* the merged-geometry cache and the renderer's GPU buffers both subscribe
|
|
38
|
+
* to in order to force a re-process.
|
|
39
|
+
*/
|
|
40
|
+
geometryContentVersion: number;
|
|
33
41
|
boundedGeometryMode: boolean;
|
|
34
42
|
/** Transient overlay colors (lens/IDS/sdk overlays). */
|
|
35
43
|
pendingColorUpdates: Map<number, [number, number, number, number]> | null;
|
|
@@ -41,9 +49,40 @@ export interface DataSlice {
|
|
|
41
49
|
setGeometryResult: (result: GeometryResult | null) => void;
|
|
42
50
|
setBoundedGeometryMode: (enabled: boolean) => void;
|
|
43
51
|
appendGeometryBatch: (meshes: GeometryResult['meshes'], coordinateInfo?: CoordinateInfo) => void;
|
|
52
|
+
/** Signal that mesh positions/normals have been mutated in place — see
|
|
53
|
+
* `geometryContentVersion` for why this is separate from setGeometryResult. */
|
|
54
|
+
bumpGeometryContentVersion: () => void;
|
|
44
55
|
releaseGeometryMemory: () => void;
|
|
45
56
|
/** Persist mesh color changes in geometryResult (used for IFC style/material updates). */
|
|
46
57
|
updateMeshColors: (updates: Map<number, [number, number, number, number]>) => void;
|
|
58
|
+
/**
|
|
59
|
+
* Pending mesh removals for the renderer. Authoring actions
|
|
60
|
+
* (split, delete) push globalIds here; `useGeometryStreaming`
|
|
61
|
+
* flushes them on the next frame via
|
|
62
|
+
* `scene.removeMeshesForEntities` and then prunes the matching
|
|
63
|
+
* meshes out of `geometryResult.meshes` so picking + bounds
|
|
64
|
+
* recomputation stay consistent.
|
|
65
|
+
*
|
|
66
|
+
* Stored as a Set on the slice rather than a transient ref so
|
|
67
|
+
* tests + headless workflows can observe it directly.
|
|
68
|
+
*/
|
|
69
|
+
pendingMeshRemovals: Set<number> | null;
|
|
70
|
+
setPendingMeshRemovals: (ids: Set<number>) => void;
|
|
71
|
+
clearPendingMeshRemovals: () => void;
|
|
72
|
+
/**
|
|
73
|
+
* Pending per-entity translations for the renderer. Authoring
|
|
74
|
+
* actions (translateEntity, setEntityPosition, gizmo drag) push
|
|
75
|
+
* `globalId → [dx, dy, dz]` in *renderer* frame (Y-up). The
|
|
76
|
+
* streaming hook drains via `scene.translateMeshesForEntities`
|
|
77
|
+
* on the next frame, which mutates vertex positions in place
|
|
78
|
+
* and marks the affected buckets for re-batch.
|
|
79
|
+
*
|
|
80
|
+
* The delta is renderer-frame; the IFC → renderer conversion
|
|
81
|
+
* lives in the action that produces the entry.
|
|
82
|
+
*/
|
|
83
|
+
pendingMeshTranslations: Map<number, [number, number, number]> | null;
|
|
84
|
+
setPendingMeshTranslations: (updates: Map<number, [number, number, number]>) => void;
|
|
85
|
+
clearPendingMeshTranslations: () => void;
|
|
47
86
|
/** Set pending color updates for the renderer without cloning mesh data.
|
|
48
87
|
* Use this for transient overlays (lens, IDS) where the source-of-truth
|
|
49
88
|
* mesh colors should remain unchanged. */
|
|
@@ -76,9 +115,12 @@ export const createDataSlice: StateCreator<DataSlice & DataCrossSliceState, [],
|
|
|
76
115
|
ifcDataStore: null,
|
|
77
116
|
geometryResult: null,
|
|
78
117
|
geometryUpdateTick: 0,
|
|
118
|
+
geometryContentVersion: 0,
|
|
79
119
|
boundedGeometryMode: false,
|
|
80
120
|
pendingColorUpdates: null,
|
|
81
121
|
pendingMeshColorUpdates: null,
|
|
122
|
+
pendingMeshRemovals: null,
|
|
123
|
+
pendingMeshTranslations: null,
|
|
82
124
|
|
|
83
125
|
// Actions
|
|
84
126
|
setIfcDataStore: (ifcDataStore) => set((state) => {
|
|
@@ -115,6 +157,10 @@ export const createDataSlice: StateCreator<DataSlice & DataCrossSliceState, [],
|
|
|
115
157
|
|
|
116
158
|
setBoundedGeometryMode: (boundedGeometryMode) => set({ boundedGeometryMode }),
|
|
117
159
|
|
|
160
|
+
bumpGeometryContentVersion: () => set((state) => ({
|
|
161
|
+
geometryContentVersion: state.geometryContentVersion + 1,
|
|
162
|
+
})),
|
|
163
|
+
|
|
118
164
|
appendGeometryBatch: (meshes, coordinateInfo) => set((state) => {
|
|
119
165
|
// Incremental totals: O(batch_size) instead of O(total_accumulated) .reduce()
|
|
120
166
|
let batchTriangles = 0;
|
|
@@ -236,6 +282,40 @@ export const createDataSlice: StateCreator<DataSlice & DataCrossSliceState, [],
|
|
|
236
282
|
|
|
237
283
|
clearPendingMeshColorUpdates: () => set({ pendingMeshColorUpdates: null }),
|
|
238
284
|
|
|
285
|
+
setPendingMeshRemovals: (ids) => set((state) => {
|
|
286
|
+
// Accumulate across calls — the streaming loop drains in one
|
|
287
|
+
// pass per frame, but split / delete actions may fire several
|
|
288
|
+
// times between frames.
|
|
289
|
+
const merged = new Set<number>(state.pendingMeshRemovals ?? []);
|
|
290
|
+
for (const id of ids) merged.add(id);
|
|
291
|
+
return { pendingMeshRemovals: merged };
|
|
292
|
+
}),
|
|
293
|
+
|
|
294
|
+
clearPendingMeshRemovals: () => set({ pendingMeshRemovals: null }),
|
|
295
|
+
|
|
296
|
+
setPendingMeshTranslations: (updates) => set((state) => {
|
|
297
|
+
// Accumulate deltas across calls — a single drag-frame may
|
|
298
|
+
// bump translateEntity many times before the streaming hook
|
|
299
|
+
// drains. Existing entries get their delta summed; the
|
|
300
|
+
// renderer sees one combined translation per entity.
|
|
301
|
+
const merged = new Map<number, [number, number, number]>(state.pendingMeshTranslations ?? []);
|
|
302
|
+
for (const [id, delta] of updates) {
|
|
303
|
+
const existing = merged.get(id);
|
|
304
|
+
if (existing) {
|
|
305
|
+
merged.set(id, [
|
|
306
|
+
existing[0] + delta[0],
|
|
307
|
+
existing[1] + delta[1],
|
|
308
|
+
existing[2] + delta[2],
|
|
309
|
+
]);
|
|
310
|
+
} else {
|
|
311
|
+
merged.set(id, [delta[0], delta[1], delta[2]]);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return { pendingMeshTranslations: merged };
|
|
315
|
+
}),
|
|
316
|
+
|
|
317
|
+
clearPendingMeshTranslations: () => set({ pendingMeshTranslations: null }),
|
|
318
|
+
|
|
239
319
|
updateCoordinateInfo: (coordinateInfo) => set((state) => {
|
|
240
320
|
if (!state.geometryResult) return {};
|
|
241
321
|
const geometryResult = {
|
|
@@ -0,0 +1,105 @@
|
|
|
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
|
+
* Level display mode — Pascal Editor's Stacked / Exploded / Solo
|
|
7
|
+
* pattern, adapted to ifc-lite's spatial hierarchy.
|
|
8
|
+
*
|
|
9
|
+
* - Stacked (default): every storey at its native elevation.
|
|
10
|
+
* - Exploded : each storey lifted along world +Y by
|
|
11
|
+
* `storey-index × explodedGap`, indexed
|
|
12
|
+
* after sorting storeys by elevation
|
|
13
|
+
* ascending. Index 0 stays at its
|
|
14
|
+
* native Y; subsequent storeys move up
|
|
15
|
+
* by `gap`.
|
|
16
|
+
* - Solo : only entities in the chosen `soloStorey`
|
|
17
|
+
* render. Driven by the existing
|
|
18
|
+
* visibilitySlice.setIsolatedEntities so
|
|
19
|
+
* we don't ship a second isolation
|
|
20
|
+
* channel.
|
|
21
|
+
*
|
|
22
|
+
* The slice owns mode + parameters only. The actual mesh
|
|
23
|
+
* translation (Exploded) and isolation (Solo) are applied by a
|
|
24
|
+
* separate hook in the viewer — `useLevelDisplayEffect` — which
|
|
25
|
+
* watches the slice and the active model's spatial hierarchy and
|
|
26
|
+
* flushes per-entity updates to the renderer via
|
|
27
|
+
* `pendingMeshTranslations` and `setIsolatedEntities`.
|
|
28
|
+
*
|
|
29
|
+
* Reversibility: the slice keeps the LAST APPLIED offset per
|
|
30
|
+
* storey so the effect can compute the delta between target and
|
|
31
|
+
* applied when the user toggles modes — no "remember the original
|
|
32
|
+
* positions" gymnastics. Switching Exploded → Stacked subtracts
|
|
33
|
+
* the applied offset; switching gap mid-Exploded shifts by the
|
|
34
|
+
* difference.
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
import type { StateCreator } from 'zustand';
|
|
38
|
+
|
|
39
|
+
export type LevelDisplayMode = 'stacked' | 'exploded' | 'solo';
|
|
40
|
+
|
|
41
|
+
/** Per-model snapshot of the currently-applied storey offsets. */
|
|
42
|
+
export type AppliedStoreyOffsets = Map<
|
|
43
|
+
string /* modelId */,
|
|
44
|
+
Map<number /* storey express id */, number /* applied Y offset (m, renderer frame) */>
|
|
45
|
+
>;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Solo target — must carry both modelId and expressId because
|
|
49
|
+
* express ids are scoped per model. In a federated session two
|
|
50
|
+
* different models often have storeys with overlapping ids, so a
|
|
51
|
+
* bare expressId would silently pick the wrong storey on the
|
|
52
|
+
* wrong model.
|
|
53
|
+
*/
|
|
54
|
+
export interface SoloStoreyRef {
|
|
55
|
+
modelId: string;
|
|
56
|
+
expressId: number;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface LevelDisplaySlice {
|
|
60
|
+
levelDisplayMode: LevelDisplayMode;
|
|
61
|
+
/** Storey for Solo. Null = effect picks the lowest storey on
|
|
62
|
+
* the active model on activation. */
|
|
63
|
+
soloStorey: SoloStoreyRef | null;
|
|
64
|
+
/** Per-storey gap in metres for Exploded. Default 4 m. */
|
|
65
|
+
explodedGap: number;
|
|
66
|
+
/**
|
|
67
|
+
* Bookkeeping — last applied Y offset per storey, per model.
|
|
68
|
+
* Read by the effect to compute deltas without re-doing the
|
|
69
|
+
* "what was the previous gap?" math; written by the effect
|
|
70
|
+
* after each successful flush. Tests can probe this directly.
|
|
71
|
+
*/
|
|
72
|
+
appliedStoreyOffsets: AppliedStoreyOffsets;
|
|
73
|
+
|
|
74
|
+
setLevelDisplayMode: (mode: LevelDisplayMode) => void;
|
|
75
|
+
setSoloStorey: (ref: SoloStoreyRef | null) => void;
|
|
76
|
+
setExplodedGap: (metres: number) => void;
|
|
77
|
+
/** Effect-only: record the offsets that were just flushed to
|
|
78
|
+
* the renderer so the next toggle knows what to subtract. */
|
|
79
|
+
setAppliedStoreyOffsets: (next: AppliedStoreyOffsets) => void;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const LEVEL_DISPLAY_DEFAULTS = {
|
|
83
|
+
mode: 'stacked' as LevelDisplayMode,
|
|
84
|
+
gap: 4,
|
|
85
|
+
soloStorey: null as SoloStoreyRef | null,
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export const createLevelDisplaySlice: StateCreator<LevelDisplaySlice, [], [], LevelDisplaySlice> = (set) => ({
|
|
89
|
+
levelDisplayMode: LEVEL_DISPLAY_DEFAULTS.mode,
|
|
90
|
+
soloStorey: LEVEL_DISPLAY_DEFAULTS.soloStorey,
|
|
91
|
+
explodedGap: LEVEL_DISPLAY_DEFAULTS.gap,
|
|
92
|
+
appliedStoreyOffsets: new Map(),
|
|
93
|
+
|
|
94
|
+
setLevelDisplayMode: (levelDisplayMode) => set({ levelDisplayMode }),
|
|
95
|
+
setSoloStorey: (soloStorey) => set({ soloStorey }),
|
|
96
|
+
setExplodedGap: (metres) => {
|
|
97
|
+
// Guard against non-finite / non-positive — UI lets the user
|
|
98
|
+
// type, but a 0 gap means "Exploded = Stacked" and a negative
|
|
99
|
+
// gap inverts the sort, which is rarely useful. Clamp to
|
|
100
|
+
// [0, 100] to keep behaviour sane.
|
|
101
|
+
const clamped = Math.max(0, Math.min(100, Number.isFinite(metres) ? metres : 0));
|
|
102
|
+
set({ explodedGap: clamped });
|
|
103
|
+
},
|
|
104
|
+
setAppliedStoreyOffsets: (appliedStoreyOffsets) => set({ appliedStoreyOffsets }),
|
|
105
|
+
});
|
|
@@ -127,6 +127,25 @@ describe('ModelSlice', () => {
|
|
|
127
127
|
state.addModel(model);
|
|
128
128
|
assert.strictEqual(state.hasModels(), true);
|
|
129
129
|
});
|
|
130
|
+
|
|
131
|
+
// Regression for issue #661.
|
|
132
|
+
it('keeps each model entry distinct when a second model is added', () => {
|
|
133
|
+
const firstStore = { tag: 'first' } as unknown as IfcDataStore;
|
|
134
|
+
const firstGeometry = { tag: 'first' } as unknown as GeometryResult;
|
|
135
|
+
const secondStore = { tag: 'second' } as unknown as IfcDataStore;
|
|
136
|
+
const secondGeometry = { tag: 'second' } as unknown as GeometryResult;
|
|
137
|
+
|
|
138
|
+
const model1 = { ...createMockModel('model-1', 'First'), ifcDataStore: firstStore, geometryResult: firstGeometry };
|
|
139
|
+
const model2 = { ...createMockModel('model-2', 'Second'), ifcDataStore: secondStore, geometryResult: secondGeometry };
|
|
140
|
+
|
|
141
|
+
state.addModel(model1);
|
|
142
|
+
state.addModel(model2);
|
|
143
|
+
|
|
144
|
+
assert.strictEqual(state.models.get('model-1')?.ifcDataStore, firstStore);
|
|
145
|
+
assert.strictEqual(state.models.get('model-1')?.geometryResult, firstGeometry);
|
|
146
|
+
assert.strictEqual(state.models.get('model-2')?.ifcDataStore, secondStore);
|
|
147
|
+
assert.strictEqual(state.models.get('model-2')?.geometryResult, secondGeometry);
|
|
148
|
+
});
|
|
130
149
|
});
|
|
131
150
|
|
|
132
151
|
describe('removeModel', () => {
|