@ifc-lite/viewer 1.22.1 → 1.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/.turbo/turbo-build.log +30 -30
  2. package/CHANGELOG.md +50 -0
  3. package/dist/assets/{basketViewActivator--cFpU2Q9.js → basketViewActivator-Dn_bHUl2.js} +6 -6
  4. package/dist/assets/{bcf-Ba2CjHib.js → bcf-B9SFl84i.js} +1 -1
  5. package/dist/assets/{deflate-DCLbV4UE.js → deflate-yMpdCIqk.js} +1 -1
  6. package/dist/assets/{exporters-Bf6PTtdW.js → exporters-D-BvrNIg.js} +1178 -1147
  7. package/dist/assets/{geometry-controller.worker-CEr00X3X.js → geometry-controller.worker-Cm5pvyR6.js} +2 -2
  8. package/dist/assets/geometry.worker-ClNvXIrj.js +1 -0
  9. package/dist/assets/{geotiff-BN4J8Vt9.js → geotiff-D1tvcDCb.js} +10 -10
  10. package/dist/assets/{ids-XwxE1tK3.js → ids-DZLs0snJ.js} +3 -3
  11. package/dist/assets/{ifc-lite-DNzkEkIb.js → ifc-lite-BDg0iIbj.js} +2 -2
  12. package/dist/assets/{ifc-lite_bg-1IiJN0Zg.wasm → ifc-lite_bg-BIryVCXQ.wasm} +0 -0
  13. package/dist/assets/{ifc-lite_bg-B_eUD1Wy.wasm → ifc-lite_bg-DyHX37GQ.wasm} +0 -0
  14. package/dist/assets/{index-j2x5R7fb.js → index-CXSBhkcJ.js} +20564 -20159
  15. package/dist/assets/{jpeg-BUTmr0Bp.js → jpeg-DUMcZp24.js} +1 -1
  16. package/dist/assets/{lerc-DmzRHXn3.js → lerc-IN4uWojP.js} +1 -1
  17. package/dist/assets/{lzw-CgyIIzii.js → lzw-Cnw0hH-m.js} +1 -1
  18. package/dist/assets/{native-bridge-Q5ACp4QY.js → native-bridge-BVf2uzoH.js} +1 -1
  19. package/dist/assets/{packbits-C1r4AzHj.js → packbits-BskJCwk0.js} +1 -1
  20. package/dist/assets/{parser.worker-Cl6XQcXA.js → parser.worker-BdtkkaGf.js} +3 -3
  21. package/dist/assets/raw-DzTtEZIY.js +1 -0
  22. package/dist/assets/{sandbox-Bju6ZKJK.js → sandbox-VLI_y7cl.js} +2 -2
  23. package/dist/assets/{server-client-B8wi3CGx.js → server-client-BLcKaWQB.js} +1 -1
  24. package/dist/assets/{wasm-bridge-X-mWRA9Z.js → wasm-bridge-BAfZh7YT.js} +1 -1
  25. package/dist/assets/{webimage-D0MbRMkU.js → webimage-Db2xzze3.js} +1 -1
  26. package/dist/assets/{workerHelpers-DnNedVRr.js → workerHelpers--sAYm9yN.js} +1 -1
  27. package/dist/assets/{zstd-DA4VQ-ji.js → zstd-BDToOQyD.js} +1 -1
  28. package/dist/index.html +6 -6
  29. package/package.json +7 -7
  30. package/src/components/viewer/GLBExportDialog.tsx +389 -0
  31. package/src/components/viewer/MainToolbar.tsx +17 -25
  32. package/dist/assets/geometry.worker-B4VPDkmL.js +0 -1
  33. package/dist/assets/raw-ZqLh7kVQ.js +0 -1
@@ -1,5 +1,5 @@
1
1
 
2
- > @ifc-lite/viewer@1.22.1 build /home/runner/work/ifc-lite/ifc-lite/apps/viewer
2
+ > @ifc-lite/viewer@1.23.0 build /home/runner/work/ifc-lite/ifc-lite/apps/viewer
3
3
  > vite build
4
4
 
5
5
  vite v7.3.3 building client environment for production...
@@ -8,6 +8,7 @@ transforming...
8
8
  [plugin vite:resolve] Module "node:fs" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0/node_modules/@anthropic-ai/sdk/lib/credentials/types.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
9
9
  [plugin vite:resolve] Module "node:path" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0/node_modules/@anthropic-ai/sdk/lib/credentials/types.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
10
10
  [plugin vite:resolve] Module "node:fs" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0/node_modules/@anthropic-ai/sdk/lib/credentials/credential-chain.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
11
+ [plugin vite:resolve] Module "node:fs" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0/node_modules/@anthropic-ai/sdk/lib/credentials/identity-token.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
11
12
  [plugin vite:resolve] Module "node:fs" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0/node_modules/@anthropic-ai/sdk/core/credentials.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
12
13
  [plugin vite:resolve] Module "node:path" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0/node_modules/@anthropic-ai/sdk/core/credentials.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
13
14
  [plugin vite:resolve] Module "node:fs" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0/node_modules/@anthropic-ai/sdk/core/credentials.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
@@ -15,9 +16,8 @@ transforming...
15
16
  [plugin vite:resolve] Module "node:path" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0/node_modules/@anthropic-ai/sdk/core/credentials.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
16
17
  [plugin vite:resolve] Module "node:fs" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0/node_modules/@anthropic-ai/sdk/core/credentials.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
17
18
  [plugin vite:resolve] Module "node:path" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0/node_modules/@anthropic-ai/sdk/core/credentials.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
18
- [plugin vite:resolve] Module "node:fs" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0/node_modules/@anthropic-ai/sdk/lib/credentials/identity-token.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
19
19
  [plugin vite:resolve] Module "node:fs" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0/node_modules/@anthropic-ai/sdk/lib/credentials/user-oauth.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
20
- ✓ 4865 modules transformed.
20
+ ✓ 4866 modules transformed.
21
21
  rendering chunks...
22
22
  [plugin vite:reporter]
23
23
  (!) /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/utils/ifcConfig.ts is dynamically imported by /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/utils/acquireFileBuffer.ts but also statically imported by /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcFederation.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcLoader.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcServer.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/services/cacheService.ts, dynamic import will not move module into another chunk.
