@ifc-lite/viewer 1.21.0 → 1.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +91 -57
- package/CHANGELOG.md +33 -0
- package/dist/assets/__vite-browser-external-B1O5LaIO.js +1 -0
- package/dist/assets/arrow-CXWhTnNT.js +20 -0
- package/dist/assets/ascii-points-source-bTjLVmUX.js +1 -0
- package/dist/assets/{basketViewActivator-Bzw51jhm.js → basketViewActivator--cFpU2Q9.js} +14 -15
- package/dist/assets/bcf-Ba2CjHib.js +281 -0
- package/dist/assets/browser-DXS29_v9.js +695 -0
- package/dist/assets/cesium-BoVuJvTC.js +17850 -0
- package/dist/assets/decode-worker-CgM1iNSK.js +172 -0
- package/dist/assets/deflate-DCLbV4UE.js +1 -0
- package/dist/assets/{drawing-2d-Bjy8YPrg.js → drawing-2d-C71b8Ugx.js} +1 -1
- package/dist/assets/e57-source-CQHxE8n3.js +1 -0
- package/dist/assets/emscripten-module-B1g2L2eS.wasm +0 -0
- package/dist/assets/emscripten-module-DHbYPfAp.wasm +0 -0
- package/dist/assets/emscripten-module-ZrHFMo7O.wasm +0 -0
- package/dist/assets/emscripten-module-uFzwHH0Y.wasm +0 -0
- package/dist/assets/emscripten-module.browser-BLJD5hhE.js +1 -0
- package/dist/assets/{esbuild-Cpd5nU_H.wasm → esbuild-CzsZLPr0.wasm} +0 -0
- package/dist/assets/esbuild-FgU11_Eg.js +1 -0
- package/dist/assets/event-B0kAzHa-.js +1 -0
- package/dist/assets/exporters-Bf6PTtdW.js +5723 -0
- package/dist/assets/ffi-Boa1QuFa.js +1 -0
- package/dist/assets/geometry-controller.worker-CEr00X3X.js +7 -0
- package/dist/assets/geometry.worker-B4VPDkmL.js +1 -0
- package/dist/assets/geotiff-BN4J8Vt9.js +3354 -0
- package/dist/assets/{ids-B7AXEv7h.js → ids-XwxE1tK3.js} +7 -7
- package/dist/assets/ifc-lite-DNzkEkIb.js +7 -0
- package/dist/assets/ifc-lite_bg-1IiJN0Zg.wasm +0 -0
- package/dist/assets/ifc-lite_bg-B_eUD1Wy.wasm +0 -0
- package/dist/assets/index-DMho-JA0.js +6 -0
- package/dist/assets/index-DS_xJQfP.css +1 -0
- package/dist/assets/{index-DVNSvEMh.js → index-j2x5R7fb.js} +86695 -74779
- package/dist/assets/inline-worker-BpBzlmd6.js +1 -0
- package/dist/assets/jpeg-BUTmr0Bp.js +1 -0
- package/dist/assets/las-BW6LIc_j.js +1 -0
- package/dist/assets/las-source-C_IGrgRq.js +1 -0
- package/dist/assets/{laz-perf-DnSyzVYH.wasm → laz-perf-CFJp03W6.wasm} +0 -0
- package/dist/assets/laz-perf-DgUOSLeU.js +1 -0
- package/dist/assets/laz-source-BWjza0Iw.js +125 -0
- package/dist/assets/{lens-CSASnhAL.js → lens-CpjUdqpw.js} +1 -1
- package/dist/assets/lerc-DmzRHXn3.js +1 -0
- package/dist/assets/lzw-CgyIIzii.js +1 -0
- package/dist/assets/maplibre-gl-Do6O5tDc.js +800 -0
- package/dist/assets/{native-bridge-BiD01jI9.js → native-bridge-Q5ACp4QY.js} +6 -9
- package/dist/assets/packbits-C1r4AzHj.js +1 -0
- package/dist/assets/pako.esm-Cram60i4.js +1 -0
- package/dist/assets/parquet_wasm_bg-DcKVfvto.wasm +0 -0
- package/dist/assets/{parser.worker-Bnbrl6gy.js → parser.worker-Cl6XQcXA.js} +2 -2
- package/dist/assets/pcd-source-Ck0UnVDn.js +3 -0
- package/dist/assets/ply-source-C8jjyzxE.js +4 -0
- package/dist/assets/raw-ZqLh7kVQ.js +1 -0
- package/dist/assets/{exporters-u0sz2Upj.js → sandbox-Bju6ZKJK.js} +11869 -7414
- package/dist/assets/{server-client-DP8fMPY9.js → server-client-B8wi3CGx.js} +4 -4
- package/dist/assets/three-CQBzFWY2.js +4104 -0
- package/dist/assets/wasm-bridge-X-mWRA9Z.js +1 -0
- package/dist/assets/webimage-D0MbRMkU.js +1 -0
- package/dist/assets/{workerHelpers-CBbWSJmd.js → workerHelpers-DnNedVRr.js} +1 -1
- package/dist/assets/zip-BJqVbRkU.js +2 -0
- package/dist/assets/zstd-DA4VQ-ji.js +1 -0
- package/dist/cesium/{Workers/chunk-V7QEYVP3.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-236YIEYT.js} +2 -2
- package/dist/cesium/{Workers/chunk-5TJMAQVL.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-2ZYB3DYT.js} +2 -2
- package/dist/cesium/{Workers/chunk-UBOGZS7F.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-4M56RRIL.js} +2 -2
- package/dist/cesium/{Workers/chunk-OCWJRAXS.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-5BC2Q3QW.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-5XHUDY37.js +26 -0
- package/dist/cesium/{Workers/chunk-Z3QF2EHT.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-6WMLAJJP.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-72KUXMWU.js +26 -0
- package/dist/cesium/{Workers/chunk-EQ4YRVWL.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-7NQYTTAU.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-A35GG5WJ.js +26 -0
- package/dist/cesium/{Workers/chunk-FC4ZZ65J.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-AXNBHUAG.js} +2 -2
- package/dist/cesium/{Workers/chunk-BTSYJ5XU.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-DC3K7YTH.js} +2 -2
- package/dist/cesium/{Workers/chunk-SLT4J352.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-DRBPXGI7.js} +2 -2
- package/dist/cesium/{Workers/chunk-2MJIIVP4.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EARRZPMO.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EHC3BDVP.js +26 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EYZUSGKM.js +26 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EZSKHVA2.js +26 -0
- package/dist/cesium/{Workers/chunk-ICALLYLG.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-F3WJIFOO.js} +2 -2
- package/dist/cesium/{Workers/chunk-LSLE2RL4.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-FB7UV5BI.js} +2 -2
- package/dist/cesium/{Workers/chunk-CUUSNIVQ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-FC6IYMYF.js} +2 -2
- package/dist/cesium/{Workers/chunk-TNSUQXWK.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-GF67PEXE.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-GXEQRH2R.js +26 -0
- package/dist/cesium/{Workers/chunk-M4HLDBCG.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-I5NKQIWE.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IH7GXIUB.js +26 -0
- package/dist/cesium/{Workers/chunk-OIT7J4IC.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IPP3UFGH.js} +2 -2
- package/dist/cesium/{Workers/chunk-WWWZVEEH.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IYRGNBSH.js} +2 -2
- package/dist/cesium/{Workers/chunk-WPMZLB3Y.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-J6BM74AD.js} +2 -2
- package/dist/cesium/{Workers/chunk-QFM5DCMQ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-KG2GJUJT.js} +1 -1
- package/dist/cesium/{Workers/chunk-XQHLGIO7.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-L7UE5MMF.js} +2 -2
- package/dist/cesium/{Workers/chunk-EFBN7QNX.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LBZ34MHQ.js} +2 -2
- package/dist/cesium/{Workers/chunk-YP7I5QBZ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LOQDTQMX.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LYLRYC4L.js +29 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-MGPRMLLW.js +26 -0
- package/dist/cesium/{Workers/chunk-LI2ZSORM.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-NP26LKQA.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-OMUAZ3NM.js +26 -0
- package/dist/cesium/{Workers/chunk-S44JILQT.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PPFUDJN4.js} +2 -2
- package/dist/cesium/{Workers/chunk-EDVBB7SS.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PQ3V63XF.js} +2 -2
- package/dist/cesium/{Workers/chunk-Q5BPHJQF.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PWBQN4GK.js} +2 -2
- package/dist/cesium/{Workers/chunk-E7KYDCM5.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-QOTMLO2T.js} +2 -2
- package/dist/cesium/{Workers/chunk-XUSCFAVF.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-SP35IT73.js} +2 -2
- package/dist/cesium/{Workers/chunk-6BD4U3VO.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-T3ZGSZKA.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-TM6SYYHO.js +28 -0
- package/dist/cesium/{Workers/chunk-VUKYSU4H.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-TSGIJVWH.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-U3YGOX3C.js +63 -0
- package/dist/cesium/{Workers/chunk-7TVGLKQF.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VBYOXOSM.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VCOHJNKB.js +26 -0
- package/dist/cesium/{Workers/chunk-WBOV35NL.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VXAZXMUX.js} +2 -2
- package/dist/cesium/{Workers/chunk-IX4VMHEV.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VXCJOT4W.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-WPD3MB6X.js +26 -0
- package/dist/cesium/{Workers/chunk-V3OSTMM6.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-X4D5KUN5.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XEC656IT.js +26 -0
- package/dist/cesium/{Workers/chunk-MJHHSGEH.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XR53QRQS.js} +2 -2
- package/dist/cesium/{Workers/chunk-XFIQ5DEQ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XR7MN4PJ.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XU6O4MRS.js +26 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XZBHEBLF.js +29 -0
- package/dist/cesium/{Workers/chunk-OLZ3FYUM.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-Z2M4BF4E.js} +2 -2
- package/dist/cesium/{Workers/chunk-2ZBHLJST.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-Z4ERBZFB.js} +2 -2
- package/dist/cesium/{Workers/chunk-W37FE5GR.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-ZY2KCIWI.js} +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/combineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createBoxGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createBoxOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCircleGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCircleOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCoplanarPolygonGeometry.js +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCorridorGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCorridorOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCylinderGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCylinderOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipseGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipseOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipsoidGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipsoidOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createFrustumGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createFrustumOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createGeometry.js +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/createGroundPolylineGeometry.js +26 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPlaneGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPlaneOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolygonGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolygonOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolylineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolylineVolumeGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolylineVolumeOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createRectangleGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createRectangleOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createSimplePolylineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createSphereGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createSphereOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createTaskProcessorWorker.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTileClampedPolylines.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTileGeometries.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTilePoints.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTilePolygons.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTilePolylines.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromCesium3DTilesTerrain.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromGoogleEarthEnterpriseBuffer.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromHeightmap.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromQuantizedTerrainMesh.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createWallGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createWallOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/decodeDraco.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/decodeGoogleEarthEnterprisePacket.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/decodeI3S.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/gaussianSplatSorter.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/gaussianSplatTextureGenerator.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/incrementallyBuildTerrainPicker.js +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/transcodeKTX2.js +56 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/transferTypedArrayTest.js +1 -1
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/upsampleVerticesFromCesium3DTilesTerrain.js +2 -2
- package/dist/index.html +12 -14
- package/package.json +52 -45
- package/src/components/mcp/McpLanding.tsx +1 -1
- package/src/components/mcp/McpPlayground.tsx +1 -1
- package/src/components/mcp/PlaygroundChat.tsx +90 -52
- package/src/components/viewer/AddElementPanel.tsx +2 -2
- package/src/components/viewer/BasepointOverlay.tsx +239 -0
- package/src/components/viewer/CesiumOverlay.tsx +130 -115
- package/src/components/viewer/CesiumPlacementEditor.tsx +1024 -0
- package/src/components/viewer/ChatPanel.tsx +76 -93
- package/src/components/viewer/CommandPalette.tsx +25 -0
- package/src/components/viewer/EntityContextMenu.tsx +68 -10
- package/src/components/viewer/GeometryAxisRow.tsx +54 -0
- package/src/components/viewer/GeometryEditCard.tsx +392 -0
- package/src/components/viewer/HierarchyPanel.tsx +2 -2
- package/src/components/viewer/IDSAuditSummary.tsx +2 -2
- package/src/components/viewer/KeyboardShortcutsDialog.tsx +58 -4
- package/src/components/viewer/MainToolbar.tsx +308 -7
- package/src/components/viewer/PropertiesPanel.tsx +28 -31
- package/src/components/viewer/StatusBar.tsx +12 -0
- package/src/components/viewer/ToolOverlays.tsx +36 -0
- package/src/components/viewer/ViewerLayout.tsx +27 -0
- package/src/components/viewer/Viewport.tsx +49 -4
- package/src/components/viewer/ViewportContainer.tsx +158 -33
- package/src/components/viewer/ViewportOverlays.tsx +49 -106
- package/src/components/viewer/chat/ByokKeyModal.tsx +338 -0
- package/src/components/viewer/chat/ByokStreamingPill.tsx +62 -0
- package/src/components/viewer/chat/ByokTrustDiagram.tsx +192 -0
- package/src/components/viewer/properties/FederationAlignmentControls.tsx +180 -0
- package/src/components/viewer/properties/GeoreferencingPanel.tsx +55 -52
- package/src/components/viewer/properties/ModelMetadataPanel.tsx +55 -44
- package/src/components/viewer/properties/PrecisionGridBadge.tsx +125 -0
- package/src/components/viewer/properties/raw-step-format.ts +5 -3
- package/src/components/viewer/selectionHandlers.ts +308 -11
- package/src/components/viewer/tools/GizmoOverlay.tsx +322 -0
- package/src/components/viewer/tools/SplitNumericInput.tsx +225 -0
- package/src/components/viewer/tools/SplitOverlay.tsx +242 -0
- package/src/components/viewer/tools/WallEndpointOverlay.tsx +252 -0
- package/src/components/viewer/useGeometryStreaming.ts +100 -1
- package/src/components/viewer/useMouseControls.ts +8 -1
- package/src/hooks/useBCF.ts +6 -6
- package/src/hooks/useCameraTickSubscription.ts +62 -0
- package/src/hooks/useIfc.ts +4 -0
- package/src/hooks/useIfcFederation.ts +368 -20
- package/src/hooks/useKeyboardShortcuts.ts +86 -0
- package/src/hooks/useLevelDisplayEffect.ts +160 -0
- package/src/hooks/useViewerSelectors.ts +8 -0
- package/src/lib/__test__/stubs.ts +110 -0
- package/src/lib/geo/cesium-bridge.ts +86 -50
- package/src/lib/geo/cesium-placement.test.ts +260 -0
- package/src/lib/geo/cesium-placement.ts +237 -0
- package/src/lib/geo/effective-georef.test.ts +97 -8
- package/src/lib/geo/effective-georef.ts +40 -93
- package/src/lib/geo/geo-scale.ts +160 -0
- package/src/lib/geo/ifc-origin.test.ts +176 -0
- package/src/lib/geo/ifc-origin.ts +144 -0
- package/src/lib/geo/precision-grids.ts +444 -0
- package/src/lib/geo/reproject.test.ts +218 -0
- package/src/lib/geo/reproject.ts +199 -42
- package/src/lib/geo/terrain-elevation.ts +198 -89
- package/src/lib/lens/adapter.ts +52 -6
- package/src/lib/level-offsets.test.ts +153 -0
- package/src/lib/level-offsets.ts +140 -0
- package/src/lib/linear-element-edit.test.ts +220 -0
- package/src/lib/linear-element-edit.ts +327 -0
- package/src/lib/llm/clipboard-detect.test.ts +150 -0
- package/src/lib/llm/clipboard-detect.ts +90 -0
- package/src/lib/llm/models.ts +28 -0
- package/src/lib/llm/stream-direct.ts +16 -4
- package/src/lib/llm/types.ts +8 -0
- package/src/lib/metadata-clone.test.ts +173 -0
- package/src/lib/metadata-clone.ts +124 -0
- package/src/lib/placement-core.ts +340 -0
- package/src/lib/placement-edit.boot.ts +21 -0
- package/src/lib/placement-edit.test.ts +464 -0
- package/src/lib/placement-edit.ts +47 -0
- package/src/lib/polygon-clip.test.ts +193 -0
- package/src/lib/polygon-clip.ts +199 -0
- package/src/lib/slab-edit.test.ts +169 -0
- package/src/lib/slab-edit.ts +312 -0
- package/src/lib/wall-edit.ts +342 -0
- package/src/lib/wall-opening-reassign.test.ts +291 -0
- package/src/lib/wall-opening-reassign.ts +241 -0
- package/src/main.tsx +4 -0
- package/src/services/playground-model.ts +55 -0
- package/src/store/index.ts +11 -5
- package/src/store/slices/cesiumSlice.ts +154 -20
- package/src/store/slices/dataSlice.ts +80 -0
- package/src/store/slices/levelDisplaySlice.ts +105 -0
- package/src/store/slices/modelSlice.test.ts +19 -0
- package/src/store/slices/mutationSlice.ts +1138 -1
- package/src/store/slices/splitToolSlice.ts +165 -0
- package/src/store/slices/uiSlice.edit-mode.test.ts +210 -0
- package/src/store/slices/uiSlice.ts +78 -1
- package/src/store/types.ts +57 -2
- package/src/store.ts +3 -0
- package/src/utils/createBlankIfc.ts +37 -0
- package/tsconfig.json +1 -0
- package/.turbo/turbo-typecheck.log +0 -4
- package/dist/assets/arrow-CZ5kQ26f.js +0 -20
- package/dist/assets/arrow2_bg-BoXCojjR.wasm +0 -0
- package/dist/assets/bcf-4K724hw0.js +0 -281
- package/dist/assets/browser-C5TFR7sH.js +0 -694
- package/dist/assets/cesium-DUOzBlqv.js +0 -17817
- package/dist/assets/decode-worker-t2EGKAxO.js +0 -1708
- package/dist/assets/emscripten-module-BTRCZGcB.wasm +0 -0
- package/dist/assets/emscripten-module-CGIn_cMh.wasm +0 -0
- package/dist/assets/emscripten-module-DYvzWiHh.wasm +0 -0
- package/dist/assets/emscripten-module-NWak2PoB.wasm +0 -0
- package/dist/assets/emscripten-module.browser-CY5t0Vfq.js +0 -1
- package/dist/assets/esbuild-COv63sf-.js +0 -1
- package/dist/assets/event-DIOks52T.js +0 -1
- package/dist/assets/ffi-DlhRHxHv.js +0 -1
- package/dist/assets/geometry-controller.worker-NH8pZmrU.js +0 -7
- package/dist/assets/geometry.worker-Bp4rW_R1.js +0 -1
- package/dist/assets/ifc-lite-DfZHk36-.js +0 -7
- package/dist/assets/ifc-lite_bg-DlKs5-yM.wasm +0 -0
- package/dist/assets/ifc-lite_bg-PqmRe3Ph.wasm +0 -0
- package/dist/assets/index-CSWgTe1s.css +0 -1
- package/dist/assets/index-XwKzDuw6.js +0 -22
- package/dist/assets/laz-perf-Cvr_Lepg.js +0 -1
- package/dist/assets/maplibre-gl-CGLcoNXc.js +0 -811
- package/dist/assets/sandbox-DPD1ROr0.js +0 -9700
- package/dist/assets/three-CDRZThFA.js +0 -4057
- package/dist/assets/wasm-bridge-CErti6zX.js +0 -1
- package/dist/assets/zip-DBEtpeu6.js +0 -12
- package/dist/cesium/Workers/chunk-23ZQ2IVV.js +0 -29
- package/dist/cesium/Workers/chunk-2EQO3Q56.js +0 -26
- package/dist/cesium/Workers/chunk-2TE5NTVD.js +0 -26
- package/dist/cesium/Workers/chunk-BXMEEOCS.js +0 -63
- package/dist/cesium/Workers/chunk-BYLCY7GP.js +0 -29
- package/dist/cesium/Workers/chunk-CTHM3W6I.js +0 -26
- package/dist/cesium/Workers/chunk-E3JOOS3S.js +0 -26
- package/dist/cesium/Workers/chunk-F6PRE7D6.js +0 -26
- package/dist/cesium/Workers/chunk-FFBVWF2L.js +0 -26
- package/dist/cesium/Workers/chunk-GBAA6GVX.js +0 -26
- package/dist/cesium/Workers/chunk-ILRYTWTP.js +0 -26
- package/dist/cesium/Workers/chunk-IRNLBSEJ.js +0 -26
- package/dist/cesium/Workers/chunk-L6QHHACZ.js +0 -26
- package/dist/cesium/Workers/chunk-NMVKML6W.js +0 -26
- package/dist/cesium/Workers/chunk-OIRKANTH.js +0 -26
- package/dist/cesium/Workers/chunk-QKUIYMGC.js +0 -28
- package/dist/cesium/Workers/chunk-SQMIIXB7.js +0 -26
- package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +0 -26
- package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +0 -26
- package/dist/cesium/Workers/createGroundPolylineGeometry.js +0 -26
- package/dist/cesium/Workers/transcodeKTX2.js +0 -56
- package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +0 -26
- package/src/components/viewer/CesiumSettingsDialog.tsx +0 -100
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_0.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_1.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_10.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_11.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_12.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_13.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_14.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_15.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_16.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_17.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_18.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_19.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_2.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_20.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_21.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_22.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_23.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_24.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_25.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_26.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_27.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_3.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_4.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_5.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_6.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_7.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_8.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_9.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/bing_maps_credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/cesium_credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/google_earth_credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/ion-credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/LensFlare/DirtMask.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/LensFlare/StarBurst.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/0/0/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/0/1/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/0/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/0/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/1/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/1/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/2/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/2/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/3/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/3/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/tilemapresource.xml +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/airfield.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/airport.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/alcohol-shop.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/america-football.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/art-gallery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bakery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bank.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bar.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/baseball.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/basketball.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/beer.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bicycle.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/building.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bus.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cafe.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/camera.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/campsite.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/car.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cemetery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cesium.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/chemist.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cinema.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/circle-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/circle.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/city.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/clothing-store.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/college.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/commercial.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cricket.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cross.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/dam.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/danger.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/disability.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/dog-park.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/embassy.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/emergency-telephone.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/entrance.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/farm.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fast-food.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/ferry.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fire-station.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fuel.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/garden.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/gift.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/golf.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/grocery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/hairdresser.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/harbor.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/heart.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/heliport.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/hospital.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/ice-cream.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/industrial.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/land-use.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/laundry.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/library.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/lighthouse.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/lodging.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/logging.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/london-underground.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/marker-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/marker.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/minefield.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/mobilephone.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/monument.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/museum.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/music.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/oil-well.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/park.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/park2.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/parking-garage.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/parking.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/pharmacy.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/pitch.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/place-of-worship.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/playground.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/police.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/polling-place.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/post.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/prison.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-above.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-light.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-metro.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-underground.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-christian.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-jewish.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-muslim.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/restaurant.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/roadblock.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rocket.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/school.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/scooter.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/shop.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/skiing.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/slaughterhouse.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/soccer.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/square-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/square.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/star-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/star.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/suitcase.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/swimming.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/telephone.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/tennis.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/theatre.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/toilets.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/town-hall.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/town.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/triangle-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/triangle.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/village.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/warehouse.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/waste-basket.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/water.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/wetland.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/zoo.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/moonSmall.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/pin.svg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/waterNormals.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/waterNormalsSmall.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/approximateTerrainHeights.json +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/Workers/package.json +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/Workers/zip-web-worker.js +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/basis_transcoder.wasm +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/draco_decoder.wasm +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/google-earth-dbroot-parser.js +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/wasm_splats_bg.wasm +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/zip-module.wasm +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Animation/Animation.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Animation/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/BaseLayerPicker/BaseLayerPicker.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/BaseLayerPicker/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Cesium3DTilesInspector/Cesium3DTilesInspector.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumInspector/CesiumInspector.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumWidget/CesiumWidget.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumWidget/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/FullscreenButton/FullscreenButton.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Geocoder/Geocoder.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Geocoder/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/azureAerial.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/azureRoads.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingAerial.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingAerialLabels.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingRoads.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/blueMarble.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/earthAtNight.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleContour.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleRoadmap.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleSatellite.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxSatellite.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxStreets.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxTerrain.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/naturalEarthII.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/openStreetMap.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/sentinel-2.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stamenToner.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stamenWatercolor.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/Mouse.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseLeft.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseMiddle.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseRight.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/Touch.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchDrag.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchRotate.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchTilt.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchZoom.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TerrainProviders/Ellipsoid.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TimelineIcons.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/info-loading.gif +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/InfoBox/InfoBox.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/InfoBox/InfoBoxDescription.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/NavigationHelpButton/NavigationHelpButton.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/NavigationHelpButton/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/PerformanceWatchdog/PerformanceWatchdog.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/ProjectionPicker/ProjectionPicker.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/SceneModePicker/SceneModePicker.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/SelectionIndicator/SelectionIndicator.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Timeline/Timeline.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Timeline/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/VRButton/VRButton.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Viewer/Viewer.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/VoxelInspector/VoxelInspector.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/lighterShared.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/shared.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/widgets.css +0 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Pure offset math for the Exploded level-display mode.
|
|
7
|
+
*
|
|
8
|
+
* Given a model's spatial hierarchy, computes the Y offset (in
|
|
9
|
+
* world / renderer frame) each storey should receive at a given
|
|
10
|
+
* `gap`. Index 0 stays at its native elevation; subsequent
|
|
11
|
+
* storeys (sorted by elevation ascending) lift by
|
|
12
|
+
* `(index - 0) × gap - elevationDelta` so they end up at
|
|
13
|
+
* `index × gap` relative to the lowest storey's Y.
|
|
14
|
+
*
|
|
15
|
+
* The output is `Map<storeyId, deltaY>` — pure data, no
|
|
16
|
+
* side-effects — so callers can:
|
|
17
|
+
*
|
|
18
|
+
* 1. Compute the target offsets
|
|
19
|
+
* 2. Subtract the previously-applied offsets
|
|
20
|
+
* 3. Push the delta into `pendingMeshTranslations`
|
|
21
|
+
*
|
|
22
|
+
* That subtraction is what makes mode toggles + gap changes
|
|
23
|
+
* reversible without re-loading geometry.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
27
|
+
|
|
28
|
+
export type StoreyOffsets = Map<number /* storey express id */, number /* renderer Y offset, m */>;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Compute target offsets for `gap` based on the model's spatial
|
|
32
|
+
* hierarchy. Returns an empty map for models with no storeys, or
|
|
33
|
+
* with `gap = 0` (which is Stacked semantics).
|
|
34
|
+
*
|
|
35
|
+
* IFC convention: storey elevations are in the model's storey-
|
|
36
|
+
* local frame (Z-up). The renderer is Y-up, so an IFC elevation
|
|
37
|
+
* `e` translates to renderer Y `e` (the geometry pipeline already
|
|
38
|
+
* applies the swap when meshes are built).
|
|
39
|
+
*/
|
|
40
|
+
export function computeStoreyOffsets(
|
|
41
|
+
dataStore: IfcDataStore | undefined,
|
|
42
|
+
gap: number,
|
|
43
|
+
): StoreyOffsets {
|
|
44
|
+
if (!dataStore || !Number.isFinite(gap) || gap <= 0) return new Map();
|
|
45
|
+
const elevations = dataStore.spatialHierarchy?.storeyElevations;
|
|
46
|
+
if (!elevations || elevations.size === 0) return new Map();
|
|
47
|
+
|
|
48
|
+
// Sort storeys by elevation ascending so the lowest storey
|
|
49
|
+
// keeps its native Y and everything above lifts.
|
|
50
|
+
const sorted = [...elevations.entries()].sort((a, b) => a[1] - b[1]);
|
|
51
|
+
const baseElevation = sorted[0][1];
|
|
52
|
+
const out: StoreyOffsets = new Map();
|
|
53
|
+
for (let i = 0; i < sorted.length; i++) {
|
|
54
|
+
const [storeyId, elevation] = sorted[i];
|
|
55
|
+
const targetY = baseElevation + i * gap;
|
|
56
|
+
const offset = targetY - elevation;
|
|
57
|
+
if (offset !== 0) out.set(storeyId, offset);
|
|
58
|
+
}
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Diff a target offset map against the previously-applied map.
|
|
64
|
+
* Result: `Map<storeyId, deltaY>` such that
|
|
65
|
+
*
|
|
66
|
+
* newAppliedY = oldAppliedY + delta = targetY
|
|
67
|
+
*
|
|
68
|
+
* Storeys present in `previous` but not `target` get a delta of
|
|
69
|
+
* `-previous[storeyId]` (they're reverting to Stacked). Storeys
|
|
70
|
+
* in `target` but not `previous` get `+target[storeyId]` (they're
|
|
71
|
+
* lifting fresh). Storeys in both get the difference.
|
|
72
|
+
*
|
|
73
|
+
* Zero deltas are omitted so the caller doesn't push no-ops.
|
|
74
|
+
*/
|
|
75
|
+
export function diffStoreyOffsets(
|
|
76
|
+
target: StoreyOffsets,
|
|
77
|
+
previous: StoreyOffsets,
|
|
78
|
+
): StoreyOffsets {
|
|
79
|
+
const out: StoreyOffsets = new Map();
|
|
80
|
+
for (const [storeyId, prev] of previous) {
|
|
81
|
+
const next = target.get(storeyId) ?? 0;
|
|
82
|
+
const delta = next - prev;
|
|
83
|
+
if (delta !== 0) out.set(storeyId, delta);
|
|
84
|
+
}
|
|
85
|
+
for (const [storeyId, next] of target) {
|
|
86
|
+
if (previous.has(storeyId)) continue;
|
|
87
|
+
if (next !== 0) out.set(storeyId, next);
|
|
88
|
+
}
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Resolve every entity in a storey to its globalId for the given
|
|
94
|
+
* model index. Walks `spatialHierarchy.elementToStorey` and
|
|
95
|
+
* filters to entries matching `storeyExpressId`. Returns an empty
|
|
96
|
+
* array when the hierarchy is missing.
|
|
97
|
+
*
|
|
98
|
+
* `toGlobalId` is injected so the helper stays free of
|
|
99
|
+
* FederationRegistry imports (keeps it test-friendly).
|
|
100
|
+
*/
|
|
101
|
+
export function entitiesInStorey(
|
|
102
|
+
dataStore: IfcDataStore | undefined,
|
|
103
|
+
storeyExpressId: number,
|
|
104
|
+
toGlobalId: (localExpressId: number) => number,
|
|
105
|
+
): number[] {
|
|
106
|
+
if (!dataStore) return [];
|
|
107
|
+
const map = dataStore.spatialHierarchy?.elementToStorey;
|
|
108
|
+
if (!map) return [];
|
|
109
|
+
const out: number[] = [];
|
|
110
|
+
for (const [elementId, sid] of map) {
|
|
111
|
+
if (sid !== storeyExpressId) continue;
|
|
112
|
+
out.push(toGlobalId(elementId));
|
|
113
|
+
}
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Build a per-entity-globalId translation map for a model from a
|
|
119
|
+
* storey-offset map. Used by the level-display effect to push
|
|
120
|
+
* into `pendingMeshTranslations`. The translation is along world
|
|
121
|
+
* +Y only (storey lift) so the X/Z components are zero.
|
|
122
|
+
*
|
|
123
|
+
* `toGlobalId` is injected for the same reason as above.
|
|
124
|
+
*/
|
|
125
|
+
export function buildEntityTranslations(
|
|
126
|
+
dataStore: IfcDataStore | undefined,
|
|
127
|
+
offsetsByStorey: StoreyOffsets,
|
|
128
|
+
toGlobalId: (localExpressId: number) => number,
|
|
129
|
+
): Map<number, [number, number, number]> {
|
|
130
|
+
const out = new Map<number, [number, number, number]>();
|
|
131
|
+
if (!dataStore || offsetsByStorey.size === 0) return out;
|
|
132
|
+
const elementToStorey = dataStore.spatialHierarchy?.elementToStorey;
|
|
133
|
+
if (!elementToStorey) return out;
|
|
134
|
+
for (const [elementId, storeyId] of elementToStorey) {
|
|
135
|
+
const dy = offsetsByStorey.get(storeyId);
|
|
136
|
+
if (dy === undefined || dy === 0) continue;
|
|
137
|
+
out.set(toGlobalId(elementId), [0, dy, 0]);
|
|
138
|
+
}
|
|
139
|
+
return out;
|
|
140
|
+
}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
|
|
5
|
+
import { describe, it } from 'node:test';
|
|
6
|
+
import assert from 'node:assert';
|
|
7
|
+
import {
|
|
8
|
+
resolveLinearElementChain,
|
|
9
|
+
computeLinearElementSplitGeometry,
|
|
10
|
+
projectOntoLinearAxis,
|
|
11
|
+
MIN_LINEAR_SEGMENT_LENGTH,
|
|
12
|
+
} from './linear-element-edit.js';
|
|
13
|
+
|
|
14
|
+
import { StubStoreEditor, StubView, makeStubDataStore, type OverlayEntity } from './__test__/stubs.js';
|
|
15
|
+
|
|
16
|
+
const dataStoreStub = makeStubDataStore() as unknown as Parameters<typeof resolveLinearElementChain>[0];
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Beam fixture mirroring `addBeamToStore` output:
|
|
20
|
+
* #100 IfcBeam → #99 IfcLocalPlacement → #98 IfcAxis2Placement3D
|
|
21
|
+
* attrs[0] Location = #97 IfcCartesianPoint([1,0,0])
|
|
22
|
+
* attrs[1] Axis = #96 IfcDirection([1,0,0])
|
|
23
|
+
* attrs[2] RefDir = (omitted — not relevant for split)
|
|
24
|
+
* → Representation #95 IfcProductDefinitionShape
|
|
25
|
+
* → [#94 IfcShapeRepresentation]
|
|
26
|
+
* → Items[0] = #93 IfcExtrudedAreaSolid
|
|
27
|
+
* attrs[0] SweptArea = #92 IfcRectangleProfileDef (W=0.3, H=0.5)
|
|
28
|
+
* attrs[3] Depth = 4
|
|
29
|
+
*/
|
|
30
|
+
function makeBeamFixture() {
|
|
31
|
+
const startPoint: OverlayEntity = {
|
|
32
|
+
expressId: 97,
|
|
33
|
+
type: 'IFCCARTESIANPOINT',
|
|
34
|
+
attributes: [[1, 0, 0]],
|
|
35
|
+
};
|
|
36
|
+
const axisDir: OverlayEntity = {
|
|
37
|
+
expressId: 96,
|
|
38
|
+
type: 'IFCDIRECTION',
|
|
39
|
+
attributes: [[1, 0, 0]],
|
|
40
|
+
};
|
|
41
|
+
const axisPlacement: OverlayEntity = {
|
|
42
|
+
expressId: 98,
|
|
43
|
+
type: 'IFCAXIS2PLACEMENT3D',
|
|
44
|
+
attributes: [97, 96, null],
|
|
45
|
+
};
|
|
46
|
+
const localPlacement: OverlayEntity = {
|
|
47
|
+
expressId: 99,
|
|
48
|
+
type: 'IFCLOCALPLACEMENT',
|
|
49
|
+
attributes: [null, 98],
|
|
50
|
+
};
|
|
51
|
+
const profile: OverlayEntity = {
|
|
52
|
+
expressId: 92,
|
|
53
|
+
type: 'IFCRECTANGLEPROFILEDEF',
|
|
54
|
+
attributes: ['.AREA.', null, null, 0.3, 0.5],
|
|
55
|
+
};
|
|
56
|
+
const solid: OverlayEntity = {
|
|
57
|
+
expressId: 93,
|
|
58
|
+
type: 'IFCEXTRUDEDAREASOLID',
|
|
59
|
+
attributes: [92, null, null, 4],
|
|
60
|
+
};
|
|
61
|
+
const shapeRep: OverlayEntity = {
|
|
62
|
+
expressId: 94,
|
|
63
|
+
type: 'IFCSHAPEREPRESENTATION',
|
|
64
|
+
attributes: [null, 'Body', 'SweptSolid', [93]],
|
|
65
|
+
};
|
|
66
|
+
const productShape: OverlayEntity = {
|
|
67
|
+
expressId: 95,
|
|
68
|
+
type: 'IFCPRODUCTDEFINITIONSHAPE',
|
|
69
|
+
attributes: [null, null, [94]],
|
|
70
|
+
};
|
|
71
|
+
const beam: OverlayEntity = {
|
|
72
|
+
expressId: 100,
|
|
73
|
+
type: 'IFCBEAM',
|
|
74
|
+
attributes: ['guid', null, 'Beam-1', null, null, 99, 95, null],
|
|
75
|
+
};
|
|
76
|
+
return [startPoint, axisDir, axisPlacement, localPlacement, profile, solid, shapeRep, productShape, beam];
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Column fixture — same shape but with the IfcAxis2Placement3D
|
|
81
|
+
* Axis slot set to null (= implicit world +Z), matching what
|
|
82
|
+
* `addColumnToStore` emits.
|
|
83
|
+
*/
|
|
84
|
+
function makeColumnFixture(depth = 3) {
|
|
85
|
+
const beam = makeBeamFixture();
|
|
86
|
+
const axisPlacement = beam.find((e) => e.expressId === 98)!;
|
|
87
|
+
axisPlacement.attributes = [97, null, null]; // implicit Z
|
|
88
|
+
const solid = beam.find((e) => e.expressId === 93)!;
|
|
89
|
+
solid.attributes = [92, null, null, depth];
|
|
90
|
+
const column = beam.find((e) => e.expressId === 100)!;
|
|
91
|
+
column.type = 'IFCCOLUMN';
|
|
92
|
+
return beam;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
describe('linear-element-edit', () => {
|
|
96
|
+
it('resolves an explicit-axis beam chain', () => {
|
|
97
|
+
const entities = makeBeamFixture();
|
|
98
|
+
const editor = new StubStoreEditor(entities) as unknown as Parameters<typeof resolveLinearElementChain>[2];
|
|
99
|
+
const view = new StubView() as unknown as Parameters<typeof resolveLinearElementChain>[1];
|
|
100
|
+
const chain = resolveLinearElementChain(dataStoreStub, view, editor, 100);
|
|
101
|
+
assert.ok(chain);
|
|
102
|
+
assert.strictEqual(chain.elementType, 'IfcBeam');
|
|
103
|
+
assert.strictEqual(chain.depth, 4);
|
|
104
|
+
assert.strictEqual(chain.profileWidth, 0.3);
|
|
105
|
+
assert.strictEqual(chain.profileHeight, 0.5);
|
|
106
|
+
assert.deepStrictEqual(chain.axisDirection, [1, 0, 0]);
|
|
107
|
+
assert.deepStrictEqual(chain.startCoordinates, [1, 0, 0]);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('defaults the axis to [0,0,1] for columns with implicit placement', () => {
|
|
111
|
+
const entities = makeColumnFixture();
|
|
112
|
+
const editor = new StubStoreEditor(entities) as unknown as Parameters<typeof resolveLinearElementChain>[2];
|
|
113
|
+
const view = new StubView() as unknown as Parameters<typeof resolveLinearElementChain>[1];
|
|
114
|
+
const chain = resolveLinearElementChain(dataStoreStub, view, editor, 100);
|
|
115
|
+
assert.ok(chain);
|
|
116
|
+
assert.strictEqual(chain.elementType, 'IfcColumn');
|
|
117
|
+
assert.deepStrictEqual(chain.axisDirection, [0, 0, 1]);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('rejects non-linear element types', () => {
|
|
121
|
+
const entities = makeBeamFixture();
|
|
122
|
+
// Mutate the IfcBeam to an IfcWall — chain shouldn't resolve as a
|
|
123
|
+
// linear element even though the inner graph is shaped right.
|
|
124
|
+
entities.find((e) => e.expressId === 100)!.type = 'IFCWALL';
|
|
125
|
+
const editor = new StubStoreEditor(entities) as unknown as Parameters<typeof resolveLinearElementChain>[2];
|
|
126
|
+
const view = new StubView() as unknown as Parameters<typeof resolveLinearElementChain>[1];
|
|
127
|
+
assert.strictEqual(resolveLinearElementChain(dataStoreStub, view, editor, 100), null);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('computeLinearElementSplitGeometry produces coherent halves', () => {
|
|
131
|
+
const entities = makeBeamFixture();
|
|
132
|
+
const editor = new StubStoreEditor(entities) as unknown as Parameters<typeof resolveLinearElementChain>[2];
|
|
133
|
+
const view = new StubView() as unknown as Parameters<typeof resolveLinearElementChain>[1];
|
|
134
|
+
const chain = resolveLinearElementChain(dataStoreStub, view, editor, 100);
|
|
135
|
+
assert.ok(chain);
|
|
136
|
+
const result = computeLinearElementSplitGeometry(chain, 1.5);
|
|
137
|
+
assert.ok(result.ok);
|
|
138
|
+
assert.strictEqual(result.geometry.leftDepth, 1.5);
|
|
139
|
+
assert.strictEqual(result.geometry.rightDepth, 2.5);
|
|
140
|
+
assert.deepStrictEqual(result.geometry.cutPoint, [2.5, 0, 0]); // start (1,0,0) + axis (1,0,0) * 1.5
|
|
141
|
+
assert.deepStrictEqual(result.geometry.endPoint, [5, 0, 0]); // start + axis * 4
|
|
142
|
+
assert.strictEqual(result.geometry.width, 0.3);
|
|
143
|
+
assert.strictEqual(result.geometry.height, 0.5);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('rejects splits inside the min-segment guard', () => {
|
|
147
|
+
const entities = makeBeamFixture();
|
|
148
|
+
const editor = new StubStoreEditor(entities) as unknown as Parameters<typeof resolveLinearElementChain>[2];
|
|
149
|
+
const view = new StubView() as unknown as Parameters<typeof resolveLinearElementChain>[1];
|
|
150
|
+
const chain = resolveLinearElementChain(dataStoreStub, view, editor, 100);
|
|
151
|
+
assert.ok(chain);
|
|
152
|
+
assert.strictEqual(
|
|
153
|
+
computeLinearElementSplitGeometry(chain, MIN_LINEAR_SEGMENT_LENGTH / 2).ok,
|
|
154
|
+
false,
|
|
155
|
+
);
|
|
156
|
+
assert.strictEqual(
|
|
157
|
+
computeLinearElementSplitGeometry(chain, chain.depth - MIN_LINEAR_SEGMENT_LENGTH / 2).ok,
|
|
158
|
+
false,
|
|
159
|
+
);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('projects cursor onto the axis with correct clamping', () => {
|
|
163
|
+
const entities = makeBeamFixture();
|
|
164
|
+
const editor = new StubStoreEditor(entities) as unknown as Parameters<typeof resolveLinearElementChain>[2];
|
|
165
|
+
const view = new StubView() as unknown as Parameters<typeof resolveLinearElementChain>[1];
|
|
166
|
+
const chain = resolveLinearElementChain(dataStoreStub, view, editor, 100);
|
|
167
|
+
assert.ok(chain);
|
|
168
|
+
// Beam runs from (1,0,0) along +X. Cursor at (3, 0.5, 0) projects
|
|
169
|
+
// to t = 2 along the axis (X-axis dot product).
|
|
170
|
+
assert.strictEqual(projectOntoLinearAxis(chain, [3, 0.5, 0]), 2);
|
|
171
|
+
// Past the end → clamps to depth.
|
|
172
|
+
assert.strictEqual(projectOntoLinearAxis(chain, [10, 0, 0]), chain.depth);
|
|
173
|
+
// Before the start → clamps to 0.
|
|
174
|
+
assert.strictEqual(projectOntoLinearAxis(chain, [-5, 0, 0]), 0);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('column projection works along world +Z', () => {
|
|
178
|
+
const entities = makeColumnFixture(3);
|
|
179
|
+
const editor = new StubStoreEditor(entities) as unknown as Parameters<typeof resolveLinearElementChain>[2];
|
|
180
|
+
const view = new StubView() as unknown as Parameters<typeof resolveLinearElementChain>[1];
|
|
181
|
+
const chain = resolveLinearElementChain(dataStoreStub, view, editor, 100);
|
|
182
|
+
assert.ok(chain);
|
|
183
|
+
// Column at (1,0,0), 3 m tall along +Z. Cursor at (1.2, 0, 2)
|
|
184
|
+
// projects to t = 2 along Z.
|
|
185
|
+
assert.strictEqual(projectOntoLinearAxis(chain, [1.2, 0, 2]), 2);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('rejects an explicit zero-length axis', () => {
|
|
189
|
+
const entities = makeBeamFixture();
|
|
190
|
+
// Override the axis IfcDirection to (0,0,0).
|
|
191
|
+
entities.find((e) => e.expressId === 96)!.attributes = [[0, 0, 0]];
|
|
192
|
+
const editor = new StubStoreEditor(entities) as unknown as Parameters<typeof resolveLinearElementChain>[2];
|
|
193
|
+
const view = new StubView() as unknown as Parameters<typeof resolveLinearElementChain>[1];
|
|
194
|
+
assert.strictEqual(resolveLinearElementChain(dataStoreStub, view, editor, 100), null);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it('rejects an axis with NaN components', () => {
|
|
198
|
+
const entities = makeBeamFixture();
|
|
199
|
+
entities.find((e) => e.expressId === 96)!.attributes = [[NaN, 0, 0]];
|
|
200
|
+
const editor = new StubStoreEditor(entities) as unknown as Parameters<typeof resolveLinearElementChain>[2];
|
|
201
|
+
const view = new StubView() as unknown as Parameters<typeof resolveLinearElementChain>[1];
|
|
202
|
+
assert.strictEqual(resolveLinearElementChain(dataStoreStub, view, editor, 100), null);
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('rejects non-finite extrusion depth', () => {
|
|
206
|
+
const entities = makeBeamFixture();
|
|
207
|
+
entities.find((e) => e.expressId === 93)!.attributes = [92, null, null, NaN];
|
|
208
|
+
const editor = new StubStoreEditor(entities) as unknown as Parameters<typeof resolveLinearElementChain>[2];
|
|
209
|
+
const view = new StubView() as unknown as Parameters<typeof resolveLinearElementChain>[1];
|
|
210
|
+
assert.strictEqual(resolveLinearElementChain(dataStoreStub, view, editor, 100), null);
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it('rejects non-finite cross-section dimensions', () => {
|
|
214
|
+
const entities = makeBeamFixture();
|
|
215
|
+
entities.find((e) => e.expressId === 92)!.attributes = ['.AREA.', null, null, Infinity, 0.5];
|
|
216
|
+
const editor = new StubStoreEditor(entities) as unknown as Parameters<typeof resolveLinearElementChain>[2];
|
|
217
|
+
const view = new StubView() as unknown as Parameters<typeof resolveLinearElementChain>[1];
|
|
218
|
+
assert.strictEqual(resolveLinearElementChain(dataStoreStub, view, editor, 100), null);
|
|
219
|
+
});
|
|
220
|
+
});
|
|
@@ -0,0 +1,327 @@
|
|
|
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
|
+
* Linear-element split helpers for IfcBeam, IfcColumn, and
|
|
7
|
+
* IfcMember — entities built by `@ifc-lite/create`'s in-store
|
|
8
|
+
* builders that share the shape:
|
|
9
|
+
*
|
|
10
|
+
* IfcExtrudedAreaSolid
|
|
11
|
+
* ├── SweptArea : IfcRectangleProfileDef (Width × Height)
|
|
12
|
+
* └── Depth : extrusion length along the placement's
|
|
13
|
+
* local Z (= world axis direction for
|
|
14
|
+
* beams/members; world +Z for columns
|
|
15
|
+
* because their placement's Axis is `$`)
|
|
16
|
+
*
|
|
17
|
+
* The split logic is meaningfully different from walls: a wall's
|
|
18
|
+
* "length" is its profile XDim, so splitting requires rewriting
|
|
19
|
+
* four entities. A beam / column / member's "length" is the
|
|
20
|
+
* extrusion `Depth`, so we can shrink the source in place (one
|
|
21
|
+
* positional write) and add a fresh element at the cut point.
|
|
22
|
+
* Source identity (GlobalId, Pset rels) is preserved for the
|
|
23
|
+
* "left" half — cleaner downstream than the wall's two-new-walls
|
|
24
|
+
* approach, but the choice is dictated by the IFC representation,
|
|
25
|
+
* not preference.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
29
|
+
import type { MutablePropertyView, StoreEditor } from '@ifc-lite/mutations';
|
|
30
|
+
import {
|
|
31
|
+
asExpressIdRef,
|
|
32
|
+
asCoordinateTriple,
|
|
33
|
+
asDirectionRatios,
|
|
34
|
+
readAttributes,
|
|
35
|
+
resolvePlacementChain,
|
|
36
|
+
} from './placement-core.js';
|
|
37
|
+
|
|
38
|
+
export const MIN_LINEAR_SEGMENT_LENGTH = 0.05; // metres
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Element types this module handles. Maps to the STEP storage form
|
|
42
|
+
* (`IFCBEAM`, …) — the slice's `splitLinearElementAtDistance` action
|
|
43
|
+
* picks the right `addBeam` / `addColumn` / `addMember` follow-up
|
|
44
|
+
* based on this value.
|
|
45
|
+
*/
|
|
46
|
+
export type LinearElementType = 'IfcBeam' | 'IfcColumn' | 'IfcMember';
|
|
47
|
+
|
|
48
|
+
const LINEAR_ELEMENT_STEP_TYPES = new Set(['IFCBEAM', 'IFCCOLUMN', 'IFCMEMBER']);
|
|
49
|
+
|
|
50
|
+
function stepTypeToLinearType(stepType: string): LinearElementType | null {
|
|
51
|
+
switch (stepType.toUpperCase()) {
|
|
52
|
+
case 'IFCBEAM':
|
|
53
|
+
return 'IfcBeam';
|
|
54
|
+
case 'IFCCOLUMN':
|
|
55
|
+
return 'IfcColumn';
|
|
56
|
+
case 'IFCMEMBER':
|
|
57
|
+
return 'IfcMember';
|
|
58
|
+
default:
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface LinearElementEditChain {
|
|
64
|
+
/** STEP type name, for the slice's dispatch (`IfcBeam` / `IfcColumn` / `IfcMember`). */
|
|
65
|
+
elementType: LinearElementType;
|
|
66
|
+
/** Placement origin point id (storey-local). */
|
|
67
|
+
startPointId: number;
|
|
68
|
+
/** Current start coordinates in storey-local space. */
|
|
69
|
+
startCoordinates: [number, number, number];
|
|
70
|
+
/**
|
|
71
|
+
* World-axis direction of the extrusion in storey-local space.
|
|
72
|
+
* For beams / members this is the explicit
|
|
73
|
+
* `IfcAxis2Placement3D.Axis` IfcDirection. For columns it's the
|
|
74
|
+
* implicit default `[0, 0, 1]` (placement Axis = `$`).
|
|
75
|
+
*/
|
|
76
|
+
axisDirection: [number, number, number];
|
|
77
|
+
/** IfcExtrudedAreaSolid id; holds the length on attribute 3 (`Depth`). */
|
|
78
|
+
extrudedSolidId: number;
|
|
79
|
+
/** Current extrusion length (metres). */
|
|
80
|
+
depth: number;
|
|
81
|
+
/** Profile cross-section width (X dimension, metres). */
|
|
82
|
+
profileWidth: number;
|
|
83
|
+
/** Profile cross-section height (Y dimension, metres). */
|
|
84
|
+
profileHeight: number;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function readEntityType(
|
|
88
|
+
dataStore: IfcDataStore,
|
|
89
|
+
view: MutablePropertyView,
|
|
90
|
+
editor: StoreEditor,
|
|
91
|
+
expressId: number,
|
|
92
|
+
): string | null {
|
|
93
|
+
const overlay = editor.getNewEntity(expressId);
|
|
94
|
+
if (overlay) return overlay.type;
|
|
95
|
+
// Source-buffer entities: the parser's entityIndex.byId stores
|
|
96
|
+
// type per ref. Pull it through `byType` reverse-walk only if we
|
|
97
|
+
// can't avoid it. Simpler path: read the attributes via the
|
|
98
|
+
// source reader; if the reader path returns nothing the entity
|
|
99
|
+
// either doesn't exist or isn't reachable from where we stand.
|
|
100
|
+
const ref = dataStore.entityIndex.byId.get(expressId);
|
|
101
|
+
return ref?.type ?? null;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Resolve the chain for an IfcBeam / IfcColumn / IfcMember whose
|
|
106
|
+
* representation matches what `addBeamToStore` / `addColumnToStore`
|
|
107
|
+
* / `addMemberToStore` produce. Returns null when the chain doesn't
|
|
108
|
+
* match (mapped representation, non-rectangle profile, missing
|
|
109
|
+
* placement, etc.) so the caller can hide the split affordance.
|
|
110
|
+
*/
|
|
111
|
+
export function resolveLinearElementChain(
|
|
112
|
+
dataStore: IfcDataStore,
|
|
113
|
+
view: MutablePropertyView,
|
|
114
|
+
editor: StoreEditor,
|
|
115
|
+
expressId: number,
|
|
116
|
+
): LinearElementEditChain | null {
|
|
117
|
+
const rawType = readEntityType(dataStore, view, editor, expressId);
|
|
118
|
+
if (!rawType || !LINEAR_ELEMENT_STEP_TYPES.has(rawType.toUpperCase())) return null;
|
|
119
|
+
const elementType = stepTypeToLinearType(rawType);
|
|
120
|
+
if (!elementType) return null;
|
|
121
|
+
|
|
122
|
+
// ObjectPlacement chain — gives us the start point AND the
|
|
123
|
+
// IfcAxis2Placement3D id for axis lookup.
|
|
124
|
+
const chain = resolvePlacementChain(dataStore, view, editor, expressId);
|
|
125
|
+
if (!chain) return null;
|
|
126
|
+
|
|
127
|
+
// Pull the axis direction. IfcAxis2Placement3D.Axis (index 1) may
|
|
128
|
+
// be null → implicit world +Z (matches the column builder).
|
|
129
|
+
const axisAttrs = readAttributes(dataStore, view, editor, chain.axisPlacementId);
|
|
130
|
+
if (!axisAttrs) return null;
|
|
131
|
+
const axisDirId = asExpressIdRef(axisAttrs[1]);
|
|
132
|
+
let axisDirection: [number, number, number] = [0, 0, 1];
|
|
133
|
+
if (axisDirId !== null) {
|
|
134
|
+
const dirAttrs = readAttributes(dataStore, view, editor, axisDirId);
|
|
135
|
+
if (!dirAttrs) return null;
|
|
136
|
+
const ratios = asDirectionRatios(dirAttrs[0]);
|
|
137
|
+
if (!ratios) return null;
|
|
138
|
+
// Reject NaN / Infinity components — those would propagate into
|
|
139
|
+
// every downstream split / projection call. The builder writes
|
|
140
|
+
// unit vectors but source-buffer entities can be malformed.
|
|
141
|
+
if (!Number.isFinite(ratios[0]) || !Number.isFinite(ratios[1]) || !Number.isFinite(ratios[2])) {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
const len = Math.hypot(ratios[0], ratios[1], ratios[2]);
|
|
145
|
+
// Zero-length axis isn't translatable; refuse rather than fall
|
|
146
|
+
// back silently to world +Z (which would silently mis-orient
|
|
147
|
+
// every downstream operation).
|
|
148
|
+
if (len < 1e-9) return null;
|
|
149
|
+
axisDirection = [ratios[0] / len, ratios[1] / len, ratios[2] / len];
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Representation chain: same shape as walls but the length lives
|
|
153
|
+
// on the extrusion depth, not the profile XDim.
|
|
154
|
+
const elementAttrs = readAttributes(dataStore, view, editor, expressId);
|
|
155
|
+
if (!elementAttrs) return null;
|
|
156
|
+
const productShapeId = asExpressIdRef(elementAttrs[6]);
|
|
157
|
+
if (productShapeId === null) return null;
|
|
158
|
+
const productShapeAttrs = readAttributes(dataStore, view, editor, productShapeId);
|
|
159
|
+
if (!productShapeAttrs) return null;
|
|
160
|
+
const reps = productShapeAttrs[2];
|
|
161
|
+
if (!Array.isArray(reps) || reps.length === 0) return null;
|
|
162
|
+
const shapeRepId = asExpressIdRef(reps[0]);
|
|
163
|
+
if (shapeRepId === null) return null;
|
|
164
|
+
const shapeRepAttrs = readAttributes(dataStore, view, editor, shapeRepId);
|
|
165
|
+
if (!shapeRepAttrs) return null;
|
|
166
|
+
const items = shapeRepAttrs[3];
|
|
167
|
+
if (!Array.isArray(items) || items.length === 0) return null;
|
|
168
|
+
const solidId = asExpressIdRef(items[0]);
|
|
169
|
+
if (solidId === null) return null;
|
|
170
|
+
|
|
171
|
+
const solidAttrs = readAttributes(dataStore, view, editor, solidId);
|
|
172
|
+
if (!solidAttrs) return null;
|
|
173
|
+
const profileId = asExpressIdRef(solidAttrs[0]);
|
|
174
|
+
const depthRaw = solidAttrs[3];
|
|
175
|
+
if (
|
|
176
|
+
profileId === null ||
|
|
177
|
+
typeof depthRaw !== 'number' ||
|
|
178
|
+
!Number.isFinite(depthRaw) ||
|
|
179
|
+
depthRaw <= 0
|
|
180
|
+
) {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Cross-section dimensions from the IfcRectangleProfileDef
|
|
185
|
+
// (Width = XDim attr 3, Height = YDim attr 4). Not strictly
|
|
186
|
+
// needed for the split math, but exposed so callers building the
|
|
187
|
+
// new element can carry the same cross-section forward. Reject
|
|
188
|
+
// non-finite / non-positive — would silently produce zero-area
|
|
189
|
+
// or NaN-area profiles downstream.
|
|
190
|
+
const profileAttrs = readAttributes(dataStore, view, editor, profileId);
|
|
191
|
+
if (!profileAttrs) return null;
|
|
192
|
+
const profileWidth = profileAttrs[3];
|
|
193
|
+
const profileHeight = profileAttrs[4];
|
|
194
|
+
if (
|
|
195
|
+
typeof profileWidth !== 'number' ||
|
|
196
|
+
typeof profileHeight !== 'number' ||
|
|
197
|
+
!Number.isFinite(profileWidth) ||
|
|
198
|
+
!Number.isFinite(profileHeight) ||
|
|
199
|
+
profileWidth <= 0 ||
|
|
200
|
+
profileHeight <= 0
|
|
201
|
+
) {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return {
|
|
206
|
+
elementType,
|
|
207
|
+
startPointId: chain.cartesianPointId,
|
|
208
|
+
startCoordinates: chain.coordinates,
|
|
209
|
+
axisDirection,
|
|
210
|
+
extrudedSolidId: solidId,
|
|
211
|
+
depth: depthRaw,
|
|
212
|
+
profileWidth,
|
|
213
|
+
profileHeight,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export interface LinearSplitGeometry {
|
|
218
|
+
/** Length the source's extrusion shrinks to (= split distance from start). */
|
|
219
|
+
leftDepth: number;
|
|
220
|
+
/** Cut point in storey-local space. */
|
|
221
|
+
cutPoint: [number, number, number];
|
|
222
|
+
/** End of the source (storey-local) — also the end of the new right half. */
|
|
223
|
+
endPoint: [number, number, number];
|
|
224
|
+
/** Length the new right-half element takes. */
|
|
225
|
+
rightDepth: number;
|
|
226
|
+
/** Cross-section dimensions to copy onto the new element. */
|
|
227
|
+
width: number;
|
|
228
|
+
height: number;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export type LinearSplitResult =
|
|
232
|
+
| { ok: true; geometry: LinearSplitGeometry }
|
|
233
|
+
| { ok: false; reason: string };
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Pure split-geometry math. Splits the linear element at
|
|
237
|
+
* `distance` metres from start. Returns the cut point + remaining
|
|
238
|
+
* lengths so the caller can shrink the source and add the right
|
|
239
|
+
* half via the matching `addBeam` / `addColumn` / `addMember`
|
|
240
|
+
* action.
|
|
241
|
+
*
|
|
242
|
+
* Same min-segment guard as walls (`MIN_LINEAR_SEGMENT_LENGTH`)
|
|
243
|
+
* so dragging the cursor to the very end of a column doesn't
|
|
244
|
+
* produce a sliver.
|
|
245
|
+
*/
|
|
246
|
+
export function computeLinearElementSplitGeometry(
|
|
247
|
+
chain: LinearElementEditChain,
|
|
248
|
+
distance: number,
|
|
249
|
+
): LinearSplitResult {
|
|
250
|
+
if (!Number.isFinite(distance)) {
|
|
251
|
+
return { ok: false, reason: 'Split distance must be a finite number' };
|
|
252
|
+
}
|
|
253
|
+
if (
|
|
254
|
+
distance <= MIN_LINEAR_SEGMENT_LENGTH ||
|
|
255
|
+
distance >= chain.depth - MIN_LINEAR_SEGMENT_LENGTH
|
|
256
|
+
) {
|
|
257
|
+
return {
|
|
258
|
+
ok: false,
|
|
259
|
+
reason: `Split must be at least ${MIN_LINEAR_SEGMENT_LENGTH} m from each end (element is ${chain.depth.toFixed(2)} m)`,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
const [sx, sy, sz] = chain.startCoordinates;
|
|
263
|
+
const [dx, dy, dz] = chain.axisDirection;
|
|
264
|
+
const cut: [number, number, number] = [sx + dx * distance, sy + dy * distance, sz + dz * distance];
|
|
265
|
+
const end: [number, number, number] = [
|
|
266
|
+
sx + dx * chain.depth,
|
|
267
|
+
sy + dy * chain.depth,
|
|
268
|
+
sz + dz * chain.depth,
|
|
269
|
+
];
|
|
270
|
+
return {
|
|
271
|
+
ok: true,
|
|
272
|
+
geometry: {
|
|
273
|
+
leftDepth: distance,
|
|
274
|
+
cutPoint: cut,
|
|
275
|
+
endPoint: end,
|
|
276
|
+
rightDepth: chain.depth - distance,
|
|
277
|
+
width: chain.profileWidth,
|
|
278
|
+
height: chain.profileHeight,
|
|
279
|
+
},
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Project an arbitrary storey-local 3D cursor onto the element's
|
|
285
|
+
* axis and return how far along the element (in metres from start)
|
|
286
|
+
* it lands. Clamps to `[0, depth]`.
|
|
287
|
+
*/
|
|
288
|
+
export function projectOntoLinearAxis(
|
|
289
|
+
chain: LinearElementEditChain,
|
|
290
|
+
pointStoreyLocal: [number, number, number],
|
|
291
|
+
): number {
|
|
292
|
+
const [px, py, pz] = pointStoreyLocal;
|
|
293
|
+
const [sx, sy, sz] = chain.startCoordinates;
|
|
294
|
+
const [dx, dy, dz] = chain.axisDirection;
|
|
295
|
+
const ux = px - sx;
|
|
296
|
+
const uy = py - sy;
|
|
297
|
+
const uz = pz - sz;
|
|
298
|
+
// Axis is unit-length by resolveLinearElementChain's contract; we
|
|
299
|
+
// still divide through for robustness.
|
|
300
|
+
const denom = dx * dx + dy * dy + dz * dz;
|
|
301
|
+
if (denom < 1e-9) return 0;
|
|
302
|
+
const t = (ux * dx + uy * dy + uz * dz) / denom;
|
|
303
|
+
return Math.max(0, Math.min(chain.depth, t));
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Shrink the source linear element's extrusion to `newDepth`. Used
|
|
308
|
+
* by the split action's "left half" branch — the source's
|
|
309
|
+
* placement, axis, profile, and Pset relationships all stay; only
|
|
310
|
+
* the IfcExtrudedAreaSolid.Depth changes.
|
|
311
|
+
*
|
|
312
|
+
* Coerce-only: this is the equivalent of `setPositionalAttribute`
|
|
313
|
+
* for a known slot; we expose it via the helper module for
|
|
314
|
+
* symmetry with the other split helpers.
|
|
315
|
+
*/
|
|
316
|
+
export function shrinkLinearElementDepth(
|
|
317
|
+
editor: StoreEditor,
|
|
318
|
+
chain: LinearElementEditChain,
|
|
319
|
+
newDepth: number,
|
|
320
|
+
): void {
|
|
321
|
+
editor.setPositionalAttribute(chain.extrudedSolidId, 3, newDepth);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// Re-export the asCoordinateTriple helper so callers that import
|
|
325
|
+
// linear-element-edit don't have to reach into placement-core too.
|
|
326
|
+
// Keeps the import surface tight for the slice action.
|
|
327
|
+
export { asCoordinateTriple };
|