@ifc-lite/viewer 1.26.0 → 1.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +45 -38
- package/CHANGELOG.md +93 -0
- package/dist/assets/{basketViewActivator-ZpTYWE3K.js → basketViewActivator-BNRDNuUJ.js} +9 -9
- package/dist/assets/{bcf-Ctcu_Sc2.js → bcf-DCwCuP7n.js} +56 -56
- package/dist/assets/{browser-DXS29_v9.js → browser-BIoDDfBW.js} +1 -1
- package/dist/assets/{cesium-BoVuJvTC.js → cesium-CzZn5yVA.js} +319 -319
- package/dist/assets/{decode-worker-CgM1iNSK.js → decode-worker-Cjign7Zh.js} +1 -1
- package/dist/assets/deflate-DNGgs8Ur.js +1 -0
- package/dist/assets/drawing-2d-D0dDf6Lh.js +257 -0
- package/dist/assets/e57-source-2wI9jkCA.js +1 -0
- package/dist/assets/exceljs.min-DsuzKYnj.js +29 -0
- package/dist/assets/{exporters-DSq76AVM.js → exporters-B9v81gi9.js} +1861 -1524
- package/dist/assets/geometry.worker-Bpa3115V.js +1 -0
- package/dist/assets/{geotiff-A5UjhI6L.js → geotiff-D-YCLS4g.js} +10 -10
- package/dist/assets/html2canvas.esm-Ge7aVWlp.js +5 -0
- package/dist/assets/{ids-DiLcGTer.js → ids-CCpq-5d3.js} +952 -945
- package/dist/assets/ifc-lite_bg-DbgS5EUA.wasm +0 -0
- package/dist/assets/{index-BAH8IJVR.js → index-Bgb3_Pu_.js} +47682 -42474
- package/dist/assets/index-BtbXFKsX.css +1 -0
- package/dist/assets/index.es-CWfqZyyr.js +6866 -0
- package/dist/assets/{jpeg-BzSkwo5D.js → jpeg-DGOAeUqU.js} +1 -1
- package/dist/assets/jspdf.es.min-XPLU2Wkq.js +19571 -0
- package/dist/assets/jspdf.plugin.autotable-BBLUVd7n.js +2 -0
- package/dist/assets/lens-C4p1kQ0p.js +1 -0
- package/dist/assets/{lerc-Cg2Rz-D5.js → lerc-1PMSCHwX.js} +1 -1
- package/dist/assets/{lzw-BBPPLW-0.js → lzw-C65U9lNM.js} +1 -1
- package/dist/assets/{maplibre-gl-Do6O5tDc.js → maplibre-gl-BF3Z0idw.js} +1 -1
- package/dist/assets/{native-bridge-CPojOeGE.js → native-bridge-XxXos6yI.js} +2 -2
- package/dist/assets/{packbits-yLSpjW-V.js → packbits-BdMWXC3m.js} +1 -1
- package/dist/assets/{pako.esm-Cram60i4.js → pako.esm-n3Pgozwg.js} +1 -1
- package/dist/assets/parser.worker-Ddwo3_06.js +182 -0
- package/dist/assets/pdf-CRwaZf3s.js +135 -0
- package/dist/assets/raw-CJgQdyuZ.js +1 -0
- package/dist/assets/{sandbox-CsRXlgCO.js → sandbox-0sDo3g3m.js} +3037 -2554
- package/dist/assets/server-client-cTCJ-853.js +719 -0
- package/dist/assets/{webimage-YafxjjGr.js → webimage-BtakWX7W.js} +1 -1
- package/dist/assets/xlsx-B1YOg2QB.js +142 -0
- package/dist/assets/{zip-BJqVbRkU.js → zip-DFgP-l20.js} +1 -1
- package/dist/assets/{zstd-CkSLOiuu.js → zstd-CmwsbxmM.js} +1 -1
- package/dist/index.html +10 -10
- package/package.json +27 -23
- package/src/components/mcp/PlaygroundChat.tsx +1 -0
- package/src/components/mcp/data.ts +6 -0
- package/src/components/mcp/playground-dispatcher.ts +280 -0
- package/src/components/mcp/playground-files.ts +33 -1
- package/src/components/mcp/types.ts +2 -1
- package/src/components/ui/combo-input.tsx +163 -0
- package/src/components/ui/tabs.tsx +1 -1
- package/src/components/viewer/CommandPalette.tsx +6 -1
- package/src/components/viewer/ComparePanel.tsx +420 -0
- package/src/components/viewer/HierarchyPanel.tsx +46 -7
- package/src/components/viewer/MainToolbar.tsx +19 -2
- package/src/components/viewer/PropertiesPanel.tsx +84 -8
- package/src/components/viewer/SearchInline.tsx +62 -2
- package/src/components/viewer/SearchModal.filter.builder.tsx +24 -393
- package/src/components/viewer/SearchModal.filter.editors.tsx +503 -0
- package/src/components/viewer/SearchModal.filter.tsx +64 -1
- package/src/components/viewer/SearchModal.tsx +19 -6
- package/src/components/viewer/ViewerLayout.tsx +5 -0
- package/src/components/viewer/Viewport.tsx +18 -0
- package/src/components/viewer/hierarchy/HierarchyNode.tsx +3 -3
- package/src/components/viewer/hierarchy/ifc-icons.ts +9 -0
- package/src/components/viewer/hierarchy/treeDataBuilder.ts +87 -0
- package/src/components/viewer/hierarchy/types.ts +1 -0
- package/src/components/viewer/hierarchy/useHierarchyTree.ts +6 -2
- package/src/components/viewer/lists/ColumnHeaderMenu.tsx +84 -0
- package/src/components/viewer/lists/ListBuilder.tsx +789 -280
- package/src/components/viewer/lists/ListGroupingBar.tsx +72 -0
- package/src/components/viewer/lists/ListPanel.tsx +49 -5
- package/src/components/viewer/lists/ListResultsTable.tsx +270 -176
- package/src/components/viewer/lists/list-table-utils.ts +123 -0
- package/src/components/viewer/properties/MaterialTotalsPanel.tsx +283 -0
- package/src/generated/mcp-catalog.json +4 -0
- package/src/hooks/federationLoadGate.test.ts +12 -2
- package/src/hooks/federationLoadGate.ts +9 -2
- package/src/hooks/ingest/federationAlign.ts +481 -0
- package/src/hooks/ingest/viewerModelIngest.ts +3 -212
- package/src/hooks/source-key.ts +35 -0
- package/src/hooks/useAlignmentLines3D.ts +1 -26
- package/src/hooks/useCompare.ts +0 -0
- package/src/hooks/useCompareOverlay.ts +119 -0
- package/src/hooks/useDrawingGeneration.ts +23 -1
- package/src/hooks/useGridLines3D.ts +140 -0
- package/src/hooks/useIfc.ts +1 -1
- package/src/hooks/useIfcCache.ts +32 -9
- package/src/hooks/useIfcFederation.ts +42 -810
- package/src/hooks/useIfcLoader.ts +361 -488
- package/src/hooks/useIfcServer.ts +3 -0
- package/src/hooks/useLens.ts +5 -1
- package/src/hooks/useSymbolicAnnotations.ts +70 -38
- package/src/lib/compare/buildFingerprints.ts +173 -0
- package/src/lib/compare/describeChange.ts +0 -0
- package/src/lib/compare/geometricData.test.ts +54 -0
- package/src/lib/compare/geometricData.ts +37 -0
- package/src/lib/compare/overlay.test.ts +99 -0
- package/src/lib/compare/overlay.ts +91 -0
- package/src/lib/geo/cesium-placement.ts +1 -1
- package/src/lib/geo/reproject.ts +4 -1
- package/src/lib/length-unit-scale.ts +41 -0
- package/src/lib/lists/adapter.ts +136 -11
- package/src/lib/lists/export/csv.ts +47 -0
- package/src/lib/lists/export/index.ts +49 -0
- package/src/lib/lists/export/model.ts +111 -0
- package/src/lib/lists/export/pdf.ts +67 -0
- package/src/lib/lists/export/xlsx.ts +83 -0
- package/src/lib/lists/index.ts +2 -0
- package/src/lib/llm/script-edit-ops.ts +23 -0
- package/src/lib/llm/stream-client.ts +8 -1
- package/src/lib/search/filter-evaluate.test.ts +81 -0
- package/src/lib/search/filter-evaluate.ts +59 -87
- package/src/lib/search/filter-match.ts +167 -0
- package/src/lib/search/filter-rules.test.ts +25 -0
- package/src/lib/search/filter-rules.ts +75 -2
- package/src/lib/search/filter-schema.ts +0 -0
- package/src/lib/search/result-export.ts +7 -1
- package/src/lib/slab-edit.test.ts +72 -0
- package/src/lib/slab-edit.ts +159 -19
- package/src/sdk/adapters/export-adapter.ts +9 -4
- package/src/sdk/adapters/query-adapter.ts +3 -3
- package/src/store/globalId.ts +15 -13
- package/src/store/index.ts +16 -1
- package/src/store/slices/cesiumSlice.ts +8 -1
- package/src/store/slices/compareSlice.ts +96 -0
- package/src/store/slices/lensSlice.ts +8 -0
- package/src/store/slices/listSlice.ts +6 -0
- package/src/store/slices/mutationSlice.ts +14 -6
- package/src/store/slices/searchSlice.ts +29 -3
- package/src/utils/acquireFileBuffer.test.ts +12 -4
- package/src/utils/desktopModelSnapshot.ts +2 -1
- package/src/utils/loadingUtils.ts +32 -0
- package/src/utils/nativeSpatialDataStore.ts +6 -0
- package/src/utils/serverDataModel.test.ts +6 -0
- package/src/utils/serverDataModel.ts +7 -0
- package/src/utils/spatialHierarchy.test.ts +53 -1
- package/src/utils/spatialHierarchy.ts +42 -2
- package/src/vite-env.d.ts +2 -0
- package/dist/assets/deflate-Cnx0il6E.js +0 -1
- package/dist/assets/drawing-2d-C71b8Ugx.js +0 -257
- package/dist/assets/e57-source-CQHxE8n3.js +0 -1
- package/dist/assets/geometry.worker-0Q9qEa6p.js +0 -1
- package/dist/assets/ifc-lite_bg-CEZnhM2e.wasm +0 -0
- package/dist/assets/index-B9Ug2EqU.css +0 -1
- package/dist/assets/lens-PYsLu_MA.js +0 -1
- package/dist/assets/parser.worker-8md211IW.js +0 -182
- package/dist/assets/raw-BQrAgxwT.js +0 -1
- package/dist/assets/server-client-Bk4c1CPO.js +0 -626
- package/src/hooks/ingest/resolveDataStoreOrAbort.test.ts +0 -61
- package/src/hooks/ingest/resolveDataStoreOrAbort.ts +0 -28
- package/src/hooks/ingest/watchedGeometryStream.test.ts +0 -78
- package/src/hooks/ingest/watchedGeometryStream.ts +0 -76
|
@@ -0,0 +1,719 @@
|
|
|
1
|
+
import { _ as fe, __tla as __tla_0 } from "./sandbox-0sDo3g3m.js";
|
|
2
|
+
let et, tt;
|
|
3
|
+
let __tla = Promise.all([
|
|
4
|
+
(()=>{
|
|
5
|
+
try {
|
|
6
|
+
return __tla_0;
|
|
7
|
+
} catch {}
|
|
8
|
+
})()
|
|
9
|
+
]).then(async ()=>{
|
|
10
|
+
let qe = !1, Ae = null;
|
|
11
|
+
async function Ce() {
|
|
12
|
+
if (qe && Ae) return Ae;
|
|
13
|
+
console.log("[parquet-decoder] Starting WASM initialization...");
|
|
14
|
+
let s;
|
|
15
|
+
try {
|
|
16
|
+
if (s = await fe(()=>import("./parquet-CEXmQNRO.js").then((e)=>e.a), []), console.log("[parquet-decoder] Imported ESM build"), typeof s.default == "function") {
|
|
17
|
+
console.log("[parquet-decoder] Calling ESM init to load WASM...");
|
|
18
|
+
const a = (await fe(()=>import("./parquet-CEXmQNRO.js").then((r)=>r.b), [])).default;
|
|
19
|
+
console.log("[parquet-decoder] Loading WASM from:", a), await s.default(a), console.log("[parquet-decoder] ESM WASM initialized");
|
|
20
|
+
}
|
|
21
|
+
if (typeof s.readParquet == "function") return Ae = s, qe = !0, console.log("[parquet-decoder] ESM build ready with readParquet"), s;
|
|
22
|
+
console.warn("[parquet-decoder] ESM build initialized but readParquet not found");
|
|
23
|
+
} catch (e) {
|
|
24
|
+
console.warn("[parquet-decoder] ESM import failed:", e);
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
if (s = await fe(()=>import("./parquet-CEXmQNRO.js").then((e)=>e.a), []), typeof s.default == "function") {
|
|
28
|
+
console.log("[parquet-decoder] Trying web init with node_modules path...");
|
|
29
|
+
const e = [
|
|
30
|
+
"/node_modules/parquet-wasm/esm/arrow2_bg.wasm",
|
|
31
|
+
"./node_modules/parquet-wasm/esm/arrow2_bg.wasm"
|
|
32
|
+
];
|
|
33
|
+
for (const a of e)try {
|
|
34
|
+
const r = await fetch(a);
|
|
35
|
+
if (r.ok && (console.log("[parquet-decoder] Found WASM at:", a), await s.default(r), typeof s.readParquet == "function")) return Ae = s, qe = !0, console.log("[parquet-decoder] Web init successful"), s;
|
|
36
|
+
} catch {}
|
|
37
|
+
}
|
|
38
|
+
} catch (e) {
|
|
39
|
+
console.warn("[parquet-decoder] Web init failed:", e);
|
|
40
|
+
}
|
|
41
|
+
throw new Error("parquet-wasm: Could not load WASM module. Ensure parquet-wasm is installed and WASM files are accessible.");
|
|
42
|
+
}
|
|
43
|
+
async function ke(s) {
|
|
44
|
+
const e = await Ce(), a = new DataView(s);
|
|
45
|
+
let r = 0;
|
|
46
|
+
const n = a.getUint32(r, !0);
|
|
47
|
+
r += 4;
|
|
48
|
+
const t = new Uint8Array(s, r, n);
|
|
49
|
+
r += n;
|
|
50
|
+
const i = a.getUint32(r, !0);
|
|
51
|
+
r += 4;
|
|
52
|
+
const l = new Uint8Array(s, r, i);
|
|
53
|
+
r += i;
|
|
54
|
+
const c = a.getUint32(r, !0);
|
|
55
|
+
r += 4;
|
|
56
|
+
const h = new Uint8Array(s, r, c), g = e.readParquet(t), f = e.readParquet(l), P = e.readParquet(h), p = await fe(()=>import("./arrow-CXWhTnNT.js").then((w)=>w.A), []), d = p.tableFromIPC(g.intoIPCStream()), x = p.tableFromIPC(f.intoIPCStream()), E = p.tableFromIPC(P.intoIPCStream()), D = d.getChild("express_id")?.toArray(), L = d.getChild("ifc_type"), B = d.getChild("vertex_start")?.toArray(), j = d.getChild("vertex_count")?.toArray(), G = d.getChild("index_start")?.toArray(), $ = d.getChild("index_count")?.toArray(), A = d.getChild("color_r")?.toArray(), I = d.getChild("color_g")?.toArray(), q = d.getChild("color_b")?.toArray(), F = d.getChild("color_a")?.toArray(), v = x.getChild("x")?.toArray(), b = x.getChild("y")?.toArray(), K = x.getChild("z")?.toArray(), Y = x.getChild("nx")?.toArray(), Z = x.getChild("ny")?.toArray(), ee = x.getChild("nz")?.toArray(), T = E.getChild("i0")?.toArray(), Q = E.getChild("i1")?.toArray(), W = E.getChild("i2")?.toArray();
|
|
57
|
+
if (!v || !b || !K || !Y || !Z || !ee || !T || !Q || !W) throw new Error("Malformed Parquet geometry: missing required vertex/index column");
|
|
58
|
+
if (v.length !== b.length || v.length !== K.length || Y.length !== Z.length || Y.length !== ee.length || T.length !== Q.length || T.length !== W.length) throw new Error("Malformed Parquet geometry: inconsistent parallel column lengths");
|
|
59
|
+
const ge = D.length, X = new Array(ge);
|
|
60
|
+
for(let w = 0; w < ge; w++){
|
|
61
|
+
const M = B[w], z = j[w], C = G[w], H = $[w];
|
|
62
|
+
if (M + z > v.length || M + z > Y.length || C % 3 !== 0 || H % 3 !== 0 || (C + H) / 3 > T.length) throw new Error(`Malformed Parquet geometry: mesh ${w} range out of bounds (vertexStart=${M}, vertexCount=${z}, vertices=${v.length}; indexStart=${C}, indexCount=${H}, triangles=${T.length})`);
|
|
63
|
+
const te = new Float32Array(z * 3);
|
|
64
|
+
for(let m = 0; m < z; m++){
|
|
65
|
+
const U = M + m;
|
|
66
|
+
te[m * 3] = v[U], te[m * 3 + 1] = b[U], te[m * 3 + 2] = K[U];
|
|
67
|
+
}
|
|
68
|
+
const O = new Float32Array(z * 3);
|
|
69
|
+
for(let m = 0; m < z; m++){
|
|
70
|
+
const U = M + m;
|
|
71
|
+
O[m * 3] = Y[U], O[m * 3 + 1] = Z[U], O[m * 3 + 2] = ee[U];
|
|
72
|
+
}
|
|
73
|
+
const ce = H / 3, le = C / 3, J = new Uint32Array(H);
|
|
74
|
+
for(let m = 0; m < ce; m++){
|
|
75
|
+
const U = le + m;
|
|
76
|
+
J[m * 3] = T[U], J[m * 3 + 1] = Q[U], J[m * 3 + 2] = W[U];
|
|
77
|
+
}
|
|
78
|
+
X[w] = {
|
|
79
|
+
express_id: D[w],
|
|
80
|
+
ifc_type: L?.get(w) ?? "Unknown",
|
|
81
|
+
positions: te,
|
|
82
|
+
normals: O,
|
|
83
|
+
indices: J,
|
|
84
|
+
color: [
|
|
85
|
+
A[w],
|
|
86
|
+
I[w],
|
|
87
|
+
q[w],
|
|
88
|
+
F[w]
|
|
89
|
+
]
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
return X;
|
|
93
|
+
}
|
|
94
|
+
async function be() {
|
|
95
|
+
try {
|
|
96
|
+
return await Ce(), !0;
|
|
97
|
+
} catch (s) {
|
|
98
|
+
return console.warn("[parquet-decoder] Parquet WASM initialization failed:", s), !1;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function Ze(s, e = 1e4) {
|
|
102
|
+
const a = await Ce(), r = await fe(()=>import("./arrow-CXWhTnNT.js").then((N)=>N.A), []), n = new DataView(s);
|
|
103
|
+
let t = 0;
|
|
104
|
+
const i = n.getUint8(t);
|
|
105
|
+
if (t += 1, i !== 2) throw new Error(`Unsupported optimized Parquet version: ${i}`);
|
|
106
|
+
const l = n.getUint8(t);
|
|
107
|
+
t += 1;
|
|
108
|
+
const c = (l & 1) !== 0, h = n.getUint32(t, !0);
|
|
109
|
+
t += 4;
|
|
110
|
+
const g = n.getUint32(t, !0);
|
|
111
|
+
t += 4;
|
|
112
|
+
const f = n.getUint32(t, !0);
|
|
113
|
+
t += 4;
|
|
114
|
+
const P = n.getUint32(t, !0);
|
|
115
|
+
t += 4;
|
|
116
|
+
const p = n.getUint32(t, !0);
|
|
117
|
+
t += 4;
|
|
118
|
+
const d = new Uint8Array(s, t, h);
|
|
119
|
+
t += h;
|
|
120
|
+
const x = new Uint8Array(s, t, g);
|
|
121
|
+
t += g;
|
|
122
|
+
const E = new Uint8Array(s, t, f);
|
|
123
|
+
t += f;
|
|
124
|
+
const D = new Uint8Array(s, t, P);
|
|
125
|
+
t += P;
|
|
126
|
+
const L = new Uint8Array(s, t, p), B = a.readParquet(d), j = a.readParquet(x), G = a.readParquet(E), $ = a.readParquet(D), A = a.readParquet(L), I = r.tableFromIPC(B.intoIPCStream()), q = r.tableFromIPC(j.intoIPCStream()), F = r.tableFromIPC(G.intoIPCStream()), v = r.tableFromIPC($.intoIPCStream()), b = r.tableFromIPC(A.intoIPCStream()), K = I.getChild("entity_id")?.toArray(), Y = I.getChild("ifc_type"), Z = I.getChild("mesh_index")?.toArray(), ee = I.getChild("material_index")?.toArray(), T = q.getChild("vertex_offset")?.toArray(), Q = q.getChild("vertex_count")?.toArray(), W = q.getChild("index_offset")?.toArray(), ge = q.getChild("index_count")?.toArray(), X = F.getChild("r")?.toArray(), w = F.getChild("g")?.toArray(), M = F.getChild("b")?.toArray(), z = F.getChild("a")?.toArray(), C = v.getChild("x")?.toArray(), H = v.getChild("y")?.toArray(), te = v.getChild("z")?.toArray(), O = c ? v.getChild("nx")?.toArray() : null, ce = c ? v.getChild("ny")?.toArray() : null, le = c ? v.getChild("nz")?.toArray() : null, J = b.getChild("i")?.toArray();
|
|
127
|
+
if (!C || !H || !te || !J || !X || !w || !M || !z) throw new Error("Malformed optimized Parquet geometry: missing required column");
|
|
128
|
+
if (C.length !== H.length || C.length !== te.length || X.length !== w.length || X.length !== M.length || X.length !== z.length || c && (!O || !ce || !le || O.length !== C.length || ce.length !== C.length || le.length !== C.length)) throw new Error("Malformed optimized Parquet geometry: inconsistent parallel column lengths");
|
|
129
|
+
const m = K.length, U = new Array(m), me = 1 / e;
|
|
130
|
+
for(let N = 0; N < m; N++){
|
|
131
|
+
const re = Z[N], R = ee[N];
|
|
132
|
+
if (re >= T.length || R >= X.length) throw new Error(`Malformed optimized Parquet geometry: instance ${N} references mesh ${re} (of ${T.length}) / material ${R} (of ${X.length})`);
|
|
133
|
+
const u = T[re], oe = Q[re], ue = W[re], de = ge[re];
|
|
134
|
+
if (u + oe > C.length || O && u + oe > O.length || ue + de > J.length) throw new Error(`Malformed optimized Parquet geometry: instance ${N} range out of bounds (meshIdx=${re}, vertexOffset=${u}, vertexCount=${oe}, vertices=${C.length}; indexOffset=${ue}, indexCount=${de}, indices=${J.length})`);
|
|
135
|
+
const pe = new Float32Array(oe * 3);
|
|
136
|
+
for(let S = 0; S < oe; S++){
|
|
137
|
+
const ae = u + S;
|
|
138
|
+
pe[S * 3] = C[ae] * me, pe[S * 3 + 1] = H[ae] * me, pe[S * 3 + 2] = te[ae] * me;
|
|
139
|
+
}
|
|
140
|
+
let ne;
|
|
141
|
+
if (c && O && ce && le) {
|
|
142
|
+
ne = new Float32Array(oe * 3);
|
|
143
|
+
for(let S = 0; S < oe; S++){
|
|
144
|
+
const ae = u + S;
|
|
145
|
+
ne[S * 3] = O[ae], ne[S * 3 + 1] = ce[ae], ne[S * 3 + 2] = le[ae];
|
|
146
|
+
}
|
|
147
|
+
} else ne = Qe(pe, J.slice(ue, ue + de));
|
|
148
|
+
const we = new Uint32Array(de);
|
|
149
|
+
for(let S = 0; S < de; S++)we[S] = J[ue + S];
|
|
150
|
+
U[N] = {
|
|
151
|
+
express_id: K[N],
|
|
152
|
+
ifc_type: Y?.get(N) ?? "Unknown",
|
|
153
|
+
positions: pe,
|
|
154
|
+
normals: ne,
|
|
155
|
+
indices: we,
|
|
156
|
+
color: [
|
|
157
|
+
X[R] / 255,
|
|
158
|
+
w[R] / 255,
|
|
159
|
+
M[R] / 255,
|
|
160
|
+
z[R] / 255
|
|
161
|
+
]
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
return U;
|
|
165
|
+
}
|
|
166
|
+
function Qe(s, e) {
|
|
167
|
+
const a = s.length / 3, r = new Float32Array(a * 3).fill(0), n = e.length / 3;
|
|
168
|
+
for(let t = 0; t < n; t++){
|
|
169
|
+
const i = e[t * 3], l = e[t * 3 + 1], c = e[t * 3 + 2], h = s[i * 3], g = s[i * 3 + 1], f = s[i * 3 + 2], P = s[l * 3], p = s[l * 3 + 1], d = s[l * 3 + 2], x = s[c * 3], E = s[c * 3 + 1], D = s[c * 3 + 2], L = P - h, B = p - g, j = d - f, G = x - h, $ = E - g, A = D - f, I = B * A - j * $, q = j * G - L * A, F = L * $ - B * G;
|
|
170
|
+
r[i * 3] += I, r[i * 3 + 1] += q, r[i * 3 + 2] += F, r[l * 3] += I, r[l * 3 + 1] += q, r[l * 3 + 2] += F, r[c * 3] += I, r[c * 3 + 1] += q, r[c * 3 + 2] += F;
|
|
171
|
+
}
|
|
172
|
+
for(let t = 0; t < a; t++){
|
|
173
|
+
const i = r[t * 3], l = r[t * 3 + 1], c = r[t * 3 + 2], h = Math.sqrt(i * i + l * l + c * c);
|
|
174
|
+
h > 0 && (r[t * 3] /= h, r[t * 3 + 1] /= h, r[t * 3 + 2] /= h);
|
|
175
|
+
}
|
|
176
|
+
return r;
|
|
177
|
+
}
|
|
178
|
+
async function Pe(s) {
|
|
179
|
+
const e = s instanceof File ? s.stream() : new Blob([
|
|
180
|
+
s
|
|
181
|
+
]).stream(), a = new CompressionStream("gzip"), r = e.pipeThrough(a);
|
|
182
|
+
return new Response(r).blob();
|
|
183
|
+
}
|
|
184
|
+
async function De(s) {
|
|
185
|
+
const e = s instanceof File ? await s.arrayBuffer() : s, a = await crypto.subtle.digest("SHA-256", e);
|
|
186
|
+
return Array.from(new Uint8Array(a)).map((r)=>r.toString(16).padStart(2, "0")).join("");
|
|
187
|
+
}
|
|
188
|
+
et = class {
|
|
189
|
+
constructor(e){
|
|
190
|
+
this.baseUrl = e.baseUrl.replace(/\/$/, ""), this.timeout = e.timeout ?? 3e5;
|
|
191
|
+
}
|
|
192
|
+
async health() {
|
|
193
|
+
const e = await fetch(`${this.baseUrl}/api/v1/health`, {
|
|
194
|
+
signal: AbortSignal.timeout(this.timeout)
|
|
195
|
+
});
|
|
196
|
+
if (!e.ok) throw await this.handleError(e);
|
|
197
|
+
return e.json();
|
|
198
|
+
}
|
|
199
|
+
async parse(e) {
|
|
200
|
+
const a = await Pe(e), r = e instanceof File ? e.name : "model.ifc", n = new FormData;
|
|
201
|
+
n.append("file", a, r);
|
|
202
|
+
const t = await fetch(`${this.baseUrl}/api/v1/parse`, {
|
|
203
|
+
method: "POST",
|
|
204
|
+
body: n,
|
|
205
|
+
signal: AbortSignal.timeout(this.timeout)
|
|
206
|
+
});
|
|
207
|
+
if (!t.ok) throw await this.handleError(t);
|
|
208
|
+
return t.json();
|
|
209
|
+
}
|
|
210
|
+
async parseParquet(e) {
|
|
211
|
+
if (!await be()) throw new Error("Parquet parsing requires parquet-wasm and apache-arrow. Install them with: npm install parquet-wasm apache-arrow");
|
|
212
|
+
const r = performance.now(), n = await De(e), t = performance.now() - r;
|
|
213
|
+
console.log(`[client] Computed file hash in ${t.toFixed(0)}ms: ${n.substring(0, 16)}...`);
|
|
214
|
+
const i = performance.now(), l = await fetch(`${this.baseUrl}/api/v1/cache/check/${n}`, {
|
|
215
|
+
method: "GET",
|
|
216
|
+
signal: AbortSignal.timeout(5e3)
|
|
217
|
+
}), c = performance.now() - i;
|
|
218
|
+
return l.ok ? (console.log(`[client] Cache HIT (check: ${c.toFixed(0)}ms) - skipping upload`), this.fetchCachedGeometry(n)) : (console.log(`[client] Cache MISS (check: ${c.toFixed(0)}ms) - uploading file`), this.uploadAndProcessParquet(e, n));
|
|
219
|
+
}
|
|
220
|
+
async parseParquetStream(e, a) {
|
|
221
|
+
if (!await be()) throw new Error("Parquet streaming requires parquet-wasm and apache-arrow. Install them with: npm install parquet-wasm apache-arrow");
|
|
222
|
+
const n = e instanceof File ? e.size : e.byteLength, t = e instanceof File ? e.name : "model.ifc", i = performance.now(), l = await De(e), c = performance.now() - i;
|
|
223
|
+
console.log(`[client] Stream: computed hash in ${c.toFixed(0)}ms: ${l.substring(0, 16)}...`);
|
|
224
|
+
const h = performance.now(), g = await fetch(`${this.baseUrl}/api/v1/cache/check/${l}`, {
|
|
225
|
+
method: "GET",
|
|
226
|
+
signal: AbortSignal.timeout(5e3)
|
|
227
|
+
}), f = performance.now() - h;
|
|
228
|
+
if (g.ok) {
|
|
229
|
+
console.log(`[client] Stream: Cache HIT (check: ${f.toFixed(0)}ms) - fetching cached geometry`);
|
|
230
|
+
const A = await this.fetchCachedGeometry(l), I = performance.now();
|
|
231
|
+
a({
|
|
232
|
+
meshes: A.meshes,
|
|
233
|
+
batch_number: 1,
|
|
234
|
+
decode_time_ms: performance.now() - I
|
|
235
|
+
});
|
|
236
|
+
let q = null;
|
|
237
|
+
try {
|
|
238
|
+
q = await this.fetchSymbolic(A.cache_key);
|
|
239
|
+
} catch (F) {
|
|
240
|
+
console.warn("[client] Symbolic fetch failed on cache hit; continuing without symbols:", F);
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
cache_key: A.cache_key,
|
|
244
|
+
total_meshes: A.meshes.length,
|
|
245
|
+
stats: A.stats,
|
|
246
|
+
metadata: A.metadata,
|
|
247
|
+
symbolic_data: q ?? void 0
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
console.log(`[client] Stream: Cache MISS (check: ${f.toFixed(0)}ms) - starting stream for ${t} (${(n / 1024 / 1024).toFixed(1)}MB)`);
|
|
251
|
+
const P = new FormData;
|
|
252
|
+
P.append("file", e instanceof File ? e : new Blob([
|
|
253
|
+
e
|
|
254
|
+
]), t);
|
|
255
|
+
const p = performance.now(), d = await fetch(`${this.baseUrl}/api/v1/parse/parquet-stream`, {
|
|
256
|
+
method: "POST",
|
|
257
|
+
body: P,
|
|
258
|
+
signal: AbortSignal.timeout(this.timeout)
|
|
259
|
+
});
|
|
260
|
+
if (!d.ok) throw await this.handleError(d);
|
|
261
|
+
if (!d.body) throw new Error("No response body for streaming");
|
|
262
|
+
const x = d.body.getReader(), E = new TextDecoder;
|
|
263
|
+
let D = "", L = "", B = 0, j = null, G = null, $;
|
|
264
|
+
for(;;){
|
|
265
|
+
const { done: A, value: I } = await x.read();
|
|
266
|
+
if (A) break;
|
|
267
|
+
D += E.decode(I, {
|
|
268
|
+
stream: !0
|
|
269
|
+
});
|
|
270
|
+
const q = D.split(`
|
|
271
|
+
`);
|
|
272
|
+
D = q.pop() || "";
|
|
273
|
+
for (const F of q){
|
|
274
|
+
if (!F.startsWith("data:")) continue;
|
|
275
|
+
const v = F.slice(5).trim();
|
|
276
|
+
if (v) try {
|
|
277
|
+
const b = JSON.parse(v);
|
|
278
|
+
switch(b.type){
|
|
279
|
+
case "start":
|
|
280
|
+
L = b.cache_key, console.log(`[client] Stream started: ${b.total_estimate} entities, cache_key: ${L.substring(0, 16)}...`);
|
|
281
|
+
break;
|
|
282
|
+
case "progress":
|
|
283
|
+
break;
|
|
284
|
+
case "batch":
|
|
285
|
+
{
|
|
286
|
+
const Y = performance.now(), Z = atob(b.data), ee = new Uint8Array(Z.length);
|
|
287
|
+
for(let W = 0; W < Z.length; W++)ee[W] = Z.charCodeAt(W);
|
|
288
|
+
const T = await ke(ee.buffer), Q = performance.now() - Y;
|
|
289
|
+
B += T.length, console.log(`[client] Batch #${b.batch_number}: ${T.length} meshes, decode: ${Q.toFixed(0)}ms`), a({
|
|
290
|
+
meshes: T,
|
|
291
|
+
batch_number: b.batch_number,
|
|
292
|
+
decode_time_ms: Q
|
|
293
|
+
});
|
|
294
|
+
break;
|
|
295
|
+
}
|
|
296
|
+
case "complete":
|
|
297
|
+
j = b.stats, G = b.metadata, $ = b.symbolic_data;
|
|
298
|
+
const K = performance.now() - p;
|
|
299
|
+
console.log(`[client] Stream complete: ${B} meshes in ${K.toFixed(0)}ms`);
|
|
300
|
+
break;
|
|
301
|
+
case "error":
|
|
302
|
+
throw new Error(`Stream error: ${b.message}`);
|
|
303
|
+
}
|
|
304
|
+
} catch (b) {
|
|
305
|
+
if (b instanceof SyntaxError) console.warn("[client] Failed to parse SSE event:", v);
|
|
306
|
+
else throw b;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
if (!j || !G) throw new Error("Stream ended without complete event");
|
|
311
|
+
return {
|
|
312
|
+
cache_key: L,
|
|
313
|
+
total_meshes: B,
|
|
314
|
+
stats: j,
|
|
315
|
+
metadata: G,
|
|
316
|
+
symbolic_data: $
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
async fetchCachedGeometry(e) {
|
|
320
|
+
const a = performance.now(), r = await fetch(`${this.baseUrl}/api/v1/cache/geometry/${e}`, {
|
|
321
|
+
method: "GET",
|
|
322
|
+
signal: AbortSignal.timeout(this.timeout)
|
|
323
|
+
});
|
|
324
|
+
if (!r.ok) throw await this.handleError(r);
|
|
325
|
+
const n = performance.now() - a;
|
|
326
|
+
console.log(`[client] Fetched cached geometry in ${n.toFixed(0)}ms`);
|
|
327
|
+
const t = r.headers.get("X-IFC-Metadata");
|
|
328
|
+
if (!t) throw new Error("Missing X-IFC-Metadata header in cached geometry response");
|
|
329
|
+
const i = JSON.parse(t), l = await r.arrayBuffer(), c = l.byteLength;
|
|
330
|
+
return this.parseParquetResponse(l, i, c);
|
|
331
|
+
}
|
|
332
|
+
async uploadAndProcessParquet(e, a) {
|
|
333
|
+
const r = e instanceof File ? e.size : e.byteLength, n = e instanceof File ? e.name : "model.ifc", t = this.baseUrl.includes("localhost") || this.baseUrl.includes("127.0.0.1"), i = r > 50 * 1024 * 1024 || t;
|
|
334
|
+
let l;
|
|
335
|
+
if (i) console.log(`[client] Skipping compression (file: ${(r / 1024 / 1024).toFixed(1)}MB, localhost: ${t})`), l = e instanceof File ? e : new Blob([
|
|
336
|
+
e
|
|
337
|
+
]);
|
|
338
|
+
else {
|
|
339
|
+
const E = performance.now();
|
|
340
|
+
l = await Pe(e), console.log(`[client] Compressed in ${(performance.now() - E).toFixed(0)}ms: ${(r / 1024 / 1024).toFixed(1)}MB → ${(l.size / 1024 / 1024).toFixed(1)}MB`);
|
|
341
|
+
}
|
|
342
|
+
const c = new FormData;
|
|
343
|
+
c.append("file", l, n);
|
|
344
|
+
const h = performance.now(), g = await fetch(`${this.baseUrl}/api/v1/parse/parquet`, {
|
|
345
|
+
method: "POST",
|
|
346
|
+
body: c,
|
|
347
|
+
signal: AbortSignal.timeout(this.timeout)
|
|
348
|
+
}), f = performance.now() - h;
|
|
349
|
+
if (console.log(`[client] Upload and processing completed in ${f.toFixed(0)}ms`), !g.ok) throw await this.handleError(g);
|
|
350
|
+
const P = g.headers.get("X-IFC-Metadata");
|
|
351
|
+
if (!P) throw new Error("Missing X-IFC-Metadata header in Parquet response");
|
|
352
|
+
const p = JSON.parse(P);
|
|
353
|
+
p.cache_key !== a && console.warn(`[client] Cache key mismatch: expected ${a.substring(0, 16)}..., got ${p.cache_key.substring(0, 16)}...`);
|
|
354
|
+
const d = await g.arrayBuffer(), x = d.byteLength;
|
|
355
|
+
return this.parseParquetResponse(d, p, x);
|
|
356
|
+
}
|
|
357
|
+
async parseParquetResponse(e, a, r) {
|
|
358
|
+
const n = new DataView(e);
|
|
359
|
+
let t = 0;
|
|
360
|
+
const i = n.getUint32(0, !0), l = i > 0 && i < e.byteLength && i < e.byteLength - 4;
|
|
361
|
+
let c, h;
|
|
362
|
+
if (l) {
|
|
363
|
+
const p = i;
|
|
364
|
+
if (t += 4, p > e.byteLength || p === 0 || t + p > e.byteLength) throw new Error(`Invalid geometry length: ${p}, buffer size: ${e.byteLength}, offset: ${t}`);
|
|
365
|
+
if (c = e.slice(t, t + p), t += p, t + 4 <= e.byteLength) {
|
|
366
|
+
const d = n.getUint32(t, !0);
|
|
367
|
+
t += 4, d > 0 && t + d <= e.byteLength && (h = e.slice(t, t + d));
|
|
368
|
+
}
|
|
369
|
+
} else console.log("[client] Detected old format (no wrapper), using entire payload as geometry"), c = e, h = void 0;
|
|
370
|
+
const g = performance.now(), f = await ke(c), P = performance.now() - g;
|
|
371
|
+
return {
|
|
372
|
+
cache_key: a.cache_key,
|
|
373
|
+
meshes: f,
|
|
374
|
+
mesh_coordinate_space: a.mesh_coordinate_space,
|
|
375
|
+
site_transform: a.site_transform,
|
|
376
|
+
building_transform: a.building_transform,
|
|
377
|
+
metadata: a.metadata,
|
|
378
|
+
stats: a.stats,
|
|
379
|
+
parquet_stats: {
|
|
380
|
+
payload_size: r,
|
|
381
|
+
decode_time_ms: Math.round(P)
|
|
382
|
+
},
|
|
383
|
+
data_model: h
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
async fetchDataModel(e, a = 10) {
|
|
387
|
+
let r = 100;
|
|
388
|
+
for(let n = 0; n < a; n++)try {
|
|
389
|
+
const t = await fetch(`${this.baseUrl}/api/v1/parse/data-model/${e}`, {
|
|
390
|
+
method: "GET",
|
|
391
|
+
signal: AbortSignal.timeout(3e4)
|
|
392
|
+
});
|
|
393
|
+
if (t.status === 200) {
|
|
394
|
+
const i = await t.arrayBuffer();
|
|
395
|
+
return console.log(`[client] Data model fetched: ${(i.byteLength / 1024 / 1024).toFixed(2)}MB`), i;
|
|
396
|
+
} else if (t.status === 202) console.log(`[client] Data model still processing (attempt ${n + 1}/${a}), waiting ${r}ms...`), await new Promise((i)=>setTimeout(i, r)), r = Math.min(r * 1.5, 2e3);
|
|
397
|
+
else {
|
|
398
|
+
if (t.status === 404) return console.warn(`[client] Data model not found for cache key: ${e}`), null;
|
|
399
|
+
throw new Error(`Unexpected response status: ${t.status}`);
|
|
400
|
+
}
|
|
401
|
+
} catch (t) {
|
|
402
|
+
if (n === a - 1) return console.error("[client] Failed to fetch data model:", t), null;
|
|
403
|
+
await new Promise((i)=>setTimeout(i, r)), r = Math.min(r * 1.5, 2e3);
|
|
404
|
+
}
|
|
405
|
+
return console.warn("[client] Data model fetch timed out after max retries"), null;
|
|
406
|
+
}
|
|
407
|
+
async fetchSymbolic(e, a = 10) {
|
|
408
|
+
let r = 100;
|
|
409
|
+
for(let n = 0; n < a; n++){
|
|
410
|
+
let t;
|
|
411
|
+
try {
|
|
412
|
+
t = await fetch(`${this.baseUrl}/api/v1/parse/symbolic/${e}`, {
|
|
413
|
+
method: "GET",
|
|
414
|
+
signal: AbortSignal.timeout(3e4)
|
|
415
|
+
});
|
|
416
|
+
} catch (i) {
|
|
417
|
+
if (n === a - 1) throw i;
|
|
418
|
+
console.warn("[client] Retrying symbolic data fetch after network error:", i), await new Promise((l)=>setTimeout(l, r)), r = Math.min(r * 1.5, 2e3);
|
|
419
|
+
continue;
|
|
420
|
+
}
|
|
421
|
+
if (t.status === 200) return await t.json();
|
|
422
|
+
if (t.status === 202) await new Promise((i)=>setTimeout(i, r)), r = Math.min(r * 1.5, 2e3);
|
|
423
|
+
else {
|
|
424
|
+
if (t.status === 404) return console.warn(`[client] Symbolic data not found for cache key: ${e}`), null;
|
|
425
|
+
throw await this.handleError(t);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
return console.warn("[client] Symbolic data fetch timed out after max retries"), null;
|
|
429
|
+
}
|
|
430
|
+
async isParquetSupported() {
|
|
431
|
+
return be();
|
|
432
|
+
}
|
|
433
|
+
async parseParquetOptimized(e) {
|
|
434
|
+
if (!await be()) throw new Error("Parquet parsing requires parquet-wasm and apache-arrow. Install them with: npm install parquet-wasm apache-arrow");
|
|
435
|
+
const r = await Pe(e), n = e instanceof File ? e.name : "model.ifc", t = new FormData;
|
|
436
|
+
t.append("file", r, n);
|
|
437
|
+
const i = await fetch(`${this.baseUrl}/api/v1/parse/parquet/optimized`, {
|
|
438
|
+
method: "POST",
|
|
439
|
+
body: t,
|
|
440
|
+
signal: AbortSignal.timeout(this.timeout)
|
|
441
|
+
});
|
|
442
|
+
if (!i.ok) throw await this.handleError(i);
|
|
443
|
+
const l = i.headers.get("X-IFC-Metadata");
|
|
444
|
+
if (!l) throw new Error("Missing X-IFC-Metadata header in optimized Parquet response");
|
|
445
|
+
const c = JSON.parse(l), h = await i.arrayBuffer(), g = h.byteLength, f = performance.now(), P = await Ze(h, c.vertex_multiplier), p = performance.now() - f;
|
|
446
|
+
return {
|
|
447
|
+
cache_key: c.cache_key,
|
|
448
|
+
meshes: P,
|
|
449
|
+
mesh_coordinate_space: c.mesh_coordinate_space,
|
|
450
|
+
site_transform: c.site_transform,
|
|
451
|
+
building_transform: c.building_transform,
|
|
452
|
+
metadata: c.metadata,
|
|
453
|
+
stats: c.stats,
|
|
454
|
+
optimization_stats: c.optimization_stats,
|
|
455
|
+
parquet_stats: {
|
|
456
|
+
payload_size: g,
|
|
457
|
+
decode_time_ms: Math.round(p)
|
|
458
|
+
}
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
async *parseStream(e) {
|
|
462
|
+
const a = new FormData, r = e instanceof File ? e : new Blob([
|
|
463
|
+
e
|
|
464
|
+
], {
|
|
465
|
+
type: "application/octet-stream"
|
|
466
|
+
});
|
|
467
|
+
a.append("file", r, e instanceof File ? e.name : "model.ifc");
|
|
468
|
+
const n = await fetch(`${this.baseUrl}/api/v1/parse/stream`, {
|
|
469
|
+
method: "POST",
|
|
470
|
+
body: a,
|
|
471
|
+
headers: {
|
|
472
|
+
Accept: "text/event-stream"
|
|
473
|
+
},
|
|
474
|
+
signal: AbortSignal.timeout(this.timeout)
|
|
475
|
+
});
|
|
476
|
+
if (!n.ok) throw await this.handleError(n);
|
|
477
|
+
if (!n.body) throw new Error("Response body is null");
|
|
478
|
+
const t = n.body.getReader(), i = new TextDecoder;
|
|
479
|
+
let l = "";
|
|
480
|
+
try {
|
|
481
|
+
for(;;){
|
|
482
|
+
const { done: c, value: h } = await t.read();
|
|
483
|
+
if (c) break;
|
|
484
|
+
l += i.decode(h, {
|
|
485
|
+
stream: !0
|
|
486
|
+
});
|
|
487
|
+
const g = l.split(`
|
|
488
|
+
|
|
489
|
+
`);
|
|
490
|
+
l = g.pop() || "";
|
|
491
|
+
for (const f of g)if (f.startsWith("data: ")) try {
|
|
492
|
+
yield JSON.parse(f.slice(6));
|
|
493
|
+
} catch {}
|
|
494
|
+
}
|
|
495
|
+
if (l.startsWith("data: ")) try {
|
|
496
|
+
yield JSON.parse(l.slice(6));
|
|
497
|
+
} catch {}
|
|
498
|
+
} finally{
|
|
499
|
+
t.releaseLock();
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
async getMetadata(e) {
|
|
503
|
+
const a = new FormData;
|
|
504
|
+
a.append("file", e instanceof File ? e : new Blob([
|
|
505
|
+
e
|
|
506
|
+
]), e instanceof File ? e.name : "model.ifc");
|
|
507
|
+
const r = await fetch(`${this.baseUrl}/api/v1/parse/metadata`, {
|
|
508
|
+
method: "POST",
|
|
509
|
+
body: a,
|
|
510
|
+
signal: AbortSignal.timeout(3e4)
|
|
511
|
+
});
|
|
512
|
+
if (!r.ok) throw await this.handleError(r);
|
|
513
|
+
return r.json();
|
|
514
|
+
}
|
|
515
|
+
async getCached(e) {
|
|
516
|
+
const a = await fetch(`${this.baseUrl}/api/v1/cache/${e}`, {
|
|
517
|
+
signal: AbortSignal.timeout(this.timeout)
|
|
518
|
+
});
|
|
519
|
+
if (a.status === 404) return null;
|
|
520
|
+
if (!a.ok) throw await this.handleError(a);
|
|
521
|
+
return a.json();
|
|
522
|
+
}
|
|
523
|
+
async handleError(e) {
|
|
524
|
+
try {
|
|
525
|
+
const a = await e.json();
|
|
526
|
+
return new Error(`Server error (${a.code}): ${a.error}`);
|
|
527
|
+
} catch {
|
|
528
|
+
return new Error(`Server error: ${e.status} ${e.statusText}`);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
};
|
|
532
|
+
tt = async function(s) {
|
|
533
|
+
const e = await Ce(), a = await fe(()=>import("./arrow-CXWhTnNT.js").then((o)=>o.A), []), r = new DataView(s);
|
|
534
|
+
let n = 0;
|
|
535
|
+
const t = r.getUint32(n, !0);
|
|
536
|
+
n += 4;
|
|
537
|
+
const i = new Uint8Array(s, n, t);
|
|
538
|
+
n += t;
|
|
539
|
+
const l = r.getUint32(n, !0);
|
|
540
|
+
n += 4;
|
|
541
|
+
const c = new Uint8Array(s, n, l);
|
|
542
|
+
n += l;
|
|
543
|
+
const h = r.getUint32(n, !0);
|
|
544
|
+
n += 4;
|
|
545
|
+
const g = new Uint8Array(s, n, h);
|
|
546
|
+
n += h;
|
|
547
|
+
const f = r.getUint32(n, !0);
|
|
548
|
+
n += 4;
|
|
549
|
+
const P = new Uint8Array(s, n, f);
|
|
550
|
+
n += f;
|
|
551
|
+
const p = r.getUint32(n, !0);
|
|
552
|
+
n += 4;
|
|
553
|
+
const d = new Uint8Array(s, n, p);
|
|
554
|
+
n += p;
|
|
555
|
+
const x = ()=>{
|
|
556
|
+
if (n + 4 > s.byteLength) return null;
|
|
557
|
+
const o = r.getUint32(n, !0);
|
|
558
|
+
if (n += 4, o === 0 || n + o > s.byteLength) throw new Error(`Malformed data model: truncated appended section (len=${o}, remaining=${s.byteLength - n})`);
|
|
559
|
+
const y = new Uint8Array(s, n, o);
|
|
560
|
+
return n += o, y;
|
|
561
|
+
}, E = x(), D = x(), L = x(), B = e.readParquet(i), j = e.readParquet(c), G = e.readParquet(P), $ = a.tableFromIPC(B.intoIPCStream()), A = a.tableFromIPC(j.intoIPCStream()), I = a.tableFromIPC(G.intoIPCStream()), q = $.getChild("entity_id")?.toArray(), F = $.getChild("has_geometry")?.toArray(), v = $.getChild("type_name")?.toArray(), b = $.getChild("global_id")?.toArray(), K = $.getChild("name")?.toArray(), Y = $.getChild("description")?.toArray(), Z = $.getChild("object_type")?.toArray(), ee = q.length, T = new Map;
|
|
562
|
+
for(let o = 0; o < ee; o++)T.set(q[o], {
|
|
563
|
+
entity_id: q[o],
|
|
564
|
+
type_name: v[o] ?? "",
|
|
565
|
+
global_id: b[o] || void 0,
|
|
566
|
+
name: K[o] || void 0,
|
|
567
|
+
description: Y?.[o] || void 0,
|
|
568
|
+
object_type: Z?.[o] || void 0,
|
|
569
|
+
has_geometry: F[o] !== 0
|
|
570
|
+
});
|
|
571
|
+
const Q = A.getChild("pset_id")?.toArray(), W = A.getChild("pset_name")?.toArray(), ge = A.getChild("property_name")?.toArray(), X = A.getChild("property_value")?.toArray(), w = A.getChild("property_type")?.toArray(), M = new Map;
|
|
572
|
+
for(let o = 0; o < Q.length; o++){
|
|
573
|
+
const y = Q[o];
|
|
574
|
+
M.has(y) || M.set(y, {
|
|
575
|
+
pset_id: y,
|
|
576
|
+
pset_name: W[o] ?? "",
|
|
577
|
+
properties: []
|
|
578
|
+
}), M.get(y).properties.push({
|
|
579
|
+
property_name: ge[o] ?? "",
|
|
580
|
+
property_value: X[o] ?? "",
|
|
581
|
+
property_type: w[o] ?? ""
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
const z = e.readParquet(g), C = a.tableFromIPC(z.intoIPCStream()), H = C.getChild("qset_id")?.toArray(), te = C.getChild("qset_name")?.toArray(), O = C.getChild("method_of_measurement")?.toArray(), ce = C.getChild("quantity_name")?.toArray(), le = C.getChild("quantity_value")?.toArray(), J = C.getChild("quantity_type")?.toArray(), m = new Map;
|
|
585
|
+
for(let o = 0; o < H.length; o++){
|
|
586
|
+
const y = H[o];
|
|
587
|
+
m.has(y) || m.set(y, {
|
|
588
|
+
qset_id: y,
|
|
589
|
+
qset_name: te[o] ?? "",
|
|
590
|
+
method_of_measurement: O[o] || void 0,
|
|
591
|
+
quantities: []
|
|
592
|
+
}), m.get(y).quantities.push({
|
|
593
|
+
quantity_name: ce[o] ?? "",
|
|
594
|
+
quantity_value: le[o] ?? 0,
|
|
595
|
+
quantity_type: J[o] ?? ""
|
|
596
|
+
});
|
|
597
|
+
}
|
|
598
|
+
const U = I.getChild("rel_type")?.toArray(), me = I.getChild("relating_id")?.toArray(), N = I.getChild("related_id")?.toArray(), re = new Array(me.length);
|
|
599
|
+
for(let o = 0; o < me.length; o++)re[o] = {
|
|
600
|
+
rel_type: U[o] ?? "",
|
|
601
|
+
relating_id: me[o],
|
|
602
|
+
related_id: N[o]
|
|
603
|
+
};
|
|
604
|
+
const R = new DataView(d.buffer, d.byteOffset, d.byteLength);
|
|
605
|
+
let u = 0;
|
|
606
|
+
const oe = R.getUint32(u, !0);
|
|
607
|
+
u += 4;
|
|
608
|
+
const ue = new Uint8Array(d.buffer, d.byteOffset + u, oe);
|
|
609
|
+
u += oe;
|
|
610
|
+
const de = R.getUint32(u, !0);
|
|
611
|
+
u += 4;
|
|
612
|
+
const pe = new Uint8Array(d.buffer, d.byteOffset + u, de);
|
|
613
|
+
u += de;
|
|
614
|
+
const ne = R.getUint32(u, !0);
|
|
615
|
+
u += 4;
|
|
616
|
+
const we = new Uint8Array(d.buffer, d.byteOffset + u, ne);
|
|
617
|
+
u += ne;
|
|
618
|
+
const S = R.getUint32(u, !0);
|
|
619
|
+
u += 4;
|
|
620
|
+
const ae = new Uint8Array(d.buffer, d.byteOffset + u, S);
|
|
621
|
+
u += S;
|
|
622
|
+
const ve = R.getUint32(u, !0);
|
|
623
|
+
u += 4;
|
|
624
|
+
const Le = new Uint8Array(d.buffer, d.byteOffset + u, ve);
|
|
625
|
+
u += ve;
|
|
626
|
+
const ze = R.getUint32(u, !0), Oe = e.readParquet(ue), se = a.tableFromIPC(Oe.intoIPCStream()), xe = se.getChild("entity_id")?.toArray(), Ne = se.getChild("parent_id")?.toArray(), Re = se.getChild("level")?.toArray(), Ve = se.getChild("path")?.toArray(), Be = se.getChild("type_name")?.toArray(), je = se.getChild("name")?.toArray(), Ge = se.getChild("elevation")?.toArray(), Ie = se.getChild("children_ids"), $e = se.getChild("element_ids"), Fe = xe.length, Te = new Array(Fe);
|
|
627
|
+
for(let o = 0; o < Fe; o++){
|
|
628
|
+
let y = [], V = [];
|
|
629
|
+
if (Ie) {
|
|
630
|
+
const k = Ie.get(o);
|
|
631
|
+
k && (y = [
|
|
632
|
+
...k.toArray()
|
|
633
|
+
]);
|
|
634
|
+
}
|
|
635
|
+
if ($e) {
|
|
636
|
+
const k = $e.get(o);
|
|
637
|
+
k && (V = [
|
|
638
|
+
...k.toArray()
|
|
639
|
+
]);
|
|
640
|
+
}
|
|
641
|
+
Te[o] = {
|
|
642
|
+
entity_id: xe[o],
|
|
643
|
+
parent_id: Ne[o] ?? 0,
|
|
644
|
+
level: Re[o],
|
|
645
|
+
path: Ve[o] ?? "",
|
|
646
|
+
type_name: Be[o] ?? "",
|
|
647
|
+
name: je[o] || void 0,
|
|
648
|
+
elevation: Ge[o] ?? void 0,
|
|
649
|
+
children_ids: y,
|
|
650
|
+
element_ids: V
|
|
651
|
+
};
|
|
652
|
+
}
|
|
653
|
+
const _e = (o)=>{
|
|
654
|
+
const y = e.readParquet(o), V = a.tableFromIPC(y.intoIPCStream()), k = V.getChild("element_id")?.toArray(), ye = V.getChild("spatial_id")?.toArray(), he = new Map;
|
|
655
|
+
for(let _ = 0; _ < k.length; _++)he.set(k[_], ye[_]);
|
|
656
|
+
return he;
|
|
657
|
+
}, [We, Xe, He, Je] = [
|
|
658
|
+
_e(pe),
|
|
659
|
+
_e(we),
|
|
660
|
+
_e(ae),
|
|
661
|
+
_e(Le)
|
|
662
|
+
], Ue = [];
|
|
663
|
+
if (E) {
|
|
664
|
+
const o = a.tableFromIPC(e.readParquet(E).intoIPCStream()), y = o.getChild("element_id")?.toArray(), V = o.getChild("system_name")?.toArray(), k = o.getChild("identification")?.toArray(), ye = o.getChild("name")?.toArray(), he = o.getChild("location")?.toArray();
|
|
665
|
+
for(let _ = 0; _ < y.length; _++)Ue.push({
|
|
666
|
+
element_id: y[_],
|
|
667
|
+
system_name: V?.[_] || void 0,
|
|
668
|
+
identification: k?.[_] || void 0,
|
|
669
|
+
name: ye?.[_] || void 0,
|
|
670
|
+
location: he?.[_] || void 0
|
|
671
|
+
});
|
|
672
|
+
}
|
|
673
|
+
const Ee = [];
|
|
674
|
+
if (D) {
|
|
675
|
+
const o = a.tableFromIPC(e.readParquet(D).intoIPCStream()), y = o.getChild("element_id")?.toArray(), V = o.getChild("set_name")?.toArray(), k = o.getChild("layer_index")?.toArray(), ye = o.getChild("material_name")?.toArray(), he = o.getChild("thickness")?.toArray(), _ = o.getChild("is_ventilated"), Ye = o.getChild("category")?.toArray();
|
|
676
|
+
for(let ie = 0; ie < y.length; ie++){
|
|
677
|
+
const Se = _?.get(ie);
|
|
678
|
+
Ee.push({
|
|
679
|
+
element_id: y[ie],
|
|
680
|
+
set_name: V?.[ie] || void 0,
|
|
681
|
+
layer_index: k[ie],
|
|
682
|
+
material_name: ye?.[ie] ?? "",
|
|
683
|
+
thickness: he?.[ie] ?? void 0,
|
|
684
|
+
is_ventilated: Se == null ? void 0 : !!Se,
|
|
685
|
+
category: Ye?.[ie] || void 0
|
|
686
|
+
});
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
const Me = [];
|
|
690
|
+
if (L) {
|
|
691
|
+
const o = a.tableFromIPC(e.readParquet(L).intoIPCStream()), y = o.getChild("element_id")?.toArray(), V = o.getChild("identification")?.toArray(), k = o.getChild("name")?.toArray(), ye = o.getChild("location")?.toArray(), he = o.getChild("description")?.toArray();
|
|
692
|
+
for(let _ = 0; _ < y.length; _++)Me.push({
|
|
693
|
+
element_id: y[_],
|
|
694
|
+
identification: V?.[_] || void 0,
|
|
695
|
+
name: k?.[_] || void 0,
|
|
696
|
+
location: ye?.[_] || void 0,
|
|
697
|
+
description: he?.[_] || void 0
|
|
698
|
+
});
|
|
699
|
+
}
|
|
700
|
+
return {
|
|
701
|
+
entities: T,
|
|
702
|
+
propertySets: M,
|
|
703
|
+
quantitySets: m,
|
|
704
|
+
relationships: re,
|
|
705
|
+
classifications: Ue,
|
|
706
|
+
materials: Ee,
|
|
707
|
+
documents: Me,
|
|
708
|
+
spatialHierarchy: {
|
|
709
|
+
nodes: Te,
|
|
710
|
+
project_id: ze,
|
|
711
|
+
element_to_storey: We,
|
|
712
|
+
element_to_building: Xe,
|
|
713
|
+
element_to_site: He,
|
|
714
|
+
element_to_space: Je
|
|
715
|
+
}
|
|
716
|
+
};
|
|
717
|
+
};
|
|
718
|
+
});
|
|
719
|
+
export { et as I, tt as d, __tla };
|