@@ -26,7 +26,7 @@ rendering chunks...
26
26
  (!) /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/services/desktop-cache.ts is dynamically imported by /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcLoader.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcLoader.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcLoader.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcLoader.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcLoader.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcLoader.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/services/cacheService.ts but also statically imported by /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/services/desktop-native-metadata.ts, dynamic import will not move module into another chunk.
27
27
  
28
28
  [plugin vite:reporter]
29
- (!) /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/ui/toast.tsx is dynamically imported by /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useKeyboardShortcuts.ts but also statically imported by /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/App.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/AddElementPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/CesiumPlacementEditor.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ChatPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/EntityContextMenu.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ExportChangesButton.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ExportDialog.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/GeometryEditCard.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/MainToolbar.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/MobileToolbar.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ScriptPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/SettingsPage.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ViewportContainer.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/chat/ByokKeyModal.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/properties/FederationAlignmentControls.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/properties/GeoreferencingPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/GanttToolbar.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/selectionHandlers.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/SplitNumericInput.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/useDuplicateShortcut.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcFederation.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/services/desktop-export.ts, dynamic import will not move module into another chunk.
29
+ (!) /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/ui/toast.tsx is dynamically imported by /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useKeyboardShortcuts.ts but also statically imported by /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/App.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/AddElementPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/CesiumPlacementEditor.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ChatPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/EntityContextMenu.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ExportChangesButton.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ExportDialog.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/GLBExportDialog.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/GeometryEditCard.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/MainToolbar.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/MobileToolbar.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ScriptPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/SettingsPage.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ViewportContainer.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/chat/ByokKeyModal.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/properties/FederationAlignmentControls.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/properties/GeoreferencingPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/GanttToolbar.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/selectionHandlers.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/SplitNumericInput.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/useDuplicateShortcut.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcFederation.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/services/desktop-export.ts, dynamic import will not move module into another chunk.
30
30
  
31
31
  [plugin vite:reporter]
32
32
  (!) /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/selectionHandlers.ts is dynamically imported by /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useKeyboardShortcuts.ts but also statically imported by /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/WallEndpointOverlay.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/useMouseControls.ts, dynamic import will not move module into another chunk.
@@ -34,7 +34,7 @@ rendering chunks...
34
34
  computing gzip size...
35
35
  [vite-plugin-static-copy] Copied 389 items.
36
36
  dist/assets/laz-perf-DgUOSLeU.js  0.06 kB
37
- dist/assets/workerHelpers-DnNedVRr.js  1.21 kB
37
+ dist/assets/workerHelpers--sAYm9yN.js  1.21 kB
38
38
  dist/assets/las-source-C_IGrgRq.js  2.40 kB
39
39
  dist/assets/las-BW6LIc_j.js  3.08 kB
40
40
  dist/index.html  3.65 kB │ gzip: 1.24 kB
@@ -44,17 +44,17 @@ computing gzip size...
44
44
  dist/assets/ply-source-C8jjyzxE.js  6.77 kB
45
45
  dist/assets/pcd-source-Ck0UnVDn.js  7.31 kB
46
46
  dist/assets/e57-source-CQHxE8n3.js  13.46 kB
47
- dist/assets/ifc-lite-DNzkEkIb.js  46.74 kB
48
- dist/assets/geometry.worker-B4VPDkmL.js  47.17 kB
49
- dist/assets/geometry-controller.worker-CEr00X3X.js  52.43 kB
47
+ dist/assets/ifc-lite-BDg0iIbj.js  47.03 kB
48
+ dist/assets/geometry.worker-ClNvXIrj.js  47.46 kB
49
+ dist/assets/geometry-controller.worker-Cm5pvyR6.js  52.71 kB
50
50
  dist/assets/index-DMho-JA0.js  53.15 kB
51
51
  dist/assets/laz-perf-CFJp03W6.wasm  214.35 kB │ gzip: 73.76 kB
52
52
  dist/assets/emscripten-module-uFzwHH0Y.wasm  503.13 kB │ gzip: 234.04 kB
53
- dist/assets/parser.worker-Cl6XQcXA.js  937.84 kB
53
+ dist/assets/parser.worker-BdtkkaGf.js  938.13 kB
54
54
  dist/assets/emscripten-module-B1g2L2eS.wasm  1,027.52 kB │ gzip: 364.87 kB
55
55
  dist/assets/emscripten-module-ZrHFMo7O.wasm  1,218.63 kB │ gzip: 456.85 kB
56
- dist/assets/ifc-lite_bg-B_eUD1Wy.wasm  1,407.86 kB │ gzip: 508.13 kB
57
- dist/assets/ifc-lite_bg-1IiJN0Zg.wasm  1,468.79 kB │ gzip: 529.79 kB
56
+ dist/assets/ifc-lite_bg-DyHX37GQ.wasm  1,412.93 kB │ gzip: 510.81 kB
57
+ dist/assets/ifc-lite_bg-BIryVCXQ.wasm  1,473.79 kB │ gzip: 531.99 kB
58
58
  dist/assets/emscripten-module-DHbYPfAp.wasm  1,510.75 kB │ gzip: 497.65 kB
59
59
  dist/assets/arrow2_bg-4Y7xYo54.wasm  5,000.39 kB │ gzip: 1,544.22 kB
60
60
  dist/assets/parquet_wasm_bg-DcKVfvto.wasm  6,626.29 kB │ gzip: 1,944.12 kB
@@ -67,42 +67,42 @@ computing gzip size...
67
67
  dist/assets/esbuild-FgU11_Eg.js  0.06 kB │ gzip: 0.08 kB
68
68
  dist/assets/tauri-core-stub-D8Fa-u43.js  0.11 kB │ gzip: 0.12 kB
69
69
  dist/assets/tauri-fs-stub-BdeRC7aK.js  0.13 kB │ gzip: 0.13 kB
