@ifc-lite/export 1.16.0 → 1.17.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/dist/glb.d.ts +17 -0
- package/dist/glb.d.ts.map +1 -0
- package/dist/glb.js +129 -0
- package/dist/glb.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/lod-geometry-types.d.ts +58 -0
- package/dist/lod-geometry-types.d.ts.map +1 -0
- package/dist/lod-geometry-types.js +5 -0
- package/dist/lod-geometry-types.js.map +1 -0
- package/dist/lod-geometry-utils.d.ts +23 -0
- package/dist/lod-geometry-utils.d.ts.map +1 -0
- package/dist/lod-geometry-utils.js +113 -0
- package/dist/lod-geometry-utils.js.map +1 -0
- package/dist/lod0-generator.d.ts +4 -0
- package/dist/lod0-generator.d.ts.map +1 -0
- package/dist/lod0-generator.js +287 -0
- package/dist/lod0-generator.js.map +1 -0
- package/dist/lod1-generator.d.ts +13 -0
- package/dist/lod1-generator.d.ts.map +1 -0
- package/dist/lod1-generator.js +138 -0
- package/dist/lod1-generator.js.map +1 -0
- package/package.json +4 -4
package/dist/glb.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { MeshData } from '@ifc-lite/geometry';
|
|
2
|
+
/**
|
|
3
|
+
* Minimal GLB parser for GLBs generated by IFC-Lite's GLTFExporter.
|
|
4
|
+
* This is not a general-purpose glTF loader.
|
|
5
|
+
*/
|
|
6
|
+
type ParsedGlb = {
|
|
7
|
+
json: any;
|
|
8
|
+
bin: Uint8Array;
|
|
9
|
+
};
|
|
10
|
+
export declare function parseGLB(glb: Uint8Array): ParsedGlb;
|
|
11
|
+
export declare function extractGlbMapping(glb: Uint8Array): Record<string, {
|
|
12
|
+
node: number;
|
|
13
|
+
mesh: number;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function parseGLBToMeshData(glb: Uint8Array): MeshData[];
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=glb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glb.d.ts","sourceRoot":"","sources":["../src/glb.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;;GAGG;AAEH,KAAK,SAAS,GAAG;IACf,IAAI,EAAE,GAAG,CAAC;IACV,GAAG,EAAE,UAAU,CAAC;CACjB,CAAC;AAEF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,CA6BnD;AAiBD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAajG;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,GAAG,QAAQ,EAAE,CA4D9D"}
|
package/dist/glb.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
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
|
+
export function parseGLB(glb) {
|
|
5
|
+
const dv = new DataView(glb.buffer, glb.byteOffset, glb.byteLength);
|
|
6
|
+
const magic = dv.getUint32(0, true);
|
|
7
|
+
if (magic !== 0x46546c67)
|
|
8
|
+
throw new Error('Invalid GLB magic');
|
|
9
|
+
const version = dv.getUint32(4, true);
|
|
10
|
+
if (version !== 2)
|
|
11
|
+
throw new Error(`Unsupported GLB version: ${version}`);
|
|
12
|
+
const totalLen = dv.getUint32(8, true);
|
|
13
|
+
if (totalLen > glb.byteLength)
|
|
14
|
+
throw new Error('Invalid GLB length');
|
|
15
|
+
let offset = 12;
|
|
16
|
+
let json = null;
|
|
17
|
+
let bin = null;
|
|
18
|
+
while (offset + 8 <= glb.byteLength) {
|
|
19
|
+
const chunkLen = dv.getUint32(offset, true);
|
|
20
|
+
const chunkType = dv.getUint32(offset + 4, true);
|
|
21
|
+
offset += 8;
|
|
22
|
+
const chunk = glb.subarray(offset, offset + chunkLen);
|
|
23
|
+
offset += chunkLen;
|
|
24
|
+
if (chunkType === 0x4e4f534a) {
|
|
25
|
+
const txt = new TextDecoder().decode(chunk);
|
|
26
|
+
json = JSON.parse(txt);
|
|
27
|
+
}
|
|
28
|
+
else if (chunkType === 0x004e4942) {
|
|
29
|
+
bin = chunk;
|
|
30
|
+
}
|
|
31
|
+
// 4-byte alignment is already baked into chunkLen in GLB; offset is aligned.
|
|
32
|
+
}
|
|
33
|
+
if (!json || !bin)
|
|
34
|
+
throw new Error('Invalid GLB: missing JSON or BIN chunk');
|
|
35
|
+
return { json, bin };
|
|
36
|
+
}
|
|
37
|
+
function componentTypeSize(componentType) {
|
|
38
|
+
// Only types we emit
|
|
39
|
+
if (componentType === 5126)
|
|
40
|
+
return 4; // FLOAT
|
|
41
|
+
if (componentType === 5125)
|
|
42
|
+
return 4; // UNSIGNED_INT
|
|
43
|
+
throw new Error(`Unsupported componentType: ${componentType}`);
|
|
44
|
+
}
|
|
45
|
+
function typeComponents(type) {
|
|
46
|
+
if (type === 'SCALAR')
|
|
47
|
+
return 1;
|
|
48
|
+
if (type === 'VEC2')
|
|
49
|
+
return 2;
|
|
50
|
+
if (type === 'VEC3')
|
|
51
|
+
return 3;
|
|
52
|
+
if (type === 'VEC4')
|
|
53
|
+
return 4;
|
|
54
|
+
throw new Error(`Unsupported accessor type: ${type}`);
|
|
55
|
+
}
|
|
56
|
+
export function extractGlbMapping(glb) {
|
|
57
|
+
const { json } = parseGLB(glb);
|
|
58
|
+
const out = {};
|
|
59
|
+
const nodes = Array.isArray(json?.nodes) ? json.nodes : [];
|
|
60
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
61
|
+
const n = nodes[i];
|
|
62
|
+
const meshIdx = typeof n?.mesh === 'number' ? n.mesh : null;
|
|
63
|
+
const expressId = n?.extras?.expressId;
|
|
64
|
+
if (meshIdx !== null && typeof expressId === 'number') {
|
|
65
|
+
out[String(expressId)] = { node: i, mesh: meshIdx };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
70
|
+
export function parseGLBToMeshData(glb) {
|
|
71
|
+
const { json, bin } = parseGLB(glb);
|
|
72
|
+
const nodes = Array.isArray(json?.nodes) ? json.nodes : [];
|
|
73
|
+
const meshes = Array.isArray(json?.meshes) ? json.meshes : [];
|
|
74
|
+
const accessors = Array.isArray(json?.accessors) ? json.accessors : [];
|
|
75
|
+
const bufferViews = Array.isArray(json?.bufferViews) ? json.bufferViews : [];
|
|
76
|
+
const readAccessor = (accessorIndex) => {
|
|
77
|
+
const acc = accessors[accessorIndex];
|
|
78
|
+
const bv = bufferViews[acc.bufferView];
|
|
79
|
+
const byteOffset = (bv.byteOffset || 0) + (acc.byteOffset || 0);
|
|
80
|
+
const count = Number(acc.count || 0);
|
|
81
|
+
const comps = typeComponents(String(acc.type));
|
|
82
|
+
const cSize = componentTypeSize(Number(acc.componentType));
|
|
83
|
+
const byteLen = count * comps * cSize;
|
|
84
|
+
if (byteOffset + byteLen > bin.byteLength) {
|
|
85
|
+
throw new Error(`GLB accessor out of bounds: offset=${byteOffset} len=${byteLen} bufLen=${bin.byteLength}`);
|
|
86
|
+
}
|
|
87
|
+
const slice = bin.subarray(byteOffset, byteOffset + byteLen);
|
|
88
|
+
// Ensure 4-byte alignment; copy to a new buffer if the slice is unaligned
|
|
89
|
+
const aligned = (slice.byteOffset % 4 === 0)
|
|
90
|
+
? slice
|
|
91
|
+
: new Uint8Array(slice);
|
|
92
|
+
if (Number(acc.componentType) === 5126) {
|
|
93
|
+
return { array: new Float32Array(aligned.buffer, aligned.byteOffset, aligned.byteLength / 4), count, components: comps };
|
|
94
|
+
}
|
|
95
|
+
if (Number(acc.componentType) === 5125) {
|
|
96
|
+
return { array: new Uint32Array(aligned.buffer, aligned.byteOffset, aligned.byteLength / 4), count, components: comps };
|
|
97
|
+
}
|
|
98
|
+
throw new Error('Unsupported accessor component type');
|
|
99
|
+
};
|
|
100
|
+
const out = [];
|
|
101
|
+
for (const node of nodes) {
|
|
102
|
+
const meshIdx = typeof node?.mesh === 'number' ? node.mesh : null;
|
|
103
|
+
if (meshIdx === null)
|
|
104
|
+
continue;
|
|
105
|
+
const mesh = meshes[meshIdx];
|
|
106
|
+
const prim = Array.isArray(mesh?.primitives) ? mesh.primitives[0] : null;
|
|
107
|
+
if (!prim)
|
|
108
|
+
continue;
|
|
109
|
+
const posAcc = prim.attributes?.POSITION;
|
|
110
|
+
const normAcc = prim.attributes?.NORMAL;
|
|
111
|
+
const idxAcc = prim.indices;
|
|
112
|
+
if (typeof posAcc !== 'number' || typeof normAcc !== 'number' || typeof idxAcc !== 'number')
|
|
113
|
+
continue;
|
|
114
|
+
const pos = readAccessor(posAcc).array;
|
|
115
|
+
const nor = readAccessor(normAcc).array;
|
|
116
|
+
const ind = readAccessor(idxAcc).array;
|
|
117
|
+
const expressId = typeof node?.extras?.expressId === 'number' ? node.extras.expressId : 0;
|
|
118
|
+
out.push({
|
|
119
|
+
expressId,
|
|
120
|
+
positions: new Float32Array(pos),
|
|
121
|
+
normals: new Float32Array(nor),
|
|
122
|
+
indices: new Uint32Array(ind),
|
|
123
|
+
color: [0.8, 0.8, 0.8, 1],
|
|
124
|
+
ifcType: 'IfcElement',
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return out;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=glb.js.map
|
package/dist/glb.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glb.js","sourceRoot":"","sources":["../src/glb.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,4 +10,8 @@ export { MergedExporter, type MergeModelInput, type MergeExportOptions, type Mer
|
|
|
10
10
|
export { collectReferencedEntityIds, getVisibleEntityIds, collectStyleEntities } from './reference-collector.js';
|
|
11
11
|
export { convertEntityType, convertStepLine, needsConversion, describeConversion, type IfcSchemaVersion } from './schema-converter.js';
|
|
12
12
|
export { Ifc5Exporter, IFC5_KNOWN_PROP_NAMES, type Ifc5ExportOptions, type Ifc5ExportResult } from './ifc5-exporter.js';
|
|
13
|
+
export type { Vec3, Lod0Element, Lod0Json, Lod1MetaJson, GenerateLod1Result } from './lod-geometry-types.js';
|
|
14
|
+
export { generateLod0 } from './lod0-generator.js';
|
|
15
|
+
export { generateLod1, type GenerateLod1Options } from './lod1-generator.js';
|
|
16
|
+
export { parseGLB, extractGlbMapping, parseGLBToMeshData } from './glb.js';
|
|
13
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxI,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAClJ,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACjH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACvI,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxI,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAClJ,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACjH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACvI,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGxH,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7G,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -13,4 +13,7 @@ export { MergedExporter } from './merged-exporter.js';
|
|
|
13
13
|
export { collectReferencedEntityIds, getVisibleEntityIds, collectStyleEntities } from './reference-collector.js';
|
|
14
14
|
export { convertEntityType, convertStepLine, needsConversion, describeConversion } from './schema-converter.js';
|
|
15
15
|
export { Ifc5Exporter, IFC5_KNOWN_PROP_NAMES } from './ifc5-exporter.js';
|
|
16
|
+
export { generateLod0 } from './lod0-generator.js';
|
|
17
|
+
export { generateLod1 } from './lod1-generator.js';
|
|
18
|
+
export { parseGLB, extractGlbMapping, parseGLBToMeshData } from './glb.js';
|
|
16
19
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;GAEG;AAEH,OAAO,EAAE,YAAY,EAA0B,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAA6B,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAyB,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,cAAc,EAA4B,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,YAAY,EAA0E,MAAM,oBAAoB,CAAC;AACxI,OAAO,EAAE,cAAc,EAA8F,MAAM,sBAAsB,CAAC;AAClJ,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACjH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAyB,MAAM,uBAAuB,CAAC;AACvI,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAiD,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;GAEG;AAEH,OAAO,EAAE,YAAY,EAA0B,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAA6B,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAyB,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,cAAc,EAA4B,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,YAAY,EAA0E,MAAM,oBAAoB,CAAC;AACxI,OAAO,EAAE,cAAc,EAA8F,MAAM,sBAAsB,CAAC;AAClJ,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACjH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAyB,MAAM,uBAAuB,CAAC;AACvI,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAiD,MAAM,oBAAoB,CAAC;AAIxH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAA4B,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export type Vec3 = [number, number, number];
|
|
2
|
+
export type Lod0Element = {
|
|
3
|
+
expressID: number;
|
|
4
|
+
globalId: string | null;
|
|
5
|
+
ifcClass: string;
|
|
6
|
+
name: string | null;
|
|
7
|
+
/** Row-major 4x4 world matrix */
|
|
8
|
+
transform: [
|
|
9
|
+
number,
|
|
10
|
+
number,
|
|
11
|
+
number,
|
|
12
|
+
number,
|
|
13
|
+
number,
|
|
14
|
+
number,
|
|
15
|
+
number,
|
|
16
|
+
number,
|
|
17
|
+
number,
|
|
18
|
+
number,
|
|
19
|
+
number,
|
|
20
|
+
number,
|
|
21
|
+
number,
|
|
22
|
+
number,
|
|
23
|
+
number,
|
|
24
|
+
number
|
|
25
|
+
];
|
|
26
|
+
/** World-space axis-aligned bounding box */
|
|
27
|
+
bbox: {
|
|
28
|
+
min: Vec3;
|
|
29
|
+
max: Vec3;
|
|
30
|
+
};
|
|
31
|
+
centroid: Vec3;
|
|
32
|
+
/** Where bbox came from (required for fallback) */
|
|
33
|
+
bbox_source: 'shape' | 'fallback';
|
|
34
|
+
};
|
|
35
|
+
export type Lod0Json = {
|
|
36
|
+
schema: 'ifc-lite-geometry';
|
|
37
|
+
lod: 0;
|
|
38
|
+
units: 'm';
|
|
39
|
+
elements: Lod0Element[];
|
|
40
|
+
};
|
|
41
|
+
export type Lod1MetaJson = {
|
|
42
|
+
schema: 'ifc-lite-geometry';
|
|
43
|
+
lod: 1;
|
|
44
|
+
status: 'ok' | 'degraded';
|
|
45
|
+
fallback?: 'boxes_from_lod0';
|
|
46
|
+
failedElements: number[];
|
|
47
|
+
notes: string[];
|
|
48
|
+
/** expressID -> node/mesh mapping */
|
|
49
|
+
mapping: Record<string, {
|
|
50
|
+
node: number;
|
|
51
|
+
mesh: number;
|
|
52
|
+
}>;
|
|
53
|
+
};
|
|
54
|
+
export type GenerateLod1Result = {
|
|
55
|
+
glb: Uint8Array;
|
|
56
|
+
meta: Lod1MetaJson;
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=lod-geometry-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lod-geometry-types.d.ts","sourceRoot":"","sources":["../src/lod-geometry-types.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE5C,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,iCAAiC;IACjC,SAAS,EAAE;QACT,MAAM;QAAE,MAAM;QAAE,MAAM;QAAE,MAAM;QAC9B,MAAM;QAAE,MAAM;QAAE,MAAM;QAAE,MAAM;QAC9B,MAAM;QAAE,MAAM;QAAE,MAAM;QAAE,MAAM;QAC9B,MAAM;QAAE,MAAM;QAAE,MAAM;QAAE,MAAM;KAC/B,CAAC;IACF,4CAA4C;IAC5C,IAAI,EAAE;QAAE,GAAG,EAAE,IAAI,CAAC;QAAC,GAAG,EAAE,IAAI,CAAA;KAAE,CAAC;IAC/B,QAAQ,EAAE,IAAI,CAAC;IACf,mDAAmD;IACnD,WAAW,EAAE,OAAO,GAAG,UAAU,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,GAAG,EAAE,CAAC,CAAC;IACP,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,GAAG,EAAE,CAAC,CAAC;IACP,MAAM,EAAE,IAAI,GAAG,UAAU,CAAC;IAC1B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lod-geometry-types.js","sourceRoot":"","sources":["../src/lod-geometry-types.ts"],"names":[],"mappings":"AAAA;;+DAE+D"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Vec3 } from './lod-geometry-types.js';
|
|
2
|
+
export type IfcInput = ArrayBuffer | Uint8Array | string;
|
|
3
|
+
/** Read an IFC file from a path, ArrayBuffer, or Uint8Array into an ArrayBuffer. */
|
|
4
|
+
export declare function readIfcInput(input: IfcInput): Promise<ArrayBuffer>;
|
|
5
|
+
/**
|
|
6
|
+
* Normalize IFC type names to canonical PascalCase (e.g. "IFCWALL" → "IfcWall").
|
|
7
|
+
* For multi-word uppercase types (e.g. "IFCWALLSTANDARDCASE") we pass through
|
|
8
|
+
* as-is since we cannot recover PascalCase without a full type registry lookup.
|
|
9
|
+
*/
|
|
10
|
+
export declare function normalizeIfcTypeName(typeName: string): string;
|
|
11
|
+
export declare function vec3(x: number, y: number, z: number): Vec3;
|
|
12
|
+
export declare function vec3Cross(a: Vec3, b: Vec3): Vec3;
|
|
13
|
+
export declare function vec3Normalize(a: Vec3, fallback: Vec3): Vec3;
|
|
14
|
+
export declare function mat4Identity(): Float64Array;
|
|
15
|
+
/** Row-major 4x4 multiply: out = a * b */
|
|
16
|
+
export declare function mat4Mul(a: Float64Array, b: Float64Array): Float64Array;
|
|
17
|
+
export declare function mat4FromBasisTranslation(xAxis: Vec3, yAxis: Vec3, zAxis: Vec3, t: Vec3): Float64Array;
|
|
18
|
+
export declare function mat4TransformPoint(m: Float64Array, p: Vec3): Vec3;
|
|
19
|
+
export declare function aabbFromPoints(points: Vec3[]): {
|
|
20
|
+
min: Vec3;
|
|
21
|
+
max: Vec3;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=lod-geometry-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lod-geometry-utils.d.ts","sourceRoot":"","sources":["../src/lod-geometry-utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEpD,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,CAAC;AAEzD,oFAAoF;AACpF,wBAAsB,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAcxE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO7D;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAE1D;AAMD,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAMhD;AAMD,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,CAI3D;AAED,wBAAgB,YAAY,IAAI,YAAY,CAO3C;AAED,0CAA0C;AAC1C,wBAAgB,OAAO,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,YAAY,CAatE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,YAAY,CAQrG;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAOjE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG;IAAE,GAAG,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,CAavE"}
|
|
@@ -0,0 +1,113 @@
|
|
|
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
|
+
/** Read an IFC file from a path, ArrayBuffer, or Uint8Array into an ArrayBuffer. */
|
|
5
|
+
export async function readIfcInput(input) {
|
|
6
|
+
if (typeof input === 'string') {
|
|
7
|
+
// Node-only path reading (dynamic import so browser bundles don't include fs)
|
|
8
|
+
const fs = await import('node:fs/promises');
|
|
9
|
+
const buf = await fs.readFile(input);
|
|
10
|
+
// Copy into tightly-sized buffer (fs.readFile may return a larger underlying ArrayBuffer)
|
|
11
|
+
return new Uint8Array(buf).buffer;
|
|
12
|
+
}
|
|
13
|
+
if (input instanceof ArrayBuffer)
|
|
14
|
+
return input;
|
|
15
|
+
// Uint8Array view — avoid copy when already covering the entire buffer
|
|
16
|
+
if (input.byteOffset === 0 && input.byteLength === input.buffer.byteLength) {
|
|
17
|
+
return input.buffer;
|
|
18
|
+
}
|
|
19
|
+
return input.buffer.slice(input.byteOffset, input.byteOffset + input.byteLength);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Normalize IFC type names to canonical PascalCase (e.g. "IFCWALL" → "IfcWall").
|
|
23
|
+
* For multi-word uppercase types (e.g. "IFCWALLSTANDARDCASE") we pass through
|
|
24
|
+
* as-is since we cannot recover PascalCase without a full type registry lookup.
|
|
25
|
+
*/
|
|
26
|
+
export function normalizeIfcTypeName(typeName) {
|
|
27
|
+
const s = String(typeName || '').trim();
|
|
28
|
+
if (!s)
|
|
29
|
+
return '';
|
|
30
|
+
// Already in PascalCase (e.g. "IfcWall", "IfcWallStandardCase")
|
|
31
|
+
if (s.startsWith('Ifc') && s.length > 3 && s[3] >= 'A' && s[3] <= 'Z')
|
|
32
|
+
return s;
|
|
33
|
+
// Pass through as-is — uppercase form is valid for matching
|
|
34
|
+
return s;
|
|
35
|
+
}
|
|
36
|
+
export function vec3(x, y, z) {
|
|
37
|
+
return [x, y, z];
|
|
38
|
+
}
|
|
39
|
+
function vec3Dot(a, b) {
|
|
40
|
+
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
|
41
|
+
}
|
|
42
|
+
export function vec3Cross(a, b) {
|
|
43
|
+
return [
|
|
44
|
+
a[1] * b[2] - a[2] * b[1],
|
|
45
|
+
a[2] * b[0] - a[0] * b[2],
|
|
46
|
+
a[0] * b[1] - a[1] * b[0],
|
|
47
|
+
];
|
|
48
|
+
}
|
|
49
|
+
function vec3Len(a) {
|
|
50
|
+
return Math.sqrt(vec3Dot(a, a));
|
|
51
|
+
}
|
|
52
|
+
export function vec3Normalize(a, fallback) {
|
|
53
|
+
const l = vec3Len(a);
|
|
54
|
+
if (!Number.isFinite(l) || l <= 1e-12)
|
|
55
|
+
return fallback;
|
|
56
|
+
return [a[0] / l, a[1] / l, a[2] / l];
|
|
57
|
+
}
|
|
58
|
+
export function mat4Identity() {
|
|
59
|
+
return new Float64Array([
|
|
60
|
+
1, 0, 0, 0,
|
|
61
|
+
0, 1, 0, 0,
|
|
62
|
+
0, 0, 1, 0,
|
|
63
|
+
0, 0, 0, 1,
|
|
64
|
+
]);
|
|
65
|
+
}
|
|
66
|
+
/** Row-major 4x4 multiply: out = a * b */
|
|
67
|
+
export function mat4Mul(a, b) {
|
|
68
|
+
const o = new Float64Array(16);
|
|
69
|
+
for (let r = 0; r < 4; r++) {
|
|
70
|
+
const r0 = r * 4;
|
|
71
|
+
for (let c = 0; c < 4; c++) {
|
|
72
|
+
o[r0 + c] =
|
|
73
|
+
a[r0 + 0] * b[0 * 4 + c] +
|
|
74
|
+
a[r0 + 1] * b[1 * 4 + c] +
|
|
75
|
+
a[r0 + 2] * b[2 * 4 + c] +
|
|
76
|
+
a[r0 + 3] * b[3 * 4 + c];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return o;
|
|
80
|
+
}
|
|
81
|
+
export function mat4FromBasisTranslation(xAxis, yAxis, zAxis, t) {
|
|
82
|
+
// Row-major, columns are basis vectors (x,y,z), last column is translation.
|
|
83
|
+
return new Float64Array([
|
|
84
|
+
xAxis[0], yAxis[0], zAxis[0], t[0],
|
|
85
|
+
xAxis[1], yAxis[1], zAxis[1], t[1],
|
|
86
|
+
xAxis[2], yAxis[2], zAxis[2], t[2],
|
|
87
|
+
0, 0, 0, 1,
|
|
88
|
+
]);
|
|
89
|
+
}
|
|
90
|
+
export function mat4TransformPoint(m, p) {
|
|
91
|
+
const x = p[0], y = p[1], z = p[2];
|
|
92
|
+
return [
|
|
93
|
+
m[0] * x + m[1] * y + m[2] * z + m[3],
|
|
94
|
+
m[4] * x + m[5] * y + m[6] * z + m[7],
|
|
95
|
+
m[8] * x + m[9] * y + m[10] * z + m[11],
|
|
96
|
+
];
|
|
97
|
+
}
|
|
98
|
+
export function aabbFromPoints(points) {
|
|
99
|
+
let minX = Infinity, minY = Infinity, minZ = Infinity;
|
|
100
|
+
let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
101
|
+
for (const p of points) {
|
|
102
|
+
minX = Math.min(minX, p[0]);
|
|
103
|
+
minY = Math.min(minY, p[1]);
|
|
104
|
+
minZ = Math.min(minZ, p[2]);
|
|
105
|
+
maxX = Math.max(maxX, p[0]);
|
|
106
|
+
maxY = Math.max(maxY, p[1]);
|
|
107
|
+
maxZ = Math.max(maxZ, p[2]);
|
|
108
|
+
}
|
|
109
|
+
if (!Number.isFinite(minX))
|
|
110
|
+
return { min: [0, 0, 0], max: [0, 0, 0] };
|
|
111
|
+
return { min: [minX, minY, minZ], max: [maxX, maxY, maxZ] };
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=lod-geometry-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lod-geometry-utils.js","sourceRoot":"","sources":["../src/lod-geometry-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lod0-generator.d.ts","sourceRoot":"","sources":["../src/lod0-generator.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAqB,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAWL,KAAK,QAAQ,EACd,MAAM,yBAAyB,CAAC;AAiDjC,wBAAsB,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAgPrE"}
|
|
@@ -0,0 +1,287 @@
|
|
|
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
|
+
import { StepTokenizer, EntityExtractor, extractLengthUnitScale, getAllAttributesForEntity, } from '@ifc-lite/parser';
|
|
5
|
+
import { aabbFromPoints, mat4FromBasisTranslation, mat4Identity, mat4Mul, mat4TransformPoint, normalizeIfcTypeName, vec3, vec3Cross, vec3Normalize, readIfcInput, } from './lod-geometry-utils.js';
|
|
6
|
+
function buildEntityIndex(source) {
|
|
7
|
+
const tokenizer = new StepTokenizer(source);
|
|
8
|
+
const byId = new Map();
|
|
9
|
+
const byType = new Map();
|
|
10
|
+
for (const ref of tokenizer.scanEntitiesFast()) {
|
|
11
|
+
const t = String(ref.type || '').toUpperCase();
|
|
12
|
+
const er = {
|
|
13
|
+
expressId: ref.expressId,
|
|
14
|
+
type: t,
|
|
15
|
+
byteOffset: ref.offset,
|
|
16
|
+
byteLength: ref.length,
|
|
17
|
+
lineNumber: ref.line,
|
|
18
|
+
};
|
|
19
|
+
byId.set(er.expressId, er);
|
|
20
|
+
const arr = byType.get(t);
|
|
21
|
+
if (arr)
|
|
22
|
+
arr.push(er.expressId);
|
|
23
|
+
else
|
|
24
|
+
byType.set(t, [er.expressId]);
|
|
25
|
+
}
|
|
26
|
+
return { byId, byType };
|
|
27
|
+
}
|
|
28
|
+
function findAttrIndex(typeName, attrName) {
|
|
29
|
+
const attrs = getAllAttributesForEntity(typeName);
|
|
30
|
+
if (!attrs || attrs.length === 0)
|
|
31
|
+
return null;
|
|
32
|
+
const idx = attrs.findIndex((a) => a?.name === attrName);
|
|
33
|
+
return idx >= 0 ? idx : null;
|
|
34
|
+
}
|
|
35
|
+
function isCandidateElementType(typeUpper) {
|
|
36
|
+
// Fast prefilter: skip common non-placeable types.
|
|
37
|
+
if (!typeUpper || !typeUpper.startsWith('IFC'))
|
|
38
|
+
return false;
|
|
39
|
+
if (typeUpper.startsWith('IFCREL'))
|
|
40
|
+
return false;
|
|
41
|
+
if (typeUpper.startsWith('IFCPROPERTY'))
|
|
42
|
+
return false;
|
|
43
|
+
if (typeUpper.startsWith('IFCQUANTITY'))
|
|
44
|
+
return false;
|
|
45
|
+
if (typeUpper.startsWith('IFCMATERIAL'))
|
|
46
|
+
return false;
|
|
47
|
+
if (typeUpper.startsWith('IFCPRESENTATION'))
|
|
48
|
+
return false;
|
|
49
|
+
if (typeUpper.startsWith('IFCREPRESENTATION'))
|
|
50
|
+
return false;
|
|
51
|
+
if (typeUpper.startsWith('IFCSTYLE'))
|
|
52
|
+
return false;
|
|
53
|
+
if (typeUpper === 'IFCCARTESIANPOINT')
|
|
54
|
+
return false;
|
|
55
|
+
if (typeUpper === 'IFCDIRECTION')
|
|
56
|
+
return false;
|
|
57
|
+
if (typeUpper.startsWith('IFCAXIS2PLACEMENT'))
|
|
58
|
+
return false;
|
|
59
|
+
if (typeUpper === 'IFCLOCALPLACEMENT')
|
|
60
|
+
return false;
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
export async function generateLod0(input) {
|
|
64
|
+
const buffer = await readIfcInput(input);
|
|
65
|
+
const source = new Uint8Array(buffer);
|
|
66
|
+
const entityIndex = buildEntityIndex(source);
|
|
67
|
+
const unitScale = extractLengthUnitScale(source, entityIndex);
|
|
68
|
+
const extractor = new EntityExtractor(source);
|
|
69
|
+
const entityCache = new Map();
|
|
70
|
+
const placementCache = new Map();
|
|
71
|
+
const axisCache = new Map();
|
|
72
|
+
const pointCache = new Map();
|
|
73
|
+
const dirCache = new Map();
|
|
74
|
+
const getEntity = (id) => {
|
|
75
|
+
if (entityCache.has(id))
|
|
76
|
+
return entityCache.get(id) ?? null;
|
|
77
|
+
const ref = entityIndex.byId.get(id);
|
|
78
|
+
const ent = ref ? extractor.extractEntity(ref) : null;
|
|
79
|
+
entityCache.set(id, ent);
|
|
80
|
+
return ent;
|
|
81
|
+
};
|
|
82
|
+
const getPoint = (id) => {
|
|
83
|
+
if (pointCache.has(id))
|
|
84
|
+
return pointCache.get(id) ?? null;
|
|
85
|
+
const ent = getEntity(id);
|
|
86
|
+
if (!ent || String(ent.type || '').toUpperCase() !== 'IFCCARTESIANPOINT') {
|
|
87
|
+
pointCache.set(id, null);
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
const coords = ent.attributes?.[0];
|
|
91
|
+
let x = 0, y = 0, z = 0;
|
|
92
|
+
if (Array.isArray(coords)) {
|
|
93
|
+
x = Number(coords[0] ?? 0);
|
|
94
|
+
y = Number(coords[1] ?? 0);
|
|
95
|
+
z = Number(coords[2] ?? 0);
|
|
96
|
+
}
|
|
97
|
+
const v = [x * unitScale, y * unitScale, z * unitScale];
|
|
98
|
+
pointCache.set(id, v);
|
|
99
|
+
return v;
|
|
100
|
+
};
|
|
101
|
+
const getDirection = (id) => {
|
|
102
|
+
if (dirCache.has(id))
|
|
103
|
+
return dirCache.get(id);
|
|
104
|
+
const ent = getEntity(id);
|
|
105
|
+
if (!ent || String(ent.type || '').toUpperCase() !== 'IFCDIRECTION')
|
|
106
|
+
return null;
|
|
107
|
+
const ratios = ent.attributes?.[0];
|
|
108
|
+
let x = 1, y = 0, z = 0;
|
|
109
|
+
if (Array.isArray(ratios)) {
|
|
110
|
+
x = Number(ratios[0] ?? 1);
|
|
111
|
+
y = Number(ratios[1] ?? 0);
|
|
112
|
+
z = Number(ratios[2] ?? 0);
|
|
113
|
+
}
|
|
114
|
+
const v = [x, y, z];
|
|
115
|
+
dirCache.set(id, v);
|
|
116
|
+
return v;
|
|
117
|
+
};
|
|
118
|
+
const getAxisPlacementMatrix = (id) => {
|
|
119
|
+
const cached = axisCache.get(id);
|
|
120
|
+
if (cached)
|
|
121
|
+
return cached;
|
|
122
|
+
const ent = getEntity(id);
|
|
123
|
+
if (!ent)
|
|
124
|
+
return mat4Identity();
|
|
125
|
+
const t = String(ent.type || '').toUpperCase();
|
|
126
|
+
let m = mat4Identity();
|
|
127
|
+
if (t === 'IFCAXIS2PLACEMENT3D') {
|
|
128
|
+
const locRef = ent.attributes?.[0];
|
|
129
|
+
const axisRef = ent.attributes?.[1];
|
|
130
|
+
const refDirRef = ent.attributes?.[2];
|
|
131
|
+
const tVec = typeof locRef === 'number' ? (getPoint(locRef) ?? [0, 0, 0]) : [0, 0, 0];
|
|
132
|
+
const zAxis = typeof axisRef === 'number' ? (getDirection(axisRef) ?? [0, 0, 1]) : [0, 0, 1];
|
|
133
|
+
const xAxis0 = typeof refDirRef === 'number' ? (getDirection(refDirRef) ?? [1, 0, 0]) : [1, 0, 0];
|
|
134
|
+
const zN = vec3Normalize(zAxis, [0, 0, 1]);
|
|
135
|
+
const xN0 = vec3Normalize(xAxis0, [1, 0, 0]);
|
|
136
|
+
const yN = vec3Normalize(vec3Cross(zN, xN0), [0, 1, 0]);
|
|
137
|
+
const xN = vec3Normalize(vec3Cross(yN, zN), [1, 0, 0]);
|
|
138
|
+
m = mat4FromBasisTranslation(xN, yN, zN, tVec);
|
|
139
|
+
}
|
|
140
|
+
else if (t === 'IFCAXIS2PLACEMENT2D') {
|
|
141
|
+
const locRef = ent.attributes?.[0];
|
|
142
|
+
const refDirRef = ent.attributes?.[1];
|
|
143
|
+
const t2 = typeof locRef === 'number' ? (getPoint(locRef) ?? [0, 0, 0]) : [0, 0, 0];
|
|
144
|
+
const xAxis0 = typeof refDirRef === 'number' ? (getDirection(refDirRef) ?? [1, 0, 0]) : [1, 0, 0];
|
|
145
|
+
const xN = vec3Normalize(xAxis0, [1, 0, 0]);
|
|
146
|
+
const zN = [0, 0, 1];
|
|
147
|
+
const yN = vec3Normalize(vec3Cross(zN, xN), [0, 1, 0]);
|
|
148
|
+
m = mat4FromBasisTranslation(xN, yN, zN, t2);
|
|
149
|
+
}
|
|
150
|
+
axisCache.set(id, m);
|
|
151
|
+
return m;
|
|
152
|
+
};
|
|
153
|
+
const getPlacementMatrix = (id) => {
|
|
154
|
+
const cached = placementCache.get(id);
|
|
155
|
+
if (cached)
|
|
156
|
+
return cached;
|
|
157
|
+
const ent = getEntity(id);
|
|
158
|
+
if (!ent || String(ent.type || '').toUpperCase() !== 'IFCLOCALPLACEMENT') {
|
|
159
|
+
const ident = mat4Identity();
|
|
160
|
+
placementCache.set(id, ident);
|
|
161
|
+
return ident;
|
|
162
|
+
}
|
|
163
|
+
// IfcLocalPlacement: (PlacementRelTo, RelativePlacement)
|
|
164
|
+
const relTo = ent.attributes?.[0];
|
|
165
|
+
const relPlacement = ent.attributes?.[1];
|
|
166
|
+
const local = typeof relPlacement === 'number' ? getAxisPlacementMatrix(relPlacement) : mat4Identity();
|
|
167
|
+
const parent = typeof relTo === 'number' ? getPlacementMatrix(relTo) : mat4Identity();
|
|
168
|
+
const world = mat4Mul(parent, local);
|
|
169
|
+
placementCache.set(id, world);
|
|
170
|
+
return world;
|
|
171
|
+
};
|
|
172
|
+
const computeWorldAabbFromLocalAabb = (m, minL, maxL) => {
|
|
173
|
+
const corners = [
|
|
174
|
+
[minL[0], minL[1], minL[2]],
|
|
175
|
+
[maxL[0], minL[1], minL[2]],
|
|
176
|
+
[minL[0], maxL[1], minL[2]],
|
|
177
|
+
[minL[0], minL[1], maxL[2]],
|
|
178
|
+
[maxL[0], maxL[1], minL[2]],
|
|
179
|
+
[maxL[0], minL[1], maxL[2]],
|
|
180
|
+
[minL[0], maxL[1], maxL[2]],
|
|
181
|
+
[maxL[0], maxL[1], maxL[2]],
|
|
182
|
+
];
|
|
183
|
+
const pts = corners.map((c) => mat4TransformPoint(m, c));
|
|
184
|
+
return aabbFromPoints(pts);
|
|
185
|
+
};
|
|
186
|
+
const findBoundingBoxForRepresentation = (repRef) => {
|
|
187
|
+
if (typeof repRef !== 'number')
|
|
188
|
+
return null;
|
|
189
|
+
const repEnt = getEntity(repRef);
|
|
190
|
+
if (!repEnt)
|
|
191
|
+
return null;
|
|
192
|
+
const repType = String(repEnt.type || '').toUpperCase();
|
|
193
|
+
// IfcProductDefinitionShape: Representations (list)
|
|
194
|
+
if (repType === 'IFCPRODUCTDEFINITIONSHAPE') {
|
|
195
|
+
const reps = repEnt.attributes?.[2];
|
|
196
|
+
if (Array.isArray(reps)) {
|
|
197
|
+
for (const r of reps) {
|
|
198
|
+
const bb = findBoundingBoxForRepresentation(r);
|
|
199
|
+
if (bb)
|
|
200
|
+
return bb;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
// IfcShapeRepresentation: Items (list)
|
|
206
|
+
if (repType === 'IFCSHAPEREPRESENTATION') {
|
|
207
|
+
const items = repEnt.attributes?.[3];
|
|
208
|
+
if (Array.isArray(items)) {
|
|
209
|
+
for (const it of items) {
|
|
210
|
+
const bb = findBoundingBoxForRepresentation(it);
|
|
211
|
+
if (bb)
|
|
212
|
+
return bb;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
if (repType === 'IFCBOUNDINGBOX') {
|
|
218
|
+
const cornerRef = repEnt.attributes?.[0];
|
|
219
|
+
const xDim = Number(repEnt.attributes?.[1] ?? 0) * unitScale;
|
|
220
|
+
const yDim = Number(repEnt.attributes?.[2] ?? 0) * unitScale;
|
|
221
|
+
const zDim = Number(repEnt.attributes?.[3] ?? 0) * unitScale;
|
|
222
|
+
const corner = typeof cornerRef === 'number' ? (getPoint(cornerRef) ?? [0, 0, 0]) : [0, 0, 0];
|
|
223
|
+
const minL = [corner[0], corner[1], corner[2]];
|
|
224
|
+
const maxL = [corner[0] + xDim, corner[1] + yDim, corner[2] + zDim];
|
|
225
|
+
return { min: minL, max: maxL };
|
|
226
|
+
}
|
|
227
|
+
return null;
|
|
228
|
+
};
|
|
229
|
+
const elements = [];
|
|
230
|
+
for (const [id, ref] of entityIndex.byId) {
|
|
231
|
+
const typeUpper = ref.type;
|
|
232
|
+
if (!isCandidateElementType(typeUpper))
|
|
233
|
+
continue;
|
|
234
|
+
// Only include entities that declare ObjectPlacement in schema metadata
|
|
235
|
+
const objPlacementIdx = findAttrIndex(typeUpper, 'ObjectPlacement');
|
|
236
|
+
if (objPlacementIdx === null)
|
|
237
|
+
continue;
|
|
238
|
+
const ent = getEntity(id);
|
|
239
|
+
if (!ent)
|
|
240
|
+
continue;
|
|
241
|
+
const attrs = ent.attributes || [];
|
|
242
|
+
const globalIdIdx = findAttrIndex(typeUpper, 'GlobalId');
|
|
243
|
+
const nameIdx = findAttrIndex(typeUpper, 'Name');
|
|
244
|
+
const reprIdx = findAttrIndex(typeUpper, 'Representation');
|
|
245
|
+
const globalId = globalIdIdx !== null && typeof attrs[globalIdIdx] === 'string' ? attrs[globalIdIdx] : null;
|
|
246
|
+
const name = nameIdx !== null && typeof attrs[nameIdx] === 'string' ? attrs[nameIdx] : null;
|
|
247
|
+
const placementRef = attrs[objPlacementIdx];
|
|
248
|
+
const worldM = typeof placementRef === 'number' ? getPlacementMatrix(placementRef) : mat4Identity();
|
|
249
|
+
let bboxSource = 'fallback';
|
|
250
|
+
let localAabb = null;
|
|
251
|
+
if (reprIdx !== null) {
|
|
252
|
+
localAabb = findBoundingBoxForRepresentation(attrs[reprIdx]);
|
|
253
|
+
if (localAabb)
|
|
254
|
+
bboxSource = 'shape';
|
|
255
|
+
}
|
|
256
|
+
if (!localAabb) {
|
|
257
|
+
// Default 0.2m cube centered at origin (local space)
|
|
258
|
+
localAabb = { min: vec3(-0.1, -0.1, -0.1), max: vec3(0.1, 0.1, 0.1) };
|
|
259
|
+
bboxSource = 'fallback';
|
|
260
|
+
}
|
|
261
|
+
const worldAabb = computeWorldAabbFromLocalAabb(worldM, localAabb.min, localAabb.max);
|
|
262
|
+
const centroid = [
|
|
263
|
+
(worldAabb.min[0] + worldAabb.max[0]) / 2,
|
|
264
|
+
(worldAabb.min[1] + worldAabb.max[1]) / 2,
|
|
265
|
+
(worldAabb.min[2] + worldAabb.max[2]) / 2,
|
|
266
|
+
];
|
|
267
|
+
const ifcClass = normalizeIfcTypeName(typeUpper);
|
|
268
|
+
const transform = Array.from(worldM);
|
|
269
|
+
elements.push({
|
|
270
|
+
expressID: id,
|
|
271
|
+
globalId,
|
|
272
|
+
ifcClass,
|
|
273
|
+
name,
|
|
274
|
+
transform,
|
|
275
|
+
bbox: worldAabb,
|
|
276
|
+
centroid,
|
|
277
|
+
bbox_source: bboxSource,
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
return {
|
|
281
|
+
schema: 'ifc-lite-geometry',
|
|
282
|
+
lod: 0,
|
|
283
|
+
units: 'm',
|
|
284
|
+
elements,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=lod0-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lod0-generator.js","sourceRoot":"","sources":["../src/lod0-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { GeometryQuality } from '@ifc-lite/geometry';
|
|
2
|
+
import type { GenerateLod1Result } from './lod-geometry-types.js';
|
|
3
|
+
import { type IfcInput } from './lod-geometry-utils.js';
|
|
4
|
+
export type GenerateLod1Options = {
|
|
5
|
+
quality?: GeometryQuality;
|
|
6
|
+
/**
|
|
7
|
+
* Test-only hook to simulate meshing failure and force fallback.
|
|
8
|
+
* Not intended for production use.
|
|
9
|
+
*/
|
|
10
|
+
__forceMeshingErrorForTest?: boolean;
|
|
11
|
+
};
|
|
12
|
+
export declare function generateLod1(input: IfcInput, options?: GenerateLod1Options): Promise<GenerateLod1Result>;
|
|
13
|
+
//# sourceMappingURL=lod1-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lod1-generator.d.ts","sourceRoot":"","sources":["../src/lod1-generator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,oBAAoB,CAAC;AAKpF,OAAO,KAAK,EAAE,kBAAkB,EAAgC,MAAM,yBAAyB,CAAC;AAChG,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEtE,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B;;;OAGG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC,CAAC;AAmEF,wBAAsB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6ElH"}
|
|
@@ -0,0 +1,138 @@
|
|
|
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
|
+
import { GeometryProcessor } from '@ifc-lite/geometry';
|
|
5
|
+
import { GLTFExporter } from './gltf-exporter.js';
|
|
6
|
+
import { extractGlbMapping } from './glb.js';
|
|
7
|
+
import { generateLod0 } from './lod0-generator.js';
|
|
8
|
+
import { readIfcInput } from './lod-geometry-utils.js';
|
|
9
|
+
function buildBoxMeshFromAabb(min, max, expressId) {
|
|
10
|
+
// 24 vertices (4 per face) with correct per-face normals
|
|
11
|
+
const x0 = min[0], y0 = min[1], z0 = min[2];
|
|
12
|
+
const x1 = max[0], y1 = max[1], z1 = max[2];
|
|
13
|
+
// prettier-ignore
|
|
14
|
+
const positions = new Float32Array([
|
|
15
|
+
// bottom (z0) - normal [0,0,-1]
|
|
16
|
+
x0, y0, z0, x1, y0, z0, x1, y1, z0, x0, y1, z0,
|
|
17
|
+
// top (z1) - normal [0,0,1]
|
|
18
|
+
x0, y0, z1, x1, y0, z1, x1, y1, z1, x0, y1, z1,
|
|
19
|
+
// front (y0) - normal [0,-1,0]
|
|
20
|
+
x0, y0, z0, x1, y0, z0, x1, y0, z1, x0, y0, z1,
|
|
21
|
+
// back (y1) - normal [0,1,0]
|
|
22
|
+
x0, y1, z0, x1, y1, z0, x1, y1, z1, x0, y1, z1,
|
|
23
|
+
// left (x0) - normal [-1,0,0]
|
|
24
|
+
x0, y0, z0, x0, y1, z0, x0, y1, z1, x0, y0, z1,
|
|
25
|
+
// right (x1) - normal [1,0,0]
|
|
26
|
+
x1, y0, z0, x1, y1, z0, x1, y1, z1, x1, y0, z1,
|
|
27
|
+
]);
|
|
28
|
+
// prettier-ignore
|
|
29
|
+
const normals = new Float32Array([
|
|
30
|
+
0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, // bottom
|
|
31
|
+
0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, // top
|
|
32
|
+
0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, // front
|
|
33
|
+
0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, // back
|
|
34
|
+
-1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, // left
|
|
35
|
+
1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, // right
|
|
36
|
+
]);
|
|
37
|
+
// 12 triangles (two per face), referencing 24 vertices
|
|
38
|
+
// Winding order follows right-hand rule so cross(e1,e2) matches the declared normal.
|
|
39
|
+
// prettier-ignore
|
|
40
|
+
const indices = new Uint32Array([
|
|
41
|
+
0, 2, 1, 0, 3, 2, // bottom (normal 0, 0,-1)
|
|
42
|
+
4, 5, 6, 4, 6, 7, // top (normal 0, 0, 1)
|
|
43
|
+
8, 9, 10, 8, 10, 11, // front (normal 0,-1, 0)
|
|
44
|
+
12, 14, 13, 12, 15, 14, // back (normal 0, 1, 0)
|
|
45
|
+
16, 18, 17, 16, 19, 18, // left (normal -1, 0, 0)
|
|
46
|
+
20, 21, 22, 20, 22, 23, // right (normal 1, 0, 0)
|
|
47
|
+
]);
|
|
48
|
+
return {
|
|
49
|
+
expressId,
|
|
50
|
+
positions,
|
|
51
|
+
normals,
|
|
52
|
+
indices,
|
|
53
|
+
color: [0.8, 0.8, 0.8, 1],
|
|
54
|
+
ifcType: 'IfcBuildingElementProxy',
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function buildFallbackGeometryFromLod0(lod0) {
|
|
58
|
+
const meshes = [];
|
|
59
|
+
const failed = [];
|
|
60
|
+
for (const el of lod0.elements) {
|
|
61
|
+
try {
|
|
62
|
+
meshes.push(buildBoxMeshFromAabb(el.bbox.min, el.bbox.max, el.expressID));
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
failed.push(el.expressID);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return { meshes, failed };
|
|
69
|
+
}
|
|
70
|
+
export async function generateLod1(input, options = {}) {
|
|
71
|
+
// LOD0 is mandatory and used for degraded detection + fallback.
|
|
72
|
+
const lod0 = await generateLod0(input);
|
|
73
|
+
const allExpress = new Set(lod0.elements.map((e) => e.expressID));
|
|
74
|
+
const notes = [];
|
|
75
|
+
try {
|
|
76
|
+
if (options.__forceMeshingErrorForTest) {
|
|
77
|
+
throw new Error('Forced meshing failure for test');
|
|
78
|
+
}
|
|
79
|
+
const buffer = await readIfcInput(input);
|
|
80
|
+
const gp = new GeometryProcessor({ quality: options.quality });
|
|
81
|
+
await gp.init();
|
|
82
|
+
const geom = await gp.process(new Uint8Array(buffer));
|
|
83
|
+
const exporter = new GLTFExporter(geom);
|
|
84
|
+
const glb = exporter.exportGLB({ includeMetadata: true });
|
|
85
|
+
const mapping = extractGlbMapping(glb);
|
|
86
|
+
const mappedIds = new Set(Object.keys(mapping).map((k) => Number(k)).filter((n) => Number.isFinite(n)));
|
|
87
|
+
const failedElements = [];
|
|
88
|
+
for (const id of allExpress) {
|
|
89
|
+
if (!mappedIds.has(id))
|
|
90
|
+
failedElements.push(id);
|
|
91
|
+
}
|
|
92
|
+
const status = failedElements.length > 0 ? 'degraded' : 'ok';
|
|
93
|
+
if (status === 'degraded') {
|
|
94
|
+
notes.push('Some elements did not produce mesh output; GLB contains partial geometry.');
|
|
95
|
+
}
|
|
96
|
+
const meta = {
|
|
97
|
+
schema: 'ifc-lite-geometry',
|
|
98
|
+
lod: 1,
|
|
99
|
+
status,
|
|
100
|
+
failedElements,
|
|
101
|
+
notes,
|
|
102
|
+
mapping,
|
|
103
|
+
};
|
|
104
|
+
return { glb, meta };
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
// Full failure => mandatory fallback GLB from LOD0 bboxes
|
|
108
|
+
const errMsg = e instanceof Error ? e.message : String(e);
|
|
109
|
+
notes.push(`Meshing failed; using fallback boxes from LOD0. (${errMsg})`);
|
|
110
|
+
const { meshes } = buildFallbackGeometryFromLod0(lod0);
|
|
111
|
+
const zero = { x: 0, y: 0, z: 0 };
|
|
112
|
+
const fallbackResult = {
|
|
113
|
+
meshes,
|
|
114
|
+
totalTriangles: meshes.reduce((s, m) => s + m.indices.length / 3, 0),
|
|
115
|
+
totalVertices: meshes.reduce((s, m) => s + m.positions.length / 3, 0),
|
|
116
|
+
coordinateInfo: {
|
|
117
|
+
originShift: zero,
|
|
118
|
+
originalBounds: { min: { ...zero }, max: { ...zero } },
|
|
119
|
+
shiftedBounds: { min: { ...zero }, max: { ...zero } },
|
|
120
|
+
hasLargeCoordinates: false,
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
const exporter = new GLTFExporter(fallbackResult);
|
|
124
|
+
const glb = exporter.exportGLB({ includeMetadata: true });
|
|
125
|
+
const mapping = extractGlbMapping(glb);
|
|
126
|
+
const meta = {
|
|
127
|
+
schema: 'ifc-lite-geometry',
|
|
128
|
+
lod: 1,
|
|
129
|
+
status: 'degraded',
|
|
130
|
+
fallback: 'boxes_from_lod0',
|
|
131
|
+
failedElements: lod0.elements.map((x) => x.expressID),
|
|
132
|
+
notes,
|
|
133
|
+
mapping,
|
|
134
|
+
};
|
|
135
|
+
return { glb, meta };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=lod1-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lod1-generator.js","sourceRoot":"","sources":["../src/lod1-generator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ifc-lite/export",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.17.0",
|
|
4
4
|
"description": "Export formats for IFC-Lite",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
"parquet-wasm": "^0.5.0",
|
|
16
16
|
"apache-arrow": "^14.0.0",
|
|
17
17
|
"jszip": "^3.10.0",
|
|
18
|
-
"@ifc-lite/geometry": "^1.
|
|
19
|
-
"@ifc-lite/data": "^1.14.
|
|
18
|
+
"@ifc-lite/geometry": "^1.16.0",
|
|
19
|
+
"@ifc-lite/data": "^1.14.6",
|
|
20
20
|
"@ifc-lite/encoding": "^1.14.4",
|
|
21
|
-
"@ifc-lite/parser": "^2.1.
|
|
21
|
+
"@ifc-lite/parser": "^2.1.4",
|
|
22
22
|
"@ifc-lite/mutations": "^1.14.3"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|