@ifc-lite/cli 0.16.0 → 0.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/commands/extract-entities.d.ts +56 -0
- package/dist/commands/extract-entities.d.ts.map +1 -0
- package/dist/commands/extract-entities.js +473 -0
- package/dist/commands/extract-entities.js.map +1 -0
- package/dist/geometry-report.d.ts.map +1 -1
- package/dist/geometry-report.js +2 -1
- package/dist/geometry-report.js.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/package.json +12 -12
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** One parsed STEP instance: `#id = TYPE(<body>);`. */
|
|
2
|
+
interface Instance {
|
|
3
|
+
id: number;
|
|
4
|
+
type: string;
|
|
5
|
+
/** Argument text between the outermost parentheses (references + literals). */
|
|
6
|
+
body: string;
|
|
7
|
+
/** The verbatim `#id= TYPE(...);` text, re-emitted unchanged into the subset. */
|
|
8
|
+
full: string;
|
|
9
|
+
}
|
|
10
|
+
interface ParsedStep {
|
|
11
|
+
header: string;
|
|
12
|
+
instances: Map<number, Instance>;
|
|
13
|
+
/** 22-char GlobalId → expressId, for rooted entities. */
|
|
14
|
+
guidToId: Map<string, number>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* String-aware STEP DATA tokenizer. Splits the data section into instances at
|
|
18
|
+
* the `;` that terminates each `#id = TYPE(...)`, ignoring `;`/`#`/`(` inside
|
|
19
|
+
* STEP string literals (`'...'`, where `''` is an escaped quote). A regex split
|
|
20
|
+
* mis-fires on names containing `;` or `#` (common in Revit exports), so this
|
|
21
|
+
* scans character by character instead.
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseStep(text: string): ParsedStep;
|
|
24
|
+
/** Resolve one selector token to an expressId (`#42`, `42`, or a GlobalId).
|
|
25
|
+
* An `#id` / bare id is validated against the model too, so a typo'd or stale
|
|
26
|
+
* id fails loudly instead of silently selecting nothing. */
|
|
27
|
+
export declare function resolveToId(token: string, parsed: ParsedStep): number;
|
|
28
|
+
/** Forward reference closure: every instance transitively referenced by `seeds`. */
|
|
29
|
+
export declare function forwardClosure(seeds: Iterable<number>, parsed: ParsedStep, into: Set<number>): void;
|
|
30
|
+
/**
|
|
31
|
+
* Assemble the kept-id set: the closure of `seedProducts` + context roots
|
|
32
|
+
* (project/units/contexts + spatial skeleton) + spatial-containment relations
|
|
33
|
+
* whose every member is kept (so no dangling references).
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildSubset(seedProducts: Set<number>, parsed: ParsedStep): Set<number>;
|
|
36
|
+
/** Serialize the kept ids back into a valid STEP file (sorted, header preserved). */
|
|
37
|
+
export declare function serializeSubset(keep: Set<number>, parsed: ParsedStep): string;
|
|
38
|
+
interface TriageRow {
|
|
39
|
+
expressId: number;
|
|
40
|
+
ifcType: string;
|
|
41
|
+
tris: number;
|
|
42
|
+
/** Non-finite vertices (NaN/Inf) — a HARD defect. */
|
|
43
|
+
nonFinite: number;
|
|
44
|
+
/** Vertices with |coord|>1e4 after recentre — HARD (RTC/local-frame miss). */
|
|
45
|
+
huge: number;
|
|
46
|
+
/** full-AABB / 2-98 percentile-AABB diagonal ratio — REVIEW heuristic. */
|
|
47
|
+
aabbBlowout: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Score meshes for triage. Pure so it is unit-testable without a wasm round-trip.
|
|
51
|
+
* A HARD defect (non-finite/huge) always sorts above any REVIEW heuristic.
|
|
52
|
+
*/
|
|
53
|
+
export declare function scoreTriage(row: TriageRow): number;
|
|
54
|
+
export declare function extractEntitiesCommand(args: string[]): Promise<void>;
|
|
55
|
+
export {};
|
|
56
|
+
//# sourceMappingURL=extract-entities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-entities.d.ts","sourceRoot":"","sources":["../../src/commands/extract-entities.ts"],"names":[],"mappings":"AA+BA,uDAAuD;AACvD,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjC,yDAAyD;IACzD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CA2ElD;AAED;;4DAE4D;AAC5D,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAUrE;AAID,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAenG;AA2ED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,CAmEtF;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAI7E;AAID,UAAU,SAAS;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CAIlD;AAsDD,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiG1E"}
|
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
/**
|
|
5
|
+
* `ifc-lite extract-entities <file.ifc> [selectors] --out sub.ifc [--view]`
|
|
6
|
+
*
|
|
7
|
+
* Pull a handful of entities out of a large IFC into a small, VALID, viewable
|
|
8
|
+
* standalone model — the isolate step of a "reproduce a suspect element" loop.
|
|
9
|
+
* Selectors (unioned):
|
|
10
|
+
* --product <GUID|expressId> explicit product(s); repeatable or comma-list
|
|
11
|
+
* --type <IfcType> every product of a type
|
|
12
|
+
* --storey <GUID|name|id> every product placed under a storey (placement chain)
|
|
13
|
+
* --detect [--top N] the N meshes a geometry-triage pass ranks most unusual
|
|
14
|
+
*
|
|
15
|
+
* The output carries each selected product's full forward reference closure PLUS
|
|
16
|
+
* the shared context roots (IfcProject, unit assignment, geometric contexts, the
|
|
17
|
+
* spatial site/building/storey skeleton) and every spatial-containment relation
|
|
18
|
+
* whose members are all kept — so the result parses and renders on its own.
|
|
19
|
+
*
|
|
20
|
+
* `--detect --report [--json]` prints the triage report WITHOUT extracting. The
|
|
21
|
+
* report separates HARD defects (non-finite or |coord|>1e4 vertices after the
|
|
22
|
+
* per-element local-frame/RTC recentre — genuine corruption) from REVIEW
|
|
23
|
+
* heuristics (oversized AABB, needle/burst triangulation) that are frequently
|
|
24
|
+
* legitimate for thin or large elements and must be eyeballed, not trusted.
|
|
25
|
+
*/
|
|
26
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
27
|
+
import { basename } from 'node:path';
|
|
28
|
+
import { fatal, getFlag, getAllFlags, hasFlag } from '../output.js';
|
|
29
|
+
import { logger } from '../logger.js';
|
|
30
|
+
/**
|
|
31
|
+
* String-aware STEP DATA tokenizer. Splits the data section into instances at
|
|
32
|
+
* the `;` that terminates each `#id = TYPE(...)`, ignoring `;`/`#`/`(` inside
|
|
33
|
+
* STEP string literals (`'...'`, where `''` is an escaped quote). A regex split
|
|
34
|
+
* mis-fires on names containing `;` or `#` (common in Revit exports), so this
|
|
35
|
+
* scans character by character instead.
|
|
36
|
+
*/
|
|
37
|
+
export function parseStep(text) {
|
|
38
|
+
const dataStart = text.indexOf('DATA;');
|
|
39
|
+
if (dataStart < 0)
|
|
40
|
+
throw new Error('Not a STEP file: no DATA; section');
|
|
41
|
+
const headerEnd = text.indexOf('\n', dataStart) + 1;
|
|
42
|
+
const header = text.slice(0, headerEnd);
|
|
43
|
+
const data = text;
|
|
44
|
+
const instances = new Map();
|
|
45
|
+
const guidToId = new Map();
|
|
46
|
+
let i = headerEnd;
|
|
47
|
+
const n = data.length;
|
|
48
|
+
while (i < n) {
|
|
49
|
+
// Seek the next `#`
|
|
50
|
+
while (i < n && data[i] !== '#') {
|
|
51
|
+
// Stop at ENDSEC to avoid scanning the footer.
|
|
52
|
+
if (data.startsWith('ENDSEC', i)) {
|
|
53
|
+
i = n;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
i++;
|
|
57
|
+
}
|
|
58
|
+
if (i >= n)
|
|
59
|
+
break;
|
|
60
|
+
const hashStart = i;
|
|
61
|
+
i++; // past '#'
|
|
62
|
+
let idStr = '';
|
|
63
|
+
while (i < n && data[i] >= '0' && data[i] <= '9')
|
|
64
|
+
idStr += data[i++];
|
|
65
|
+
if (idStr === '')
|
|
66
|
+
continue; // a `#` inside something odd; skip
|
|
67
|
+
// expect optional spaces then '='
|
|
68
|
+
let j = i;
|
|
69
|
+
while (j < n && (data[j] === ' ' || data[j] === '\t'))
|
|
70
|
+
j++;
|
|
71
|
+
if (data[j] !== '=')
|
|
72
|
+
continue; // `#42` as a REFERENCE, not a definition
|
|
73
|
+
j++;
|
|
74
|
+
while (j < n && (data[j] === ' ' || data[j] === '\t' || data[j] === '\n' || data[j] === '\r'))
|
|
75
|
+
j++;
|
|
76
|
+
// read TYPE
|
|
77
|
+
let type = '';
|
|
78
|
+
while (j < n && /[A-Za-z0-9_]/.test(data[j]))
|
|
79
|
+
type += data[j++];
|
|
80
|
+
// now consume the balanced `( ... )` respecting strings, then the ';'
|
|
81
|
+
while (j < n && data[j] !== '(')
|
|
82
|
+
j++;
|
|
83
|
+
const bodyStart = j + 1;
|
|
84
|
+
let depth = 0;
|
|
85
|
+
let inStr = false;
|
|
86
|
+
for (; j < n; j++) {
|
|
87
|
+
const ch = data[j];
|
|
88
|
+
if (inStr) {
|
|
89
|
+
if (ch === "'") {
|
|
90
|
+
if (data[j + 1] === "'")
|
|
91
|
+
j++; // escaped quote
|
|
92
|
+
else
|
|
93
|
+
inStr = false;
|
|
94
|
+
}
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (ch === "'")
|
|
98
|
+
inStr = true;
|
|
99
|
+
else if (ch === '(')
|
|
100
|
+
depth++;
|
|
101
|
+
else if (ch === ')') {
|
|
102
|
+
depth--;
|
|
103
|
+
if (depth === 0) {
|
|
104
|
+
j++;
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const bodyEnd = j - 1; // index of the matching ')'
|
|
110
|
+
// consume up to and including the terminating ';'
|
|
111
|
+
while (j < n && data[j] !== ';')
|
|
112
|
+
j++;
|
|
113
|
+
const semi = j;
|
|
114
|
+
const id = parseInt(idStr, 10);
|
|
115
|
+
const body = data.slice(bodyStart, bodyEnd);
|
|
116
|
+
const full = data.slice(hashStart, semi + 1).trim();
|
|
117
|
+
instances.set(id, { id, type: type.toUpperCase(), body, full });
|
|
118
|
+
// First quoted 22-char token is the GlobalId of a rooted entity.
|
|
119
|
+
const gm = /^\s*'([^']{22})'/.exec(body);
|
|
120
|
+
if (gm)
|
|
121
|
+
guidToId.set(gm[1], id);
|
|
122
|
+
i = semi + 1;
|
|
123
|
+
}
|
|
124
|
+
return { header, instances, guidToId };
|
|
125
|
+
}
|
|
126
|
+
/** Resolve one selector token to an expressId (`#42`, `42`, or a GlobalId).
|
|
127
|
+
* An `#id` / bare id is validated against the model too, so a typo'd or stale
|
|
128
|
+
* id fails loudly instead of silently selecting nothing. */
|
|
129
|
+
export function resolveToId(token, parsed) {
|
|
130
|
+
const t = token.trim();
|
|
131
|
+
if (t.startsWith('#') || /^\d+$/.test(t)) {
|
|
132
|
+
const id = parseInt(t.startsWith('#') ? t.slice(1) : t, 10);
|
|
133
|
+
if (!parsed.instances.has(id))
|
|
134
|
+
throw new Error(`expressId not found in model: #${id}`);
|
|
135
|
+
return id;
|
|
136
|
+
}
|
|
137
|
+
const id = parsed.guidToId.get(t);
|
|
138
|
+
if (id === undefined)
|
|
139
|
+
throw new Error(`GlobalId not found in model: ${t}`);
|
|
140
|
+
return id;
|
|
141
|
+
}
|
|
142
|
+
const REF_RE = /#(\d+)/g;
|
|
143
|
+
/** Forward reference closure: every instance transitively referenced by `seeds`. */
|
|
144
|
+
export function forwardClosure(seeds, parsed, into) {
|
|
145
|
+
const stack = [...seeds];
|
|
146
|
+
while (stack.length) {
|
|
147
|
+
const id = stack.pop();
|
|
148
|
+
if (into.has(id))
|
|
149
|
+
continue;
|
|
150
|
+
into.add(id);
|
|
151
|
+
const rec = parsed.instances.get(id);
|
|
152
|
+
if (!rec)
|
|
153
|
+
continue;
|
|
154
|
+
REF_RE.lastIndex = 0;
|
|
155
|
+
let m;
|
|
156
|
+
while ((m = REF_RE.exec(rec.body)) !== null) {
|
|
157
|
+
const ref = parseInt(m[1], 10);
|
|
158
|
+
if (!into.has(ref))
|
|
159
|
+
stack.push(ref);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/** Map each IfcLocalPlacement to its parent placement (or null when top-level). */
|
|
164
|
+
function placementParents(parsed) {
|
|
165
|
+
const parents = new Map();
|
|
166
|
+
for (const inst of parsed.instances.values()) {
|
|
167
|
+
if (inst.type !== 'IFCLOCALPLACEMENT')
|
|
168
|
+
continue;
|
|
169
|
+
const pm = /^\s*(#\d+|\$)/.exec(inst.body);
|
|
170
|
+
parents.set(inst.id, pm && pm[1].startsWith('#') ? parseInt(pm[1].slice(1), 10) : null);
|
|
171
|
+
}
|
|
172
|
+
return parents;
|
|
173
|
+
}
|
|
174
|
+
/** Every product whose ObjectPlacement chains up through `storeyPlacementId`. */
|
|
175
|
+
function productsUnderPlacement(storeyPlacementId, parsed) {
|
|
176
|
+
const parents = placementParents(parsed);
|
|
177
|
+
const under = new Set();
|
|
178
|
+
for (const pid of parents.keys()) {
|
|
179
|
+
let cur = pid;
|
|
180
|
+
let guard = 0;
|
|
181
|
+
while (cur != null && guard++ < 128) {
|
|
182
|
+
if (cur === storeyPlacementId) {
|
|
183
|
+
under.add(pid);
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
cur = parents.get(cur) ?? null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Products referencing a selected placement.
|
|
190
|
+
const seeds = new Set();
|
|
191
|
+
for (const inst of parsed.instances.values()) {
|
|
192
|
+
REF_RE.lastIndex = 0;
|
|
193
|
+
let m;
|
|
194
|
+
while ((m = REF_RE.exec(inst.body)) !== null) {
|
|
195
|
+
if (under.has(parseInt(m[1], 10))) {
|
|
196
|
+
seeds.add(inst.id);
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return seeds;
|
|
202
|
+
}
|
|
203
|
+
/** Resolve a --storey selector (GUID / name / expressId) to its placement id. */
|
|
204
|
+
function resolveStoreyPlacement(token, parsed) {
|
|
205
|
+
let storeyId;
|
|
206
|
+
const t = token.trim();
|
|
207
|
+
if (/^#?\d+$/.test(t)) {
|
|
208
|
+
storeyId = parseInt(t.replace('#', ''), 10);
|
|
209
|
+
}
|
|
210
|
+
else if (parsed.guidToId.has(t)) {
|
|
211
|
+
storeyId = parsed.guidToId.get(t);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
// match by name (2nd-to-last-ish quoted arg); scan storeys for a Name match
|
|
215
|
+
for (const inst of parsed.instances.values()) {
|
|
216
|
+
if (inst.type !== 'IFCBUILDINGSTOREY')
|
|
217
|
+
continue;
|
|
218
|
+
if (inst.body.includes(`'${t}'`)) {
|
|
219
|
+
storeyId = inst.id;
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (storeyId === undefined)
|
|
225
|
+
throw new Error(`Storey not found: ${token}`);
|
|
226
|
+
const storey = parsed.instances.get(storeyId);
|
|
227
|
+
if (!storey || storey.type !== 'IFCBUILDINGSTOREY') {
|
|
228
|
+
throw new Error(`#${storeyId} is ${storey?.type ?? 'missing'}, not an IfcBuildingStorey`);
|
|
229
|
+
}
|
|
230
|
+
// IfcBuildingStorey ObjectPlacement is attribute 6 (after Guid, Owner, Name,
|
|
231
|
+
// Description, ObjectType) — the last #ref before LongName/Elevation. Grab the
|
|
232
|
+
// placement ref: the storey references exactly one IfcLocalPlacement.
|
|
233
|
+
const refs = [...storey.body.matchAll(REF_RE)].map((m) => parseInt(m[1], 10));
|
|
234
|
+
const placementId = refs.find((r) => parsed.instances.get(r)?.type === 'IFCLOCALPLACEMENT');
|
|
235
|
+
if (placementId === undefined)
|
|
236
|
+
throw new Error(`Storey #${storeyId} has no IfcLocalPlacement`);
|
|
237
|
+
return placementId;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Assemble the kept-id set: the closure of `seedProducts` + context roots
|
|
241
|
+
* (project/units/contexts + spatial skeleton) + spatial-containment relations
|
|
242
|
+
* whose every member is kept (so no dangling references).
|
|
243
|
+
*/
|
|
244
|
+
export function buildSubset(seedProducts, parsed) {
|
|
245
|
+
const keep = new Set();
|
|
246
|
+
forwardClosure(seedProducts, parsed, keep);
|
|
247
|
+
// Context roots: the project + spatial skeleton, closed forward for units,
|
|
248
|
+
// geometric contexts, and placement chains.
|
|
249
|
+
const rootSeeds = [];
|
|
250
|
+
for (const inst of parsed.instances.values()) {
|
|
251
|
+
if (inst.type === 'IFCPROJECT' ||
|
|
252
|
+
inst.type === 'IFCSITE' ||
|
|
253
|
+
inst.type === 'IFCBUILDING' ||
|
|
254
|
+
inst.type === 'IFCBUILDINGSTOREY') {
|
|
255
|
+
rootSeeds.push(inst.id);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
forwardClosure(rootSeeds, parsed, keep);
|
|
259
|
+
// Opening (void) + filler relations. These point FROM the relation TO the host
|
|
260
|
+
// wall (RelatingBuildingElement), so walking only the wall's forward closure
|
|
261
|
+
// never reaches its openings — the isolated wall would lose every window/door
|
|
262
|
+
// cut and render as an uncut box, hiding the very void-cut defect the isolate
|
|
263
|
+
// step exists to reproduce. Pull each IfcRelVoidsElement whose host is kept
|
|
264
|
+
// (+ the IfcOpeningElement's forward closure), then each IfcRelFillsElement
|
|
265
|
+
// whose opening is now kept (+ the filler window/door). The fixpoint loop lets
|
|
266
|
+
// a fill relation see an opening that a voids relation added in an earlier pass.
|
|
267
|
+
let grew = true;
|
|
268
|
+
while (grew) {
|
|
269
|
+
grew = false;
|
|
270
|
+
for (const inst of parsed.instances.values()) {
|
|
271
|
+
if (keep.has(inst.id))
|
|
272
|
+
continue;
|
|
273
|
+
const refs = [...inst.body.matchAll(REF_RE)].map((m) => parseInt(m[1], 10));
|
|
274
|
+
if (inst.type === 'IFCRELVOIDSELEMENT') {
|
|
275
|
+
// refs: [OwnerHistory, RelatingBuildingElement, RelatedOpeningElement].
|
|
276
|
+
const host = refs[refs.length - 2];
|
|
277
|
+
const opening = refs[refs.length - 1];
|
|
278
|
+
if (host !== undefined && opening !== undefined && keep.has(host)) {
|
|
279
|
+
keep.add(inst.id);
|
|
280
|
+
forwardClosure([opening], parsed, keep);
|
|
281
|
+
grew = true;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
else if (inst.type === 'IFCRELFILLSELEMENT') {
|
|
285
|
+
// refs: [OwnerHistory, RelatingOpeningElement, RelatedBuildingElement(filler)].
|
|
286
|
+
const opening = refs[refs.length - 2];
|
|
287
|
+
const filler = refs[refs.length - 1];
|
|
288
|
+
if (opening !== undefined && filler !== undefined && keep.has(opening)) {
|
|
289
|
+
keep.add(inst.id);
|
|
290
|
+
forwardClosure([filler], parsed, keep);
|
|
291
|
+
grew = true;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Spatial relationships that connect kept products into the tree — but only
|
|
297
|
+
// when EVERY referenced element is already kept, else we'd emit dangling refs.
|
|
298
|
+
for (const inst of parsed.instances.values()) {
|
|
299
|
+
if (inst.type === 'IFCRELCONTAINEDINSPATIALSTRUCTURE' ||
|
|
300
|
+
inst.type === 'IFCRELAGGREGATES') {
|
|
301
|
+
const refs = [...inst.body.matchAll(REF_RE)].map((m) => parseInt(m[1], 10));
|
|
302
|
+
if (refs.length > 0 && refs.every((r) => keep.has(r)))
|
|
303
|
+
keep.add(inst.id);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return keep;
|
|
307
|
+
}
|
|
308
|
+
/** Serialize the kept ids back into a valid STEP file (sorted, header preserved). */
|
|
309
|
+
export function serializeSubset(keep, parsed) {
|
|
310
|
+
const kept = [...keep].filter((id) => parsed.instances.has(id)).sort((a, b) => a - b);
|
|
311
|
+
const lines = kept.map((id) => parsed.instances.get(id).full);
|
|
312
|
+
return parsed.header + lines.join('\n') + '\nENDSEC;\nEND-ISO-10303-21;\n';
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Score meshes for triage. Pure so it is unit-testable without a wasm round-trip.
|
|
316
|
+
* A HARD defect (non-finite/huge) always sorts above any REVIEW heuristic.
|
|
317
|
+
*/
|
|
318
|
+
export function scoreTriage(row) {
|
|
319
|
+
if (row.nonFinite > 0)
|
|
320
|
+
return 1e12 + row.nonFinite;
|
|
321
|
+
if (row.huge > 0)
|
|
322
|
+
return 1e11 + row.huge;
|
|
323
|
+
return row.aabbBlowout;
|
|
324
|
+
}
|
|
325
|
+
function pct(sorted, p) {
|
|
326
|
+
if (sorted.length === 0)
|
|
327
|
+
return 0;
|
|
328
|
+
const idx = Math.min(sorted.length - 1, Math.max(0, Math.floor((p / 100) * (sorted.length - 1))));
|
|
329
|
+
return sorted[idx];
|
|
330
|
+
}
|
|
331
|
+
async function triage(bytes) {
|
|
332
|
+
const { GeometryProcessor } = await import('@ifc-lite/geometry');
|
|
333
|
+
const gp = new GeometryProcessor();
|
|
334
|
+
await gp.init();
|
|
335
|
+
const res = await gp.process(bytes);
|
|
336
|
+
const rows = [];
|
|
337
|
+
for (const m of res.meshes) {
|
|
338
|
+
const p = m.positions;
|
|
339
|
+
const nv = p.length / 3;
|
|
340
|
+
if (nv === 0)
|
|
341
|
+
continue;
|
|
342
|
+
const xs = new Float64Array(nv);
|
|
343
|
+
const ys = new Float64Array(nv);
|
|
344
|
+
const zs = new Float64Array(nv);
|
|
345
|
+
let nonFinite = 0;
|
|
346
|
+
let huge = 0;
|
|
347
|
+
for (let i = 0, k = 0; i < p.length; i += 3, k++) {
|
|
348
|
+
const x = p[i];
|
|
349
|
+
const y = p[i + 1];
|
|
350
|
+
const z = p[i + 2];
|
|
351
|
+
if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z))
|
|
352
|
+
nonFinite++;
|
|
353
|
+
if (Math.abs(x) > 1e4 || Math.abs(y) > 1e4 || Math.abs(z) > 1e4)
|
|
354
|
+
huge++;
|
|
355
|
+
xs[k] = x;
|
|
356
|
+
ys[k] = y;
|
|
357
|
+
zs[k] = z;
|
|
358
|
+
}
|
|
359
|
+
xs.sort();
|
|
360
|
+
ys.sort();
|
|
361
|
+
zs.sort();
|
|
362
|
+
const full = Math.hypot(xs[nv - 1] - xs[0], ys[nv - 1] - ys[0], zs[nv - 1] - zs[0]);
|
|
363
|
+
const trim = Math.hypot(pct(xs, 98) - pct(xs, 2), pct(ys, 98) - pct(ys, 2), pct(zs, 98) - pct(zs, 2));
|
|
364
|
+
const aabbBlowout = trim > 0.01 ? full / trim : full > 0.01 ? 999 : 1;
|
|
365
|
+
rows.push({
|
|
366
|
+
expressId: m.expressId,
|
|
367
|
+
ifcType: m.ifcType ?? '',
|
|
368
|
+
tris: m.indices.length / 3,
|
|
369
|
+
nonFinite,
|
|
370
|
+
huge,
|
|
371
|
+
aabbBlowout: +aabbBlowout.toFixed(2),
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
rows.sort((a, b) => scoreTriage(b) - scoreTriage(a));
|
|
375
|
+
return rows;
|
|
376
|
+
}
|
|
377
|
+
// ── Command ─────────────────────────────────────────────────────────────────
|
|
378
|
+
export async function extractEntitiesCommand(args) {
|
|
379
|
+
const filePath = args.find((a) => !a.startsWith('-') && !isFlagValue(args, a));
|
|
380
|
+
if (!filePath) {
|
|
381
|
+
fatal('Usage: ifc-lite extract-entities <file.ifc> [--product ID|GUID] [--type T] ' +
|
|
382
|
+
'[--storey ID|GUID|name] [--detect [--top N]] --out sub.ifc [--view] [--port N]\n' +
|
|
383
|
+
' ifc-lite extract-entities <file.ifc> --detect --report [--json]');
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
const buf = await readFile(filePath);
|
|
387
|
+
const text = buf.toString('utf8');
|
|
388
|
+
const parsed = parseStep(text);
|
|
389
|
+
logger.info(`Parsed ${parsed.instances.size} STEP instances from ${basename(filePath)}`);
|
|
390
|
+
const detect = hasFlag(args, '--detect');
|
|
391
|
+
const report = hasFlag(args, '--report');
|
|
392
|
+
const asJson = hasFlag(args, '--json');
|
|
393
|
+
// Fall back to 20 on a missing or non-numeric `--top` (a `NaN` would make
|
|
394
|
+
// every `slice(0, topN)` return nothing).
|
|
395
|
+
const topRaw = Number.parseInt(getFlag(args, '--top') ?? '20', 10);
|
|
396
|
+
const topN = Number.isNaN(topRaw) ? 20 : topRaw;
|
|
397
|
+
// ── Detect-only report path ──
|
|
398
|
+
if (detect && report) {
|
|
399
|
+
const bytes = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
400
|
+
const rows = await triage(bytes);
|
|
401
|
+
const hard = rows.filter((r) => r.nonFinite > 0 || r.huge > 0);
|
|
402
|
+
if (asJson) {
|
|
403
|
+
process.stdout.write(JSON.stringify({ total: rows.length, hardDefects: hard, top: rows.slice(0, topN) }, null, 2) + '\n');
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
process.stdout.write(`Geometry triage — ${rows.length} meshes\n\n`);
|
|
407
|
+
process.stdout.write(hard.length > 0
|
|
408
|
+
? `HARD defects (non-finite or |coord|>1e4 vertices — genuine corruption): ${hard.length}\n`
|
|
409
|
+
: `HARD defects: none (no NaN/Inf, no coordinate collapse)\n`);
|
|
410
|
+
for (const r of hard.slice(0, topN)) {
|
|
411
|
+
process.stdout.write(` #${r.expressId} ${r.ifcType} nonFinite=${r.nonFinite} huge=${r.huge}\n`);
|
|
412
|
+
}
|
|
413
|
+
process.stdout.write(`\nREVIEW heuristics (top ${topN} by AABB blowout — OFTEN LEGITIMATE for thin/large elements; eyeball, do not trust):\n`);
|
|
414
|
+
for (const r of rows.slice(0, topN)) {
|
|
415
|
+
process.stdout.write(` #${r.expressId} ${r.ifcType} tris=${r.tris} aabbBlowout=${r.aabbBlowout}x\n`);
|
|
416
|
+
}
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
// ── Extraction path — collect seed products from all selectors ──
|
|
420
|
+
const outPath = getFlag(args, '--out');
|
|
421
|
+
const seeds = new Set();
|
|
422
|
+
for (const token of getAllFlags(args, '--product').flatMap((v) => v.split(','))) {
|
|
423
|
+
if (token)
|
|
424
|
+
seeds.add(resolveToId(token, parsed));
|
|
425
|
+
}
|
|
426
|
+
for (const t of getAllFlags(args, '--type').flatMap((v) => v.split(','))) {
|
|
427
|
+
const want = t.trim().toUpperCase();
|
|
428
|
+
if (!want)
|
|
429
|
+
continue;
|
|
430
|
+
for (const inst of parsed.instances.values())
|
|
431
|
+
if (inst.type === want)
|
|
432
|
+
seeds.add(inst.id);
|
|
433
|
+
}
|
|
434
|
+
for (const t of getAllFlags(args, '--storey').flatMap((v) => v.split(','))) {
|
|
435
|
+
if (!t)
|
|
436
|
+
continue;
|
|
437
|
+
const placementId = resolveStoreyPlacement(t, parsed);
|
|
438
|
+
for (const id of productsUnderPlacement(placementId, parsed))
|
|
439
|
+
seeds.add(id);
|
|
440
|
+
}
|
|
441
|
+
if (detect) {
|
|
442
|
+
const bytes = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
443
|
+
const rows = await triage(bytes);
|
|
444
|
+
for (const r of rows.slice(0, topN))
|
|
445
|
+
seeds.add(r.expressId);
|
|
446
|
+
}
|
|
447
|
+
if (seeds.size === 0) {
|
|
448
|
+
fatal('No entities selected. Use --product, --type, --storey, or --detect.');
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
if (!outPath) {
|
|
452
|
+
fatal('Missing --out <sub.ifc> for extraction (or use --detect --report for a report).');
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
const keep = buildSubset(seeds, parsed);
|
|
456
|
+
const out = serializeSubset(keep, parsed);
|
|
457
|
+
await writeFile(outPath, out);
|
|
458
|
+
process.stdout.write(`Extracted ${seeds.size} product(s) → ${keep.size} instances → ${outPath}\n`);
|
|
459
|
+
if (hasFlag(args, '--view')) {
|
|
460
|
+
const { viewCommand } = await import('./view.js');
|
|
461
|
+
const viewArgs = [outPath];
|
|
462
|
+
const port = getFlag(args, '--port');
|
|
463
|
+
if (port)
|
|
464
|
+
viewArgs.push('--port', port);
|
|
465
|
+
await viewCommand(viewArgs);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
/** True when `a` is the VALUE of a preceding option flag (so it isn't the file). */
|
|
469
|
+
function isFlagValue(args, a) {
|
|
470
|
+
const idx = args.indexOf(a);
|
|
471
|
+
return idx > 0 && args[idx - 1].startsWith('--') && args[idx - 1] !== '--detect' && args[idx - 1] !== '--report' && args[idx - 1] !== '--view' && args[idx - 1] !== '--json';
|
|
472
|
+
}
|
|
473
|
+
//# sourceMappingURL=extract-entities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-entities.js","sourceRoot":"","sources":["../../src/commands/extract-entities.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,CA8CnE"}
|
package/dist/geometry-report.js
CHANGED
|
@@ -24,7 +24,8 @@ export function formatGeometryReport(d) {
|
|
|
24
24
|
lines.push('');
|
|
25
25
|
lines.push(`rect_fast: fired ${rf.fired}, openings cut ${rf.openingsCut} ` +
|
|
26
26
|
`(defer: host-not-box ${rf.deferHostNotBox}, not-through ${rf.deferNotThrough}, ` +
|
|
27
|
-
`off-face ${rf.deferOffFace}, near-edge ${rf.deferNearEdge}, no-openings ${rf.deferNoOpenings}
|
|
27
|
+
`off-face ${rf.deferOffFace}, near-edge ${rf.deferNearEdge}, no-openings ${rf.deferNoOpenings}, ` +
|
|
28
|
+
`too-many ${rf.deferTooManyOpenings ?? 0})`);
|
|
28
29
|
if (d.worstHosts.length > 0) {
|
|
29
30
|
lines.push('');
|
|
30
31
|
lines.push('Worst-failing hosts:');
|
|
@@ -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,
|
|
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,IAAI;QACjG,YAAY,EAAE,CAAC,oBAAoB,IAAI,CAAC,GAAG,CAC9C,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;YACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,CAA4C;IACpE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,CAAC,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,aAAa,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -14,6 +14,7 @@ import { queryCommand } from './commands/query.js';
|
|
|
14
14
|
import { propsCommand } from './commands/props.js';
|
|
15
15
|
import { exportCommand } from './commands/export.js';
|
|
16
16
|
import { diagnoseGeometryCommand } from './commands/diagnose-geometry.js';
|
|
17
|
+
import { extractEntitiesCommand } from './commands/extract-entities.js';
|
|
17
18
|
import { idsCommand } from './commands/ids.js';
|
|
18
19
|
import { bcfCommand } from './commands/bcf.js';
|
|
19
20
|
import { clashCommand } from './commands/clash.js';
|
|
@@ -64,6 +65,8 @@ const HELP = `
|
|
|
64
65
|
export <file.ifc> --format csv|json|ifc|hbjson Export data / Honeybee energy model
|
|
65
66
|
diagnose-geometry <file.ifc> [--json] CSG / opening diagnostics (failures, classification)
|
|
66
67
|
[--product ID|GUID] [--type T] Filter worst-hosts detail to one product/type
|
|
68
|
+
extract-entities <file.ifc> --out F Isolate entities into a small, viewable standalone IFC
|
|
69
|
+
[--product ID|GUID] [--storey S] [--detect] [--view] by GUID/type/storey or auto-triage
|
|
67
70
|
ids <file.ifc> <rules.ids> Validate against IDS rules
|
|
68
71
|
bcf <create|list|add-comment> Work with BCF collaboration files
|
|
69
72
|
clash <file.ifc> [--matrix] [--bcf F] Detect geometric clashes between elements
|
|
@@ -208,6 +211,9 @@ async function main() {
|
|
|
208
211
|
case 'diagnose-geometry':
|
|
209
212
|
await diagnoseGeometryCommand(commandArgs);
|
|
210
213
|
break;
|
|
214
|
+
case 'extract-entities':
|
|
215
|
+
await extractEntitiesCommand(commandArgs);
|
|
216
|
+
break;
|
|
211
217
|
case 'ids':
|
|
212
218
|
await idsCommand(commandArgs);
|
|
213
219
|
break;
|
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":";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,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsHpB,CAAC;AAEF,wEAAwE;AACxE,IAAI,aAAa,GAAG,EAAE,CAAC;AACvB,4DAA4D;AAC5D,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,KAAK,UAAU,IAAI;IACjB,sEAAsE;IACtE,0EAA0E;IAC1E,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7C,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC;IAC5B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IAE5B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,OAAO,IAAI,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,aAAa,GAAG,OAAO,CAAC;IACxB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAElC,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;YAC/B,MAAM;QACR,KAAK,OAAO;YACV,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;YAChC,MAAM;QACR,KAAK,OAAO;YACV,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;YAChC,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;YACjC,MAAM;QACR,KAAK,mBAAmB;YACtB,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;YAC3C,MAAM;QACR,KAAK,kBAAkB;YACrB,MAAM,sBAAsB,CAAC,WAAW,CAAC,CAAC;YAC1C,MAAM;QACR,KAAK,KAAK;YACR,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;YAC9B,MAAM;QACR,KAAK,KAAK;YACR,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;YAC9B,MAAM;QACR,KAAK,OAAO;YACV,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;YAChC,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;YACjC,MAAM;QACR,KAAK,MAAM;YACT,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;YAC/B,MAAM;QACR,KAAK,KAAK;YACR,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;YAC9B,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;YACjC,MAAM;QACR,KAAK,OAAO;YACV,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;YAChC,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;YAClC,MAAM;QACR,KAAK,MAAM;YACT,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;YAC/B,MAAM;QACR,KAAK,UAAU;YACb,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;YACnC,MAAM;QACR,KAAK,MAAM;YACT,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;YAC/B,MAAM;QACR,KAAK,OAAO;YACV,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;YAChC,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;YACjC,MAAM;QACR,KAAK,iBAAiB;YACpB,MAAM,qBAAqB,CAAC,WAAW,CAAC,CAAC;YACzC,MAAM;QACR,KAAK,KAAK;YACR,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;YAC9B,MAAM;QACR,KAAK,MAAM;YACT,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;YAC/B,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;YAClC,MAAM;QACR,KAAK,KAAK;YACR,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;YAC9B,MAAM;QACR,KAAK,KAAK;YACR,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;YAC9B,MAAM;QACR,KAAK,KAAK;YACR,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;YAC9B,MAAM;QACR;YACE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,OAAO,IAAI,CAAC,CAAC;YACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;IAC1B,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,UAAU,aAAa,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;IACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;IACnD,uEAAuE;IACvE,wCAAwC;IACxC,IAAI,SAAS,IAAI,MAAM,CAAC,KAAK,EAAE,KAAK,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,8DAA8D,aAAa,IAAI,WAAW,wBAAwB,CACnH,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ifc-lite/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"description": "CLI toolkit for IFC files — query, validate, export, create, and script BIM data",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -20,25 +20,25 @@
|
|
|
20
20
|
"README.md"
|
|
21
21
|
],
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@ifc-lite/bcf": "^1.
|
|
24
|
-
"@ifc-lite/clash": "^1.
|
|
23
|
+
"@ifc-lite/bcf": "^1.16.0",
|
|
24
|
+
"@ifc-lite/clash": "^1.6.0",
|
|
25
25
|
"@ifc-lite/create": "^1.16.2",
|
|
26
|
-
"@ifc-lite/data": "^2.3.0",
|
|
27
26
|
"@ifc-lite/export": "^2.5.0",
|
|
27
|
+
"@ifc-lite/data": "^2.5.0",
|
|
28
28
|
"@ifc-lite/extensions": "^0.3.3",
|
|
29
|
-
"@ifc-lite/geometry": "^3.1.
|
|
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.3",
|
|
30
|
+
"@ifc-lite/ids": "^1.15.25",
|
|
31
|
+
"@ifc-lite/mcp": "^0.7.0",
|
|
32
|
+
"@ifc-lite/mutations": "^1.18.0",
|
|
33
|
+
"@ifc-lite/parser": "^3.8.0",
|
|
34
34
|
"@ifc-lite/query": "^1.14.11",
|
|
35
35
|
"@ifc-lite/sandbox": "^1.16.1",
|
|
36
|
-
"@ifc-lite/sdk": "^1.
|
|
36
|
+
"@ifc-lite/sdk": "^1.21.0",
|
|
37
37
|
"@ifc-lite/viewer-core": "^0.2.7",
|
|
38
|
-
"@ifc-lite/wasm": "^3.0.
|
|
38
|
+
"@ifc-lite/wasm": "^3.0.12"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
|
-
"@types/node": "^26.0
|
|
41
|
+
"@types/node": "^26.1.0",
|
|
42
42
|
"typescript": "^6.0.3",
|
|
43
43
|
"vitest": "^4.1.9"
|
|
44
44
|
},
|