70
- dist/assets/raw-ZqLh7kVQ.js  0.21 kB │ gzip: 0.18 kB
71
- dist/assets/deflate-DCLbV4UE.js  0.28 kB │ gzip: 0.22 kB
72
- dist/assets/packbits-C1r4AzHj.js  0.45 kB │ gzip: 0.32 kB
73
- dist/assets/webimage-D0MbRMkU.js  1.06 kB │ gzip: 0.60 kB
70
+ dist/assets/raw-DzTtEZIY.js  0.21 kB │ gzip: 0.18 kB
71
+ dist/assets/deflate-yMpdCIqk.js  0.28 kB │ gzip: 0.22 kB
72
+ dist/assets/packbits-BskJCwk0.js  0.45 kB │ gzip: 0.32 kB
73
+ dist/assets/webimage-Db2xzze3.js  1.06 kB │ gzip: 0.60 kB
74
74
  dist/assets/event-B0kAzHa-.js  1.49 kB │ gzip: 0.68 kB
75
- dist/assets/lzw-CgyIIzii.js  1.60 kB │ gzip: 0.91 kB
76
- dist/assets/wasm-bridge-X-mWRA9Z.js  1.60 kB │ gzip: 0.77 kB
77
- dist/assets/basketViewActivator--cFpU2Q9.js  2.28 kB │ gzip: 0.79 kB
75
+ dist/assets/lzw-Cnw0hH-m.js  1.60 kB │ gzip: 0.91 kB
76
+ dist/assets/wasm-bridge-BAfZh7YT.js  1.60 kB │ gzip: 0.77 kB
77
+ dist/assets/basketViewActivator-Dn_bHUl2.js  2.28 kB │ gzip: 0.79 kB
78
78
  dist/assets/ifc-cache-BAN4vcd4.js  2.77 kB │ gzip: 0.94 kB
79
79
  dist/assets/ffi-Boa1QuFa.js  6.32 kB │ gzip: 1.00 kB
80
80
  dist/assets/lens-CpjUdqpw.js  9.07 kB │ gzip: 2.81 kB
81
81
  dist/assets/emscripten-module.browser-BLJD5hhE.js  9.16 kB │ gzip: 4.19 kB
82
- dist/assets/jpeg-BUTmr0Bp.js  11.28 kB │ gzip: 4.28 kB
83
- dist/assets/native-bridge-Q5ACp4QY.js  18.61 kB │ gzip: 3.76 kB
82
+ dist/assets/jpeg-DUMcZp24.js  11.28 kB │ gzip: 4.27 kB
83
+ dist/assets/native-bridge-BVf2uzoH.js  18.61 kB │ gzip: 3.76 kB
84
84
  dist/assets/pako.esm-Cram60i4.js  21.58 kB │ gzip: 7.64 kB
85
85
  dist/assets/parquet-CEXmQNRO.js  29.67 kB │ gzip: 6.89 kB
86
- dist/assets/server-client-B8wi3CGx.js  31.43 kB │ gzip: 7.06 kB
87
- dist/assets/bcf-Ba2CjHib.js  37.74 kB │ gzip: 11.37 kB
86
+ dist/assets/server-client-BLcKaWQB.js  31.43 kB │ gzip: 7.06 kB
87
+ dist/assets/bcf-B9SFl84i.js  37.74 kB │ gzip: 11.37 kB
88
88
  dist/assets/browser-DXS29_v9.js  70.26 kB │ gzip: 19.95 kB
89
89
  dist/assets/drawing-2d-C71b8Ugx.js  71.89 kB │ gzip: 21.08 kB
90
- dist/assets/zstd-DA4VQ-ji.js  81.19 kB │ gzip: 32.35 kB
90
+ dist/assets/zstd-BDToOQyD.js  81.19 kB │ gzip: 32.35 kB
91
91
  dist/assets/zip-BJqVbRkU.js  96.95 kB │ gzip: 29.94 kB
92
- dist/assets/lerc-DmzRHXn3.js  97.20 kB │ gzip: 37.62 kB
93
- dist/assets/ids-XwxE1tK3.js  164.18 kB │ gzip: 29.22 kB
92
+ dist/assets/lerc-IN4uWojP.js  97.20 kB │ gzip: 37.62 kB
93
+ dist/assets/ids-DZLs0snJ.js  164.18 kB │ gzip: 29.22 kB
94
94
  dist/assets/arrow-CXWhTnNT.js  208.86 kB │ gzip: 50.09 kB
95
- dist/assets/exporters-Bf6PTtdW.js  232.32 kB │ gzip: 40.83 kB
96
- dist/assets/geotiff-BN4J8Vt9.js  366.67 kB │ gzip: 118.40 kB
95
+ dist/assets/exporters-D-BvrNIg.js  233.91 kB │ gzip: 41.19 kB
96
+ dist/assets/geotiff-D1tvcDCb.js  366.67 kB │ gzip: 118.41 kB
97
97
  dist/assets/three-CQBzFWY2.js  534.00 kB │ gzip: 133.77 kB
98
98
  dist/assets/maplibre-gl-Do6O5tDc.js  1,053.34 kB │ gzip: 284.74 kB
99
99
  dist/assets/epsg-index.generated-BjJrt_0S.js  4,295.95 kB │ gzip: 440.44 kB
100
100
  dist/assets/cesium-BoVuJvTC.js  4,778.78 kB │ gzip: 1,320.18 kB
101
- dist/assets/index-j2x5R7fb.js  6,745.02 kB │ gzip: 1,218.55 kB
102
- dist/assets/sandbox-Bju6ZKJK.js  8,485.01 kB │ gzip: 512.35 kB
101
+ dist/assets/index-CXSBhkcJ.js  6,764.49 kB │ gzip: 1,220.09 kB
102
+ dist/assets/sandbox-VLI_y7cl.js  8,485.01 kB │ gzip: 512.34 kB
103
103
  
104
104
  (!) Some chunks are larger than 6000 kB after minification. Consider:
105
105
  - Using dynamic import() to code-split the application
106
106
  - Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks
107
107
  - Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.
108
- ✓ built in 1m 18s
108
+ ✓ built in 1m 16s
package/CHANGELOG.md CHANGED
@@ -1,5 +1,55 @@
1
1
  # @ifc-lite/viewer
2
2
 
