@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,173 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
|
|
5
|
+
import { describe, it } from 'node:test';
|
|
6
|
+
import assert from 'node:assert';
|
|
7
|
+
import { cloneElementMetadata } from './metadata-clone.js';
|
|
8
|
+
|
|
9
|
+
import { StubStoreEditor, StubView, makeStubDataStore, type OverlayEntity } from './__test__/stubs.js';
|
|
10
|
+
|
|
11
|
+
function makeStore(byType: Map<string, number[]>) {
|
|
12
|
+
return makeStubDataStore(byType) as unknown as Parameters<typeof cloneElementMetadata>[0];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
describe('metadata-clone', () => {
|
|
16
|
+
it('appends targets to IfcRelDefinesByProperties RelatedObjects', () => {
|
|
17
|
+
const rel: OverlayEntity = {
|
|
18
|
+
expressId: 50,
|
|
19
|
+
type: 'IFCRELDEFINESBYPROPERTIES',
|
|
20
|
+
attributes: ['guid', null, null, null, [100], 200],
|
|
21
|
+
};
|
|
22
|
+
const editor = new StubStoreEditor([rel]);
|
|
23
|
+
const view = new StubView() as unknown as Parameters<typeof cloneElementMetadata>[1];
|
|
24
|
+
const store = makeStore(
|
|
25
|
+
new Map([['IFCRELDEFINESBYPROPERTIES', [50]]]),
|
|
26
|
+
);
|
|
27
|
+
const result = cloneElementMetadata(
|
|
28
|
+
store,
|
|
29
|
+
view,
|
|
30
|
+
editor as unknown as Parameters<typeof cloneElementMetadata>[2],
|
|
31
|
+
100,
|
|
32
|
+
[101, 102],
|
|
33
|
+
);
|
|
34
|
+
assert.strictEqual(result.relationshipsTouched, 1);
|
|
35
|
+
assert.deepStrictEqual(editor.getNewEntity(50)?.attributes[4], [100, 101, 102]);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('preserves overlay #X string refs when appending', () => {
|
|
39
|
+
const rel: OverlayEntity = {
|
|
40
|
+
expressId: 51,
|
|
41
|
+
type: 'IFCRELASSOCIATESCLASSIFICATION',
|
|
42
|
+
// Mix of #X-string refs (overlay-style) — additions should
|
|
43
|
+
// pick up the same form so the exporter doesn't choke.
|
|
44
|
+
attributes: ['guid', null, null, null, ['#100', '#101'], '#999'],
|
|
45
|
+
};
|
|
46
|
+
const editor = new StubStoreEditor([rel]);
|
|
47
|
+
const view = new StubView() as unknown as Parameters<typeof cloneElementMetadata>[1];
|
|
48
|
+
const store = makeStore(
|
|
49
|
+
new Map([['IFCRELASSOCIATESCLASSIFICATION', [51]]]),
|
|
50
|
+
);
|
|
51
|
+
cloneElementMetadata(
|
|
52
|
+
store,
|
|
53
|
+
view,
|
|
54
|
+
editor as unknown as Parameters<typeof cloneElementMetadata>[2],
|
|
55
|
+
100,
|
|
56
|
+
[200, 201],
|
|
57
|
+
);
|
|
58
|
+
assert.deepStrictEqual(editor.getNewEntity(51)?.attributes[4], ['#100', '#101', '#200', '#201']);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('skips relationships whose RelatedObjects do not include the source', () => {
|
|
62
|
+
const rel: OverlayEntity = {
|
|
63
|
+
expressId: 52,
|
|
64
|
+
type: 'IFCRELDEFINESBYPROPERTIES',
|
|
65
|
+
attributes: ['guid', null, null, null, [42, 43], 999],
|
|
66
|
+
};
|
|
67
|
+
const editor = new StubStoreEditor([rel]);
|
|
68
|
+
const view = new StubView() as unknown as Parameters<typeof cloneElementMetadata>[1];
|
|
69
|
+
const store = makeStore(
|
|
70
|
+
new Map([['IFCRELDEFINESBYPROPERTIES', [52]]]),
|
|
71
|
+
);
|
|
72
|
+
const result = cloneElementMetadata(
|
|
73
|
+
store,
|
|
74
|
+
view,
|
|
75
|
+
editor as unknown as Parameters<typeof cloneElementMetadata>[2],
|
|
76
|
+
100,
|
|
77
|
+
[200],
|
|
78
|
+
);
|
|
79
|
+
assert.strictEqual(result.relationshipsTouched, 0);
|
|
80
|
+
// Unchanged.
|
|
81
|
+
assert.deepStrictEqual(editor.getNewEntity(52)?.attributes[4], [42, 43]);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('is idempotent for targets already present', () => {
|
|
85
|
+
const rel: OverlayEntity = {
|
|
86
|
+
expressId: 53,
|
|
87
|
+
type: 'IFCRELDEFINESBYPROPERTIES',
|
|
88
|
+
attributes: ['guid', null, null, null, [100, 101], 999],
|
|
89
|
+
};
|
|
90
|
+
const editor = new StubStoreEditor([rel]);
|
|
91
|
+
const view = new StubView() as unknown as Parameters<typeof cloneElementMetadata>[1];
|
|
92
|
+
const store = makeStore(
|
|
93
|
+
new Map([['IFCRELDEFINESBYPROPERTIES', [53]]]),
|
|
94
|
+
);
|
|
95
|
+
// Source = 100 (already in list). Add 101 (also already in list)
|
|
96
|
+
// and 102 (new). Only 102 should land.
|
|
97
|
+
cloneElementMetadata(
|
|
98
|
+
store,
|
|
99
|
+
view,
|
|
100
|
+
editor as unknown as Parameters<typeof cloneElementMetadata>[2],
|
|
101
|
+
100,
|
|
102
|
+
[101, 102],
|
|
103
|
+
);
|
|
104
|
+
assert.deepStrictEqual(editor.getNewEntity(53)?.attributes[4], [100, 101, 102]);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('returns zero touches when the source has no relationships', () => {
|
|
108
|
+
const editor = new StubStoreEditor([]);
|
|
109
|
+
const view = new StubView() as unknown as Parameters<typeof cloneElementMetadata>[1];
|
|
110
|
+
const store = makeStore(new Map());
|
|
111
|
+
const result = cloneElementMetadata(
|
|
112
|
+
store,
|
|
113
|
+
view,
|
|
114
|
+
editor as unknown as Parameters<typeof cloneElementMetadata>[2],
|
|
115
|
+
100,
|
|
116
|
+
[200],
|
|
117
|
+
);
|
|
118
|
+
assert.strictEqual(result.relationshipsTouched, 0);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('handles multiple relationship types in one call', () => {
|
|
122
|
+
const pset: OverlayEntity = {
|
|
123
|
+
expressId: 60,
|
|
124
|
+
type: 'IFCRELDEFINESBYPROPERTIES',
|
|
125
|
+
attributes: ['guid', null, null, null, [100], 999],
|
|
126
|
+
};
|
|
127
|
+
const type: OverlayEntity = {
|
|
128
|
+
expressId: 61,
|
|
129
|
+
type: 'IFCRELDEFINESBYTYPE',
|
|
130
|
+
attributes: ['guid', null, null, null, [100], 888],
|
|
131
|
+
};
|
|
132
|
+
const editor = new StubStoreEditor([pset, type]);
|
|
133
|
+
const view = new StubView() as unknown as Parameters<typeof cloneElementMetadata>[1];
|
|
134
|
+
const store = makeStore(
|
|
135
|
+
new Map([
|
|
136
|
+
['IFCRELDEFINESBYPROPERTIES', [60]],
|
|
137
|
+
['IFCRELDEFINESBYTYPE', [61]],
|
|
138
|
+
]),
|
|
139
|
+
);
|
|
140
|
+
const result = cloneElementMetadata(
|
|
141
|
+
store,
|
|
142
|
+
view,
|
|
143
|
+
editor as unknown as Parameters<typeof cloneElementMetadata>[2],
|
|
144
|
+
100,
|
|
145
|
+
[200],
|
|
146
|
+
);
|
|
147
|
+
assert.strictEqual(result.relationshipsTouched, 2);
|
|
148
|
+
assert.deepStrictEqual(editor.getNewEntity(60)?.attributes[4], [100, 200]);
|
|
149
|
+
assert.deepStrictEqual(editor.getNewEntity(61)?.attributes[4], [100, 200]);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it('no-ops with empty target list', () => {
|
|
153
|
+
const rel: OverlayEntity = {
|
|
154
|
+
expressId: 70,
|
|
155
|
+
type: 'IFCRELDEFINESBYPROPERTIES',
|
|
156
|
+
attributes: ['guid', null, null, null, [100], 999],
|
|
157
|
+
};
|
|
158
|
+
const editor = new StubStoreEditor([rel]);
|
|
159
|
+
const view = new StubView() as unknown as Parameters<typeof cloneElementMetadata>[1];
|
|
160
|
+
const store = makeStore(
|
|
161
|
+
new Map([['IFCRELDEFINESBYPROPERTIES', [70]]]),
|
|
162
|
+
);
|
|
163
|
+
const result = cloneElementMetadata(
|
|
164
|
+
store,
|
|
165
|
+
view,
|
|
166
|
+
editor as unknown as Parameters<typeof cloneElementMetadata>[2],
|
|
167
|
+
100,
|
|
168
|
+
[],
|
|
169
|
+
);
|
|
170
|
+
assert.strictEqual(result.relationshipsTouched, 0);
|
|
171
|
+
assert.deepStrictEqual(editor.getNewEntity(70)?.attributes[4], [100]);
|
|
172
|
+
});
|
|
173
|
+
});
|
|
@@ -0,0 +1,124 @@
|
|
|
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
|
+
* Carry an element's Pset / Qto / classification / material / type
|
|
7
|
+
* relationships from a source IfcProduct onto one or more target
|
|
8
|
+
* products. Used when an authoring operation produces siblings of
|
|
9
|
+
* a source entity (split, duplicate, etc.) — both halves of a split
|
|
10
|
+
* wall should keep the source's FireRating, etc.
|
|
11
|
+
*
|
|
12
|
+
* Strategy: append the target id(s) to each relationship's
|
|
13
|
+
* `RelatedObjects` list rather than cloning the relationship entity
|
|
14
|
+
* itself. Cheaper, less overlay growth, and the IFC schema allows
|
|
15
|
+
* many objects to share a single rel. Downstream tooling (IDS, Pset
|
|
16
|
+
* dumps, exports) reads each rel's RelatedObjects list, so the
|
|
17
|
+
* targets become first-class members.
|
|
18
|
+
*
|
|
19
|
+
* The relationships we touch:
|
|
20
|
+
*
|
|
21
|
+
* IfcRelDefinesByProperties — Psets / Qtos (the big one)
|
|
22
|
+
* IfcRelDefinesByType — occurrence → type binding
|
|
23
|
+
* IfcRelAssociatesClassification
|
|
24
|
+
* IfcRelAssociatesMaterial
|
|
25
|
+
* IfcRelContainedInSpatialStructure — storey containment
|
|
26
|
+
* IfcRelAggregates / IfcRelNests — element assemblies
|
|
27
|
+
*
|
|
28
|
+
* Containment is handled separately by callers that already use
|
|
29
|
+
* `addWallToStore` / `addSlabToStore` etc. (those builders emit a
|
|
30
|
+
* fresh `IfcRelContainedInSpatialStructure` for the new entity), so
|
|
31
|
+
* this helper deliberately skips it.
|
|
32
|
+
*
|
|
33
|
+
* Returns the number of relationships touched so callers can log
|
|
34
|
+
* useful telemetry. Returns 0 silently when the source has no
|
|
35
|
+
* relationships — that's a valid case.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
39
|
+
import type { IfcAttributeValue, MutablePropertyView, StoreEditor } from '@ifc-lite/mutations';
|
|
40
|
+
import { asExpressIdRef, readAttributes } from './placement-core.js';
|
|
41
|
+
|
|
42
|
+
/** Relationship entity types we touch (case follows STEP storage form). */
|
|
43
|
+
const RELATIONSHIPS_TO_CLONE = [
|
|
44
|
+
// [type, related-objects-attribute-index, related-object-is-list-of-refs?]
|
|
45
|
+
['IFCRELDEFINESBYPROPERTIES', 4],
|
|
46
|
+
['IFCRELDEFINESBYTYPE', 4],
|
|
47
|
+
['IFCRELASSOCIATESCLASSIFICATION', 4],
|
|
48
|
+
['IFCRELASSOCIATESMATERIAL', 4],
|
|
49
|
+
['IFCRELAGGREGATES', 5],
|
|
50
|
+
['IFCRELNESTS', 5],
|
|
51
|
+
] as const;
|
|
52
|
+
|
|
53
|
+
export interface CloneMetadataResult {
|
|
54
|
+
/** Number of relationships that gained at least one target. */
|
|
55
|
+
relationshipsTouched: number;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Coerce a raw RelatedObjects attribute into an array of express ids.
|
|
60
|
+
* Overlay-stored refs are `#X` strings; parsed source refs are bare
|
|
61
|
+
* numbers (see `asExpressIdRef`).
|
|
62
|
+
*/
|
|
63
|
+
function relatedObjectIds(raw: unknown): number[] {
|
|
64
|
+
if (!Array.isArray(raw)) return [];
|
|
65
|
+
const ids: number[] = [];
|
|
66
|
+
for (const v of raw) {
|
|
67
|
+
const id = asExpressIdRef(v);
|
|
68
|
+
if (id !== null) ids.push(id);
|
|
69
|
+
}
|
|
70
|
+
return ids;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Append target ids to the raw RelatedObjects list while preserving
|
|
75
|
+
* the source's ref form (`#X` strings if any source ref is a string,
|
|
76
|
+
* raw numbers otherwise). Avoids accidentally normalising overlay
|
|
77
|
+
* refs into bare numbers, which the exporter wouldn't recognise.
|
|
78
|
+
*/
|
|
79
|
+
function appendTargetsToList(
|
|
80
|
+
raw: unknown,
|
|
81
|
+
targets: number[],
|
|
82
|
+
): unknown[] {
|
|
83
|
+
const list: unknown[] = Array.isArray(raw) ? raw.slice() : [];
|
|
84
|
+
const usesStrings = list.some((v) => typeof v === 'string');
|
|
85
|
+
for (const t of targets) {
|
|
86
|
+
list.push(usesStrings ? `#${t}` : t);
|
|
87
|
+
}
|
|
88
|
+
return list;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function cloneElementMetadata(
|
|
92
|
+
dataStore: IfcDataStore,
|
|
93
|
+
view: MutablePropertyView,
|
|
94
|
+
editor: StoreEditor,
|
|
95
|
+
sourceExpressId: number,
|
|
96
|
+
targetExpressIds: number[],
|
|
97
|
+
): CloneMetadataResult {
|
|
98
|
+
if (targetExpressIds.length === 0) return { relationshipsTouched: 0 };
|
|
99
|
+
|
|
100
|
+
// Dedupe caller-side input so a target listed twice doesn't
|
|
101
|
+
// produce two appends. The per-rel `currentRelated.includes`
|
|
102
|
+
// guard below would catch it on the second pass, but on the
|
|
103
|
+
// first pass both copies would land in the new list.
|
|
104
|
+
const uniqueTargets = Array.from(new Set(targetExpressIds));
|
|
105
|
+
|
|
106
|
+
let touched = 0;
|
|
107
|
+
for (const [type, index] of RELATIONSHIPS_TO_CLONE) {
|
|
108
|
+
const relIds = dataStore.entityIndex.byType.get(type) ?? [];
|
|
109
|
+
for (const relId of relIds) {
|
|
110
|
+
const attrs = readAttributes(dataStore, view, editor, relId);
|
|
111
|
+
if (!attrs) continue;
|
|
112
|
+
const currentRelated = relatedObjectIds(attrs[index]);
|
|
113
|
+
if (!currentRelated.includes(sourceExpressId)) continue;
|
|
114
|
+
// Skip targets that are already in the list — avoids duplicates
|
|
115
|
+
// when this is called twice for the same operation (idempotent).
|
|
116
|
+
const additions = uniqueTargets.filter((t) => !currentRelated.includes(t));
|
|
117
|
+
if (additions.length === 0) continue;
|
|
118
|
+
const newList = appendTargetsToList(attrs[index], additions);
|
|
119
|
+
editor.setPositionalAttribute(relId, index, newList as IfcAttributeValue);
|
|
120
|
+
touched++;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return { relationshipsTouched: touched };
|
|
124
|
+
}
|
|
@@ -0,0 +1,340 @@
|
|
|
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
|
+
* Core placement-chain reader + generic IfcProduct edits.
|
|
7
|
+
*
|
|
8
|
+
* Walks the standard product placement chain
|
|
9
|
+
*
|
|
10
|
+
* IfcProduct → ObjectPlacement → IfcLocalPlacement
|
|
11
|
+
* → RelativePlacement → IfcAxis2Placement3D
|
|
12
|
+
* → Location → IfcCartesianPoint → Coordinates [x, y, z]
|
|
13
|
+
*
|
|
14
|
+
* Reads honour the `StoreEditor` overlay (overlay-only entities,
|
|
15
|
+
* positional-mutation overrides on top of source-buffer entities).
|
|
16
|
+
* Writes go through `setPositionalAttribute` so they stack with
|
|
17
|
+
* other overlay edits and participate in the standard undo path.
|
|
18
|
+
*
|
|
19
|
+
* Wall-specific edits live in `wall-edit.ts`; this module stays
|
|
20
|
+
* generic so file size + cognitive scope stay manageable.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
24
|
+
import type { MutablePropertyView, StoreEditor } from '@ifc-lite/mutations';
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Decode an entity's raw attributes from the source buffer.
|
|
28
|
+
*
|
|
29
|
+
* Injected from the call site rather than imported here directly —
|
|
30
|
+
* `@ifc-lite/parser` transitively pulls in `@ifc-lite/ifcx` /
|
|
31
|
+
* `@ifc-lite/pointcloud`, which aren't always buildable in the
|
|
32
|
+
* test environment. The viewer wires this once at module load
|
|
33
|
+
* (`placement-edit.boot.ts`); tests using only overlay entities
|
|
34
|
+
* never need to provide it.
|
|
35
|
+
*/
|
|
36
|
+
export type SourceAttrsReader = (
|
|
37
|
+
dataStore: IfcDataStore,
|
|
38
|
+
expressId: number,
|
|
39
|
+
) => unknown[] | null;
|
|
40
|
+
|
|
41
|
+
let configuredSourceReader: SourceAttrsReader | null = null;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Register the parser-backed source reader. Called once during app
|
|
45
|
+
* boot. Pass `null` to clear (used by tests).
|
|
46
|
+
*/
|
|
47
|
+
export function setSourceAttrsReader(reader: SourceAttrsReader | null): void {
|
|
48
|
+
configuredSourceReader = reader;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
type EntityAttrs = unknown[];
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Read the effective attribute list for an express id. Overlay-only
|
|
55
|
+
* entities come from the StoreEditor; source entities come from the
|
|
56
|
+
* original buffer. Positional-mutation overrides are layered on top so
|
|
57
|
+
* a previously-translated point reads back its mutated coords.
|
|
58
|
+
*/
|
|
59
|
+
export function readAttributes(
|
|
60
|
+
dataStore: IfcDataStore,
|
|
61
|
+
view: MutablePropertyView,
|
|
62
|
+
editor: StoreEditor,
|
|
63
|
+
expressId: number,
|
|
64
|
+
): EntityAttrs | null {
|
|
65
|
+
const overlay = editor.getNewEntity(expressId);
|
|
66
|
+
let attrs: EntityAttrs | null = null;
|
|
67
|
+
if (overlay) {
|
|
68
|
+
attrs = overlay.attributes.slice();
|
|
69
|
+
} else if (configuredSourceReader) {
|
|
70
|
+
attrs = configuredSourceReader(dataStore, expressId);
|
|
71
|
+
if (!attrs) return null;
|
|
72
|
+
attrs = attrs.slice();
|
|
73
|
+
} else {
|
|
74
|
+
// No source reader configured and no overlay entry — typical in
|
|
75
|
+
// unit tests that don't wire `setSourceAttrsReader`. Treat as
|
|
76
|
+
// "unknown entity" so callers fall back gracefully.
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
// Apply positional mutations so a partially-edited entity reflects
|
|
80
|
+
// its current state (relevant when the user translates the same
|
|
81
|
+
// entity twice — the second read must see the first delta).
|
|
82
|
+
const mutated = view.getPositionalMutationsForEntity(expressId);
|
|
83
|
+
if (mutated) {
|
|
84
|
+
for (const [index, value] of mutated.entries()) {
|
|
85
|
+
attrs[index] = value;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return attrs;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* References take two forms in our attribute graph:
|
|
93
|
+
* - number (the parser normalises `#123` → 123 when reading source)
|
|
94
|
+
* - string `#123` (overlay entities created via `editor.addEntity`
|
|
95
|
+
* carry the raw `#X` form straight through)
|
|
96
|
+
* Treat both as valid so the chain walker works for source-buffer
|
|
97
|
+
* AND overlay-only entities — it's the same conceptual reference.
|
|
98
|
+
*/
|
|
99
|
+
export function asExpressIdRef(value: unknown): number | null {
|
|
100
|
+
if (typeof value === 'number' && Number.isFinite(value)) return value;
|
|
101
|
+
if (typeof value === 'string' && value.startsWith('#')) {
|
|
102
|
+
const id = parseInt(value.slice(1), 10);
|
|
103
|
+
return Number.isFinite(id) ? id : null;
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function asCoordinateTriple(value: unknown): [number, number, number] | null {
|
|
109
|
+
if (!Array.isArray(value)) return null;
|
|
110
|
+
if (value.length < 2) return null;
|
|
111
|
+
const x = typeof value[0] === 'number' ? value[0] : NaN;
|
|
112
|
+
const y = typeof value[1] === 'number' ? value[1] : NaN;
|
|
113
|
+
// Coordinates may be 2D ([x, y]) — treat the missing Z as 0.
|
|
114
|
+
const z = value.length >= 3 && typeof value[2] === 'number' ? value[2] : 0;
|
|
115
|
+
if (Number.isNaN(x) || Number.isNaN(y)) return null;
|
|
116
|
+
return [x, y, z];
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function asDirectionRatios(value: unknown): [number, number, number] | null {
|
|
120
|
+
if (!Array.isArray(value)) return null;
|
|
121
|
+
if (value.length < 2) return null;
|
|
122
|
+
const x = typeof value[0] === 'number' ? value[0] : NaN;
|
|
123
|
+
const y = typeof value[1] === 'number' ? value[1] : NaN;
|
|
124
|
+
const z = value.length >= 3 && typeof value[2] === 'number' ? value[2] : 0;
|
|
125
|
+
if (Number.isNaN(x) || Number.isNaN(y)) return null;
|
|
126
|
+
return [x, y, z];
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export interface PlacementChain {
|
|
130
|
+
/** IfcProduct.ObjectPlacement target (IfcLocalPlacement express id). */
|
|
131
|
+
localPlacementId: number;
|
|
132
|
+
/** IfcLocalPlacement.RelativePlacement target (IfcAxis2Placement3D express id). */
|
|
133
|
+
axisPlacementId: number;
|
|
134
|
+
/** IfcAxis2Placement3D.Location target (IfcCartesianPoint express id). */
|
|
135
|
+
cartesianPointId: number;
|
|
136
|
+
/** Current coordinates on the IfcCartesianPoint (storey-local, IFC Z-up). */
|
|
137
|
+
coordinates: [number, number, number];
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Resolve the full placement chain for an IfcProduct. Returns `null`
|
|
142
|
+
* if any link is missing or has the wrong shape — callers should treat
|
|
143
|
+
* this as "this entity's placement isn't directly translatable" and
|
|
144
|
+
* surface a clear message rather than crashing.
|
|
145
|
+
*
|
|
146
|
+
* Indices follow the IfcProduct attribute order:
|
|
147
|
+
* [0] GlobalId · [1] OwnerHistory · [2] Name · [3] Description
|
|
148
|
+
* [4] ObjectType · [5] ObjectPlacement · [6] Representation · ...
|
|
149
|
+
*
|
|
150
|
+
* For non-product entities (e.g. profiles, points themselves) attrs[5]
|
|
151
|
+
* either doesn't exist or isn't a placement reference, so we bail.
|
|
152
|
+
*/
|
|
153
|
+
export function resolvePlacementChain(
|
|
154
|
+
dataStore: IfcDataStore,
|
|
155
|
+
view: MutablePropertyView,
|
|
156
|
+
editor: StoreEditor,
|
|
157
|
+
expressId: number,
|
|
158
|
+
): PlacementChain | null {
|
|
159
|
+
const productAttrs = readAttributes(dataStore, view, editor, expressId);
|
|
160
|
+
if (!productAttrs) return null;
|
|
161
|
+
|
|
162
|
+
const localPlacementId = asExpressIdRef(productAttrs[5]);
|
|
163
|
+
if (localPlacementId === null) return null;
|
|
164
|
+
|
|
165
|
+
const localPlacementAttrs = readAttributes(dataStore, view, editor, localPlacementId);
|
|
166
|
+
if (!localPlacementAttrs) return null;
|
|
167
|
+
|
|
168
|
+
// IfcLocalPlacement.RelativePlacement is at index 1
|
|
169
|
+
// ([0] = PlacementRelTo (parent placement)).
|
|
170
|
+
const axisPlacementId = asExpressIdRef(localPlacementAttrs[1]);
|
|
171
|
+
if (axisPlacementId === null) return null;
|
|
172
|
+
|
|
173
|
+
const axisAttrs = readAttributes(dataStore, view, editor, axisPlacementId);
|
|
174
|
+
if (!axisAttrs) return null;
|
|
175
|
+
|
|
176
|
+
// IfcAxis2Placement3D.Location at index 0.
|
|
177
|
+
const cartesianPointId = asExpressIdRef(axisAttrs[0]);
|
|
178
|
+
if (cartesianPointId === null) return null;
|
|
179
|
+
|
|
180
|
+
const pointAttrs = readAttributes(dataStore, view, editor, cartesianPointId);
|
|
181
|
+
if (!pointAttrs) return null;
|
|
182
|
+
|
|
183
|
+
const coordinates = asCoordinateTriple(pointAttrs[0]);
|
|
184
|
+
if (!coordinates) return null;
|
|
185
|
+
|
|
186
|
+
return { localPlacementId, axisPlacementId, cartesianPointId, coordinates };
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export type TranslateResult =
|
|
190
|
+
| { ok: true; oldCoordinates: [number, number, number]; newCoordinates: [number, number, number] }
|
|
191
|
+
| { ok: false; reason: string };
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Translate an IfcProduct by `delta` (storey-local IFC Z-up). Reads
|
|
195
|
+
* the current coordinates from the chain, adds the delta, writes back
|
|
196
|
+
* via `setPositionalAttribute`. Caller is responsible for batching
|
|
197
|
+
* undo (the upstream `setPositionalAttribute` action already pushes a
|
|
198
|
+
* single mutation onto the model's undo stack).
|
|
199
|
+
*/
|
|
200
|
+
export function translateProduct(
|
|
201
|
+
dataStore: IfcDataStore,
|
|
202
|
+
view: MutablePropertyView,
|
|
203
|
+
editor: StoreEditor,
|
|
204
|
+
expressId: number,
|
|
205
|
+
delta: [number, number, number],
|
|
206
|
+
): TranslateResult {
|
|
207
|
+
const chain = resolvePlacementChain(dataStore, view, editor, expressId);
|
|
208
|
+
if (!chain) {
|
|
209
|
+
return {
|
|
210
|
+
ok: false,
|
|
211
|
+
reason:
|
|
212
|
+
'Entity placement is not a simple IfcLocalPlacement → IfcAxis2Placement3D → IfcCartesianPoint chain',
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
const [x, y, z] = chain.coordinates;
|
|
216
|
+
const next: [number, number, number] = [x + delta[0], y + delta[1], z + delta[2]];
|
|
217
|
+
editor.setPositionalAttribute(chain.cartesianPointId, 0, next);
|
|
218
|
+
return { ok: true, oldCoordinates: chain.coordinates, newCoordinates: next };
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Set the entity's position to an absolute storey-local coordinate.
|
|
223
|
+
* Convenience over `translateProduct` when the caller has a target
|
|
224
|
+
* (e.g. a numeric form bound to current coordinates).
|
|
225
|
+
*/
|
|
226
|
+
export function setProductPosition(
|
|
227
|
+
dataStore: IfcDataStore,
|
|
228
|
+
view: MutablePropertyView,
|
|
229
|
+
editor: StoreEditor,
|
|
230
|
+
expressId: number,
|
|
231
|
+
position: [number, number, number],
|
|
232
|
+
): TranslateResult {
|
|
233
|
+
const chain = resolvePlacementChain(dataStore, view, editor, expressId);
|
|
234
|
+
if (!chain) {
|
|
235
|
+
return {
|
|
236
|
+
ok: false,
|
|
237
|
+
reason:
|
|
238
|
+
'Entity placement is not a simple IfcLocalPlacement → IfcAxis2Placement3D → IfcCartesianPoint chain',
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
editor.setPositionalAttribute(chain.cartesianPointId, 0, position);
|
|
242
|
+
return { ok: true, oldCoordinates: chain.coordinates, newCoordinates: position };
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Snapshot of the placement's IfcAxis2Placement3D rotation.
|
|
247
|
+
* `refDirectionId === null` means the slot is implicit (STEP `$`) —
|
|
248
|
+
* the default direction `[1, 0, 0]` is reported, but callers that
|
|
249
|
+
* want to rotate must refuse this case (no IfcDirection to write to
|
|
250
|
+
* without orphaning one on undo).
|
|
251
|
+
*/
|
|
252
|
+
export interface RotationState {
|
|
253
|
+
axisPlacementId: number;
|
|
254
|
+
refDirectionId: number | null;
|
|
255
|
+
refDirection: [number, number, number];
|
|
256
|
+
/** Current yaw about Z (rad). */
|
|
257
|
+
yawZ: number;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
export function resolveRotationState(
|
|
261
|
+
dataStore: IfcDataStore,
|
|
262
|
+
view: MutablePropertyView,
|
|
263
|
+
editor: StoreEditor,
|
|
264
|
+
expressId: number,
|
|
265
|
+
): RotationState | null {
|
|
266
|
+
const chain = resolvePlacementChain(dataStore, view, editor, expressId);
|
|
267
|
+
if (!chain) return null;
|
|
268
|
+
const axisAttrs = readAttributes(dataStore, view, editor, chain.axisPlacementId);
|
|
269
|
+
if (!axisAttrs) return null;
|
|
270
|
+
// IfcAxis2Placement3D index 2 = RefDirection (an optional IfcDirection ref).
|
|
271
|
+
const refDirectionId = asExpressIdRef(axisAttrs[2]);
|
|
272
|
+
if (refDirectionId === null) {
|
|
273
|
+
return {
|
|
274
|
+
axisPlacementId: chain.axisPlacementId,
|
|
275
|
+
refDirectionId: null,
|
|
276
|
+
refDirection: [1, 0, 0],
|
|
277
|
+
yawZ: 0,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
const dirAttrs = readAttributes(dataStore, view, editor, refDirectionId);
|
|
281
|
+
if (!dirAttrs) return null;
|
|
282
|
+
// IfcDirection index 0 = DirectionRatios (list of doubles).
|
|
283
|
+
const ratios = asDirectionRatios(dirAttrs[0]);
|
|
284
|
+
if (!ratios) return null;
|
|
285
|
+
// Yaw about Z derived from the in-plane direction. Numerically
|
|
286
|
+
// stable for any unit-length input; for non-unit inputs we still
|
|
287
|
+
// recover the angle from atan2.
|
|
288
|
+
const yawZ = Math.atan2(ratios[1], ratios[0]);
|
|
289
|
+
return { axisPlacementId: chain.axisPlacementId, refDirectionId, refDirection: ratios, yawZ };
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
export type RotateResult =
|
|
293
|
+
| { ok: true; oldYawZ: number; newYawZ: number; newRefDirection: [number, number, number] }
|
|
294
|
+
| { ok: false; reason: string };
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Rotate an IfcProduct about the storey-up Z axis by `deltaYaw`
|
|
298
|
+
* radians. Updates RefDirection on the IfcAxis2Placement3D in place
|
|
299
|
+
* when one already exists.
|
|
300
|
+
*
|
|
301
|
+
* Refuses to operate when the placement has no explicit RefDirection
|
|
302
|
+
* (the implicit `[1, 0, 0]` STEP default). Materialising a fresh
|
|
303
|
+
* IfcDirection there would require a multi-mutation atomic undo
|
|
304
|
+
* entry to avoid orphans on undo, which the store doesn't have yet.
|
|
305
|
+
* Every entity emitted by `@ifc-lite/create`'s in-store builders
|
|
306
|
+
* carries an explicit RefDirection, so the implicit branch only
|
|
307
|
+
* trips on hand-rolled source-buffer entities — surfacing a clear
|
|
308
|
+
* refusal beats silently leaking entities.
|
|
309
|
+
*/
|
|
310
|
+
export function rotateProductYaw(
|
|
311
|
+
dataStore: IfcDataStore,
|
|
312
|
+
view: MutablePropertyView,
|
|
313
|
+
editor: StoreEditor,
|
|
314
|
+
expressId: number,
|
|
315
|
+
deltaYaw: number,
|
|
316
|
+
): RotateResult {
|
|
317
|
+
const state = resolveRotationState(dataStore, view, editor, expressId);
|
|
318
|
+
if (!state) {
|
|
319
|
+
return {
|
|
320
|
+
ok: false,
|
|
321
|
+
reason:
|
|
322
|
+
'Entity placement is not a simple IfcLocalPlacement → IfcAxis2Placement3D chain',
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
if (state.refDirectionId === null) {
|
|
326
|
+
return {
|
|
327
|
+
ok: false,
|
|
328
|
+
reason:
|
|
329
|
+
'Entity has an implicit reference direction; rotation requires an explicit IfcDirection on its axis placement.',
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
const newYaw = state.yawZ + deltaYaw;
|
|
333
|
+
const newRatios: [number, number, number] = [
|
|
334
|
+
Math.cos(newYaw),
|
|
335
|
+
Math.sin(newYaw),
|
|
336
|
+
state.refDirection[2],
|
|
337
|
+
];
|
|
338
|
+
editor.setPositionalAttribute(state.refDirectionId, 0, newRatios);
|
|
339
|
+
return { ok: true, oldYawZ: state.yawZ, newYawZ: newYaw, newRefDirection: newRatios };
|
|
340
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
* Boot-time wiring for `placement-edit`. Imported once for its side
|
|
7
|
+
* effect from the app entrypoint (`main.tsx`). Keeps the
|
|
8
|
+
* `@ifc-lite/parser` import out of `placement-edit.ts` itself so the
|
|
9
|
+
* pure overlay-path logic stays unit-testable without a parser build.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { EntityExtractor, type IfcDataStore } from '@ifc-lite/parser';
|
|
13
|
+
import { setSourceAttrsReader } from './placement-edit.js';
|
|
14
|
+
|
|
15
|
+
setSourceAttrsReader((dataStore: IfcDataStore, expressId: number) => {
|
|
16
|
+
const ref = dataStore.entityIndex.byId.get(expressId);
|
|
17
|
+
if (!ref) return null;
|
|
18
|
+
const extractor = new EntityExtractor(dataStore.source);
|
|
19
|
+
const entity = extractor.extractEntity(ref);
|
|
20
|
+
return entity?.attributes ?? null;
|
|
21
|
+
});
|