@ifc-lite/viewer 1.22.0 → 1.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +71 -44
- package/CHANGELOG.md +23 -0
- package/dist/assets/__vite-browser-external-B1O5LaIO.js +1 -0
- package/dist/assets/{arrow-fie-E7fe.js → arrow-CXWhTnNT.js} +1 -1
- package/dist/assets/{basketViewActivator-EHAhHlwN.js → basketViewActivator--cFpU2Q9.js} +10 -10
- package/dist/assets/{bcf-Bhx-K17f.js → bcf-Ba2CjHib.js} +2 -2
- package/dist/assets/browser-DXS29_v9.js +695 -0
- package/dist/assets/{cesium-B4ZIU9jS.js → cesium-BoVuJvTC.js} +5838 -5730
- package/dist/assets/{decode-worker-CYqSjk1n.js → decode-worker-CgM1iNSK.js} +1 -1
- package/dist/assets/deflate-DCLbV4UE.js +1 -0
- package/dist/assets/{drawing-2d-Bjy8YPrg.js → drawing-2d-C71b8Ugx.js} +1 -1
- package/dist/assets/emscripten-module-B1g2L2eS.wasm +0 -0
- package/dist/assets/emscripten-module-DHbYPfAp.wasm +0 -0
- package/dist/assets/emscripten-module-ZrHFMo7O.wasm +0 -0
- package/dist/assets/emscripten-module-uFzwHH0Y.wasm +0 -0
- package/dist/assets/emscripten-module.browser-BLJD5hhE.js +1 -0
- package/dist/assets/{esbuild-Cpd5nU_H.wasm → esbuild-CzsZLPr0.wasm} +0 -0
- package/dist/assets/esbuild-FgU11_Eg.js +1 -0
- package/dist/assets/event-B0kAzHa-.js +1 -0
- package/dist/assets/{exporters-KTio0Tdm.js → exporters-Bf6PTtdW.js} +1011 -1011
- package/dist/assets/ffi-Boa1QuFa.js +1 -0
- package/dist/assets/{geometry-controller.worker-Cm2P_EJr.js → geometry-controller.worker-CEr00X3X.js} +2 -2
- package/dist/assets/{geometry.worker-DchLBqZ8.js → geometry.worker-B4VPDkmL.js} +1 -1
- package/dist/assets/geotiff-BN4J8Vt9.js +3354 -0
- package/dist/assets/{ids-CS7VCFin.js → ids-XwxE1tK3.js} +6 -6
- package/dist/assets/{ifc-lite-C6wEhXa6.js → ifc-lite-DNzkEkIb.js} +2 -2
- package/dist/assets/ifc-lite_bg-1IiJN0Zg.wasm +0 -0
- package/dist/assets/ifc-lite_bg-B_eUD1Wy.wasm +0 -0
- package/dist/assets/index-DMho-JA0.js +6 -0
- package/dist/assets/index-DS_xJQfP.css +1 -0
- package/dist/assets/{index-8k9h-ANq.js → index-j2x5R7fb.js} +66047 -55202
- package/dist/assets/jpeg-BUTmr0Bp.js +1 -0
- package/dist/assets/{laz-perf-DnSyzVYH.wasm → laz-perf-CFJp03W6.wasm} +0 -0
- package/dist/assets/laz-perf-DgUOSLeU.js +1 -0
- package/dist/assets/{laz-source-jj3xI5Y4.js → laz-source-BWjza0Iw.js} +2 -2
- package/dist/assets/{lens-CSASnhAL.js → lens-CpjUdqpw.js} +1 -1
- package/dist/assets/lerc-DmzRHXn3.js +1 -0
- package/dist/assets/lzw-CgyIIzii.js +1 -0
- package/dist/assets/maplibre-gl-Do6O5tDc.js +800 -0
- package/dist/assets/{native-bridge-DNrEhx2R.js → native-bridge-Q5ACp4QY.js} +3 -3
- package/dist/assets/packbits-C1r4AzHj.js +1 -0
- package/dist/assets/pako.esm-Cram60i4.js +1 -0
- package/dist/assets/parquet_wasm_bg-DcKVfvto.wasm +0 -0
- package/dist/assets/{parser.worker-BcjkIo89.js → parser.worker-Cl6XQcXA.js} +2 -2
- package/dist/assets/raw-ZqLh7kVQ.js +1 -0
- package/dist/assets/{sandbox-BSn5MyEJ.js → sandbox-Bju6ZKJK.js} +1664 -1542
- package/dist/assets/{server-client-D-kU2XAF.js → server-client-B8wi3CGx.js} +4 -4
- package/dist/assets/three-CQBzFWY2.js +4104 -0
- package/dist/assets/wasm-bridge-X-mWRA9Z.js +1 -0
- package/dist/assets/webimage-D0MbRMkU.js +1 -0
- package/dist/assets/{workerHelpers-pUUnk9Wc.js → workerHelpers-DnNedVRr.js} +1 -1
- package/dist/assets/zstd-DA4VQ-ji.js +1 -0
- package/dist/cesium/{Workers/chunk-V7QEYVP3.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-236YIEYT.js} +2 -2
- package/dist/cesium/{Workers/chunk-5TJMAQVL.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-2ZYB3DYT.js} +2 -2
- package/dist/cesium/{Workers/chunk-UBOGZS7F.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-4M56RRIL.js} +2 -2
- package/dist/cesium/{Workers/chunk-OCWJRAXS.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-5BC2Q3QW.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-5XHUDY37.js +26 -0
- package/dist/cesium/{Workers/chunk-Z3QF2EHT.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-6WMLAJJP.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-72KUXMWU.js +26 -0
- package/dist/cesium/{Workers/chunk-EQ4YRVWL.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-7NQYTTAU.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-A35GG5WJ.js +26 -0
- package/dist/cesium/{Workers/chunk-FC4ZZ65J.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-AXNBHUAG.js} +2 -2
- package/dist/cesium/{Workers/chunk-BTSYJ5XU.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-DC3K7YTH.js} +2 -2
- package/dist/cesium/{Workers/chunk-SLT4J352.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-DRBPXGI7.js} +2 -2
- package/dist/cesium/{Workers/chunk-2MJIIVP4.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EARRZPMO.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EHC3BDVP.js +26 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EYZUSGKM.js +26 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-EZSKHVA2.js +26 -0
- package/dist/cesium/{Workers/chunk-ICALLYLG.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-F3WJIFOO.js} +2 -2
- package/dist/cesium/{Workers/chunk-LSLE2RL4.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-FB7UV5BI.js} +2 -2
- package/dist/cesium/{Workers/chunk-CUUSNIVQ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-FC6IYMYF.js} +2 -2
- package/dist/cesium/{Workers/chunk-TNSUQXWK.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-GF67PEXE.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-GXEQRH2R.js +26 -0
- package/dist/cesium/{Workers/chunk-M4HLDBCG.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-I5NKQIWE.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IH7GXIUB.js +26 -0
- package/dist/cesium/{Workers/chunk-OIT7J4IC.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IPP3UFGH.js} +2 -2
- package/dist/cesium/{Workers/chunk-WWWZVEEH.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-IYRGNBSH.js} +2 -2
- package/dist/cesium/{Workers/chunk-WPMZLB3Y.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-J6BM74AD.js} +2 -2
- package/dist/cesium/{Workers/chunk-QFM5DCMQ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-KG2GJUJT.js} +1 -1
- package/dist/cesium/{Workers/chunk-XQHLGIO7.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-L7UE5MMF.js} +2 -2
- package/dist/cesium/{Workers/chunk-EFBN7QNX.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LBZ34MHQ.js} +2 -2
- package/dist/cesium/{Workers/chunk-YP7I5QBZ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LOQDTQMX.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-LYLRYC4L.js +29 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-MGPRMLLW.js +26 -0
- package/dist/cesium/{Workers/chunk-LI2ZSORM.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-NP26LKQA.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-OMUAZ3NM.js +26 -0
- package/dist/cesium/{Workers/chunk-S44JILQT.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PPFUDJN4.js} +2 -2
- package/dist/cesium/{Workers/chunk-EDVBB7SS.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PQ3V63XF.js} +2 -2
- package/dist/cesium/{Workers/chunk-Q5BPHJQF.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-PWBQN4GK.js} +2 -2
- package/dist/cesium/{Workers/chunk-E7KYDCM5.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-QOTMLO2T.js} +2 -2
- package/dist/cesium/{Workers/chunk-XUSCFAVF.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-SP35IT73.js} +2 -2
- package/dist/cesium/{Workers/chunk-6BD4U3VO.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-T3ZGSZKA.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-TM6SYYHO.js +28 -0
- package/dist/cesium/{Workers/chunk-VUKYSU4H.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-TSGIJVWH.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-U3YGOX3C.js +63 -0
- package/dist/cesium/{Workers/chunk-7TVGLKQF.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VBYOXOSM.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VCOHJNKB.js +26 -0
- package/dist/cesium/{Workers/chunk-WBOV35NL.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VXAZXMUX.js} +2 -2
- package/dist/cesium/{Workers/chunk-IX4VMHEV.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-VXCJOT4W.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-WPD3MB6X.js +26 -0
- package/dist/cesium/{Workers/chunk-V3OSTMM6.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-X4D5KUN5.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XEC656IT.js +26 -0
- package/dist/cesium/{Workers/chunk-MJHHSGEH.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XR53QRQS.js} +2 -2
- package/dist/cesium/{Workers/chunk-XFIQ5DEQ.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XR7MN4PJ.js} +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XU6O4MRS.js +26 -0
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-XZBHEBLF.js +29 -0
- package/dist/cesium/{Workers/chunk-OLZ3FYUM.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-Z2M4BF4E.js} +2 -2
- package/dist/cesium/{Workers/chunk-2ZBHLJST.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-Z4ERBZFB.js} +2 -2
- package/dist/cesium/{Workers/chunk-W37FE5GR.js → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/chunk-ZY2KCIWI.js} +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/combineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createBoxGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createBoxOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCircleGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCircleOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCoplanarPolygonGeometry.js +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/createCoplanarPolygonOutlineGeometry.js +26 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCorridorGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCorridorOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCylinderGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createCylinderOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipseGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipseOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipsoidGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createEllipsoidOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createFrustumGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createFrustumOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createGeometry.js +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/createGroundPolylineGeometry.js +26 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPlaneGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPlaneOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolygonGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolygonOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolylineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolylineVolumeGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createPolylineVolumeOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createRectangleGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createRectangleOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createSimplePolylineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createSphereGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createSphereOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createTaskProcessorWorker.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTileClampedPolylines.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTileGeometries.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTilePoints.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTilePolygons.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVectorTilePolylines.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromCesium3DTilesTerrain.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromGoogleEarthEnterpriseBuffer.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromHeightmap.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createVerticesFromQuantizedTerrainMesh.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createWallGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/createWallOutlineGeometry.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/decodeDraco.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/decodeGoogleEarthEnterprisePacket.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/decodeI3S.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/gaussianSplatSorter.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/gaussianSplatTextureGenerator.js +2 -2
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/incrementallyBuildTerrainPicker.js +2 -2
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/transcodeKTX2.js +56 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/transferTypedArrayTest.js +1 -1
- package/dist/cesium/node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers/upsampleQuantizedTerrainMesh.js +26 -0
- package/dist/cesium/{Workers → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Workers}/upsampleVerticesFromCesium3DTilesTerrain.js +2 -2
- package/dist/index.html +11 -11
- package/package.json +52 -45
- package/src/components/mcp/McpLanding.tsx +1 -1
- package/src/components/mcp/McpPlayground.tsx +1 -1
- package/src/components/viewer/AddElementPanel.tsx +2 -2
- package/src/components/viewer/BasepointOverlay.tsx +239 -0
- package/src/components/viewer/CesiumOverlay.tsx +15 -59
- package/src/components/viewer/CesiumPlacementEditor.tsx +16 -1
- package/src/components/viewer/CommandPalette.tsx +25 -0
- package/src/components/viewer/GeometryAxisRow.tsx +54 -0
- package/src/components/viewer/GeometryEditCard.tsx +392 -0
- package/src/components/viewer/HierarchyPanel.tsx +2 -2
- package/src/components/viewer/IDSAuditSummary.tsx +2 -2
- package/src/components/viewer/KeyboardShortcutsDialog.tsx +58 -4
- package/src/components/viewer/MainToolbar.tsx +275 -4
- package/src/components/viewer/PropertiesPanel.tsx +28 -31
- package/src/components/viewer/StatusBar.tsx +12 -0
- package/src/components/viewer/ToolOverlays.tsx +36 -0
- package/src/components/viewer/ViewerLayout.tsx +27 -0
- package/src/components/viewer/Viewport.tsx +49 -4
- package/src/components/viewer/ViewportContainer.tsx +88 -17
- package/src/components/viewer/ViewportOverlays.tsx +50 -11
- package/src/components/viewer/chat/ByokKeyModal.tsx +1 -1
- package/src/components/viewer/properties/FederationAlignmentControls.tsx +180 -0
- package/src/components/viewer/properties/GeoreferencingPanel.tsx +6 -0
- package/src/components/viewer/properties/PrecisionGridBadge.tsx +125 -0
- package/src/components/viewer/properties/raw-step-format.ts +5 -3
- package/src/components/viewer/selectionHandlers.ts +301 -10
- package/src/components/viewer/tools/GizmoOverlay.tsx +322 -0
- package/src/components/viewer/tools/SplitNumericInput.tsx +225 -0
- package/src/components/viewer/tools/SplitOverlay.tsx +242 -0
- package/src/components/viewer/tools/WallEndpointOverlay.tsx +252 -0
- package/src/components/viewer/useGeometryStreaming.ts +100 -1
- package/src/components/viewer/useMouseControls.ts +8 -1
- package/src/hooks/useBCF.ts +6 -6
- package/src/hooks/useCameraTickSubscription.ts +62 -0
- package/src/hooks/useIfc.ts +4 -0
- package/src/hooks/useIfcFederation.ts +368 -20
- package/src/hooks/useKeyboardShortcuts.ts +86 -0
- package/src/hooks/useLevelDisplayEffect.ts +160 -0
- package/src/hooks/useViewerSelectors.ts +8 -0
- package/src/lib/__test__/stubs.ts +110 -0
- package/src/lib/geo/cesium-bridge.ts +3 -3
- package/src/lib/geo/cesium-placement.test.ts +28 -12
- package/src/lib/geo/cesium-placement.ts +16 -10
- package/src/lib/geo/effective-georef.test.ts +23 -7
- package/src/lib/geo/geo-scale.ts +58 -2
- package/src/lib/geo/ifc-origin.test.ts +176 -0
- package/src/lib/geo/ifc-origin.ts +144 -0
- package/src/lib/geo/precision-grids.ts +444 -0
- package/src/lib/geo/reproject.test.ts +88 -0
- package/src/lib/geo/reproject.ts +168 -36
- package/src/lib/level-offsets.test.ts +153 -0
- package/src/lib/level-offsets.ts +140 -0
- package/src/lib/linear-element-edit.test.ts +220 -0
- package/src/lib/linear-element-edit.ts +327 -0
- package/src/lib/metadata-clone.test.ts +173 -0
- package/src/lib/metadata-clone.ts +124 -0
- package/src/lib/placement-core.ts +340 -0
- package/src/lib/placement-edit.boot.ts +21 -0
- package/src/lib/placement-edit.test.ts +464 -0
- package/src/lib/placement-edit.ts +47 -0
- package/src/lib/polygon-clip.test.ts +193 -0
- package/src/lib/polygon-clip.ts +199 -0
- package/src/lib/slab-edit.test.ts +169 -0
- package/src/lib/slab-edit.ts +312 -0
- package/src/lib/wall-edit.ts +342 -0
- package/src/lib/wall-opening-reassign.test.ts +291 -0
- package/src/lib/wall-opening-reassign.ts +241 -0
- package/src/main.tsx +4 -0
- package/src/store/index.ts +7 -0
- package/src/store/slices/cesiumSlice.ts +61 -8
- package/src/store/slices/dataSlice.ts +80 -0
- package/src/store/slices/levelDisplaySlice.ts +105 -0
- package/src/store/slices/modelSlice.test.ts +19 -0
- package/src/store/slices/mutationSlice.ts +1138 -1
- package/src/store/slices/splitToolSlice.ts +165 -0
- package/src/store/slices/uiSlice.edit-mode.test.ts +210 -0
- package/src/store/slices/uiSlice.ts +78 -1
- package/src/store/types.ts +57 -2
- package/src/utils/createBlankIfc.ts +37 -0
- package/tsconfig.json +1 -0
- package/.turbo/turbo-typecheck.log +0 -4
- package/dist/assets/arrow2_bg-BoXCojjR.wasm +0 -0
- package/dist/assets/browser-CVf8ATeW.js +0 -694
- package/dist/assets/emscripten-module-BTRCZGcB.wasm +0 -0
- package/dist/assets/emscripten-module-CGIn_cMh.wasm +0 -0
- package/dist/assets/emscripten-module-DYvzWiHh.wasm +0 -0
- package/dist/assets/emscripten-module-NWak2PoB.wasm +0 -0
- package/dist/assets/emscripten-module.browser-DcFZLAUx.js +0 -1
- package/dist/assets/esbuild-COv63sf-.js +0 -1
- package/dist/assets/event-DIOks52T.js +0 -1
- package/dist/assets/ffi-DlhRHxHv.js +0 -1
- package/dist/assets/ifc-lite_bg-CSeT3fNI.wasm +0 -0
- package/dist/assets/ifc-lite_bg-ns4cSnX2.wasm +0 -0
- package/dist/assets/index-BZC2YaOP.css +0 -1
- package/dist/assets/index-HqAIQkr6.js +0 -22
- package/dist/assets/laz-perf-Cvr_Lepg.js +0 -1
- package/dist/assets/maplibre-gl-C4LXKM6c.js +0 -808
- package/dist/assets/three-DwNDHx9-.js +0 -4049
- package/dist/assets/wasm-bridge-Cha08LdC.js +0 -1
- package/dist/cesium/Workers/chunk-23ZQ2IVV.js +0 -29
- package/dist/cesium/Workers/chunk-2EQO3Q56.js +0 -26
- package/dist/cesium/Workers/chunk-2TE5NTVD.js +0 -26
- package/dist/cesium/Workers/chunk-BXMEEOCS.js +0 -63
- package/dist/cesium/Workers/chunk-BYLCY7GP.js +0 -29
- package/dist/cesium/Workers/chunk-CTHM3W6I.js +0 -26
- package/dist/cesium/Workers/chunk-E3JOOS3S.js +0 -26
- package/dist/cesium/Workers/chunk-F6PRE7D6.js +0 -26
- package/dist/cesium/Workers/chunk-FFBVWF2L.js +0 -26
- package/dist/cesium/Workers/chunk-GBAA6GVX.js +0 -26
- package/dist/cesium/Workers/chunk-ILRYTWTP.js +0 -26
- package/dist/cesium/Workers/chunk-IRNLBSEJ.js +0 -26
- package/dist/cesium/Workers/chunk-L6QHHACZ.js +0 -26
- package/dist/cesium/Workers/chunk-NMVKML6W.js +0 -26
- package/dist/cesium/Workers/chunk-OIRKANTH.js +0 -26
- package/dist/cesium/Workers/chunk-QKUIYMGC.js +0 -28
- package/dist/cesium/Workers/chunk-SQMIIXB7.js +0 -26
- package/dist/cesium/Workers/chunk-TJ4XLGBQ.js +0 -26
- package/dist/cesium/Workers/createCoplanarPolygonOutlineGeometry.js +0 -26
- package/dist/cesium/Workers/createGroundPolylineGeometry.js +0 -26
- package/dist/cesium/Workers/transcodeKTX2.js +0 -56
- package/dist/cesium/Workers/upsampleQuantizedTerrainMesh.js +0 -26
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_0.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_1.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_10.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_11.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_12.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_13.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_14.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_15.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_16.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_17.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_18.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_19.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_2.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_20.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_21.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_22.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_23.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_24.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_25.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_26.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_27.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_3.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_4.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_5.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_6.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_7.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_8.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/IAU2006_XYS/IAU2006_XYS_9.json +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/bing_maps_credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/cesium_credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/google_earth_credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Images/ion-credit.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/LensFlare/DirtMask.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/LensFlare/StarBurst.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/0/0/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/0/1/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/0/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/0/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/1/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/1/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/2/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/2/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/3/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/1/3/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/0/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/1/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/2/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/3/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/4/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/5/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/6/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/0.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/1.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/2.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/2/7/3.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/NaturalEarthII/tilemapresource.xml +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/airfield.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/airport.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/alcohol-shop.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/america-football.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/art-gallery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bakery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bank.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bar.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/baseball.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/basketball.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/beer.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bicycle.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/building.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/bus.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cafe.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/camera.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/campsite.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/car.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cemetery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cesium.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/chemist.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cinema.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/circle-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/circle.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/city.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/clothing-store.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/college.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/commercial.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cricket.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/cross.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/dam.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/danger.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/disability.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/dog-park.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/embassy.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/emergency-telephone.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/entrance.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/farm.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fast-food.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/ferry.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fire-station.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/fuel.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/garden.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/gift.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/golf.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/grocery.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/hairdresser.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/harbor.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/heart.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/heliport.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/hospital.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/ice-cream.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/industrial.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/land-use.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/laundry.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/library.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/lighthouse.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/lodging.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/logging.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/london-underground.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/marker-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/marker.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/minefield.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/mobilephone.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/monument.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/museum.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/music.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/oil-well.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/park.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/park2.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/parking-garage.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/parking.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/pharmacy.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/pitch.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/place-of-worship.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/playground.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/police.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/polling-place.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/post.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/prison.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-above.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-light.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-metro.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail-underground.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rail.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-christian.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-jewish.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/religious-muslim.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/restaurant.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/roadblock.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/rocket.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/school.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/scooter.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/shop.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/skiing.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/slaughterhouse.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/soccer.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/square-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/square.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/star-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/star.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/suitcase.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/swimming.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/telephone.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/tennis.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/theatre.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/toilets.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/town-hall.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/town.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/triangle-stroked.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/triangle.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/village.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/warehouse.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/waste-basket.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/water.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/wetland.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/maki/zoo.png +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/moonSmall.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/pin.svg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/waterNormals.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/Textures/waterNormalsSmall.jpg +0 -0
- /package/dist/cesium/{Assets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Assets}/approximateTerrainHeights.json +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/Workers/package.json +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/Workers/zip-web-worker.js +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/basis_transcoder.wasm +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/draco_decoder.wasm +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/google-earth-dbroot-parser.js +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/wasm_splats_bg.wasm +0 -0
- /package/dist/cesium/{ThirdParty → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/ThirdParty}/zip-module.wasm +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Animation/Animation.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Animation/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/BaseLayerPicker/BaseLayerPicker.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/BaseLayerPicker/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Cesium3DTilesInspector/Cesium3DTilesInspector.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumInspector/CesiumInspector.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumWidget/CesiumWidget.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/CesiumWidget/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/FullscreenButton/FullscreenButton.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Geocoder/Geocoder.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Geocoder/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/azureAerial.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/azureRoads.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingAerial.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingAerialLabels.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/bingRoads.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/blueMarble.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/earthAtNight.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleContour.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleRoadmap.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleSatellite.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxSatellite.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxStreets.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/mapboxTerrain.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/naturalEarthII.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/openStreetMap.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/sentinel-2.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stamenToner.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/ImageryProviders/stamenWatercolor.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/Mouse.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseLeft.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseMiddle.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/MouseRight.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/Touch.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchDrag.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchRotate.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchTilt.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/NavigationHelp/TouchZoom.svg +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TerrainProviders/Ellipsoid.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/TimelineIcons.png +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Images/info-loading.gif +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/InfoBox/InfoBox.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/InfoBox/InfoBoxDescription.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/NavigationHelpButton/NavigationHelpButton.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/NavigationHelpButton/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/PerformanceWatchdog/PerformanceWatchdog.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/ProjectionPicker/ProjectionPicker.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/SceneModePicker/SceneModePicker.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/SelectionIndicator/SelectionIndicator.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Timeline/Timeline.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Timeline/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/VRButton/VRButton.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/Viewer/Viewer.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/VoxelInspector/VoxelInspector.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/lighter.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/lighterShared.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/shared.css +0 -0
- /package/dist/cesium/{Widgets → node_modules/.pnpm/cesium@1.141.0/node_modules/cesium/Build/Cesium/Widgets}/widgets.css +0 -0
|
@@ -0,0 +1,199 @@
|
|
|
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
|
+
* 2D polygon half-plane clipping. Used by slab / roof / plate /
|
|
7
|
+
* space split to divide a footprint polygon into two halves by a
|
|
8
|
+
* cut line.
|
|
9
|
+
*
|
|
10
|
+
* The cut line is defined by two points in the polygon's local
|
|
11
|
+
* plane. We derive the line's normal (rotated 90° CCW from the
|
|
12
|
+
* direction) and use it to assign each polygon vertex to one of
|
|
13
|
+
* the two half-planes. Sutherland-Hodgman-style edge walk
|
|
14
|
+
* produces the clipped polygon for each side; the union of the
|
|
15
|
+
* two output polygons reconstructs the input (minus any sliver
|
|
16
|
+
* vertices that landed exactly on the cut line, which both halves
|
|
17
|
+
* include as boundary).
|
|
18
|
+
*
|
|
19
|
+
* Returns:
|
|
20
|
+
*
|
|
21
|
+
* - `{ ok: true, left, right }` when the cut intersects the
|
|
22
|
+
* polygon and both halves have ≥ 3 vertices (a valid polygon).
|
|
23
|
+
* - `{ ok: false, reason }` when the cut misses the polygon, is
|
|
24
|
+
* tangent to a single vertex, or produces a degenerate sliver
|
|
25
|
+
* (< 3 vertices on either side).
|
|
26
|
+
*
|
|
27
|
+
* "Left" / "right" naming follows the cut-line direction: walking
|
|
28
|
+
* from A to B, "left" is the half-plane on the user's left
|
|
29
|
+
* (positive cross product of (B-A) with (vertex-A)).
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
export type Point2D = [number, number];
|
|
33
|
+
|
|
34
|
+
export type PolygonClipResult =
|
|
35
|
+
| { ok: true; left: Point2D[]; right: Point2D[] }
|
|
36
|
+
| { ok: false; reason: string };
|
|
37
|
+
|
|
38
|
+
const EPS = 1e-9;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Signed perpendicular distance of `p` to the directed line through
|
|
42
|
+
* `a → b`. Positive means `p` is to the LEFT of A→B in standard
|
|
43
|
+
* math coords (y-up) — i.e. the side reached by rotating the A→B
|
|
44
|
+
* direction 90° counter-clockwise.
|
|
45
|
+
*/
|
|
46
|
+
function signedDistance(a: Point2D, b: Point2D, p: Point2D): number {
|
|
47
|
+
// Standard 2D cross product (b - a) × (p - a).
|
|
48
|
+
return (b[0] - a[0]) * (p[1] - a[1]) - (b[1] - a[1]) * (p[0] - a[0]);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Linear interpolation between two polygon vertices at the cut line.
|
|
53
|
+
* `da`, `db` are signed distances of `a` and `b` from the line; the
|
|
54
|
+
* intersection sits where the signed distance crosses zero.
|
|
55
|
+
*/
|
|
56
|
+
function intersectEdge(a: Point2D, b: Point2D, da: number, db: number): Point2D {
|
|
57
|
+
const t = da / (da - db); // never 0/0 because callers ensure signs differ
|
|
58
|
+
return [a[0] + t * (b[0] - a[0]), a[1] + t * (b[1] - a[1])];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Clip a polygon to one side of the cut line. `keep` selects which
|
|
63
|
+
* side to retain: `'positive'` keeps vertices with signed distance
|
|
64
|
+
* > 0 (left of A→B); `'negative'` keeps vertices with signed
|
|
65
|
+
* distance < 0 (right). On-line vertices (|d| < EPS) belong to
|
|
66
|
+
* both halves and are emitted unchanged.
|
|
67
|
+
*
|
|
68
|
+
* Standard Sutherland-Hodgman: walk each edge of the input polygon,
|
|
69
|
+
* decide whether to emit the current vertex and/or an intersection
|
|
70
|
+
* with the cut line based on which side current and previous
|
|
71
|
+
* vertices are on.
|
|
72
|
+
*/
|
|
73
|
+
function clipPolygonHalfPlane(
|
|
74
|
+
polygon: Point2D[],
|
|
75
|
+
a: Point2D,
|
|
76
|
+
b: Point2D,
|
|
77
|
+
keep: 'positive' | 'negative',
|
|
78
|
+
): Point2D[] {
|
|
79
|
+
if (polygon.length === 0) return [];
|
|
80
|
+
const out: Point2D[] = [];
|
|
81
|
+
const sign = keep === 'positive' ? 1 : -1;
|
|
82
|
+
const pushUnique = (p: Point2D) => {
|
|
83
|
+
// Skip duplicate emits — the on-line edge case (prev outside,
|
|
84
|
+
// curr on the line) would otherwise emit the intersection AND
|
|
85
|
+
// curr, which are the same point. Cheap O(1) check against the
|
|
86
|
+
// most recent vertex; the polygon body itself is allowed to
|
|
87
|
+
// have repeated adjacent vertices in pathological input but we
|
|
88
|
+
// don't want to manufacture them.
|
|
89
|
+
if (out.length > 0) {
|
|
90
|
+
const last = out[out.length - 1];
|
|
91
|
+
if (Math.abs(last[0] - p[0]) < EPS && Math.abs(last[1] - p[1]) < EPS) return;
|
|
92
|
+
}
|
|
93
|
+
out.push(p);
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
let prev = polygon[polygon.length - 1];
|
|
97
|
+
let prevD = signedDistance(a, b, prev) * sign;
|
|
98
|
+
for (const curr of polygon) {
|
|
99
|
+
const currD = signedDistance(a, b, curr) * sign;
|
|
100
|
+
if (currD >= -EPS) {
|
|
101
|
+
// Current vertex is inside (or on the line).
|
|
102
|
+
if (prevD < -EPS) {
|
|
103
|
+
// Crossing into the half-plane — emit the intersection.
|
|
104
|
+
pushUnique(intersectEdge(prev, curr, prevD, currD));
|
|
105
|
+
}
|
|
106
|
+
pushUnique(curr);
|
|
107
|
+
} else if (prevD >= -EPS) {
|
|
108
|
+
// Crossing out of the half-plane — emit the intersection.
|
|
109
|
+
pushUnique(intersectEdge(prev, curr, prevD, currD));
|
|
110
|
+
}
|
|
111
|
+
// Else both outside — skip.
|
|
112
|
+
prev = curr;
|
|
113
|
+
prevD = currD;
|
|
114
|
+
}
|
|
115
|
+
// The pushUnique guard runs against the previous push; the
|
|
116
|
+
// wrap-around (last vs first) can also produce a dup when the
|
|
117
|
+
// polygon closes on a near-coincident pair. Trim once.
|
|
118
|
+
if (out.length > 1) {
|
|
119
|
+
const first = out[0];
|
|
120
|
+
const last = out[out.length - 1];
|
|
121
|
+
if (Math.abs(last[0] - first[0]) < EPS && Math.abs(last[1] - first[1]) < EPS) {
|
|
122
|
+
out.pop();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return out;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Split a polygon into two halves by a cut line.
|
|
130
|
+
*
|
|
131
|
+
* Inputs:
|
|
132
|
+
* - `polygon` — outer curve as an ordered list of 2D vertices
|
|
133
|
+
* (CW or CCW; the algorithm is orientation-independent).
|
|
134
|
+
* First vertex should NOT repeat at the end.
|
|
135
|
+
* - `a`, `b` — two points defining the cut line. The line
|
|
136
|
+
* extends infinitely in both directions through these points,
|
|
137
|
+
* so the user-clicked endpoints don't need to lie on the
|
|
138
|
+
* polygon edge.
|
|
139
|
+
*
|
|
140
|
+
* Returns `{ ok: true, left, right }` when both halves are valid
|
|
141
|
+
* polygons (≥ 3 vertices). Otherwise returns `{ ok: false, reason }`.
|
|
142
|
+
*/
|
|
143
|
+
export function clipPolygonByLine(
|
|
144
|
+
polygon: Point2D[],
|
|
145
|
+
a: Point2D,
|
|
146
|
+
b: Point2D,
|
|
147
|
+
): PolygonClipResult {
|
|
148
|
+
if (polygon.length < 3) {
|
|
149
|
+
return { ok: false, reason: 'Polygon must have at least 3 vertices' };
|
|
150
|
+
}
|
|
151
|
+
const dx = b[0] - a[0];
|
|
152
|
+
const dy = b[1] - a[1];
|
|
153
|
+
if (Math.hypot(dx, dy) < EPS) {
|
|
154
|
+
return { ok: false, reason: 'Cut endpoints are coincident' };
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Count how many vertices land strictly on each side. If all
|
|
158
|
+
// vertices are on one side, the cut line misses the polygon.
|
|
159
|
+
let pos = 0;
|
|
160
|
+
let neg = 0;
|
|
161
|
+
for (const p of polygon) {
|
|
162
|
+
const d = signedDistance(a, b, p);
|
|
163
|
+
if (d > EPS) pos++;
|
|
164
|
+
else if (d < -EPS) neg++;
|
|
165
|
+
}
|
|
166
|
+
if (pos === 0 || neg === 0) {
|
|
167
|
+
return { ok: false, reason: 'Cut line does not cross the polygon' };
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const left = clipPolygonHalfPlane(polygon, a, b, 'positive');
|
|
171
|
+
const right = clipPolygonHalfPlane(polygon, a, b, 'negative');
|
|
172
|
+
|
|
173
|
+
if (left.length < 3 || right.length < 3) {
|
|
174
|
+
return { ok: false, reason: 'Cut produces a degenerate half (< 3 vertices)' };
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return { ok: true, left, right };
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Test helper: is `p` strictly inside `polygon` (ray-cast). Used by
|
|
182
|
+
* the slab-split tool to figure out which half the user clicked on
|
|
183
|
+
* after committing the cut, so we can move selection to that half.
|
|
184
|
+
*/
|
|
185
|
+
export function pointInPolygon(polygon: Point2D[], p: Point2D): boolean {
|
|
186
|
+
if (polygon.length < 3) return false;
|
|
187
|
+
let inside = false;
|
|
188
|
+
let j = polygon.length - 1;
|
|
189
|
+
for (let i = 0; i < polygon.length; i++) {
|
|
190
|
+
const a = polygon[i];
|
|
191
|
+
const b = polygon[j];
|
|
192
|
+
const intersects =
|
|
193
|
+
(a[1] > p[1]) !== (b[1] > p[1]) &&
|
|
194
|
+
p[0] < ((b[0] - a[0]) * (p[1] - a[1])) / (b[1] - a[1] + EPS) + a[0];
|
|
195
|
+
if (intersects) inside = !inside;
|
|
196
|
+
j = i;
|
|
197
|
+
}
|
|
198
|
+
return inside;
|
|
199
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
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
|
+
resolveSlabEditChain,
|
|
9
|
+
computeSlabSplitGeometry,
|
|
10
|
+
} from './slab-edit.js';
|
|
11
|
+
|
|
12
|
+
import { StubStoreEditor, StubView, makeStubDataStore, type OverlayEntity } from './__test__/stubs.js';
|
|
13
|
+
|
|
14
|
+
const dataStoreStub = makeStubDataStore() as unknown as Parameters<typeof resolveSlabEditChain>[0];
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Rectangle-profile slab fixture mirroring `addSlabToStore`:
|
|
18
|
+
* #100 IfcSlab
|
|
19
|
+
* placement → #99 IfcLocalPlacement → #98 IfcAxis2Placement3D
|
|
20
|
+
* Location → #97 IfcCartesianPoint([1, 2, 0])
|
|
21
|
+
* representation → #95 IfcProductDefinitionShape
|
|
22
|
+
* → #94 IfcShapeRepresentation
|
|
23
|
+
* → Items[0] = #93 IfcExtrudedAreaSolid
|
|
24
|
+
* SweptArea = #92 IfcRectangleProfileDef (W=4, D=3)
|
|
25
|
+
* Position = #91 IfcAxis2Placement2D
|
|
26
|
+
* Location = #90 IfcCartesianPoint([2, 1.5])
|
|
27
|
+
* Depth = 0.3
|
|
28
|
+
*/
|
|
29
|
+
function makeRectangleSlabFixture() {
|
|
30
|
+
return [
|
|
31
|
+
{ expressId: 97, type: 'IFCCARTESIANPOINT', attributes: [[1, 2, 0]] },
|
|
32
|
+
{ expressId: 98, type: 'IFCAXIS2PLACEMENT3D', attributes: [97, null, null] },
|
|
33
|
+
{ expressId: 99, type: 'IFCLOCALPLACEMENT', attributes: [null, 98] },
|
|
34
|
+
{ expressId: 90, type: 'IFCCARTESIANPOINT', attributes: [[2, 1.5]] },
|
|
35
|
+
{ expressId: 91, type: 'IFCAXIS2PLACEMENT2D', attributes: [90, null] },
|
|
36
|
+
{ expressId: 92, type: 'IFCRECTANGLEPROFILEDEF', attributes: ['.AREA.', null, 91, 4, 3] },
|
|
37
|
+
{ expressId: 93, type: 'IFCEXTRUDEDAREASOLID', attributes: [92, null, null, 0.3] },
|
|
38
|
+
{ expressId: 94, type: 'IFCSHAPEREPRESENTATION', attributes: [null, 'Body', 'SweptSolid', [93]] },
|
|
39
|
+
{ expressId: 95, type: 'IFCPRODUCTDEFINITIONSHAPE', attributes: [null, null, [94]] },
|
|
40
|
+
{ expressId: 100, type: 'IFCSLAB', attributes: ['guid', null, 'Slab-1', null, null, 99, 95, null] },
|
|
41
|
+
];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Polygon-profile slab fixture (triangle footprint).
|
|
46
|
+
* IfcArbitraryClosedProfileDef → IfcPolyline with three points
|
|
47
|
+
* (0,0), (2,0), (1,2) in profile-local 2D.
|
|
48
|
+
*/
|
|
49
|
+
function makePolygonSlabFixture() {
|
|
50
|
+
return [
|
|
51
|
+
{ expressId: 97, type: 'IFCCARTESIANPOINT', attributes: [[10, 20, 0]] },
|
|
52
|
+
{ expressId: 98, type: 'IFCAXIS2PLACEMENT3D', attributes: [97, null, null] },
|
|
53
|
+
{ expressId: 99, type: 'IFCLOCALPLACEMENT', attributes: [null, 98] },
|
|
54
|
+
{ expressId: 80, type: 'IFCCARTESIANPOINT', attributes: [[0, 0]] },
|
|
55
|
+
{ expressId: 81, type: 'IFCCARTESIANPOINT', attributes: [[2, 0]] },
|
|
56
|
+
{ expressId: 82, type: 'IFCCARTESIANPOINT', attributes: [[1, 2]] },
|
|
57
|
+
{ expressId: 83, type: 'IFCPOLYLINE', attributes: [[80, 81, 82]] },
|
|
58
|
+
{ expressId: 92, type: 'IFCARBITRARYCLOSEDPROFILEDEF', attributes: ['.AREA.', null, 83] },
|
|
59
|
+
{ expressId: 93, type: 'IFCEXTRUDEDAREASOLID', attributes: [92, null, null, 0.25] },
|
|
60
|
+
{ expressId: 94, type: 'IFCSHAPEREPRESENTATION', attributes: [null, 'Body', 'SweptSolid', [93]] },
|
|
61
|
+
{ expressId: 95, type: 'IFCPRODUCTDEFINITIONSHAPE', attributes: [null, null, [94]] },
|
|
62
|
+
{ expressId: 100, type: 'IFCSLAB', attributes: ['guid', null, 'Slab-1', null, null, 99, 95, null] },
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
describe('slab-edit', () => {
|
|
67
|
+
it('resolves a rectangle-profile slab footprint with placement-origin added', () => {
|
|
68
|
+
const entities = makeRectangleSlabFixture();
|
|
69
|
+
const editor = new StubStoreEditor(entities) as unknown as Parameters<typeof resolveSlabEditChain>[2];
|
|
70
|
+
const view = new StubView() as unknown as Parameters<typeof resolveSlabEditChain>[1];
|
|
71
|
+
const chain = resolveSlabEditChain(dataStoreStub, view, editor, 100);
|
|
72
|
+
assert.ok(chain);
|
|
73
|
+
assert.strictEqual(chain.elementType, 'IfcSlab');
|
|
74
|
+
assert.strictEqual(chain.thickness, 0.3);
|
|
75
|
+
assert.strictEqual(chain.profileKind, 'rectangle');
|
|
76
|
+
// Profile centered at (2, 1.5) with XDim=4, YDim=3 means it
|
|
77
|
+
// spans [0..4] x [0..3] in profile-local. Plus placement origin
|
|
78
|
+
// (1, 2) gives [1..5] x [2..5] in storey-local.
|
|
79
|
+
assert.deepStrictEqual(chain.footprint, [
|
|
80
|
+
[1, 2],
|
|
81
|
+
[5, 2],
|
|
82
|
+
[5, 5],
|
|
83
|
+
[1, 5],
|
|
84
|
+
]);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('resolves a polygon-profile slab footprint with placement-origin added', () => {
|
|
88
|
+
const entities = makePolygonSlabFixture();
|
|
89
|
+
const editor = new StubStoreEditor(entities) as unknown as Parameters<typeof resolveSlabEditChain>[2];
|
|
90
|
+
const view = new StubView() as unknown as Parameters<typeof resolveSlabEditChain>[1];
|
|
91
|
+
const chain = resolveSlabEditChain(dataStoreStub, view, editor, 100);
|
|
92
|
+
assert.ok(chain);
|
|
93
|
+
assert.strictEqual(chain.profileKind, 'polygon');
|
|
94
|
+
// Triangle vertices (0,0), (2,0), (1,2) with placement (10, 20)
|
|
95
|
+
// and no explicit profile origin → footprint at (10,20), (12,20), (11,22).
|
|
96
|
+
assert.strictEqual(chain.footprint.length, 3);
|
|
97
|
+
assert.deepStrictEqual(chain.footprint[0], [10, 20]);
|
|
98
|
+
assert.deepStrictEqual(chain.footprint[1], [12, 20]);
|
|
99
|
+
assert.deepStrictEqual(chain.footprint[2], [11, 22]);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it('strips the redundant closing vertex from an IfcPolyline', () => {
|
|
103
|
+
const entities = makePolygonSlabFixture();
|
|
104
|
+
// Append a duplicate of the first vertex to the polyline.
|
|
105
|
+
const polyline = entities.find((e) => e.expressId === 83)!;
|
|
106
|
+
polyline.attributes = [[80, 81, 82, 80]];
|
|
107
|
+
const editor = new StubStoreEditor(entities) as unknown as Parameters<typeof resolveSlabEditChain>[2];
|
|
108
|
+
const view = new StubView() as unknown as Parameters<typeof resolveSlabEditChain>[1];
|
|
109
|
+
const chain = resolveSlabEditChain(dataStoreStub, view, editor, 100);
|
|
110
|
+
assert.ok(chain);
|
|
111
|
+
assert.strictEqual(chain.footprint.length, 3);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('rejects non-slab-like element types', () => {
|
|
115
|
+
const entities = makeRectangleSlabFixture();
|
|
116
|
+
entities.find((e) => e.expressId === 100)!.type = 'IFCWALL';
|
|
117
|
+
const editor = new StubStoreEditor(entities) as unknown as Parameters<typeof resolveSlabEditChain>[2];
|
|
118
|
+
const view = new StubView() as unknown as Parameters<typeof resolveSlabEditChain>[1];
|
|
119
|
+
assert.strictEqual(resolveSlabEditChain(dataStoreStub, view, editor, 100), null);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('computeSlabSplitGeometry halves a rectangle slab', () => {
|
|
123
|
+
const entities = makeRectangleSlabFixture();
|
|
124
|
+
const editor = new StubStoreEditor(entities) as unknown as Parameters<typeof resolveSlabEditChain>[2];
|
|
125
|
+
const view = new StubView() as unknown as Parameters<typeof resolveSlabEditChain>[1];
|
|
126
|
+
const chain = resolveSlabEditChain(dataStoreStub, view, editor, 100);
|
|
127
|
+
assert.ok(chain);
|
|
128
|
+
// Slab spans x:[1..5], y:[2..5]. Vertical cut at x=3.
|
|
129
|
+
const result = computeSlabSplitGeometry(chain, [3, 0], [3, 10]);
|
|
130
|
+
assert.ok(result.ok);
|
|
131
|
+
assert.strictEqual(result.leftFootprint.length, 4);
|
|
132
|
+
assert.strictEqual(result.rightFootprint.length, 4);
|
|
133
|
+
// One half covers x:[1..3], other x:[3..5]. Total area = 12 (4*3).
|
|
134
|
+
const area = (poly: [number, number][]) => {
|
|
135
|
+
let a = 0;
|
|
136
|
+
for (let i = 0; i < poly.length; i++) {
|
|
137
|
+
const [x1, y1] = poly[i];
|
|
138
|
+
const [x2, y2] = poly[(i + 1) % poly.length];
|
|
139
|
+
a += x1 * y2 - x2 * y1;
|
|
140
|
+
}
|
|
141
|
+
return Math.abs(a) / 2;
|
|
142
|
+
};
|
|
143
|
+
const totalArea = area(result.leftFootprint) + area(result.rightFootprint);
|
|
144
|
+
assert.ok(Math.abs(totalArea - 12) < 1e-9);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it('rejects cut lines that miss the slab', () => {
|
|
148
|
+
const entities = makeRectangleSlabFixture();
|
|
149
|
+
const editor = new StubStoreEditor(entities) as unknown as Parameters<typeof resolveSlabEditChain>[2];
|
|
150
|
+
const view = new StubView() as unknown as Parameters<typeof resolveSlabEditChain>[1];
|
|
151
|
+
const chain = resolveSlabEditChain(dataStoreStub, view, editor, 100);
|
|
152
|
+
assert.ok(chain);
|
|
153
|
+
// Cut line at x=100 — entirely outside the slab.
|
|
154
|
+
const result = computeSlabSplitGeometry(chain, [100, 0], [100, 10]);
|
|
155
|
+
assert.strictEqual(result.ok, false);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it('preserves thickness + element type through split', () => {
|
|
159
|
+
const entities = makeRectangleSlabFixture();
|
|
160
|
+
const editor = new StubStoreEditor(entities) as unknown as Parameters<typeof resolveSlabEditChain>[2];
|
|
161
|
+
const view = new StubView() as unknown as Parameters<typeof resolveSlabEditChain>[1];
|
|
162
|
+
const chain = resolveSlabEditChain(dataStoreStub, view, editor, 100);
|
|
163
|
+
assert.ok(chain);
|
|
164
|
+
const result = computeSlabSplitGeometry(chain, [3, 0], [3, 10]);
|
|
165
|
+
assert.ok(result.ok);
|
|
166
|
+
assert.strictEqual(result.thickness, 0.3);
|
|
167
|
+
assert.strictEqual(result.elementType, 'IfcSlab');
|
|
168
|
+
});
|
|
169
|
+
});
|
|
@@ -0,0 +1,312 @@
|
|
|
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
|
+
* Footprint reader + cut helpers for slab-like elements (IfcSlab,
|
|
7
|
+
* IfcRoof, IfcPlate, IfcSpace) shaped by the in-store builders in
|
|
8
|
+
* `@ifc-lite/create`. The shared shape is:
|
|
9
|
+
*
|
|
10
|
+
* IfcExtrudedAreaSolid
|
|
11
|
+
* ├── SweptArea : IfcRectangleProfileDef (W × D) — rectangle mode
|
|
12
|
+
* │ OR IfcArbitraryClosedProfileDef → IfcPolyline — polygon mode
|
|
13
|
+
* └── Depth : thickness along +Z (storey-local)
|
|
14
|
+
*
|
|
15
|
+
* The "footprint" is the profile polygon in storey-local 2D (XY).
|
|
16
|
+
* For rectangle mode we derive it from (placementOrigin, W, D); for
|
|
17
|
+
* polygon mode we read the polyline's vertex list.
|
|
18
|
+
*
|
|
19
|
+
* The split workflow:
|
|
20
|
+
*
|
|
21
|
+
* 1. user clicks twice on the slab (in storey-local 2D)
|
|
22
|
+
* 2. polygon-clip cuts the footprint into two halves
|
|
23
|
+
* 3. caller builds two fresh slabs via `addSlab` polygon-mode
|
|
24
|
+
* (cleaner than trying to detect "rectangle still fits" — most
|
|
25
|
+
* cuts produce non-rectangular halves)
|
|
26
|
+
* 4. source is tombstoned + its mesh hidden
|
|
27
|
+
*
|
|
28
|
+
* Source-buffer slabs with unusual representations (mapped shapes,
|
|
29
|
+
* tessellated faces, …) refuse with a clear reason and the caller's
|
|
30
|
+
* Split tool stays armed.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
34
|
+
import type { MutablePropertyView, StoreEditor } from '@ifc-lite/mutations';
|
|
35
|
+
import {
|
|
36
|
+
asExpressIdRef,
|
|
37
|
+
asCoordinateTriple,
|
|
38
|
+
readAttributes,
|
|
39
|
+
resolvePlacementChain,
|
|
40
|
+
} from './placement-core.js';
|
|
41
|
+
import { clipPolygonByLine, type Point2D, type PolygonClipResult } from './polygon-clip.js';
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Slab-like element types this module handles. Matches the STEP
|
|
45
|
+
* storage form (`IFCSLAB`, …) so the slice's split action can
|
|
46
|
+
* dispatch to the right `addSlab` / `addRoof` / `addPlate` /
|
|
47
|
+
* `addSpace` follow-up. (Roof/plate/space are added in subsequent
|
|
48
|
+
* commits but their representation is identical, so this resolver
|
|
49
|
+
* already accepts them.)
|
|
50
|
+
*/
|
|
51
|
+
export type SlabLikeType = 'IfcSlab' | 'IfcRoof' | 'IfcPlate' | 'IfcSpace';
|
|
52
|
+
|
|
53
|
+
const SLAB_LIKE_STEP_TYPES: Record<string, SlabLikeType> = {
|
|
54
|
+
IFCSLAB: 'IfcSlab',
|
|
55
|
+
IFCROOF: 'IfcRoof',
|
|
56
|
+
IFCPLATE: 'IfcPlate',
|
|
57
|
+
IFCSPACE: 'IfcSpace',
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
function stepTypeToSlabLike(stepType: string): SlabLikeType | null {
|
|
61
|
+
return SLAB_LIKE_STEP_TYPES[stepType.toUpperCase()] ?? null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface SlabEditChain {
|
|
65
|
+
/** STEP type name, for the slice's dispatch. */
|
|
66
|
+
elementType: SlabLikeType;
|
|
67
|
+
/** Placement origin (storey-local). The footprint polygon is in
|
|
68
|
+
* world-XY space, with the origin already added. */
|
|
69
|
+
placementOrigin: [number, number, number];
|
|
70
|
+
/** Footprint polygon as an ordered list of 2D vertices (storey-
|
|
71
|
+
* local world XY). First vertex does NOT repeat at the end. */
|
|
72
|
+
footprint: Point2D[];
|
|
73
|
+
/** IfcExtrudedAreaSolid id — holds the thickness on attr 3. */
|
|
74
|
+
extrudedSolidId: number;
|
|
75
|
+
/** Current extrusion thickness (metres along +Z). */
|
|
76
|
+
thickness: number;
|
|
77
|
+
/**
|
|
78
|
+
* Whether the source profile was a rectangle (XDim/YDim) or an
|
|
79
|
+
* arbitrary polygon (IfcArbitraryClosedProfileDef → IfcPolyline).
|
|
80
|
+
* Surface for telemetry; not required by the split flow.
|
|
81
|
+
*/
|
|
82
|
+
profileKind: 'rectangle' | 'polygon';
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function readEntityType(
|
|
86
|
+
dataStore: IfcDataStore,
|
|
87
|
+
view: MutablePropertyView,
|
|
88
|
+
editor: StoreEditor,
|
|
89
|
+
expressId: number,
|
|
90
|
+
): string | null {
|
|
91
|
+
void view;
|
|
92
|
+
const overlay = editor.getNewEntity(expressId);
|
|
93
|
+
if (overlay) return overlay.type;
|
|
94
|
+
const ref = dataStore.entityIndex.byId.get(expressId);
|
|
95
|
+
return ref?.type ?? null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Derive a rectangle profile's outline from its centred placement.
|
|
100
|
+
* `IfcRectangleProfileDef` extends from `-XDim/2` to `+XDim/2`
|
|
101
|
+
* along the profile's local X (and same for YDim along local Y),
|
|
102
|
+
* centred at the IfcAxis2Placement2D's Location point.
|
|
103
|
+
*/
|
|
104
|
+
function rectangleFootprint(
|
|
105
|
+
placementOrigin: [number, number, number],
|
|
106
|
+
profileOrigin2D: [number, number],
|
|
107
|
+
xdim: number,
|
|
108
|
+
ydim: number,
|
|
109
|
+
): Point2D[] {
|
|
110
|
+
// The profile's local frame maps directly to storey-local XY for
|
|
111
|
+
// a slab (no in-plane rotation; the builder writes Position +
|
|
112
|
+
// null Axis + null RefDirection so the placement is axis-aligned).
|
|
113
|
+
const [px, py] = placementOrigin;
|
|
114
|
+
const [cx, cy] = profileOrigin2D;
|
|
115
|
+
const xMin = px + cx - xdim / 2;
|
|
116
|
+
const xMax = px + cx + xdim / 2;
|
|
117
|
+
const yMin = py + cy - ydim / 2;
|
|
118
|
+
const yMax = py + cy + ydim / 2;
|
|
119
|
+
return [
|
|
120
|
+
[xMin, yMin],
|
|
121
|
+
[xMax, yMin],
|
|
122
|
+
[xMax, yMax],
|
|
123
|
+
[xMin, yMax],
|
|
124
|
+
];
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Read an IfcPolyline's vertex list and return them as 2D storey-
|
|
129
|
+
* local points (adding the placement origin so the result is in
|
|
130
|
+
* the same frame as a rectangle footprint).
|
|
131
|
+
*/
|
|
132
|
+
function polylineFootprint(
|
|
133
|
+
dataStore: IfcDataStore,
|
|
134
|
+
view: MutablePropertyView,
|
|
135
|
+
editor: StoreEditor,
|
|
136
|
+
polylineId: number,
|
|
137
|
+
placementOrigin: [number, number, number],
|
|
138
|
+
profileOrigin2D: [number, number],
|
|
139
|
+
): Point2D[] | null {
|
|
140
|
+
const attrs = readAttributes(dataStore, view, editor, polylineId);
|
|
141
|
+
if (!attrs) return null;
|
|
142
|
+
// IfcPolyline.Points is a list of IfcCartesianPoint refs at attr 0.
|
|
143
|
+
const refList = attrs[0];
|
|
144
|
+
if (!Array.isArray(refList) || refList.length < 3) return null;
|
|
145
|
+
const [px, py] = placementOrigin;
|
|
146
|
+
const [cx, cy] = profileOrigin2D;
|
|
147
|
+
const out: Point2D[] = [];
|
|
148
|
+
for (const ref of refList) {
|
|
149
|
+
const ptId = asExpressIdRef(ref);
|
|
150
|
+
if (ptId === null) return null;
|
|
151
|
+
const ptAttrs = readAttributes(dataStore, view, editor, ptId);
|
|
152
|
+
if (!ptAttrs) return null;
|
|
153
|
+
// IfcCartesianPoint.Coordinates is a list of doubles at attr 0.
|
|
154
|
+
// Polyline points are 2D here (slab profiles), but treat 3D
|
|
155
|
+
// tolerantly — IFC files in the wild sometimes pad with Z=0.
|
|
156
|
+
const coords = asCoordinateTriple(ptAttrs[0]);
|
|
157
|
+
if (!coords) return null;
|
|
158
|
+
out.push([px + cx + coords[0], py + cy + coords[1]]);
|
|
159
|
+
}
|
|
160
|
+
// IfcPolyline for a closed profile may or may not repeat the
|
|
161
|
+
// first vertex at the end — strip if present, our clip API
|
|
162
|
+
// wants the implicit-close form.
|
|
163
|
+
if (out.length >= 2) {
|
|
164
|
+
const first = out[0];
|
|
165
|
+
const last = out[out.length - 1];
|
|
166
|
+
if (Math.abs(first[0] - last[0]) < 1e-9 && Math.abs(first[1] - last[1]) < 1e-9) {
|
|
167
|
+
out.pop();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return out.length >= 3 ? out : null;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Resolve the slab chain (placement + footprint + extrusion). Works
|
|
175
|
+
* for IfcSlab / IfcRoof / IfcPlate / IfcSpace whose representation
|
|
176
|
+
* matches the in-store builder shape; null otherwise.
|
|
177
|
+
*/
|
|
178
|
+
export function resolveSlabEditChain(
|
|
179
|
+
dataStore: IfcDataStore,
|
|
180
|
+
view: MutablePropertyView,
|
|
181
|
+
editor: StoreEditor,
|
|
182
|
+
expressId: number,
|
|
183
|
+
): SlabEditChain | null {
|
|
184
|
+
const rawType = readEntityType(dataStore, view, editor, expressId);
|
|
185
|
+
if (!rawType) return null;
|
|
186
|
+
const elementType = stepTypeToSlabLike(rawType);
|
|
187
|
+
if (!elementType) return null;
|
|
188
|
+
|
|
189
|
+
const chain = resolvePlacementChain(dataStore, view, editor, expressId);
|
|
190
|
+
if (!chain) return null;
|
|
191
|
+
const placementOrigin = chain.coordinates;
|
|
192
|
+
|
|
193
|
+
const elementAttrs = readAttributes(dataStore, view, editor, expressId);
|
|
194
|
+
if (!elementAttrs) return null;
|
|
195
|
+
const productShapeId = asExpressIdRef(elementAttrs[6]);
|
|
196
|
+
if (productShapeId === null) return null;
|
|
197
|
+
const productShapeAttrs = readAttributes(dataStore, view, editor, productShapeId);
|
|
198
|
+
if (!productShapeAttrs) return null;
|
|
199
|
+
const reps = productShapeAttrs[2];
|
|
200
|
+
if (!Array.isArray(reps) || reps.length === 0) return null;
|
|
201
|
+
const shapeRepId = asExpressIdRef(reps[0]);
|
|
202
|
+
if (shapeRepId === null) return null;
|
|
203
|
+
const shapeRepAttrs = readAttributes(dataStore, view, editor, shapeRepId);
|
|
204
|
+
if (!shapeRepAttrs) return null;
|
|
205
|
+
const items = shapeRepAttrs[3];
|
|
206
|
+
if (!Array.isArray(items) || items.length === 0) return null;
|
|
207
|
+
const solidId = asExpressIdRef(items[0]);
|
|
208
|
+
if (solidId === null) return null;
|
|
209
|
+
const solidAttrs = readAttributes(dataStore, view, editor, solidId);
|
|
210
|
+
if (!solidAttrs) return null;
|
|
211
|
+
const profileId = asExpressIdRef(solidAttrs[0]);
|
|
212
|
+
const thicknessRaw = solidAttrs[3];
|
|
213
|
+
if (profileId === null || typeof thicknessRaw !== 'number') return null;
|
|
214
|
+
|
|
215
|
+
// Profile dispatch — rectangle vs polygon, both produced by
|
|
216
|
+
// addSlabToStore. Source-buffer slabs with mapped representations,
|
|
217
|
+
// I-shape profiles, etc. land in `null` here and the slice
|
|
218
|
+
// surfaces a "not supported" toast.
|
|
219
|
+
const profileAttrs = readAttributes(dataStore, view, editor, profileId);
|
|
220
|
+
if (!profileAttrs) return null;
|
|
221
|
+
const overlay = editor.getNewEntity(profileId);
|
|
222
|
+
const profileType = overlay?.type ?? dataStore.entityIndex.byId.get(profileId)?.type ?? null;
|
|
223
|
+
|
|
224
|
+
// Profile-local origin (IfcAxis2Placement2D.Location) — both
|
|
225
|
+
// profile kinds share this. May be null for the slot, in which
|
|
226
|
+
// case the spec defaults to origin = (0, 0).
|
|
227
|
+
const profilePosId = asExpressIdRef(profileAttrs[2]);
|
|
228
|
+
let profileOrigin2D: [number, number] = [0, 0];
|
|
229
|
+
if (profilePosId !== null) {
|
|
230
|
+
const profilePosAttrs = readAttributes(dataStore, view, editor, profilePosId);
|
|
231
|
+
if (profilePosAttrs) {
|
|
232
|
+
const profileOriginPtId = asExpressIdRef(profilePosAttrs[0]);
|
|
233
|
+
if (profileOriginPtId !== null) {
|
|
234
|
+
const profileOriginAttrs = readAttributes(dataStore, view, editor, profileOriginPtId);
|
|
235
|
+
if (profileOriginAttrs) {
|
|
236
|
+
const c = asCoordinateTriple(profileOriginAttrs[0]);
|
|
237
|
+
if (c) profileOrigin2D = [c[0], c[1]];
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (profileType && profileType.toUpperCase() === 'IFCRECTANGLEPROFILEDEF') {
|
|
244
|
+
const xdim = profileAttrs[3];
|
|
245
|
+
const ydim = profileAttrs[4];
|
|
246
|
+
if (typeof xdim !== 'number' || typeof ydim !== 'number') return null;
|
|
247
|
+
return {
|
|
248
|
+
elementType,
|
|
249
|
+
placementOrigin,
|
|
250
|
+
footprint: rectangleFootprint(placementOrigin, profileOrigin2D, xdim, ydim),
|
|
251
|
+
extrudedSolidId: solidId,
|
|
252
|
+
thickness: thicknessRaw,
|
|
253
|
+
profileKind: 'rectangle',
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
if (profileType && profileType.toUpperCase() === 'IFCARBITRARYCLOSEDPROFILEDEF') {
|
|
257
|
+
// OuterCurve at attr 2.
|
|
258
|
+
const polylineId = asExpressIdRef(profileAttrs[2]);
|
|
259
|
+
if (polylineId === null) return null;
|
|
260
|
+
const fp = polylineFootprint(dataStore, view, editor, polylineId, placementOrigin, profileOrigin2D);
|
|
261
|
+
if (!fp) return null;
|
|
262
|
+
return {
|
|
263
|
+
elementType,
|
|
264
|
+
placementOrigin,
|
|
265
|
+
footprint: fp,
|
|
266
|
+
extrudedSolidId: solidId,
|
|
267
|
+
thickness: thicknessRaw,
|
|
268
|
+
profileKind: 'polygon',
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export interface SlabSplitResult {
|
|
275
|
+
ok: true;
|
|
276
|
+
leftFootprint: Point2D[];
|
|
277
|
+
rightFootprint: Point2D[];
|
|
278
|
+
thickness: number;
|
|
279
|
+
placementOrigin: [number, number, number];
|
|
280
|
+
elementType: SlabLikeType;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
export type SlabSplitOutcome = SlabSplitResult | { ok: false; reason: string };
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Pure split-geometry helper. Clips the slab's footprint by a cut
|
|
287
|
+
* line (defined by two storey-local 2D points) and returns the two
|
|
288
|
+
* halves so the caller can build new slabs with `addSlab`. Both
|
|
289
|
+
* halves carry the source's thickness + storey placement; only the
|
|
290
|
+
* outer-curve polygon changes.
|
|
291
|
+
*
|
|
292
|
+
* Returns the underlying polygon-clip reason on failure so the UI
|
|
293
|
+
* can surface "Cut line does not cross the slab" verbatim.
|
|
294
|
+
*/
|
|
295
|
+
export function computeSlabSplitGeometry(
|
|
296
|
+
chain: SlabEditChain,
|
|
297
|
+
cutA: Point2D,
|
|
298
|
+
cutB: Point2D,
|
|
299
|
+
): SlabSplitOutcome {
|
|
300
|
+
const clipped: PolygonClipResult = clipPolygonByLine(chain.footprint, cutA, cutB);
|
|
301
|
+
if (!clipped.ok) {
|
|
302
|
+
return { ok: false, reason: clipped.reason };
|
|
303
|
+
}
|
|
304
|
+
return {
|
|
305
|
+
ok: true,
|
|
306
|
+
leftFootprint: clipped.left,
|
|
307
|
+
rightFootprint: clipped.right,
|
|
308
|
+
thickness: chain.thickness,
|
|
309
|
+
placementOrigin: chain.placementOrigin,
|
|
310
|
+
elementType: chain.elementType,
|
|
311
|
+
};
|
|
312
|
+
}
|