3
+ ## 1.23.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#688](https://github.com/LTplus-AG/ifc-lite/pull/688) [`d0ba541`](https://github.com/LTplus-AG/ifc-lite/commit/d0ba541dda3936b985c2189fbca4300cbb89df91) Thanks [@louistrue](https://github.com/louistrue)! - Add GLB export dialog with colour-source selection and visibility
8
+ filtering (PR [#688](https://github.com/LTplus-AG/ifc-lite/issues/688)).
9
+
10
+ The new `GLBExportDialog` in the viewer replaces the inline GLB
11
+ export handler in `MainToolbar` with a dedicated dialog. Features:
12
+
13
+ - **Model picker** for federated multi-model scenes.
14
+ - **Colour source** selector: "Rendering" (the apparent display
15
+ colour — `IfcSurfaceStyleRendering.DiffuseColour` if authored,
16
+ falling back to `IfcSurfaceStyleShading.SurfaceColour`) or
17
+ "Shading" (the raw `SurfaceColour`, only available when the file
18
+ authored a distinct `DiffuseColour`).
19
+ - **Visible-only filter** that respects the viewer's hidden /
20
+ isolated entity sets. Mesh-vs-set comparison runs in global ID
21
+ space so federated models with non-zero `idOffset` filter
22
+ correctly.
23
+ - **Metadata inclusion** toggle for IFC GlobalId / type / name
24
+ side-tables.
25
+
26
+ Pipeline changes underneath:
27
+
28
+ - `MeshData` / `MeshDataJs` carry an optional `shadingColor`
29
+ alongside `color`. The Rust styling module now extracts both
30
+ `IfcSurfaceStyleRendering.DiffuseColour` (rendering) and
31
+ `IfcSurfaceStyleShading.SurfaceColour` (shading) in a single
32
+ pre-pass and returns them as separate maps; `shadingColor` is
33
+ only populated when it actually differs from the rendering
34
+ colour, so memory cost stays sparse on the common case.
35
+ - The streaming geometry path
36
+ (`convertMeshCollectionToBatch`) and the worker collector
37
+ (`IfcLiteMeshCollector`) both copy `shadingColor` end-to-end so
38
+ the dialog's "Shading" source works on every load path, not just
39
+ the batch path.
40
+ - `GLTFExporter` gains `colorSource`, `visibleOnly`,
41
+ `hiddenEntityIds`, and `isolatedEntityIds` options. Visibility
42
+ filtering compares mesh `expressId` (global) against the dialog-
43
+ supplied sets (also global) — no offset arithmetic in the
44
+ exporter.
45
+
46
+ ### Patch Changes
47
+
48
+ - Updated dependencies [[`b0b19ad`](https://github.com/LTplus-AG/ifc-lite/commit/b0b19ad2ea205813e599cac02c964ecdb315c6b5), [`b0b19ad`](https://github.com/LTplus-AG/ifc-lite/commit/b0b19ad2ea205813e599cac02c964ecdb315c6b5), [`d0ba541`](https://github.com/LTplus-AG/ifc-lite/commit/d0ba541dda3936b985c2189fbca4300cbb89df91)]:
49
+ - @ifc-lite/wasm@1.18.0
50
+ - @ifc-lite/export@1.19.0
51
+ - @ifc-lite/geometry@1.19.0
52
+
3
53
  ## 1.22.1
4
54
 
5
55
  ### Patch Changes
@@ -1,13 +1,13 @@
1
- import { u as o, __tla as __tla_0 } from "./index-j2x5R7fb.js";
1
+ import { u as o, __tla as __tla_0 } from "./index-CXSBhkcJ.js";
2
2
  import "./zip-BJqVbRkU.js";
3
3
  import "./arrow-CXWhTnNT.js";
4
- import { __tla as __tla_1 } from "./sandbox-Bju6ZKJK.js";
4
+ import { __tla as __tla_1 } from "./sandbox-VLI_y7cl.js";
5
5
  import "./lens-CpjUdqpw.js";
6
- import { __tla as __tla_2 } from "./exporters-Bf6PTtdW.js";
6
+ import { __tla as __tla_2 } from "./exporters-D-BvrNIg.js";
7
7
  import "./drawing-2d-C71b8Ugx.js";
8
- import "./bcf-Ba2CjHib.js";
9
- import { __tla as __tla_3 } from "./server-client-B8wi3CGx.js";
10
- import { __tla as __tla_4 } from "./ids-XwxE1tK3.js";
8
+ import "./bcf-B9SFl84i.js";
9
+ import { __tla as __tla_3 } from "./server-client-BLcKaWQB.js";
10
+ import { __tla as __tla_4 } from "./ids-DZLs0snJ.js";
11
11
  import "./three-CQBzFWY2.js";
12
12
  let v;
13
13
  let __tla = Promise.all([
@@ -1,4 +1,4 @@
1
- import{J as X}from"./zip-BJqVbRkU.js";import{ae as C}from"./sandbox-Bju6ZKJK.js";async function te(t){const e=await X.loadAsync(t),i=await Q(e),{projectId:o,name:n,extensions:s}=await tt(e),c=await et(e);return{version:i.versionId,projectId:o,name:n,topics:c,extensions:s}}async function Q(t){const e=t.file("bcf.version");if(!e)throw new Error("Invalid BCF file: missing bcf.version");const o=(await e.async("string")).match(/VersionId="([^"]+)"/);if(!o)throw new Error("Invalid BCF version file: could not parse VersionId");const n=o[1];return n!=="2.1"&&n!=="3.0"&&console.warn(`Unsupported BCF version: ${n}, treating as 2.1`),{versionId:n==="3.0"?"3.0":"2.1",detailedVersion:o[1]}}async function tt(t){const e=t.file("project.bcfp");if(!e)return{};const i=await e.async("string"),o=i.match(/ProjectId="([^"]+)"/),n=i.match(/<Name>([^<]+)<\/Name>/);return{projectId:o?.[1],name:n?.[1]}}async function et(t){const e=new Map,i=new Set;t.forEach(o=>{const n=o.match(/^([^/]+)\/markup\.bcf$/i);n&&i.add(n[1])});for(const o of i)try{const n=await it(t,o);n&&e.set(n.guid,n)}catch(n){console.warn(`Failed to parse topic ${o}:`,n)}return e}async function it(t,e){const i=t.file(`${e}/markup.bcf`);if(!i)return null;const o=await i.async("string"),n=o.match(/<Topic\s+Guid="([^"]+)"[^>]*>([\s\S]*?)<\/Topic>/);if(!n)return console.warn(`Invalid markup.bcf in ${e}: missing Topic element`),null;const s=n[1],c=n[2],r=o.match(/<Topic[^>]*TopicType="([^"]+)"/),a=o.match(/<Topic[^>]*TopicStatus="([^"]+)"/),l=h(c,"Title")||"Untitled",p=h(c,"Description"),f=h(c,"Priority"),m=h(c,"Index"),u=h(c,"CreationDate")||new Date().toISOString(),g=h(c,"CreationAuthor")||"Unknown",d=h(c,"ModifiedDate"),x=h(c,"ModifiedAuthor"),w=h(c,"DueDate"),b=h(c,"AssignedTo"),v=h(c,"Stage"),T=[],q=c.matchAll(/<Labels>([^<]+)<\/Labels>/g);for(const A of q)T.push(A[1]);const H=ot(c),O=nt(c),z=[],W=c.matchAll(/<RelatedTopic\s+Guid="([^"]+)"/g);for(const A of W)z.push(A[1]);const J=st(o),K=await ct(t,e,o);return{guid:s,title:l,description:p,topicType:r?.[1],topicStatus:a?.[1],priority:f,index:m?parseInt(m,10):void 0,creationDate:u,creationAuthor:g,modifiedDate:d,modifiedAuthor:x,dueDate:w,assignedTo:b,stage:v,labels:T.length>0?T:void 0,bimSnippet:H,documentReferences:O.length>0?O:void 0,relatedTopics:z.length>0?z:void 0,comments:J,viewpoints:K}}function h(t,e){return t.match(new RegExp(`<${e}>([^<]*)<\\/${e}>`))?.[1]}function ot(t){const e=t.match(/<BimSnippet\s+SnippetType="([^"]+)"[^>]*>([\s\S]*?)<\/BimSnippet>/);if(!e)return;const i=e[0].match(/isExternal="([^"]+)"/),o=h(e[2],"Reference"),n=h(e[2],"ReferenceSchema");return{snippetType:e[1],isExternal:i?.[1]==="true",reference:o||"",referenceSchema:n}}function nt(t){const e=[],i=t.matchAll(/<DocumentReference[^>]*>([\s\S]*?)<\/DocumentReference>/g);for(const o of i){const n=o[0].match(/Guid="([^"]+)"/),s=o[0].match(/isExternal="([^"]+)"/),c=h(o[1],"ReferencedDocument"),r=h(o[1],"Description");c&&e.push({guid:n?.[1],isExternal:s?.[1]==="true",referencedDocument:c,description:r})}return e}function st(t){const e=[],i=t.matchAll(/<Comment\s+Guid="([^"]+)"[^>]*>([\s\S]*?)<\/Comment>/g);for(const o of i){const n=o[1],s=o[2],c=h(s,"Date")||new Date().toISOString(),r=h(s,"Author")||"Unknown",a=h(s,"Comment")||"",l=h(s,"ModifiedDate"),p=h(s,"ModifiedAuthor"),f=s.match(/<Viewpoint\s+Guid="([^"]+)"/);e.push({guid:n,date:c,author:r,comment:a,viewpointGuid:f?.[1],modifiedDate:l,modifiedAuthor:p})}return e}async function ct(t,e,i){const o=[],n=new Map,s=/<Viewpoint\s+Guid="([^"]+)"[^>]*>([\s\S]*?)<\/Viewpoint>/g;for(const a of i.matchAll(s)){const l=a[1],p=a[2],f=p.match(/<Viewpoint>([^<]+)<\/Viewpoint>/),m=p.match(/<Snapshot>([^<]+)<\/Snapshot>/);n.set(l,{viewpointFile:f?.[1],snapshotFile:m?.[1]})}const c=i.matchAll(/<Viewpoint\s+Guid="([^"]+)"[^>]*\/>/g);for(const a of c)n.has(a[1])||n.set(a[1],{});const r=[];t.forEach(a=>{a.startsWith(`${e}/`)&&a.endsWith(".bcfv")&&r.push(a)});for(const a of r)try{const l=t.file(a);if(!l)continue;const p=await l.async("string"),f=at(p);if(f){const m=n.get(f.guid);let u=null,g="png";if(m?.snapshotFile){const d=`${e}/${m.snapshotFile}`;u=t.file(d),(m.snapshotFile.toLowerCase().endsWith(".jpg")||m.snapshotFile.toLowerCase().endsWith(".jpeg"))&&(g="jpeg")}if(!u){const d=a.replace(".bcfv",""),x=d.replace(/Viewpoint_/i,"Snapshot_"),w=d.replace(/_viewpoint$/i,"_snapshot"),b=[`${x}.png`,`${w}.png`,`${d}.png`,`${e}/snapshot.png`,`${x}.jpg`,`${w}.jpg`,`${d}.jpg`,`${e}/snapshot.jpg`];for(const v of b)if(u=t.file(v),u){(v.toLowerCase().endsWith(".jpg")||v.toLowerCase().endsWith(".jpeg"))&&(g="jpeg");break}}if(u){const d=await u.async("uint8array");f.snapshotData=d,f.snapshot=`data:image/${g};base64,${j(d)}`}o.push(f)}}catch(l){console.warn(`Failed to parse viewpoint ${a}:`,l)}if(o.length===0){const a=t.file(`${e}/snapshot.png`)||t.file(`${e}/snapshot.jpg`);if(a){const l=a.name.toLowerCase().endsWith(".jpg"),p=await a.async("uint8array");o.push({guid:e,snapshot:`data:image/${l?"jpeg":"png"};base64,${j(p)}`,snapshotData:p})}}return o}function at(t){const i=t.match(/<VisualizationInfo[^>]+Guid="([^"]+)"/)?.[1]||crypto.randomUUID?.()||`vp-${Date.now()}`,o=rt(t),n=lt(t),s=pt(t),c=mt(t),r=dt(t),a=ht(t);return{guid:i,perspectiveCamera:o,orthogonalCamera:n,components:s,lines:c.length>0?c:void 0,clippingPlanes:r.length>0?r:void 0,bitmaps:a.length>0?a:void 0}}function rt(t){const e=t.match(/<PerspectiveCamera>([\s\S]*?)<\/PerspectiveCamera>/);if(!e)return;const i=e[1],o=V(i,"CameraViewPoint"),n=P(i,"CameraDirection"),s=P(i,"CameraUpVector"),c=h(i,"FieldOfView");if(!(!o||!n||!s||!c))return{cameraViewPoint:o,cameraDirection:n,cameraUpVector:s,fieldOfView:parseFloat(c)}}function lt(t){const e=t.match(/<OrthogonalCamera>([\s\S]*?)<\/OrthogonalCamera>/);if(!e)return;const i=e[1],o=V(i,"CameraViewPoint"),n=P(i,"CameraDirection"),s=P(i,"CameraUpVector"),c=h(i,"ViewToWorldScale");if(!(!o||!n||!s||!c))return{cameraViewPoint:o,cameraDirection:n,cameraUpVector:s,viewToWorldScale:parseFloat(c)}}function V(t,e){const i=t.match(new RegExp(`<${e}>([\\s\\S]*?)<\\/${e}>`));if(!i)return;const o=h(i[1],"X"),n=h(i[1],"Y"),s=h(i[1],"Z");if(!(o===void 0||n===void 0||s===void 0))return{x:parseFloat(o),y:parseFloat(n),z:parseFloat(s)}}function P(t,e){return V(t,e)}function pt(t){const e=t.match(/<Components>([\s\S]*?)<\/Components>/);if(!e)return;const i=e[1],o=B(i,"Selection"),n=ft(i),s=ut(i);if(!(!o&&!n&&!s))return{selection:o?.length?o:void 0,visibility:n,coloring:s?.length?s:void 0}}function B(t,e){const i=t.match(new RegExp(`<${e}>([\\s\\S]*?)<\\/${e}>`));if(!i)return;const o=[],n=i[1].matchAll(/<Component[^>]*(?:\/>|>[\s\S]*?<\/Component>)/g);for(const s of n){const c=Y(s[0]);c&&o.push(c)}return o.length>0?o:void 0}function Y(t){const e=t.match(/IfcGuid="([^"]+)"/),i=t.match(/AuthoringToolId="([^"]+)"/),o=t.match(/OriginatingSystem="([^"]+)"/);if(!(!e&&!i))return{ifcGuid:e?.[1],authoringToolId:i?.[1],originatingSystem:o?.[1]}}function ft(t){const e=t.match(/<Visibility[^>]*>([\s\S]*?)<\/Visibility>/);if(!e)return;const o=t.match(/DefaultVisibility="([^"]+)"/)?.[1]!=="false",n=B(e[1],"Exceptions");return{defaultVisibility:o,exceptions:n}}function ut(t){const e=t.match(/<Coloring>([\s\S]*?)<\/Coloring>/);if(!e)return;const i=[],o=e[1].matchAll(/<Color\s+Color="([^"]+)"[^>]*>([\s\S]*?)<\/Color>/g);for(const n of o){const s=n[1],c=[],r=n[2].matchAll(/<Component[^>]*(?:\/>|>[\s\S]*?<\/Component>)/g);for(const a of r){const l=Y(a[0]);l&&c.push(l)}c.length>0&&i.push({color:s,components:c})}return i.length>0?i:void 0}function mt(t){const e=[],i=t.match(/<Lines>([\s\S]*?)<\/Lines>/);if(!i)return e;const o=i[1].matchAll(/<Line>([\s\S]*?)<\/Line>/g);for(const n of o){const s=V(n[1],"StartPoint"),c=V(n[1],"EndPoint");s&&c&&e.push({startPoint:s,endPoint:c})}return e}function dt(t){const e=[],i=t.match(/<ClippingPlanes>([\s\S]*?)<\/ClippingPlanes>/);if(!i)return e;const o=i[1].matchAll(/<ClippingPlane>([\s\S]*?)<\/ClippingPlane>/g);for(const n of o){const s=V(n[1],"Location"),c=P(n[1],"Direction");s&&c&&e.push({location:s,direction:c})}return e}function ht(t){const e=[],i=t.match(/<Bitmaps>([\s\S]*?)<\/Bitmaps>/);if(!i)return e;const o=i[1].matchAll(/<Bitmap>([\s\S]*?)<\/Bitmap>/g);for(const n of o){const s=h(n[1],"Format")||h(n[1],"Bitmap"),c=h(n[1],"Reference"),r=V(n[1],"Location"),a=P(n[1],"Normal"),l=P(n[1],"Up"),p=h(n[1],"Height");s&&c&&r&&a&&l&&p&&e.push({format:s.toUpperCase()==="JPG"?"JPG":"PNG",reference:c,location:r,normal:a,up:l,height:parseFloat(p)})}return e}function j(t){let e="";for(let i=0;i<t.length;i++)e+=String.fromCharCode(t[i]);return btoa(e)}async function ee(t){const e=new X;gt(e,t.version),(t.projectId||t.name)&&yt(e,t);for(const[i,o]of t.topics)await xt(e,o);return e.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}})}function gt(t,e){const i=`<?xml version="1.0" encoding="UTF-8"?>
1
+ import{J as X}from"./zip-BJqVbRkU.js";import{ae as C}from"./sandbox-VLI_y7cl.js";async function te(t){const e=await X.loadAsync(t),i=await Q(e),{projectId:o,name:n,extensions:s}=await tt(e),c=await et(e);return{version:i.versionId,projectId:o,name:n,topics:c,extensions:s}}async function Q(t){const e=t.file("bcf.version");if(!e)throw new Error("Invalid BCF file: missing bcf.version");const o=(await e.async("string")).match(/VersionId="([^"]+)"/);if(!o)throw new Error("Invalid BCF version file: could not parse VersionId");const n=o[1];return n!=="2.1"&&n!=="3.0"&&console.warn(`Unsupported BCF version: ${n}, treating as 2.1`),{versionId:n==="3.0"?"3.0":"2.1",detailedVersion:o[1]}}async function tt(t){const e=t.file("project.bcfp");if(!e)return{};const i=await e.async("string"),o=i.match(/ProjectId="([^"]+)"/),n=i.match(/<Name>([^<]+)<\/Name>/);return{projectId:o?.[1],name:n?.[1]}}async function et(t){const e=new Map,i=new Set;t.forEach(o=>{const n=o.match(/^([^/]+)\/markup\.bcf$/i);n&&i.add(n[1])});for(const o of i)try{const n=await it(t,o);n&&e.set(n.guid,n)}catch(n){console.warn(`Failed to parse topic ${o}:`,n)}return e}async function it(t,e){const i=t.file(`${e}/markup.bcf`);if(!i)return null;const o=await i.async("string"),n=o.match(/<Topic\s+Guid="([^"]+)"[^>]*>([\s\S]*?)<\/Topic>/);if(!n)return console.warn(`Invalid markup.bcf in ${e}: missing Topic element`),null;const s=n[1],c=n[2],r=o.match(/<Topic[^>]*TopicType="([^"]+)"/),a=o.match(/<Topic[^>]*TopicStatus="([^"]+)"/),l=h(c,"Title")||"Untitled",p=h(c,"Description"),f=h(c,"Priority"),m=h(c,"Index"),u=h(c,"CreationDate")||new Date().toISOString(),g=h(c,"CreationAuthor")||"Unknown",d=h(c,"ModifiedDate"),x=h(c,"ModifiedAuthor"),w=h(c,"DueDate"),b=h(c,"AssignedTo"),v=h(c,"Stage"),T=[],q=c.matchAll(/<Labels>([^<]+)<\/Labels>/g);for(const A of q)T.push(A[1]);const H=ot(c),O=nt(c),z=[],W=c.matchAll(/<RelatedTopic\s+Guid="([^"]+)"/g);for(const A of W)z.push(A[1]);const J=st(o),K=await ct(t,e,o);return{guid:s,title:l,description:p,topicType:r?.[1],topicStatus:a?.[1],priority:f,index:m?parseInt(m,10):void 0,creationDate:u,creationAuthor:g,modifiedDate:d,modifiedAuthor:x,dueDate:w,assignedTo:b,stage:v,labels:T.length>0?T:void 0,bimSnippet:H,documentReferences:O.length>0?O:void 0,relatedTopics:z.length>0?z:void 0,comments:J,viewpoints:K}}function h(t,e){return t.match(new RegExp(`<${e}>([^<]*)<\\/${e}>`))?.[1]}function ot(t){const e=t.match(/<BimSnippet\s+SnippetType="([^"]+)"[^>]*>([\s\S]*?)<\/BimSnippet>/);if(!e)return;const i=e[0].match(/isExternal="([^"]+)"/),o=h(e[2],"Reference"),n=h(e[2],"ReferenceSchema");return{snippetType:e[1],isExternal:i?.[1]==="true",reference:o||"",referenceSchema:n}}function nt(t){const e=[],i=t.matchAll(/<DocumentReference[^>]*>([\s\S]*?)<\/DocumentReference>/g);for(const o of i){const n=o[0].match(/Guid="([^"]+)"/),s=o[0].match(/isExternal="([^"]+)"/),c=h(o[1],"ReferencedDocument"),r=h(o[1],"Description");c&&e.push({guid:n?.[1],isExternal:s?.[1]==="true",referencedDocument:c,description:r})}return e}function st(t){const e=[],i=t.matchAll(/<Comment\s+Guid="([^"]+)"[^>]*>([\s\S]*?)<\/Comment>/g);for(const o of i){const n=o[1],s=o[2],c=h(s,"Date")||new Date().toISOString(),r=h(s,"Author")||"Unknown",a=h(s,"Comment")||"",l=h(s,"ModifiedDate"),p=h(s,"ModifiedAuthor"),f=s.match(/<Viewpoint\s+Guid="([^"]+)"/);e.push({guid:n,date:c,author:r,comment:a,viewpointGuid:f?.[1],modifiedDate:l,modifiedAuthor:p})}return e}async function ct(t,e,i){const o=[],n=new Map,s=/<Viewpoint\s+Guid="([^"]+)"[^>]*>([\s\S]*?)<\/Viewpoint>/g;for(const a of i.matchAll(s)){const l=a[1],p=a[2],f=p.match(/<Viewpoint>([^<]+)<\/Viewpoint>/),m=p.match(/<Snapshot>([^<]+)<\/Snapshot>/);n.set(l,{viewpointFile:f?.[1],snapshotFile:m?.[1]})}const c=i.matchAll(/<Viewpoint\s+Guid="([^"]+)"[^>]*\/>/g);for(const a of c)n.has(a[1])||n.set(a[1],{});const r=[];t.forEach(a=>{a.startsWith(`${e}/`)&&a.endsWith(".bcfv")&&r.push(a)});for(const a of r)try{const l=t.file(a);if(!l)continue;const p=await l.async("string"),f=at(p);if(f){const m=n.get(f.guid);let u=null,g="png";if(m?.snapshotFile){const d=`${e}/${m.snapshotFile}`;u=t.file(d),(m.snapshotFile.toLowerCase().endsWith(".jpg")||m.snapshotFile.toLowerCase().endsWith(".jpeg"))&&(g="jpeg")}if(!u){const d=a.replace(".bcfv",""),x=d.replace(/Viewpoint_/i,"Snapshot_"),w=d.replace(/_viewpoint$/i,"_snapshot"),b=[`${x}.png`,`${w}.png`,`${d}.png`,`${e}/snapshot.png`,`${x}.jpg`,`${w}.jpg`,`${d}.jpg`,`${e}/snapshot.jpg`];for(const v of b)if(u=t.file(v),u){(v.toLowerCase().endsWith(".jpg")||v.toLowerCase().endsWith(".jpeg"))&&(g="jpeg");break}}if(u){const d=await u.async("uint8array");f.snapshotData=d,f.snapshot=`data:image/${g};base64,${j(d)}`}o.push(f)}}catch(l){console.warn(`Failed to parse viewpoint ${a}:`,l)}if(o.length===0){const a=t.file(`${e}/snapshot.png`)||t.file(`${e}/snapshot.jpg`);if(a){const l=a.name.toLowerCase().endsWith(".jpg"),p=await a.async("uint8array");o.push({guid:e,snapshot:`data:image/${l?"jpeg":"png"};base64,${j(p)}`,snapshotData:p})}}return o}function at(t){const i=t.match(/<VisualizationInfo[^>]+Guid="([^"]+)"/)?.[1]||crypto.randomUUID?.()||`vp-${Date.now()}`,o=rt(t),n=lt(t),s=pt(t),c=mt(t),r=dt(t),a=ht(t);return{guid:i,perspectiveCamera:o,orthogonalCamera:n,components:s,lines:c.length>0?c:void 0,clippingPlanes:r.length>0?r:void 0,bitmaps:a.length>0?a:void 0}}function rt(t){const e=t.match(/<PerspectiveCamera>([\s\S]*?)<\/PerspectiveCamera>/);if(!e)return;const i=e[1],o=V(i,"CameraViewPoint"),n=P(i,"CameraDirection"),s=P(i,"CameraUpVector"),c=h(i,"FieldOfView");if(!(!o||!n||!s||!c))return{cameraViewPoint:o,cameraDirection:n,cameraUpVector:s,fieldOfView:parseFloat(c)}}function lt(t){const e=t.match(/<OrthogonalCamera>([\s\S]*?)<\/OrthogonalCamera>/);if(!e)return;const i=e[1],o=V(i,"CameraViewPoint"),n=P(i,"CameraDirection"),s=P(i,"CameraUpVector"),c=h(i,"ViewToWorldScale");if(!(!o||!n||!s||!c))return{cameraViewPoint:o,cameraDirection:n,cameraUpVector:s,viewToWorldScale:parseFloat(c)}}function V(t,e){const i=t.match(new RegExp(`<${e}>([\\s\\S]*?)<\\/${e}>`));if(!i)return;const o=h(i[1],"X"),n=h(i[1],"Y"),s=h(i[1],"Z");if(!(o===void 0||n===void 0||s===void 0))return{x:parseFloat(o),y:parseFloat(n),z:parseFloat(s)}}function P(t,e){return V(t,e)}function pt(t){const e=t.match(/<Components>([\s\S]*?)<\/Components>/);if(!e)return;const i=e[1],o=B(i,"Selection"),n=ft(i),s=ut(i);if(!(!o&&!n&&!s))return{selection:o?.length?o:void 0,visibility:n,coloring:s?.length?s:void 0}}function B(t,e){const i=t.match(new RegExp(`<${e}>([\\s\\S]*?)<\\/${e}>`));if(!i)return;const o=[],n=i[1].matchAll(/<Component[^>]*(?:\/>|>[\s\S]*?<\/Component>)/g);for(const s of n){const c=Y(s[0]);c&&o.push(c)}return o.length>0?o:void 0}function Y(t){const e=t.match(/IfcGuid="([^"]+)"/),i=t.match(/AuthoringToolId="([^"]+)"/),o=t.match(/OriginatingSystem="([^"]+)"/);if(!(!e&&!i))return{ifcGuid:e?.[1],authoringToolId:i?.[1],originatingSystem:o?.[1]}}function ft(t){const e=t.match(/<Visibility[^>]*>([\s\S]*?)<\/Visibility>/);if(!e)return;const o=t.match(/DefaultVisibility="([^"]+)"/)?.[1]!=="false",n=B(e[1],"Exceptions");return{defaultVisibility:o,exceptions:n}}function ut(t){const e=t.match(/<Coloring>([\s\S]*?)<\/Coloring>/);if(!e)return;const i=[],o=e[1].matchAll(/<Color\s+Color="([^"]+)"[^>]*>([\s\S]*?)<\/Color>/g);for(const n of o){const s=n[1],c=[],r=n[2].matchAll(/<Component[^>]*(?:\/>|>[\s\S]*?<\/Component>)/g);for(const a of r){const l=Y(a[0]);l&&c.push(l)}c.length>0&&i.push({color:s,components:c})}return i.length>0?i:void 0}function mt(t){const e=[],i=t.match(/<Lines>([\s\S]*?)<\/Lines>/);if(!i)return e;const o=i[1].matchAll(/<Line>([\s\S]*?)<\/Line>/g);for(const n of o){const s=V(n[1],"StartPoint"),c=V(n[1],"EndPoint");s&&c&&e.push({startPoint:s,endPoint:c})}return e}function dt(t){const e=[],i=t.match(/<ClippingPlanes>([\s\S]*?)<\/ClippingPlanes>/);if(!i)return e;const o=i[1].matchAll(/<ClippingPlane>([\s\S]*?)<\/ClippingPlane>/g);for(const n of o){const s=V(n[1],"Location"),c=P(n[1],"Direction");s&&c&&e.push({location:s,direction:c})}return e}function ht(t){const e=[],i=t.match(/<Bitmaps>([\s\S]*?)<\/Bitmaps>/);if(!i)return e;const o=i[1].matchAll(/<Bitmap>([\s\S]*?)<\/Bitmap>/g);for(const n of o){const s=h(n[1],"Format")||h(n[1],"Bitmap"),c=h(n[1],"Reference"),r=V(n[1],"Location"),a=P(n[1],"Normal"),l=P(n[1],"Up"),p=h(n[1],"Height");s&&c&&r&&a&&l&&p&&e.push({format:s.toUpperCase()==="JPG"?"JPG":"PNG",reference:c,location:r,normal:a,up:l,height:parseFloat(p)})}return e}function j(t){let e="";for(let i=0;i<t.length;i++)e+=String.fromCharCode(t[i]);return btoa(e)}async function ee(t){const e=new X;gt(e,t.version),(t.projectId||t.name)&&yt(e,t);for(const[i,o]of t.topics)await xt(e,o);return e.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}})}function gt(t,e){const i=`<?xml version="1.0" encoding="UTF-8"?>
2
2
  <Version xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" VersionId="${e}">
3
3
  <DetailedVersion>${e}</DetailedVersion>
4
4
  </Version>`;t.file("bcf.version",i)}function yt(t,e){const i=e.projectId||C(),o=e.name?`
@@ -1 +1 @@
1
- import{i as r}from"./pako.esm-Cram60i4.js";import{B as o}from"./geotiff-BN4J8Vt9.js";import"./sandbox-Bju6ZKJK.js";import"./lens-CpjUdqpw.js";import"./__vite-browser-external-B1O5LaIO.js";class d extends o{decodeBlock(e){return r(new Uint8Array(e)).buffer}}export{d as default};
1
+ import{i as r}from"./pako.esm-Cram60i4.js";import{B as o}from"./geotiff-D1tvcDCb.js";import"./sandbox-VLI_y7cl.js";import"./lens-CpjUdqpw.js";import"./__vite-browser-external-B1O5LaIO.js";class d extends o{decodeBlock(e){return r(new Uint8Array(e)).buffer}}export{d as default};