@ifc-lite/cli 0.15.1 → 0.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/diagnose-geometry.d.ts +13 -0
- package/dist/commands/diagnose-geometry.d.ts.map +1 -1
- package/dist/commands/diagnose-geometry.js +73 -8
- package/dist/commands/diagnose-geometry.js.map +1 -1
- package/dist/geometry-report.d.ts.map +1 -1
- package/dist/geometry-report.js +21 -0
- package/dist/geometry-report.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/loader.d.ts +8 -0
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +33 -10
- package/dist/loader.js.map +1 -1
- package/package.json +10 -10
|
@@ -1,2 +1,15 @@
|
|
|
1
|
+
import { type GeometryDiagnostics } from '@ifc-lite/geometry';
|
|
2
|
+
type WorstHost = GeometryDiagnostics['worstHosts'][number];
|
|
3
|
+
/** True for a bare STEP express ID ("42"), false for a GlobalId ("0YvCT2..."). */
|
|
4
|
+
export declare function isExpressId(raw: string): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Narrow the bounded `worstHosts` list to a single product and/or IFC type.
|
|
7
|
+
* Pure so it's directly unit-testable without a wasm/model round-trip.
|
|
8
|
+
*/
|
|
9
|
+
export declare function filterWorstHosts(hosts: WorstHost[], opts: {
|
|
10
|
+
productId?: number;
|
|
11
|
+
ifcType?: string;
|
|
12
|
+
}): WorstHost[];
|
|
1
13
|
export declare function diagnoseGeometryCommand(args: string[]): Promise<void>;
|
|
14
|
+
export {};
|
|
2
15
|
//# sourceMappingURL=diagnose-geometry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnose-geometry.d.ts","sourceRoot":"","sources":["../../src/commands/diagnose-geometry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"diagnose-geometry.d.ts","sourceRoot":"","sources":["../../src/commands/diagnose-geometry.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAqB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAMjF,KAAK,SAAS,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAAE,EAClB,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,SAAS,EAAE,CAMb;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6E3E"}
|
|
@@ -8,40 +8,105 @@
|
|
|
8
8
|
* rect_fast fast-path engagement, and the worst-failing hosts. The same contract
|
|
9
9
|
* the viewer surfaces on the streaming `complete` event and the server attaches to
|
|
10
10
|
* `ProcessingStats.geometry_diagnostics`. Use `--json` for the raw object.
|
|
11
|
+
*
|
|
12
|
+
* `--product <expressId|GlobalId>` and `--type <IfcType>` narrow the
|
|
13
|
+
* `worstHosts` detail list (the ONLY per-product records this contract
|
|
14
|
+
* carries — a bounded top-N of hosts that recorded a CSG failure; aggregate
|
|
15
|
+
* counts always describe the whole file, filters only narrow which
|
|
16
|
+
* per-product rows are shown/printed).
|
|
11
17
|
*/
|
|
12
|
-
import { readFile } from 'node:fs/promises';
|
|
18
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
13
19
|
import { GeometryProcessor } from '@ifc-lite/geometry';
|
|
14
20
|
import { getFlag, hasFlag, fatal } from '../output.js';
|
|
21
|
+
import { logger } from '../logger.js';
|
|
22
|
+
import { loadIfcBytes } from '../loader.js';
|
|
15
23
|
import { formatGeometryReport, NO_DIAGNOSTICS_LINE } from '../geometry-report.js';
|
|
24
|
+
/** True for a bare STEP express ID ("42"), false for a GlobalId ("0YvCT2..."). */
|
|
25
|
+
export function isExpressId(raw) {
|
|
26
|
+
return /^\d+$/.test(raw);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Narrow the bounded `worstHosts` list to a single product and/or IFC type.
|
|
30
|
+
* Pure so it's directly unit-testable without a wasm/model round-trip.
|
|
31
|
+
*/
|
|
32
|
+
export function filterWorstHosts(hosts, opts) {
|
|
33
|
+
return hosts.filter((h) => {
|
|
34
|
+
if (opts.productId !== undefined && h.productId !== opts.productId)
|
|
35
|
+
return false;
|
|
36
|
+
if (opts.ifcType && h.ifcType !== opts.ifcType)
|
|
37
|
+
return false;
|
|
38
|
+
return true;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
16
41
|
export async function diagnoseGeometryCommand(args) {
|
|
17
42
|
const filePath = args.find((a) => !a.startsWith('-'));
|
|
18
43
|
if (!filePath) {
|
|
19
|
-
fatal('Usage: ifc-lite diagnose-geometry <file.ifc> [--json] [--out file.json]'
|
|
44
|
+
fatal('Usage: ifc-lite diagnose-geometry <file.ifc> [--json] [--out file.json] ' +
|
|
45
|
+
'[--product <expressId|GlobalId>] [--type <IfcType>]');
|
|
20
46
|
return;
|
|
21
47
|
}
|
|
22
48
|
const asJson = hasFlag(args, '--json');
|
|
23
49
|
const outPath = getFlag(args, '--out');
|
|
50
|
+
const productArg = getFlag(args, '--product');
|
|
51
|
+
const typeArg = getFlag(args, '--type');
|
|
24
52
|
const buf = await readFile(filePath);
|
|
25
53
|
const bytes = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
26
54
|
const gp = new GeometryProcessor();
|
|
27
55
|
await gp.init();
|
|
28
|
-
|
|
56
|
+
let diag = gp.diagnoseGeometry(bytes);
|
|
57
|
+
if (diag && (productArg !== undefined || typeArg !== undefined)) {
|
|
58
|
+
let productId;
|
|
59
|
+
if (productArg !== undefined) {
|
|
60
|
+
if (isExpressId(productArg)) {
|
|
61
|
+
productId = parseInt(productArg, 10);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// GlobalId: resolve via the columnar parser's entity table (the wasm
|
|
65
|
+
// diagnostics pass never surfaces GlobalIds, only express IDs). Parse
|
|
66
|
+
// the bytes ALREADY in memory rather than re-reading the file from disk
|
|
67
|
+
// — the geometry pass above already loaded them, so this avoids a
|
|
68
|
+
// redundant disk read (the wasm IfcAPI exposes no GlobalId lookup, so a
|
|
69
|
+
// columnar parse is still required to map GlobalId → expressId).
|
|
70
|
+
const store = await loadIfcBytes(bytes, filePath);
|
|
71
|
+
const resolved = store.entities.getExpressIdByGlobalId(productArg);
|
|
72
|
+
if (resolved === -1) {
|
|
73
|
+
fatal(`--product: no entity found with GlobalId "${productArg}"`);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
productId = resolved;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
diag = { ...diag, worstHosts: filterWorstHosts(diag.worstHosts, { productId, ifcType: typeArg }) };
|
|
80
|
+
}
|
|
29
81
|
if (asJson || outPath) {
|
|
30
82
|
const json = JSON.stringify(diag ?? null, null, 2);
|
|
31
83
|
if (outPath) {
|
|
32
|
-
const { writeFile } = await import('node:fs/promises');
|
|
33
84
|
await writeFile(outPath, json);
|
|
34
|
-
|
|
85
|
+
logger.info(`Wrote diagnostics to ${outPath}`);
|
|
35
86
|
}
|
|
36
87
|
else {
|
|
37
|
-
|
|
88
|
+
process.stdout.write(json + '\n');
|
|
38
89
|
}
|
|
39
90
|
return;
|
|
40
91
|
}
|
|
41
92
|
if (!diag) {
|
|
42
|
-
|
|
93
|
+
process.stdout.write(NO_DIAGNOSTICS_LINE + '\n');
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// Always print the full aggregate report — `formatGeometryReport` renders the
|
|
97
|
+
// file-wide counts (totalCsgFailures, failuresByReason, classification, …)
|
|
98
|
+
// and handles an empty `worstHosts` list gracefully. When a --product/--type
|
|
99
|
+
// filter narrowed the list to nothing we append a note rather than hiding the
|
|
100
|
+
// aggregate context behind a bare "no match" line (PR #1564 review).
|
|
101
|
+
const report = formatGeometryReport(diag);
|
|
102
|
+
if ((productArg !== undefined || typeArg !== undefined) && diag.worstHosts.length === 0) {
|
|
103
|
+
process.stdout.write(report +
|
|
104
|
+
'\n\n' +
|
|
105
|
+
'(No worst-failing host record matches --product/--type — diagnose-geometry ' +
|
|
106
|
+
'only tracks the bounded top-N hosts that recorded a CSG failure; a filtered-out ' +
|
|
107
|
+
'product may simply have none.)\n');
|
|
43
108
|
return;
|
|
44
109
|
}
|
|
45
|
-
|
|
110
|
+
process.stdout.write(report + '\n');
|
|
46
111
|
}
|
|
47
112
|
//# sourceMappingURL=diagnose-geometry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnose-geometry.js","sourceRoot":"","sources":["../../src/commands/diagnose-geometry.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,sEAAsE;AACtE,4DAA4D;AAE5D
|
|
1
|
+
{"version":3,"file":"diagnose-geometry.js","sourceRoot":"","sources":["../../src/commands/diagnose-geometry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometry-report.d.ts","sourceRoot":"","sources":["../src/geometry-report.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,gFAAgF;AAChF,eAAO,MAAM,mBAAmB,0EACyC,CAAC;AAE1E,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"geometry-report.d.ts","sourceRoot":"","sources":["../src/geometry-report.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,gFAAgF;AAChF,eAAO,MAAM,mBAAmB,0EACyC,CAAC;AAE1E,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,CA6CnE"}
|
package/dist/geometry-report.js
CHANGED
|
@@ -31,8 +31,29 @@ export function formatGeometryReport(d) {
|
|
|
31
31
|
for (const h of d.worstHosts) {
|
|
32
32
|
const label = h.firstFailureLabel ? ` [${h.firstFailureLabel}]` : '';
|
|
33
33
|
lines.push(` #${h.productId} ${h.ifcType}: ${h.csgFailures} failure(s), ${h.openings} opening(s)${label}`);
|
|
34
|
+
const detail = formatHostDetail(h);
|
|
35
|
+
if (detail)
|
|
36
|
+
lines.push(` ${detail}`);
|
|
34
37
|
}
|
|
35
38
|
}
|
|
36
39
|
return lines.join('\n');
|
|
37
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Render a worst-failing host's optional per-product detail (bbox + triangle
|
|
43
|
+
* count). Both fields are opt-in — only captured when a void cut ran for that
|
|
44
|
+
* host (see `HostBbox`/`triangle_count` in the Rust `WorstHost` contract) — so
|
|
45
|
+
* this returns `undefined` rather than printing "undefined" when neither was
|
|
46
|
+
* recorded.
|
|
47
|
+
*/
|
|
48
|
+
function formatHostDetail(h) {
|
|
49
|
+
const parts = [];
|
|
50
|
+
if (h.bbox) {
|
|
51
|
+
const fmt = (v) => (Number.isFinite(v) ? v.toFixed(2) : String(v));
|
|
52
|
+
parts.push(`bbox=[${h.bbox.min.map(fmt).join(', ')}] – [${h.bbox.max.map(fmt).join(', ')}]`);
|
|
53
|
+
}
|
|
54
|
+
if (h.triangleCount !== undefined) {
|
|
55
|
+
parts.push(`triangles=${h.triangleCount.toLocaleString()}`);
|
|
56
|
+
}
|
|
57
|
+
return parts.length > 0 ? parts.join(' ') : undefined;
|
|
58
|
+
}
|
|
38
59
|
//# sourceMappingURL=geometry-report.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometry-report.js","sourceRoot":"","sources":["../src/geometry-report.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAS/D,gFAAgF;AAChF,MAAM,CAAC,MAAM,mBAAmB,GAC9B,uEAAuE,CAAC;AAE1E,MAAM,UAAU,oBAAoB,CAAC,CAAsB;IACzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CACR,wBAAwB,CAAC,CAAC,gBAAgB,WAAW,CAAC,CAAC,oBAAoB,aAAa,CACzF,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CACR,wBAAwB,CAAC,CAAC,cAAc,CAAC,KAAK,GAAG;QAC/C,gBAAgB,CAAC,CAAC,cAAc,CAAC,WAAW,cAAc,CAAC,CAAC,cAAc,CAAC,QAAQ,IAAI;QACvF,mBAAmB,CAAC,CAAC,cAAc,CAAC,cAAc,GAAG,CACxD,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAEpD,IAAI,CAAC,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC;IACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CACR,oBAAoB,EAAE,CAAC,KAAK,kBAAkB,EAAE,CAAC,WAAW,GAAG;QAC7D,wBAAwB,EAAE,CAAC,eAAe,iBAAiB,EAAE,CAAC,eAAe,IAAI;QACjF,YAAY,EAAE,CAAC,YAAY,eAAe,EAAE,CAAC,aAAa,iBAAiB,EAAE,CAAC,eAAe,GAAG,CACnG,CAAC;IAEF,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,KAAK,CAAC,IAAI,CACR,MAAM,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,WAAW,gBAAgB,CAAC,CAAC,QAAQ,cAAc,KAAK,EAAE,CAChG,CAAC;
|
|
1
|
+
{"version":3,"file":"geometry-report.js","sourceRoot":"","sources":["../src/geometry-report.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -63,6 +63,7 @@ const HELP = `
|
|
|
63
63
|
props <file.ifc> --id <N> All properties for a single entity
|
|
64
64
|
export <file.ifc> --format csv|json|ifc|hbjson Export data / Honeybee energy model
|
|
65
65
|
diagnose-geometry <file.ifc> [--json] CSG / opening diagnostics (failures, classification)
|
|
66
|
+
[--product ID|GUID] [--type T] Filter worst-hosts detail to one product/type
|
|
66
67
|
ids <file.ifc> <rules.ids> Validate against IDS rules
|
|
67
68
|
bcf <create|list|add-comment> Work with BCF collaboration files
|
|
68
69
|
clash <file.ifc> [--matrix] [--bcf F] Detect geometric clashes between elements
|
|
@@ -109,6 +110,9 @@ const HELP = `
|
|
|
109
110
|
ifc-lite props model.ifc --id 42
|
|
110
111
|
ifc-lite export model.ifc --format csv --type IfcWall --columns Name,Type,GlobalId
|
|
111
112
|
ifc-lite export model.ifc --format json --type IfcWall,IfcDoor
|
|
113
|
+
ifc-lite diagnose-geometry model.ifc --json
|
|
114
|
+
ifc-lite diagnose-geometry model.ifc --type IfcWall
|
|
115
|
+
ifc-lite diagnose-geometry model.ifc --product 0YvCT2_$X3_xJG3rzD8L_8
|
|
112
116
|
ifc-lite ids model.ifc requirements.ids --json
|
|
113
117
|
ifc-lite bcf create --title "Missing door" --out issue.bcf
|
|
114
118
|
ifc-lite clash model.ifc --matrix --json
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;+DAE+D;AAE/D;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,+DAA+D;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAE7B,MAAM,IAAI,GAAG;cACC,OAAO
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/loader.d.ts
CHANGED
|
@@ -5,6 +5,14 @@ import { type BimContext } from '@ifc-lite/sdk';
|
|
|
5
5
|
* Suppresses parser console output for clean CLI experience.
|
|
6
6
|
*/
|
|
7
7
|
export declare function loadIfcFile(filePath: string): Promise<IfcDataStore>;
|
|
8
|
+
/**
|
|
9
|
+
* Parse IFC bytes ALREADY in memory into an IfcDataStore — same validation and
|
|
10
|
+
* console-capture as {@link loadIfcFile}, but without a disk read. Lets callers
|
|
11
|
+
* that already hold the file buffer (e.g. `diagnose-geometry`, which read the
|
|
12
|
+
* bytes once for the geometry pass) resolve GlobalId→expressId without a second
|
|
13
|
+
* `readFile` of the same file. `label` is only used in error messages.
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadIfcBytes(bytes: Uint8Array, label?: string): Promise<IfcDataStore>;
|
|
8
16
|
/**
|
|
9
17
|
* Create a BimContext backed by a headless backend from an IFC file.
|
|
10
18
|
*/
|
package/dist/loader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAWA,OAAO,
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAWA,OAAO,EAA+B,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAoB,KAAK,UAAU,EAA4D,MAAM,eAAe,CAAC;AAI5H;;;GAGG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAGzE;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,UAAU,EACjB,KAAK,SAAU,GACd,OAAO,CAAC,YAAY,CAAC,CA6DvB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC,CAK/G;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC,CAUnD"}
|
package/dist/loader.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { readFile } from 'node:fs/promises';
|
|
8
8
|
import { logger } from './logger.js';
|
|
9
9
|
import { basename } from 'node:path';
|
|
10
|
-
import { IfcParser } from '@ifc-lite/parser';
|
|
10
|
+
import { IfcParser, unwrapIfcZipView } from '@ifc-lite/parser';
|
|
11
11
|
import { createBimContext } from '@ifc-lite/sdk';
|
|
12
12
|
import { HeadlessBackend } from './headless-backend.js';
|
|
13
13
|
import { createStreamingViewerAdapter, createStreamingVisibilityAdapter } from './streaming-viewer.js';
|
|
@@ -17,15 +17,37 @@ import { createStreamingViewerAdapter, createStreamingVisibilityAdapter } from '
|
|
|
17
17
|
*/
|
|
18
18
|
export async function loadIfcFile(filePath) {
|
|
19
19
|
const buffer = await readFile(filePath);
|
|
20
|
+
return loadIfcBytes(buffer, filePath);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Parse IFC bytes ALREADY in memory into an IfcDataStore — same validation and
|
|
24
|
+
* console-capture as {@link loadIfcFile}, but without a disk read. Lets callers
|
|
25
|
+
* that already hold the file buffer (e.g. `diagnose-geometry`, which read the
|
|
26
|
+
* bytes once for the geometry pass) resolve GlobalId→expressId without a second
|
|
27
|
+
* `readFile` of the same file. `label` is only used in error messages.
|
|
28
|
+
*/
|
|
29
|
+
export async function loadIfcBytes(bytes, label = 'input') {
|
|
20
30
|
// Validate the file is a STEP/IFC file
|
|
21
|
-
if (
|
|
22
|
-
process.stderr.write(`Error: ${
|
|
31
|
+
if (bytes.byteLength === 0) {
|
|
32
|
+
process.stderr.write(`Error: ${label} is empty (0 bytes)\n`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
// Transparent .ifcZIP unwrap (issue #1494) — cheap magic-byte no-op for an
|
|
36
|
+
// ordinary .ifc file. `unwrapIfcZipView` returns an ArrayBuffer over the
|
|
37
|
+
// model bytes (the input unchanged when it isn't a zip container), so this
|
|
38
|
+
// covers both the disk-read path and callers that already hold the buffer.
|
|
39
|
+
try {
|
|
40
|
+
bytes = new Uint8Array(await unwrapIfcZipView(bytes));
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
process.stderr.write(`Error: ${label}: ${err.message}\n`);
|
|
23
44
|
process.exit(1);
|
|
24
45
|
}
|
|
25
|
-
// Check for STEP file signature ("ISO-10303-21") in the first 256 bytes
|
|
26
|
-
|
|
46
|
+
// Check for STEP file signature ("ISO-10303-21") in the first 256 bytes.
|
|
47
|
+
// TextDecoder (not Buffer.toString) so a plain Uint8Array view works too.
|
|
48
|
+
const headerSnippet = new TextDecoder('latin1').decode(bytes.subarray(0, Math.min(bytes.byteLength, 256)));
|
|
27
49
|
if (!headerSnippet.includes('ISO-10303-21')) {
|
|
28
|
-
process.stderr.write(`Error: ${
|
|
50
|
+
process.stderr.write(`Error: ${label} is not a valid IFC/STEP file\n`);
|
|
29
51
|
process.exit(1);
|
|
30
52
|
}
|
|
31
53
|
const parser = new IfcParser();
|
|
@@ -43,14 +65,15 @@ export async function loadIfcFile(filePath) {
|
|
|
43
65
|
logger.debug(`parser: ${parts.map(String).join(' ')}`);
|
|
44
66
|
};
|
|
45
67
|
try {
|
|
46
|
-
// Ensure we pass the exact slice — Node Buffers
|
|
47
|
-
// a larger pooled ArrayBuffer, so buffer
|
|
48
|
-
|
|
68
|
+
// Ensure we pass the exact slice — Node Buffers / Uint8Array views may be
|
|
69
|
+
// windows into a larger pooled ArrayBuffer, so `.buffer` can include extra
|
|
70
|
+
// bytes.
|
|
71
|
+
const arrayBuffer = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
|
|
49
72
|
const store = await parser.parseColumnar(arrayBuffer, {
|
|
50
73
|
// The structured diagnostic channel, captured directly.
|
|
51
74
|
onDiagnostic: (m) => logger.debug(`parser: ${m}`),
|
|
52
75
|
});
|
|
53
|
-
store.fileSize =
|
|
76
|
+
store.fileSize = bytes.byteLength;
|
|
54
77
|
return store;
|
|
55
78
|
}
|
|
56
79
|
finally {
|
package/dist/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAqB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ifc-lite/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.1",
|
|
4
4
|
"description": "CLI toolkit for IFC files — query, validate, export, create, and script BIM data",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -21,21 +21,21 @@
|
|
|
21
21
|
],
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@ifc-lite/bcf": "^1.15.7",
|
|
24
|
-
"@ifc-lite/clash": "^1.
|
|
24
|
+
"@ifc-lite/clash": "^1.5.0",
|
|
25
25
|
"@ifc-lite/create": "^1.16.2",
|
|
26
|
-
"@ifc-lite/data": "^2.
|
|
27
|
-
"@ifc-lite/export": "^2.
|
|
26
|
+
"@ifc-lite/data": "^2.4.0",
|
|
27
|
+
"@ifc-lite/export": "^2.5.0",
|
|
28
28
|
"@ifc-lite/extensions": "^0.3.3",
|
|
29
|
-
"@ifc-lite/geometry": "^3.0
|
|
30
|
-
"@ifc-lite/ids": "^1.15.
|
|
31
|
-
"@ifc-lite/mcp": "^0.
|
|
32
|
-
"@ifc-lite/mutations": "^1.
|
|
33
|
-
"@ifc-lite/parser": "^3.
|
|
29
|
+
"@ifc-lite/geometry": "^3.1.0",
|
|
30
|
+
"@ifc-lite/ids": "^1.15.24",
|
|
31
|
+
"@ifc-lite/mcp": "^0.7.0",
|
|
32
|
+
"@ifc-lite/mutations": "^1.18.0",
|
|
33
|
+
"@ifc-lite/parser": "^3.7.0",
|
|
34
34
|
"@ifc-lite/query": "^1.14.11",
|
|
35
35
|
"@ifc-lite/sandbox": "^1.16.1",
|
|
36
36
|
"@ifc-lite/sdk": "^1.20.1",
|
|
37
37
|
"@ifc-lite/viewer-core": "^0.2.7",
|
|
38
|
-
"@ifc-lite/wasm": "^3.0.
|
|
38
|
+
"@ifc-lite/wasm": "^3.0.5"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@types/node": "^26.0.1",
|