@ifc-lite/cli 0.28.0 → 0.28.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/bcf.js +1 -1
- package/dist/commands/bcf.js.map +1 -1
- package/dist/commands/export-rust-formats.d.ts +11 -0
- package/dist/commands/export-rust-formats.d.ts.map +1 -0
- package/dist/commands/export-rust-formats.js +161 -0
- package/dist/commands/export-rust-formats.js.map +1 -0
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +31 -145
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/extract-entities.d.ts +10 -17
- package/dist/commands/extract-entities.d.ts.map +1 -1
- package/dist/commands/extract-entities.js +34 -23
- package/dist/commands/extract-entities.js.map +1 -1
- package/dist/commands/mutate.d.ts +16 -4
- package/dist/commands/mutate.d.ts.map +1 -1
- package/dist/commands/mutate.js +38 -46
- package/dist/commands/mutate.js.map +1 -1
- package/dist/commands/step-args.d.ts +114 -0
- package/dist/commands/step-args.d.ts.map +1 -0
- package/dist/commands/step-args.js +299 -0
- package/dist/commands/step-args.js.map +1 -0
- package/dist/commands/subset-relations.d.ts +124 -0
- package/dist/commands/subset-relations.d.ts.map +1 -0
- package/dist/commands/subset-relations.js +273 -0
- package/dist/commands/subset-relations.js.map +1 -0
- package/dist/index.js +1 -1
- package/package.json +15 -15
|
@@ -0,0 +1,273 @@
|
|
|
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
|
+
* Spatial-structure relations, as `[relatingAttributeIndex,
|
|
6
|
+
* relatedAttributeIndex]`. `IfcRelAggregates` names the whole
|
|
7
|
+
* (`RelatingObject`) first; the two containment relations name the parts
|
|
8
|
+
* (`RelatedElements`) first. Same table as `STRUCTURE_RELATIONS` in
|
|
9
|
+
* `@ifc-lite/export`'s `merged-empty-containers.ts`, which reads the same three
|
|
10
|
+
* records, copied rather than imported because that module is internal to
|
|
11
|
+
* `@ifc-lite/export` and exporting it would widen a published API surface for a
|
|
12
|
+
* three-line constant.
|
|
13
|
+
*
|
|
14
|
+
* `IfcRelReferencedInSpatialStructure` is here for the same reason the other
|
|
15
|
+
* two are: same shape (one relating parent, one related SET), same
|
|
16
|
+
* one-per-storey authoring, same claim in the command's own docs that the
|
|
17
|
+
* output "parses and renders on its own". It used to be missing entirely, so a
|
|
18
|
+
* referenced-but-not-contained product was always orphaned.
|
|
19
|
+
*/
|
|
20
|
+
const STRUCTURE_RELATIONS = {
|
|
21
|
+
IFCRELAGGREGATES: [4, 5],
|
|
22
|
+
IFCRELCONTAINEDINSPATIALSTRUCTURE: [5, 4],
|
|
23
|
+
IFCRELREFERENCEDINSPATIALSTRUCTURE: [5, 4],
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* All three are `GlobalId, OwnerHistory, Name, Description` plus the
|
|
27
|
+
* relating/related pair: exactly 6 attributes in every schema that defines
|
|
28
|
+
* them. A record that does not split into 6 was mis-scanned (or is not the
|
|
29
|
+
* entity the type name claims), so it falls back to keep-whole-or-drop-whole
|
|
30
|
+
* rather than having a slot index written into whatever it did split into.
|
|
31
|
+
*
|
|
32
|
+
* A relation type with a different attribute COUNT (`IfcRelAssignsToGroup` has
|
|
33
|
+
* 7) therefore cannot simply be added as a row above: it would fail this check
|
|
34
|
+
* on every record and fall silently back to keep-whole-or-drop-whole, which is
|
|
35
|
+
* the bug this module exists to fix. Such a type needs the count moved into the
|
|
36
|
+
* table value first, or the whole table derived from the schema registry, which
|
|
37
|
+
* returns 7 for that entity and would make row four safe rather than forbidden.
|
|
38
|
+
* Filed as #4123.
|
|
39
|
+
*/
|
|
40
|
+
const STRUCTURE_RELATION_ATTRS = 6;
|
|
41
|
+
/** A single `#id` and nothing else: an object reference in one slot. */
|
|
42
|
+
const SINGLE_REF_RE = /^#(\d+)$/;
|
|
43
|
+
/**
|
|
44
|
+
* Decide every spatial-structure relation against a kept-id set.
|
|
45
|
+
*
|
|
46
|
+
* Pure in both arguments: adding relation ids to `keep` afterwards cannot
|
|
47
|
+
* change any verdict, because a relation of these types references products,
|
|
48
|
+
* spatial containers and an OwnerHistory, never another relation.
|
|
49
|
+
*/
|
|
50
|
+
export function planSpatialRelations(instances, keep) {
|
|
51
|
+
const add = [];
|
|
52
|
+
const rewritten = new Map();
|
|
53
|
+
const blockedOn = [];
|
|
54
|
+
for (const inst of instances) {
|
|
55
|
+
const slots = STRUCTURE_RELATIONS[inst.type];
|
|
56
|
+
if (slots === undefined)
|
|
57
|
+
continue;
|
|
58
|
+
const line = relationLine(inst, slots, keep, blockedOn);
|
|
59
|
+
if (line === null)
|
|
60
|
+
continue;
|
|
61
|
+
add.push(inst.id);
|
|
62
|
+
if (line !== inst.full)
|
|
63
|
+
rewritten.set(inst.id, line);
|
|
64
|
+
}
|
|
65
|
+
return { add, rewritten, blockedOn };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* The record text this relation contributes to the subset, or null to drop it.
|
|
69
|
+
* Returns `inst.full` unchanged when nothing was filtered out. Appends to
|
|
70
|
+
* `blocked` when the ONLY thing standing in the way is an unkept non-SET
|
|
71
|
+
* reference; see {@link SpatialRelationPlan.blockedOn}.
|
|
72
|
+
*/
|
|
73
|
+
function relationLine(inst, [relatingIdx, relatedIdx], keep, blocked) {
|
|
74
|
+
// A null is a REJECTED scan, not an empty list: its parts are wherever the
|
|
75
|
+
// scanner happened to be, so reading `args[relatingIdx]` or writing
|
|
76
|
+
// `args[relatedIdx]` by index would land on the wrong attribute (#2470).
|
|
77
|
+
const args = splitTopLevelArgs(inst.body);
|
|
78
|
+
if (args === null || args.length !== STRUCTURE_RELATION_ATTRS)
|
|
79
|
+
return keepWhole(inst, keep);
|
|
80
|
+
const setText = args[relatedIdx];
|
|
81
|
+
if (!setText.startsWith('(') || !setText.endsWith(')'))
|
|
82
|
+
return keepWhole(inst, keep);
|
|
83
|
+
const members = splitTopLevelArgs(setText.slice(1, -1));
|
|
84
|
+
if (members === null)
|
|
85
|
+
return keepWhole(inst, keep);
|
|
86
|
+
const memberIds = [];
|
|
87
|
+
for (const member of members) {
|
|
88
|
+
const ref = SINGLE_REF_RE.exec(member);
|
|
89
|
+
// A SET member that is not a plain object reference is not something this
|
|
90
|
+
// rewrite understands; fall back rather than guess at it.
|
|
91
|
+
if (ref === null)
|
|
92
|
+
return keepWhole(inst, keep);
|
|
93
|
+
memberIds.push(Number(ref[1]));
|
|
94
|
+
}
|
|
95
|
+
// The relating parent must be a real, kept reference. The `every reference
|
|
96
|
+
// outside the SET is kept` loop below would pass VACUOUSLY on a `$` here,
|
|
97
|
+
// emitting a containment with no parent.
|
|
98
|
+
const relating = SINGLE_REF_RE.exec(args[relatingIdx]);
|
|
99
|
+
if (relating === null || !keep.has(Number(relating[1])))
|
|
100
|
+
return null;
|
|
101
|
+
const kept = memberIds.filter((id) => keep.has(id));
|
|
102
|
+
if (kept.length === 0)
|
|
103
|
+
return null;
|
|
104
|
+
// Every other non-set reference (OwnerHistory) must be kept or the emitted
|
|
105
|
+
// record dangles. Ordered AFTER the intersection so `blocked` names only the
|
|
106
|
+
// references of a relation that would OTHERWISE survive; both checks drop the
|
|
107
|
+
// relation, so which one runs first changes no verdict.
|
|
108
|
+
const unkept = [];
|
|
109
|
+
for (let i = 0; i < args.length; i++) {
|
|
110
|
+
if (i === relatedIdx)
|
|
111
|
+
continue;
|
|
112
|
+
for (const id of refsOutsideStrings(args[i])) {
|
|
113
|
+
if (!keep.has(id))
|
|
114
|
+
unkept.push(id);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (unkept.length > 0) {
|
|
118
|
+
blocked.push(...unkept);
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
if (kept.length === memberIds.length)
|
|
122
|
+
return inst.full;
|
|
123
|
+
return spliceArgument(inst, args, relatedIdx, `(${kept.map((id) => `#${id}`).join(',')})`);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* The `#id` object references in one argument, ignoring any that sit inside a
|
|
127
|
+
* STEP string literal.
|
|
128
|
+
*
|
|
129
|
+
* A relation's `Name` and `Description` are free TEXT, and free text contains
|
|
130
|
+
* `#`; `parseStep` tokenizes rather than regexes precisely because Revit
|
|
131
|
+
* writes names like that. Read raw, the `#99` in `'Level #99 contents'` looks
|
|
132
|
+
* like a reference to entity 99, and one unkept lookalike drops the WHOLE
|
|
133
|
+
* relation: the orphaned-storey bug this module exists to fix, re-created for
|
|
134
|
+
* any model that names a relation that way.
|
|
135
|
+
*
|
|
136
|
+
* Correct only on an argument whose split VALIDATED, so the quote boundaries
|
|
137
|
+
* are the record's own. {@link keepWhole} deliberately does NOT use this. It
|
|
138
|
+
* runs when the split FAILED, and also when it succeeded but the record is not
|
|
139
|
+
* the six-attribute shape this module rewrites, so its boundaries are not
|
|
140
|
+
* established in general. There, over-counting references (drop the record) is
|
|
141
|
+
* the safe error, while under-counting (emit a dangling `#id`) is not.
|
|
142
|
+
*/
|
|
143
|
+
function refsOutsideStrings(arg) {
|
|
144
|
+
const ids = [];
|
|
145
|
+
let inString = false;
|
|
146
|
+
for (let i = 0; i < arg.length; i++) {
|
|
147
|
+
const char = arg[i];
|
|
148
|
+
if (inString) {
|
|
149
|
+
if (char === "'") {
|
|
150
|
+
if (arg[i + 1] === "'")
|
|
151
|
+
i++;
|
|
152
|
+
else
|
|
153
|
+
inString = false;
|
|
154
|
+
}
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if (char === "'") {
|
|
158
|
+
inString = true;
|
|
159
|
+
}
|
|
160
|
+
else if (char === '#') {
|
|
161
|
+
let end = i + 1;
|
|
162
|
+
while (end < arg.length && arg[end] >= '0' && arg[end] <= '9')
|
|
163
|
+
end++;
|
|
164
|
+
if (end > i + 1)
|
|
165
|
+
ids.push(Number(arg.slice(i + 1, end)));
|
|
166
|
+
i = end - 1;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return ids;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Keep-whole-or-drop-whole, for a record this module could not scan, or could
|
|
173
|
+
* not read as its six attributes. Reads references straight off the raw body,
|
|
174
|
+
* so it needs no argument boundaries to be correct. Same no-dangling guarantee,
|
|
175
|
+
* no rewriting.
|
|
176
|
+
*/
|
|
177
|
+
function keepWhole(inst, keep) {
|
|
178
|
+
const refs = [...inst.body.matchAll(/#(\d+)/g)].map((m) => Number(m[1]));
|
|
179
|
+
return refs.length > 0 && refs.every((r) => keep.has(r)) ? inst.full : null;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Re-emit the record with ONE top-level argument replaced. Rejoining the split
|
|
183
|
+
* arguments normalizes only the whitespace BETWEEN them (each argument's own
|
|
184
|
+
* text is untouched), and this runs only for a relation that actually lost a
|
|
185
|
+
* member, so an unfiltered subset stays byte-identical.
|
|
186
|
+
*/
|
|
187
|
+
function spliceArgument(inst, args, index, replacement) {
|
|
188
|
+
const open = inst.full.indexOf('(');
|
|
189
|
+
// `body` is by construction the slice of `full` between its first `(` and the
|
|
190
|
+
// matching `)`: the id and type name that precede it hold no parenthesis. A
|
|
191
|
+
// mismatch would mean the parser and this module disagree about where the
|
|
192
|
+
// arguments are, and splicing on that offset corrupts the record, so drop it
|
|
193
|
+
// instead of emitting something malformed.
|
|
194
|
+
if (open < 0 || inst.full.slice(open + 1, open + 1 + inst.body.length) !== inst.body)
|
|
195
|
+
return null;
|
|
196
|
+
const next = [...args];
|
|
197
|
+
next[index] = replacement;
|
|
198
|
+
return inst.full.slice(0, open + 1) + next.join(',') + inst.full.slice(open + 1 + inst.body.length);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Split a STEP argument list on top-level commas, respecting nested
|
|
202
|
+
* parentheses, quoted strings and doubled-quote escapes. Returns null when the
|
|
203
|
+
* text is not a well-formed argument list.
|
|
204
|
+
*
|
|
205
|
+
* It VALIDATES rather than accepting whatever it accumulated, because
|
|
206
|
+
* {@link relationLine} reads `RelatingStructure` by index and writes
|
|
207
|
+
* `RelatedElements` by index, the situation #2470 names, where a mis-scanned
|
|
208
|
+
* list still produces parts and a slot written into those parts lands on the
|
|
209
|
+
* wrong argument while reporting success.
|
|
210
|
+
*
|
|
211
|
+
* Rejected, because after any of these the parts are no longer the record's
|
|
212
|
+
* attributes: commas were swallowed and everything past them shifted:
|
|
213
|
+
* - a quote still open at the end (unterminated string);
|
|
214
|
+
* - a paren depth that does not return to zero at the end (unbalanced list);
|
|
215
|
+
* - a depth that ever goes NEGATIVE (stray closing paren). Both ends matter:
|
|
216
|
+
* a depth that dips below zero and climbs back looks balanced at the end
|
|
217
|
+
* while every comma in between was read as nested.
|
|
218
|
+
*
|
|
219
|
+
* An EMPTY INTERIOR slot (`a,,b`) is deliberately NOT rejected: it is one part,
|
|
220
|
+
* exactly as an entity parser counts it, so every later index still names the
|
|
221
|
+
* attribute it is meant to.
|
|
222
|
+
*
|
|
223
|
+
* Near-twin, not a copy, of `@ifc-lite/export`'s `splitTopLevelStepArguments`
|
|
224
|
+
* (see the module header for why it is not imported). Two MEASURED differences,
|
|
225
|
+
* both wanted here and neither shared with that function:
|
|
226
|
+
* - each part is `trim`med, because {@link SINGLE_REF_RE} is anchored;
|
|
227
|
+
* - a TRAILING empty slot (`a,b,`) yields 2 parts, not 3. So a SIX-attribute
|
|
228
|
+
* record with a stray trailing comma still counts as six, is rewritten, and
|
|
229
|
+
* loses that comma in the output; a five-attribute one is rejected by the
|
|
230
|
+
* attribute-count check instead. Invalid STEP in, valid STEP out, and the
|
|
231
|
+
* slot indices are the ones the record meant either way.
|
|
232
|
+
*/
|
|
233
|
+
function splitTopLevelArgs(text) {
|
|
234
|
+
const parts = [];
|
|
235
|
+
let start = 0;
|
|
236
|
+
let depth = 0;
|
|
237
|
+
let inString = false;
|
|
238
|
+
for (let i = 0; i < text.length; i++) {
|
|
239
|
+
const char = text[i];
|
|
240
|
+
if (inString) {
|
|
241
|
+
if (char === "'") {
|
|
242
|
+
// A doubled quote is an escaped quote, not the end of the string.
|
|
243
|
+
if (text[i + 1] === "'")
|
|
244
|
+
i++;
|
|
245
|
+
else
|
|
246
|
+
inString = false;
|
|
247
|
+
}
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
if (char === "'") {
|
|
251
|
+
inString = true;
|
|
252
|
+
}
|
|
253
|
+
else if (char === '(') {
|
|
254
|
+
depth++;
|
|
255
|
+
}
|
|
256
|
+
else if (char === ')') {
|
|
257
|
+
depth--;
|
|
258
|
+
if (depth < 0)
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
else if (char === ',' && depth === 0) {
|
|
262
|
+
parts.push(text.slice(start, i).trim());
|
|
263
|
+
start = i + 1;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
if (inString || depth !== 0)
|
|
267
|
+
return null;
|
|
268
|
+
const tail = text.slice(start).trim();
|
|
269
|
+
if (tail)
|
|
270
|
+
parts.push(tail);
|
|
271
|
+
return parts;
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=subset-relations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subset-relations.js","sourceRoot":"","sources":["../../src/commands/subset-relations.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -145,7 +145,7 @@ const HELP = `
|
|
|
145
145
|
ifc-lite diagnose-geometry model.ifc --type IfcWall
|
|
146
146
|
ifc-lite diagnose-geometry model.ifc --product 0YvCT2_$X3_xJG3rzD8L_8
|
|
147
147
|
ifc-lite ids model.ifc requirements.ids --json
|
|
148
|
-
ifc-lite bcf create --title "Missing door" --out
|
|
148
|
+
ifc-lite bcf create --title "Missing door" --out topic.bcf
|
|
149
149
|
ifc-lite clash model.ifc --matrix --json
|
|
150
150
|
ifc-lite clash model.ifc --a "IfcDuct*|IfcPipe*" --b "IfcWall*" --mode clearance --clearance 0.05
|
|
151
151
|
ifc-lite clash model.ifc --matrix --bcf clashes.bcfzip
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ifc-lite/cli",
|
|
3
|
-
"version": "0.28.
|
|
3
|
+
"version": "0.28.1",
|
|
4
4
|
"description": "CLI toolkit for IFC files — query, validate, export, create, and script BIM data",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -20,28 +20,28 @@
|
|
|
20
20
|
"README.md"
|
|
21
21
|
],
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@ifc-lite/bcf": "^3.0.
|
|
24
|
-
"@ifc-lite/clash": "^2.1.0",
|
|
23
|
+
"@ifc-lite/bcf": "^3.0.1",
|
|
25
24
|
"@ifc-lite/create": "^2.2.1",
|
|
26
25
|
"@ifc-lite/data": "^4.0.0",
|
|
27
26
|
"@ifc-lite/diff": "^0.8.0",
|
|
28
|
-
"@ifc-lite/
|
|
29
|
-
"@ifc-lite/
|
|
30
|
-
"@ifc-lite/ids": "^1.15.54",
|
|
31
|
-
"@ifc-lite/merge": "^0.4.5",
|
|
27
|
+
"@ifc-lite/clash": "^2.1.0",
|
|
28
|
+
"@ifc-lite/export": "^4.0.1",
|
|
32
29
|
"@ifc-lite/extensions": "^0.6.0",
|
|
30
|
+
"@ifc-lite/ids": "^1.16.0",
|
|
31
|
+
"@ifc-lite/geometry": "^4.3.0",
|
|
33
32
|
"@ifc-lite/ifcx": "^4.0.0",
|
|
34
|
-
"@ifc-lite/
|
|
35
|
-
"@ifc-lite/
|
|
36
|
-
"@ifc-lite/
|
|
37
|
-
"@ifc-lite/
|
|
38
|
-
"@ifc-lite/
|
|
39
|
-
"@ifc-lite/
|
|
33
|
+
"@ifc-lite/merge": "^0.4.5",
|
|
34
|
+
"@ifc-lite/mcp": "^0.13.1",
|
|
35
|
+
"@ifc-lite/mutations": "^2.1.0",
|
|
36
|
+
"@ifc-lite/parser": "^5.2.0",
|
|
37
|
+
"@ifc-lite/query": "^2.2.0",
|
|
38
|
+
"@ifc-lite/sandbox": "^2.2.3",
|
|
40
39
|
"@ifc-lite/viewer-core": "^0.2.15",
|
|
41
|
-
"@ifc-lite/
|
|
40
|
+
"@ifc-lite/sdk": "^4.0.2",
|
|
41
|
+
"@ifc-lite/wasm": "^6.4.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"@types/node": "^26.4.
|
|
44
|
+
"@types/node": "^26.4.1",
|
|
45
45
|
"typescript": "^6.0.3",
|
|
46
46
|
"vitest": "^4.1.11"
|
|
47
47
|
},
|