@ifc-lite/export 3.1.0 → 4.0.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/README.md +3 -1
- package/dist/anonymize-export.d.ts.map +1 -1
- package/dist/anonymize-export.js +108 -8
- package/dist/anonymize-export.js.map +1 -1
- package/dist/anonymize-placement.js +4 -4
- package/dist/anonymize-scrub.d.ts.map +1 -1
- package/dist/anonymize-scrub.js +5 -2
- package/dist/anonymize-scrub.js.map +1 -1
- package/dist/anonymize-types.d.ts +30 -7
- package/dist/anonymize-types.d.ts.map +1 -1
- package/dist/declared-property-type.d.ts +15 -0
- package/dist/declared-property-type.d.ts.map +1 -1
- package/dist/declared-property-type.js +43 -0
- package/dist/declared-property-type.js.map +1 -1
- package/dist/georef-closure.d.ts +55 -0
- package/dist/georef-closure.d.ts.map +1 -0
- package/dist/georef-closure.js +95 -0
- package/dist/georef-closure.js.map +1 -0
- package/dist/glb.d.ts.map +1 -1
- package/dist/glb.js +26 -2
- package/dist/glb.js.map +1 -1
- package/dist/ifc5-classification.d.ts +36 -0
- package/dist/ifc5-classification.d.ts.map +1 -0
- package/dist/ifc5-classification.js +46 -0
- package/dist/ifc5-classification.js.map +1 -0
- package/dist/ifc5-export-helpers.d.ts +32 -0
- package/dist/ifc5-export-helpers.d.ts.map +1 -0
- package/dist/ifc5-export-helpers.js +84 -0
- package/dist/ifc5-export-helpers.js.map +1 -0
- package/dist/ifc5-exporter.d.ts.map +1 -1
- package/dist/ifc5-exporter.js +14 -86
- package/dist/ifc5-exporter.js.map +1 -1
- package/dist/ifc5-material.d.ts +38 -0
- package/dist/ifc5-material.d.ts.map +1 -0
- package/dist/ifc5-material.js +32 -0
- package/dist/ifc5-material.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/merged-context.d.ts +100 -0
- package/dist/merged-context.d.ts.map +1 -0
- package/dist/merged-context.js +211 -0
- package/dist/merged-context.js.map +1 -0
- package/dist/merged-empty-containers.d.ts +63 -0
- package/dist/merged-empty-containers.d.ts.map +1 -0
- package/dist/merged-empty-containers.js +354 -0
- package/dist/merged-empty-containers.js.map +1 -0
- package/dist/merged-exporter.d.ts +28 -67
- package/dist/merged-exporter.d.ts.map +1 -1
- package/dist/merged-exporter.js +134 -258
- package/dist/merged-exporter.js.map +1 -1
- package/dist/merged-guid.d.ts +48 -0
- package/dist/merged-guid.d.ts.map +1 -0
- package/dist/merged-guid.js +128 -0
- package/dist/merged-guid.js.map +1 -0
- package/dist/merged-rel-aggregates.d.ts +63 -0
- package/dist/merged-rel-aggregates.d.ts.map +1 -0
- package/dist/merged-rel-aggregates.js +122 -0
- package/dist/merged-rel-aggregates.js.map +1 -0
- package/dist/merged-remap.d.ts +18 -0
- package/dist/merged-remap.d.ts.map +1 -0
- package/dist/merged-remap.js +66 -0
- package/dist/merged-remap.js.map +1 -0
- package/dist/merged-subcontext.d.ts +41 -0
- package/dist/merged-subcontext.d.ts.map +1 -0
- package/dist/merged-subcontext.js +99 -0
- package/dist/merged-subcontext.js.map +1 -0
- package/dist/parquet-exporter-ondemand.d.ts +34 -0
- package/dist/parquet-exporter-ondemand.d.ts.map +1 -0
- package/dist/parquet-exporter-ondemand.js +89 -0
- package/dist/parquet-exporter-ondemand.js.map +1 -0
- package/dist/parquet-exporter.d.ts +1 -29
- package/dist/parquet-exporter.d.ts.map +1 -1
- package/dist/parquet-exporter.js +59 -81
- package/dist/parquet-exporter.js.map +1 -1
- package/dist/parquet-type-strings.d.ts +11 -0
- package/dist/parquet-type-strings.d.ts.map +1 -0
- package/dist/parquet-type-strings.js +40 -0
- package/dist/parquet-type-strings.js.map +1 -0
- package/dist/parquet-uint32-columns.d.ts +30 -0
- package/dist/parquet-uint32-columns.d.ts.map +1 -0
- package/dist/parquet-uint32-columns.js +38 -0
- package/dist/parquet-uint32-columns.js.map +1 -0
- package/dist/reference-collector.d.ts +0 -31
- package/dist/reference-collector.d.ts.map +1 -1
- package/dist/reference-collector.js +27 -82
- package/dist/reference-collector.js.map +1 -1
- package/dist/related-entities.d.ts.map +1 -1
- package/dist/related-entities.js +19 -4
- package/dist/related-entities.js.map +1 -1
- package/dist/schema-converter-attr-remap.d.ts +53 -0
- package/dist/schema-converter-attr-remap.d.ts.map +1 -0
- package/dist/schema-converter-attr-remap.js +106 -0
- package/dist/schema-converter-attr-remap.js.map +1 -0
- package/dist/schema-converter.d.ts.map +1 -1
- package/dist/schema-converter.js +24 -1
- package/dist/schema-converter.js.map +1 -1
- package/dist/schema-untranslatable.d.ts +35 -0
- package/dist/schema-untranslatable.d.ts.map +1 -0
- package/dist/schema-untranslatable.js +60 -0
- package/dist/schema-untranslatable.js.map +1 -0
- package/dist/step-argument-parser.d.ts.map +1 -1
- package/dist/step-argument-parser.js +11 -1
- package/dist/step-argument-parser.js.map +1 -1
- package/dist/step-attribute-mutations.js +14 -11
- package/dist/step-attribute-mutations.js.map +1 -1
- package/dist/step-collection.d.ts.map +1 -1
- package/dist/step-collection.js +20 -6
- package/dist/step-collection.js.map +1 -1
- package/dist/step-export-types.d.ts +15 -0
- package/dist/step-export-types.d.ts.map +1 -1
- package/dist/step-export-types.js +10 -0
- package/dist/step-export-types.js.map +1 -1
- package/dist/step-exporter.d.ts.map +1 -1
- package/dist/step-exporter.js +9 -1
- package/dist/step-exporter.js.map +1 -1
- package/dist/step-map-unit.d.ts +2 -1
- package/dist/step-map-unit.d.ts.map +1 -1
- package/dist/step-map-unit.js.map +1 -1
- package/dist/step-serialization.d.ts +10 -30
- package/dist/step-serialization.d.ts.map +1 -1
- package/dist/step-serialization.js +10 -60
- package/dist/step-serialization.js.map +1 -1
- package/dist/step-source-iteration.d.ts.map +1 -1
- package/dist/step-source-iteration.js +21 -0
- package/dist/step-source-iteration.js.map +1 -1
- package/dist/style-closure.d.ts +91 -0
- package/dist/style-closure.d.ts.map +1 -0
- package/dist/style-closure.js +164 -0
- package/dist/style-closure.js.map +1 -0
- package/dist/subset-entity-reader.d.ts +10 -9
- package/dist/subset-entity-reader.d.ts.map +1 -1
- package/dist/subset-entity-reader.js +21 -11
- package/dist/subset-entity-reader.js.map +1 -1
- package/dist/subset-roots.d.ts +17 -1
- package/dist/subset-roots.d.ts.map +1 -1
- package/dist/subset-roots.js +67 -2
- package/dist/subset-roots.js.map +1 -1
- package/dist/type-owned-psets.d.ts +19 -0
- package/dist/type-owned-psets.d.ts.map +1 -1
- package/dist/type-owned-psets.js +31 -0
- package/dist/type-owned-psets.js.map +1 -1
- package/dist/unit-normalize.d.ts.map +1 -1
- package/dist/unit-normalize.js +10 -2
- package/dist/unit-normalize.js.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,354 @@
|
|
|
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 { asSourceBytes, STEP_TRIVIA } from '@ifc-lite/parser';
|
|
5
|
+
import { splitTopLevelArgs } from './step-argument-parser.js';
|
|
6
|
+
/**
|
|
7
|
+
* `#N=TYPE(...)` record, with STEP trivia (whitespace and/or a
|
|
8
|
+
* `/* ... */` comment, #3789) tolerated between the type name and `(` —
|
|
9
|
+
* same adjacency fix as `entity-extractor.ts`'s `extractEntity`. Without it
|
|
10
|
+
* a wrapped line's arguments are unreadable here (`topLevelAttrs` returns
|
|
11
|
+
* `null`), which the caller treats as "can't safely rewrite" and blocks the
|
|
12
|
+
* empty-container drop for that entity.
|
|
13
|
+
*/
|
|
14
|
+
const RECORD_RE = new RegExp(`^#\\d+\\s*=\\s*\\w+${STEP_TRIVIA}\\(([\\s\\S]*)\\)\\s*;?\\s*$`);
|
|
15
|
+
/**
|
|
16
|
+
* Spatial container types dropped when they end up empty. `IfcProject` is
|
|
17
|
+
* deliberately absent: it is the file's root, never a candidate.
|
|
18
|
+
*/
|
|
19
|
+
const CONTAINER_TYPES = new Set([
|
|
20
|
+
'IFCSITE',
|
|
21
|
+
'IFCBUILDING',
|
|
22
|
+
'IFCBUILDINGSTOREY',
|
|
23
|
+
'IFCSPACE',
|
|
24
|
+
]);
|
|
25
|
+
/**
|
|
26
|
+
* Relationships that express spatial structure, as
|
|
27
|
+
* `[relatingAttributeIndex, relatedAttributeIndex]` — `IfcRelAggregates` names
|
|
28
|
+
* the whole first, the containment relationships name the parts first.
|
|
29
|
+
*/
|
|
30
|
+
const STRUCTURE_RELATIONS = {
|
|
31
|
+
IFCRELAGGREGATES: [4, 5],
|
|
32
|
+
IFCRELCONTAINEDINSPATIALSTRUCTURE: [5, 4],
|
|
33
|
+
IFCRELREFERENCEDINSPATIALSTRUCTURE: [5, 4],
|
|
34
|
+
};
|
|
35
|
+
/** True when `typeUpper` is a droppable spatial container type. */
|
|
36
|
+
function isSpatialContainerType(typeUpper) {
|
|
37
|
+
return CONTAINER_TYPES.has(typeUpper);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* A model with nothing to analyse — the placeholder for an input whose source
|
|
41
|
+
* bytes are missing (a cache-restored, metadata-only store), which the emit loop
|
|
42
|
+
* skips too. Keeps the caller's per-model arrays aligned with its inputs.
|
|
43
|
+
*/
|
|
44
|
+
export const EMPTY_MODEL_VIEW = {
|
|
45
|
+
entities: new Map(),
|
|
46
|
+
source: asSourceBytes(new Uint8Array()),
|
|
47
|
+
included: null,
|
|
48
|
+
sharedRemap: new Map(),
|
|
49
|
+
offset: 0,
|
|
50
|
+
compatible: false,
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Plan which spatial containers the merge leaves holding nothing.
|
|
54
|
+
*
|
|
55
|
+
* The returned local ids are what the caller withholds from the output; every
|
|
56
|
+
* surviving line that named one is narrowed (or withheld with it) by
|
|
57
|
+
* `filterHiddenRefsFromRelationshipLine`, which is what keeps the result free of
|
|
58
|
+
* dangling references.
|
|
59
|
+
*/
|
|
60
|
+
export function planEmptyContainerDrops(models) {
|
|
61
|
+
const nodes = new Set();
|
|
62
|
+
const hasContent = new Set();
|
|
63
|
+
const blocked = new Set();
|
|
64
|
+
/** Spatial child node → its container nodes (upward edges for the sweep). */
|
|
65
|
+
const parents = new Map();
|
|
66
|
+
const guidNode = new Map();
|
|
67
|
+
const containersByModel = [];
|
|
68
|
+
for (const view of models) {
|
|
69
|
+
const canon = canonicalContainers(view, guidNode);
|
|
70
|
+
containersByModel.push(canon);
|
|
71
|
+
for (const node of canon.values())
|
|
72
|
+
nodes.add(node);
|
|
73
|
+
recordEdges(view, canon, hasContent, parents);
|
|
74
|
+
recordBlocks(view, canon, blocked);
|
|
75
|
+
}
|
|
76
|
+
// A container is non-empty when it holds something, is blocked, or has a
|
|
77
|
+
// non-empty spatial child — the last propagated upward from the first two.
|
|
78
|
+
// The visited check also makes a self-referential aggregation terminate.
|
|
79
|
+
const nonEmpty = new Set([...hasContent, ...blocked]);
|
|
80
|
+
const stack = [...nonEmpty];
|
|
81
|
+
while (stack.length > 0) {
|
|
82
|
+
const node = stack.pop();
|
|
83
|
+
for (const parent of parents.get(node) ?? []) {
|
|
84
|
+
if (!nonEmpty.has(parent)) {
|
|
85
|
+
nonEmpty.add(parent);
|
|
86
|
+
stack.push(parent);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const dropped = new Set([...nodes].filter(node => !nonEmpty.has(node)));
|
|
91
|
+
return {
|
|
92
|
+
droppedByModel: containersByModel.map(canon => {
|
|
93
|
+
const ids = new Set();
|
|
94
|
+
for (const [localId, node] of canon) {
|
|
95
|
+
if (dropped.has(node))
|
|
96
|
+
ids.add(localId);
|
|
97
|
+
}
|
|
98
|
+
return ids;
|
|
99
|
+
}),
|
|
100
|
+
droppedCount: dropped.size,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Map each of this model's visible containers to its node in the merged model:
|
|
105
|
+
* the container it was unified onto, the earlier instance that already carries
|
|
106
|
+
* its GlobalId, or its own final express id. Mirrors the emit loop's
|
|
107
|
+
* unification order (iteration order, first occurrence wins).
|
|
108
|
+
*/
|
|
109
|
+
function canonicalContainers(view, guidNode) {
|
|
110
|
+
const canon = new Map();
|
|
111
|
+
for (const [localId, ref] of view.entities) {
|
|
112
|
+
if (view.included !== null && !view.included.has(localId))
|
|
113
|
+
continue;
|
|
114
|
+
if (!isSpatialContainerType(ref.type.toUpperCase()))
|
|
115
|
+
continue;
|
|
116
|
+
const unified = view.sharedRemap.get(localId);
|
|
117
|
+
if (unified !== undefined) {
|
|
118
|
+
canon.set(localId, unified);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const finalId = localId + view.offset;
|
|
122
|
+
if (!view.compatible) {
|
|
123
|
+
canon.set(localId, finalId);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const guid = leadingGuid(lineOf(view, localId));
|
|
127
|
+
if (guid === null) {
|
|
128
|
+
canon.set(localId, finalId);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
const known = guidNode.get(guid);
|
|
132
|
+
if (known === undefined)
|
|
133
|
+
guidNode.set(guid, finalId);
|
|
134
|
+
canon.set(localId, known ?? finalId);
|
|
135
|
+
}
|
|
136
|
+
return canon;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Record what this model contributes to each container: contained elements and
|
|
140
|
+
* aggregated objects become content; aggregated spatial children become upward
|
|
141
|
+
* edges, so a non-empty storey keeps its building and its site.
|
|
142
|
+
*/
|
|
143
|
+
function recordEdges(view, canon, hasContent, parents) {
|
|
144
|
+
if (canon.size === 0)
|
|
145
|
+
return;
|
|
146
|
+
for (const [localId, ref] of view.entities) {
|
|
147
|
+
if (view.included !== null && !view.included.has(localId))
|
|
148
|
+
continue;
|
|
149
|
+
const slots = STRUCTURE_RELATIONS[ref.type.toUpperCase()];
|
|
150
|
+
if (slots === undefined)
|
|
151
|
+
continue;
|
|
152
|
+
const attrs = topLevelAttrs(lineOf(view, localId));
|
|
153
|
+
if (attrs === null)
|
|
154
|
+
continue;
|
|
155
|
+
const [relatingIndex, relatedIndex] = slots;
|
|
156
|
+
const relating = singleRef(attrs[relatingIndex] ?? '');
|
|
157
|
+
// Not a container (an IfcProject aggregating its sites, say) — its children
|
|
158
|
+
// are roots of the spatial tree, with nothing above them to keep.
|
|
159
|
+
if (relating === null)
|
|
160
|
+
continue;
|
|
161
|
+
const parent = canon.get(relating);
|
|
162
|
+
if (parent === undefined)
|
|
163
|
+
continue;
|
|
164
|
+
for (const child of refList(attrs[relatedIndex] ?? '')) {
|
|
165
|
+
if (view.included !== null && !view.included.has(child))
|
|
166
|
+
continue;
|
|
167
|
+
const childNode = canon.get(child);
|
|
168
|
+
if (childNode === undefined) {
|
|
169
|
+
hasContent.add(parent);
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
const edges = parents.get(childNode);
|
|
173
|
+
if (edges === undefined)
|
|
174
|
+
parents.set(childNode, [parent]);
|
|
175
|
+
else
|
|
176
|
+
edges.push(parent);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Block every container this model names in a way the emit loop could not
|
|
182
|
+
* rewrite. Dropping such a container would leave a dangling `#ref`, so it stays
|
|
183
|
+
* (counting as non-empty, which keeps its ancestors too) instead.
|
|
184
|
+
*
|
|
185
|
+
* Rewritable is: a reference from an objectified relationship (`IfcRel*`) that
|
|
186
|
+
* nothing else references, since `filterHiddenRefsFromRelationshipLine` can
|
|
187
|
+
* strip it from a list or withhold the whole line. Everything else — a
|
|
188
|
+
* non-relationship referrer, a reference nested inside a typed value, or a
|
|
189
|
+
* relationship that is itself referenced (withholding it would dangle in turn) —
|
|
190
|
+
* blocks.
|
|
191
|
+
*/
|
|
192
|
+
function recordBlocks(view, canon, blocked) {
|
|
193
|
+
if (canon.size === 0)
|
|
194
|
+
return;
|
|
195
|
+
const referrers = [];
|
|
196
|
+
const referencedRelationships = new Set();
|
|
197
|
+
for (const [localId, ref] of view.entities) {
|
|
198
|
+
if (view.included !== null && !view.included.has(localId))
|
|
199
|
+
continue;
|
|
200
|
+
let namesContainer = false;
|
|
201
|
+
for (const target of argRefs(view.source.slice(ref.byteOffset, ref.byteOffset + ref.byteLength))) {
|
|
202
|
+
if (canon.has(target))
|
|
203
|
+
namesContainer = true;
|
|
204
|
+
const targetType = view.entities.get(target)?.type.toUpperCase();
|
|
205
|
+
if (targetType?.startsWith('IFCREL'))
|
|
206
|
+
referencedRelationships.add(target);
|
|
207
|
+
}
|
|
208
|
+
if (namesContainer)
|
|
209
|
+
referrers.push(localId);
|
|
210
|
+
}
|
|
211
|
+
for (const localId of referrers) {
|
|
212
|
+
const typeUpper = view.entities.get(localId).type.toUpperCase();
|
|
213
|
+
const rewritable = typeUpper.startsWith('IFCREL') && !referencedRelationships.has(localId);
|
|
214
|
+
const line = lineOf(view, localId);
|
|
215
|
+
const slots = classifyRefs(line);
|
|
216
|
+
if (slots === null) {
|
|
217
|
+
// The argument list could not be parsed, so no rewrite can narrow this
|
|
218
|
+
// line: every container it names has to stay.
|
|
219
|
+
for (const target of argRefs(line)) {
|
|
220
|
+
const node = canon.get(target);
|
|
221
|
+
if (node !== undefined)
|
|
222
|
+
blocked.add(node);
|
|
223
|
+
}
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
for (const [target, nested] of slots) {
|
|
227
|
+
const node = canon.get(target);
|
|
228
|
+
if (node === undefined)
|
|
229
|
+
continue;
|
|
230
|
+
if (nested || !rewritable)
|
|
231
|
+
blocked.add(node);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/** The entity's STEP line text. */
|
|
236
|
+
function lineOf(view, localId) {
|
|
237
|
+
const ref = view.entities.get(localId);
|
|
238
|
+
if (ref === undefined)
|
|
239
|
+
return '';
|
|
240
|
+
return view.source.decodeUtf8(ref.byteOffset, ref.byteOffset + ref.byteLength);
|
|
241
|
+
}
|
|
242
|
+
/** Top-level arguments of a `#id=TYPE(…);` line, or `null` when unparseable. */
|
|
243
|
+
function topLevelAttrs(line) {
|
|
244
|
+
const match = line.match(RECORD_RE);
|
|
245
|
+
if (!match)
|
|
246
|
+
return null;
|
|
247
|
+
return splitTopLevelArgs(match[1]).map(arg => arg.trim());
|
|
248
|
+
}
|
|
249
|
+
/** Parse an argument that is exactly one reference (`"#7"` → `7`). */
|
|
250
|
+
function singleRef(arg) {
|
|
251
|
+
const match = arg.trim().match(/^#(\d+)$/);
|
|
252
|
+
return match ? Number(match[1]) : null;
|
|
253
|
+
}
|
|
254
|
+
/** Parse a `(#a,#b,…)` list argument into ids. */
|
|
255
|
+
function refList(arg) {
|
|
256
|
+
const trimmed = arg.trim();
|
|
257
|
+
if (!trimmed.startsWith('(') || !trimmed.endsWith(')'))
|
|
258
|
+
return [];
|
|
259
|
+
const inner = trimmed.slice(1, -1).trim();
|
|
260
|
+
if (inner === '')
|
|
261
|
+
return [];
|
|
262
|
+
const ids = [];
|
|
263
|
+
for (const item of splitTopLevelArgs(inner)) {
|
|
264
|
+
const id = singleRef(item);
|
|
265
|
+
if (id !== null)
|
|
266
|
+
ids.push(id);
|
|
267
|
+
}
|
|
268
|
+
return ids;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Every reference in a line's argument list, paired with whether it sits
|
|
272
|
+
* somewhere neither `filterHiddenRefsFromRelationshipLine` can strip (a direct
|
|
273
|
+
* list element) nor withhold the line for (a whole single-valued attribute) —
|
|
274
|
+
* i.e. nested inside a list of lists or a typed value. `null` when the line's
|
|
275
|
+
* argument list cannot be parsed at all: a line no rewrite can narrow, which the
|
|
276
|
+
* analysis must treat as a blocker rather than as "names nothing".
|
|
277
|
+
*/
|
|
278
|
+
function classifyRefs(line) {
|
|
279
|
+
const attrs = topLevelAttrs(line);
|
|
280
|
+
if (attrs === null)
|
|
281
|
+
return null;
|
|
282
|
+
const out = [];
|
|
283
|
+
for (const attr of attrs) {
|
|
284
|
+
const direct = singleRef(attr);
|
|
285
|
+
if (direct !== null) {
|
|
286
|
+
out.push([direct, false]);
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
if (attr.startsWith('(') && attr.endsWith(')')) {
|
|
290
|
+
const inner = attr.slice(1, -1).trim();
|
|
291
|
+
if (inner === '')
|
|
292
|
+
continue;
|
|
293
|
+
for (const item of splitTopLevelArgs(inner)) {
|
|
294
|
+
const id = singleRef(item);
|
|
295
|
+
if (id !== null)
|
|
296
|
+
out.push([id, false]);
|
|
297
|
+
else
|
|
298
|
+
for (const nested of argRefs(item))
|
|
299
|
+
out.push([nested, true]);
|
|
300
|
+
}
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
for (const nested of argRefs(attr))
|
|
304
|
+
out.push([nested, true]);
|
|
305
|
+
}
|
|
306
|
+
return out;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Every `#N` reference in a chunk of STEP text, skipping quoted strings (where a
|
|
310
|
+
* `#` is literal) and any leading `#id=` (the line's own id). Reads bytes rather
|
|
311
|
+
* than decoded text so the reverse-reference scan never decodes a whole model.
|
|
312
|
+
*/
|
|
313
|
+
function argRefs(text) {
|
|
314
|
+
const bytes = typeof text === 'string' ? new TextEncoder().encode(text) : text;
|
|
315
|
+
const eq = bytes.indexOf(0x3d /* = */);
|
|
316
|
+
const from = eq === -1 ? 0 : eq + 1;
|
|
317
|
+
const out = [];
|
|
318
|
+
let inString = false;
|
|
319
|
+
for (let i = from; i < bytes.length; i++) {
|
|
320
|
+
const byte = bytes[i];
|
|
321
|
+
if (byte === 0x27 /* ' */) {
|
|
322
|
+
inString = !inString;
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
if (inString || byte !== 0x23 /* # */)
|
|
326
|
+
continue;
|
|
327
|
+
let j = i + 1;
|
|
328
|
+
let value = 0;
|
|
329
|
+
while (j < bytes.length && bytes[j] >= 0x30 && bytes[j] <= 0x39) {
|
|
330
|
+
value = value * 10 + (bytes[j] - 0x30);
|
|
331
|
+
j++;
|
|
332
|
+
}
|
|
333
|
+
if (j > i + 1) {
|
|
334
|
+
out.push(value);
|
|
335
|
+
i = j - 1;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return out;
|
|
339
|
+
}
|
|
340
|
+
/** The GlobalId (first quoted attribute) of a rooted entity's line. */
|
|
341
|
+
function leadingGuid(line) {
|
|
342
|
+
const open = line.indexOf('(');
|
|
343
|
+
if (open === -1)
|
|
344
|
+
return null;
|
|
345
|
+
const first = line.indexOf("'", open + 1);
|
|
346
|
+
if (first === -1)
|
|
347
|
+
return null;
|
|
348
|
+
const second = line.indexOf("'", first + 1);
|
|
349
|
+
if (second === -1)
|
|
350
|
+
return null;
|
|
351
|
+
const raw = line.slice(first + 1, second);
|
|
352
|
+
return /^[0-9A-Za-z_$]{22}$/.test(raw) ? raw : null;
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=merged-empty-containers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merged-empty-containers.js","sourceRoot":"","sources":["../src/merged-empty-containers.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,25 +7,6 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
9
9
|
import type { MutablePropertyView } from '@ifc-lite/mutations';
|
|
10
|
-
/**
|
|
11
|
-
* Whether `type` is an IfcRoot subtype — a schema-derived replacement for a
|
|
12
|
-
* hand-maintained denylist of "non-rooted types whose first attribute happens
|
|
13
|
-
* to be a string". A denylist has to be told about every such type by hand and
|
|
14
|
-
* silently under-covers as the schema grows — `IfcMaterialProfileWithOffsets`
|
|
15
|
-
* and several other resource types were missing and got their leading Name
|
|
16
|
-
* treated as a GlobalId, corrupting ordinary model data on a collision.
|
|
17
|
-
*
|
|
18
|
-
* `getInheritanceChainAcrossSchemas` walks the bundled IFC2X3/IFC4/IFC4X3
|
|
19
|
-
* schema union to the entity's root ancestor; a rooted entity's chain always
|
|
20
|
-
* ends in `IfcRoot`. This mirrors the Rust side's `IfcType::is_subtype_of`
|
|
21
|
-
* schema check, so the two implementations of "is this rooted" agree instead
|
|
22
|
-
* of drifting apart as separate hand-maintained lists.
|
|
23
|
-
*
|
|
24
|
-
* A type unknown to every bundled schema (typo, vendor extension) yields an
|
|
25
|
-
* empty chain and is treated as non-rooted — the same safe-miss direction the
|
|
26
|
-
* old denylist documented: it just skips one GlobalId reconciliation.
|
|
27
|
-
*/
|
|
28
|
-
export declare function isRootedType(type: string): boolean;
|
|
29
10
|
/**
|
|
30
11
|
* A model to be included in the merge, with its data store and metadata.
|
|
31
12
|
*/
|
|
@@ -137,6 +118,16 @@ export interface MergeExportOptions {
|
|
|
137
118
|
* - `'by-name-then-elevation'`: try Name first, fall back to Elevation.
|
|
138
119
|
*/
|
|
139
120
|
mergeStoreys?: 'by-name' | 'by-elevation' | 'by-name-then-elevation';
|
|
121
|
+
/**
|
|
122
|
+
* Drop spatial containers (`IfcSite` / `IfcBuilding` / `IfcBuildingStorey` /
|
|
123
|
+
* `IfcSpace`) the merge leaves holding nothing — the "Merge Projects" recipe
|
|
124
|
+
* step the matching options above do not cover (#3643). Emptiness is judged on
|
|
125
|
+
* the MERGED model, after visibility filtering and spatial unification, so a
|
|
126
|
+
* container only a later model fills is kept; see
|
|
127
|
+
* `merged-empty-containers.ts` for the exact rule. Off by default: output is
|
|
128
|
+
* byte-identical to a merge that never asked for it.
|
|
129
|
+
*/
|
|
130
|
+
dropEmptyContainers?: boolean;
|
|
140
131
|
/** Apply visibility filtering to each model before merging */
|
|
141
132
|
visibleOnly?: boolean;
|
|
142
133
|
/** Hidden entity IDs per model (local expressIds) */
|
|
@@ -186,6 +177,12 @@ export interface MergeExportResult {
|
|
|
186
177
|
* modes (or when every model already shared the first model's unit).
|
|
187
178
|
*/
|
|
188
179
|
normalizedModelCount: number;
|
|
180
|
+
/**
|
|
181
|
+
* Spatial containers dropped for holding nothing, counted in the merged
|
|
182
|
+
* model (a container unified across three inputs counts once). Always 0
|
|
183
|
+
* unless {@link MergeExportOptions.dropEmptyContainers} is set.
|
|
184
|
+
*/
|
|
185
|
+
droppedContainerCount: number;
|
|
189
186
|
/**
|
|
190
187
|
* Human-readable advisories about the merge (empty on a clean single-unit
|
|
191
188
|
* merge). Notably flags when federation produced more than one IfcProject,
|
|
@@ -291,6 +288,16 @@ export declare class MergedExporter {
|
|
|
291
288
|
* Assemble the result stats, including any federation conformance warnings.
|
|
292
289
|
*/
|
|
293
290
|
private buildStats;
|
|
291
|
+
/**
|
|
292
|
+
* Plan the empty spatial containers of the whole merge (#3643), or `null` when
|
|
293
|
+
* the caller did not ask for the drop. Reproduces the same spatial unification
|
|
294
|
+
* {@link planModel} will, so emptiness is judged on the containers the merge
|
|
295
|
+
* actually keeps rather than on each file in isolation.
|
|
296
|
+
*/
|
|
297
|
+
private planContainerDrops;
|
|
298
|
+
/** Fold a model's dropped containers into its plan: the container lines are
|
|
299
|
+
* skipped outright, and {@link renderEntity} narrows every line naming one. */
|
|
300
|
+
private applyContainerDrops;
|
|
294
301
|
/**
|
|
295
302
|
* Record advisories for a model being normalized. The rescaler derives its
|
|
296
303
|
* length-attribute map from the IFC4 schema registry, so it may not cover
|
|
@@ -331,8 +338,8 @@ export declare class MergedExporter {
|
|
|
331
338
|
* Resolve a model's declared AREAUNIT / VOLUMEUNIT scale (SI m² / m³ per unit)
|
|
332
339
|
* by walking IfcProject → IfcUnitAssignment. Falls back to the length-derived
|
|
333
340
|
* unit (`lengthScale ** power`) when the model declares no explicit area/volume
|
|
334
|
-
* unit — the IFC default. A prefixed SI area/volume unit (rare)
|
|
335
|
-
* prefix
|
|
341
|
+
* unit — the IFC default. A prefixed SI area/volume unit (rare) raises the
|
|
342
|
+
* prefix to `power` (area = prefix², volume = prefix³), matching `rust/core`.
|
|
336
343
|
*/
|
|
337
344
|
private resolveDerivedUnitScale;
|
|
338
345
|
/** Uppercase an enum token, stripping the STEP `.ENUM.` dots. `''` for nullish. */
|
|
@@ -387,41 +394,6 @@ export declare class MergedExporter {
|
|
|
387
394
|
* hidden (below).
|
|
388
395
|
*/
|
|
389
396
|
private renderEntity;
|
|
390
|
-
/**
|
|
391
|
-
* Read the GlobalId (first quoted attribute) from an already-rendered STEP
|
|
392
|
-
* line. Used to register the id that was actually emitted, after any id
|
|
393
|
-
* remap, GlobalId re-stamp, or schema conversion. Returns null if the first
|
|
394
|
-
* quoted token is not a 22-char GlobalId.
|
|
395
|
-
*/
|
|
396
|
-
private readLeadingGuid;
|
|
397
|
-
/**
|
|
398
|
-
* Mint a fresh, deterministic, collision-free GlobalId for an entity whose id
|
|
399
|
-
* collides. Seeded from the original GlobalId and the model's stable id so the
|
|
400
|
-
* output is reproducible and does not churn when an unrelated earlier model
|
|
401
|
-
* changes size; checked against both already-emitted ids and the ids minted
|
|
402
|
-
* so far for this model.
|
|
403
|
-
*/
|
|
404
|
-
private mintUniqueGuid;
|
|
405
|
-
/**
|
|
406
|
-
* Read an entity's GlobalId (first attribute) by decoding only its head.
|
|
407
|
-
* Returns the 22-char id for a rooted entity, or `null` for any entity whose
|
|
408
|
-
* first attribute is not a GlobalId (geometry, lists, property atoms, …).
|
|
409
|
-
*/
|
|
410
|
-
private extractGlobalIdFast;
|
|
411
|
-
/**
|
|
412
|
-
* Replace an entity's GlobalId (first quoted attribute) with `newGuid`.
|
|
413
|
-
* `newGuid` is a 22-char IFC id (no quote in its charset), so this is safe.
|
|
414
|
-
*/
|
|
415
|
-
private replaceGlobalId;
|
|
416
|
-
/**
|
|
417
|
-
* Remap all #ID references in a STEP entity line.
|
|
418
|
-
* Applies offset to all IDs, then overrides with specific remappings.
|
|
419
|
-
*
|
|
420
|
-
* Only `#<digits>` tokens in code positions are rewritten; tokens inside
|
|
421
|
-
* single-quoted STEP strings (e.g. a 'Room #205' Name or a 'http://x#42'
|
|
422
|
-
* URL) are left untouched so string attribute values are not corrupted.
|
|
423
|
-
*/
|
|
424
|
-
private remapEntityText;
|
|
425
397
|
/**
|
|
426
398
|
* Find entity IDs of shared infrastructure types in a data store.
|
|
427
399
|
* Returns a map of uppercase type name → array of expressIds.
|
|
@@ -465,17 +437,6 @@ export declare class MergedExporter {
|
|
|
465
437
|
* rather than kept as its own root.
|
|
466
438
|
*/
|
|
467
439
|
private matchRootContainer;
|
|
468
|
-
/**
|
|
469
|
-
* Skip IfcRelAggregates that become fully redundant after spatial unification.
|
|
470
|
-
*
|
|
471
|
-
* When Model2's `IfcRelAggregates(Project, (Site))` gets remapped to
|
|
472
|
-
* `IfcRelAggregates(FirstProject, (FirstSite))`, it duplicates Model1's
|
|
473
|
-
* existing relationship, causing viewers to show Site multiple times.
|
|
474
|
-
*
|
|
475
|
-
* An IfcRelAggregates is redundant if both its RelatingObject (attr 4)
|
|
476
|
-
* and ALL its RelatedObjects (attr 5) were remapped via sharedRemap.
|
|
477
|
-
*/
|
|
478
|
-
private skipRedundantRelAggregates;
|
|
479
440
|
/**
|
|
480
441
|
* Extract the Name attribute (index 2) from a STEP entity.
|
|
481
442
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merged-exporter.d.ts","sourceRoot":"","sources":["../src/merged-exporter.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"merged-exporter.d.ts","sourceRoot":"","sources":["../src/merged-exporter.ts"],"names":[],"mappings":"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"}
|