@ifc-lite/export 4.7.2 → 4.8.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/entity-subgraph.d.ts +56 -0
- package/dist/entity-subgraph.d.ts.map +1 -0
- package/dist/entity-subgraph.js +138 -0
- package/dist/entity-subgraph.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/lod0-generator.d.ts.map +1 -1
- package/dist/lod0-generator.js +4 -1
- package/dist/lod0-generator.js.map +1 -1
- package/dist/merged-empty-containers-refs.d.ts +24 -0
- package/dist/merged-empty-containers-refs.d.ts.map +1 -0
- package/dist/merged-empty-containers-refs.js +126 -0
- package/dist/merged-empty-containers-refs.js.map +1 -0
- package/dist/merged-empty-containers.d.ts +36 -1
- package/dist/merged-empty-containers.d.ts.map +1 -1
- package/dist/merged-empty-containers.js +21 -126
- package/dist/merged-empty-containers.js.map +1 -1
- package/dist/merged-exporter.d.ts +4 -1
- package/dist/merged-exporter.d.ts.map +1 -1
- package/dist/merged-exporter.js +42 -39
- package/dist/merged-exporter.js.map +1 -1
- package/dist/merged-guid.d.ts +4 -0
- package/dist/merged-guid.d.ts.map +1 -1
- package/dist/merged-guid.js +14 -0
- package/dist/merged-guid.js.map +1 -1
- package/dist/merged-inverse-claims.d.ts +154 -0
- package/dist/merged-inverse-claims.d.ts.map +1 -0
- package/dist/merged-inverse-claims.js +306 -0
- package/dist/merged-inverse-claims.js.map +1 -0
- package/dist/merged-planner-guids.d.ts +32 -0
- package/dist/merged-planner-guids.d.ts.map +1 -0
- package/dist/merged-planner-guids.js +79 -0
- package/dist/merged-planner-guids.js.map +1 -0
- package/dist/merged-subcontext.d.ts.map +1 -1
- package/dist/merged-subcontext.js +1 -0
- package/dist/merged-subcontext.js.map +1 -1
- package/dist/parquet-exporter.d.ts.map +1 -1
- package/dist/parquet-exporter.js +25 -23
- package/dist/parquet-exporter.js.map +1 -1
- package/dist/parquet-spatial-rows.d.ts +14 -0
- package/dist/parquet-spatial-rows.d.ts.map +1 -0
- package/dist/parquet-spatial-rows.js +57 -0
- package/dist/parquet-spatial-rows.js.map +1 -0
- package/dist/property-value-serialization.d.ts.map +1 -1
- package/dist/property-value-serialization.js +2 -1
- package/dist/property-value-serialization.js.map +1 -1
- package/dist/reference-collector.js +3 -0
- package/dist/reference-collector.js.map +1 -1
- package/dist/related-entities.d.ts.map +1 -1
- package/dist/related-entities.js +6 -0
- package/dist/related-entities.js.map +1 -1
- package/dist/remesh-context-roots.d.ts +36 -0
- package/dist/remesh-context-roots.d.ts.map +1 -0
- package/dist/remesh-context-roots.js +126 -0
- package/dist/remesh-context-roots.js.map +1 -0
- package/dist/step-collection.js +1 -1
- package/dist/step-collection.js.map +1 -1
- package/dist/step-export-types.d.ts +2 -0
- package/dist/step-export-types.d.ts.map +1 -1
- package/dist/step-omission-predicates.d.ts +8 -0
- package/dist/step-omission-predicates.d.ts.map +1 -1
- package/dist/step-omission-predicates.js +11 -1
- package/dist/step-omission-predicates.js.map +1 -1
- package/dist/step-overlay-entities.d.ts.map +1 -1
- package/dist/step-overlay-entities.js +23 -1
- package/dist/step-overlay-entities.js.map +1 -1
- package/dist/step-pass-builder.d.ts.map +1 -1
- package/dist/step-pass-builder.js +1 -0
- package/dist/step-pass-builder.js.map +1 -1
- package/dist/step-property-set-collection.d.ts +2 -0
- package/dist/step-property-set-collection.d.ts.map +1 -1
- package/dist/step-property-set-collection.js +42 -21
- package/dist/step-property-set-collection.js.map +1 -1
- package/dist/step-property-set-generators.d.ts +1 -1
- package/dist/step-property-set-generators.d.ts.map +1 -1
- package/dist/step-property-set-generators.js +19 -2
- package/dist/step-property-set-generators.js.map +1 -1
- package/dist/step-property-set-index.js +5 -2
- package/dist/step-property-set-index.js.map +1 -1
- package/dist/step-property-sets.d.ts.map +1 -1
- package/dist/step-property-sets.js +5 -2
- package/dist/step-property-sets.js.map +1 -1
- package/dist/step-pset-copy-on-write.d.ts +75 -0
- package/dist/step-pset-copy-on-write.d.ts.map +1 -0
- package/dist/step-pset-copy-on-write.js +146 -0
- package/dist/step-pset-copy-on-write.js.map +1 -0
- package/dist/step-source-iteration.d.ts.map +1 -1
- package/dist/step-source-iteration.js +7 -0
- package/dist/step-source-iteration.js.map +1 -1
- package/package.json +11 -10
- package/dist/merged-rel-aggregates.d.ts +0 -63
- package/dist/merged-rel-aggregates.d.ts.map +0 -1
- package/dist/merged-rel-aggregates.js +0 -122
- package/dist/merged-rel-aggregates.js.map +0 -1
|
@@ -0,0 +1,306 @@
|
|
|
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 { filterHiddenRefsFromRelationshipLine } from './reference-collector.js';
|
|
5
|
+
import { readStepSlots, replaceStepArgument } from './step-argument-parser.js';
|
|
6
|
+
/** Shorthand for a row: `inverse` on attribute `claimed`, related to attribute `partner`. */
|
|
7
|
+
const rule = (inverse, claimed, partner, extra = {}) => ({ inverse, claimed, partner, ...extra });
|
|
8
|
+
/**
|
|
9
|
+
* Rows every schema shares (#5923): containment, voids and fills, coverings,
|
|
10
|
+
* flow control, ports, services and structural activity. Each is `SET [0:1]`
|
|
11
|
+
* (or exactly one) on the claimed side in IFC2X3, IFC4 and IFC4X3.
|
|
12
|
+
*/
|
|
13
|
+
const SHARED_ROWS = [
|
|
14
|
+
['IFCRELCONTAINEDINSPATIALSTRUCTURE', [rule('ContainedInStructure', 4, 5)]],
|
|
15
|
+
['IFCRELVOIDSELEMENT', [rule('VoidsElements', 5, 4)]],
|
|
16
|
+
['IFCRELFILLSELEMENT', [rule('FillsVoids', 5, 4)]],
|
|
17
|
+
['IFCRELPROJECTSELEMENT', [rule('ProjectsElements', 5, 4)]],
|
|
18
|
+
['IFCRELCOVERSSPACES', [rule('CoversSpaces', 5, 4)]],
|
|
19
|
+
['IFCRELFLOWCONTROLELEMENTS', [rule('AssignedToFlowElement', 4, 5), rule('HasControlElements', 5, 4)]],
|
|
20
|
+
['IFCRELCONNECTSPORTS', [rule('ConnectedTo', 4, 5), rule('ConnectedFrom', 5, 4)]],
|
|
21
|
+
['IFCRELSERVICESBUILDINGS', [rule('ServicesBuildings', 4, 5)]],
|
|
22
|
+
];
|
|
23
|
+
/**
|
|
24
|
+
* Relationship type (uppercase) → its single-valued inverses, per OUTPUT
|
|
25
|
+
* schema, list-side rules first. Every row is checked against the EXPRESS
|
|
26
|
+
* schemas in `merged-inverse-claims.test.ts`, which also lists the one
|
|
27
|
+
* single-valued relationship inverse left out and why.
|
|
28
|
+
*
|
|
29
|
+
* IFC2X3: `IfcObjectDefinition.Decomposes : SET [0:1] OF IfcRelDecomposes`,
|
|
30
|
+
* and IfcRelAggregates and IfcRelNests are both IfcRelDecomposes, so one
|
|
31
|
+
* nesting and one aggregation parent together are already two (#5726).
|
|
32
|
+
* `IfcPropertySetDefinition.PropertyDefinitionOf : SET [0:1] OF
|
|
33
|
+
* IfcRelDefinesByProperties` (#5774). A type has one IfcRelDefinesByType
|
|
34
|
+
* (`ObjectTypeOf`), and `IfcObject.WR1` (a WHERE rule, not an inverse bound)
|
|
35
|
+
* allows an object one. IFC4 and later split `Nests : SET [0:1] OF IfcRelNests`
|
|
36
|
+
* off `Decomposes : SET [0:1] OF IfcRelAggregates`, name the typing inverses
|
|
37
|
+
* `IsTypedBy`/`Types`, and relax the property-set side to
|
|
38
|
+
* `DefinesOccurrence : SET [0:?]`, so a property set may be shared by several
|
|
39
|
+
* IfcRelDefinesByProperties there.
|
|
40
|
+
*/
|
|
41
|
+
const PROPERTY_DEFINITION_OF = rule('PropertyDefinitionOf', 5, 4);
|
|
42
|
+
const IFC2X3_RULES = new Map([
|
|
43
|
+
...SHARED_ROWS,
|
|
44
|
+
['IFCRELAGGREGATES', [rule('Decomposes', 5, 4)]],
|
|
45
|
+
['IFCRELNESTS', [rule('Decomposes', 5, 4)]],
|
|
46
|
+
['IFCRELDEFINESBYPROPERTIES', [PROPERTY_DEFINITION_OF]],
|
|
47
|
+
// `IfcRelOverridesProperties.WR1`: `SIZEOF(RelatedObjects) = 1`.
|
|
48
|
+
['IFCRELOVERRIDESPROPERTIES', [{ ...PROPERTY_DEFINITION_OF, onePartner: true }]],
|
|
49
|
+
['IFCRELDEFINESBYTYPE', [rule('IsDefinedBy', 4, 5, { where: 'IfcObject.WR1' }), rule('ObjectTypeOf', 5, 4)]],
|
|
50
|
+
['IFCRELCOVERSBLDGELEMENTS', [rule('Covers', 5, 4)]],
|
|
51
|
+
['IFCRELCONNECTSPORTTOELEMENT', [rule('ContainedIn', 4, 5)]],
|
|
52
|
+
['IFCRELCONNECTSSTRUCTURALACTIVITY', [rule('AssignedToStructuralItem', 5, 4)]],
|
|
53
|
+
['IFCRELASSIGNSTOGROUP', [rule('IsGroupedBy', 6, 4)]],
|
|
54
|
+
['IFCRELASSIGNSTASKS', [rule('ScheduleTimeControlAssigned', 7, 6)]],
|
|
55
|
+
]);
|
|
56
|
+
const IFC4_ROWS = [
|
|
57
|
+
...SHARED_ROWS,
|
|
58
|
+
['IFCRELAGGREGATES', [rule('Decomposes', 5, 4)]],
|
|
59
|
+
['IFCRELNESTS', [rule('Nests', 5, 4)]],
|
|
60
|
+
['IFCRELDEFINESBYTYPE', [rule('IsTypedBy', 4, 5), rule('Types', 5, 4)]],
|
|
61
|
+
['IFCRELDEFINESBYOBJECT', [rule('IsDeclaredBy', 4, 5)]],
|
|
62
|
+
['IFCRELDECLARES', [rule('HasContext', 5, 4)]],
|
|
63
|
+
['IFCRELCOVERSBLDGELEMENTS', [rule('CoversElements', 5, 4)]],
|
|
64
|
+
['IFCRELCONNECTSPORTTOELEMENT', [rule('ContainedIn', 4, 5)]],
|
|
65
|
+
['IFCRELCONNECTSSTRUCTURALACTIVITY', [rule('AssignedToStructuralItem', 5, 4)]],
|
|
66
|
+
];
|
|
67
|
+
const IFC4_RULES = new Map(IFC4_ROWS);
|
|
68
|
+
const IFC4X3_RULES = new Map([...IFC4_ROWS, ['IFCRELADHERESTOELEMENT', [rule('AdheresToElement', 5, 4)]]]);
|
|
69
|
+
/** The rule table of an output schema (IFC5 falls back to IFC4X3's). */
|
|
70
|
+
export function inverseRules(outputSchema) {
|
|
71
|
+
return outputSchema === 'IFC2X3' ? IFC2X3_RULES : outputSchema === 'IFC4' ? IFC4_RULES : IFC4X3_RULES;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Which final ids already fill each single-valued inverse in the merge output.
|
|
75
|
+
* One instance per merge, grown model by model in merge order.
|
|
76
|
+
*/
|
|
77
|
+
export class InverseClaims {
|
|
78
|
+
/** Relationship type (uppercase) → the rules it is claimed under. */
|
|
79
|
+
rules;
|
|
80
|
+
/** Claimed through a list side (RelatedObjects, RelatedElements): the ids alone. */
|
|
81
|
+
members = new Map();
|
|
82
|
+
/** Claimed through a single side (RelatingPropertyDefinition): the rel that owns each. */
|
|
83
|
+
owners = new Map();
|
|
84
|
+
/** Final rel id → partner ids a later, folded rel adds to its partner list. */
|
|
85
|
+
folds = new Map();
|
|
86
|
+
/** Later rels withheld with partners no owner could take: final rel id → how many. */
|
|
87
|
+
unfolded = new Map();
|
|
88
|
+
/** `only` narrows the claimed relationship types (the #5725 drop planner's view). */
|
|
89
|
+
constructor(outputSchema, only = () => true) {
|
|
90
|
+
this.rules = new Map([...inverseRules(outputSchema)].filter(([relType]) => only(relType)));
|
|
91
|
+
}
|
|
92
|
+
membersOf(inverse) {
|
|
93
|
+
let ids = this.members.get(inverse);
|
|
94
|
+
if (ids === undefined)
|
|
95
|
+
this.members.set(inverse, (ids = new Set()));
|
|
96
|
+
return ids;
|
|
97
|
+
}
|
|
98
|
+
ownersOf(inverse) {
|
|
99
|
+
let owners = this.owners.get(inverse);
|
|
100
|
+
if (owners === undefined)
|
|
101
|
+
this.owners.set(inverse, (owners = new Map()));
|
|
102
|
+
return owners;
|
|
103
|
+
}
|
|
104
|
+
/** Move `ids` onto `owner`'s partner list, in place of a rel that would have been a second one. */
|
|
105
|
+
fold(owner, ids) {
|
|
106
|
+
for (const id of ids)
|
|
107
|
+
owner.partners.add(id);
|
|
108
|
+
const fold = this.folds.get(owner.rel);
|
|
109
|
+
if (fold === undefined)
|
|
110
|
+
this.folds.set(owner.rel, { partnerIndex: owner.partnerIndex, ids: [...ids] });
|
|
111
|
+
else
|
|
112
|
+
fold.ids.push(...ids);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Keep one written rel per entity and single-valued inverse across a merge
|
|
117
|
+
* (#5471, #5726, #5774).
|
|
118
|
+
*
|
|
119
|
+
* Called once per model in merge order, after all of that model's unification
|
|
120
|
+
* and container drops. `claims` holds what the output already says: every rel
|
|
121
|
+
* the model will write records its claims. A rel that will not be written
|
|
122
|
+
* (skipped, outside the visibility closure, or with a hidden or dropped
|
|
123
|
+
* single-valued side) claims nothing, and neither does a member narrowed out
|
|
124
|
+
* of it, so a later model's rel stays in place for an entity whose primary rel
|
|
125
|
+
* is not in the output.
|
|
126
|
+
*
|
|
127
|
+
* With `dedupe`, a later rel naming an already-claimed entity is resolved by
|
|
128
|
+
* the claimed side's shape:
|
|
129
|
+
* - a LIST side (an object's parent, #5471): the claimed members are stripped
|
|
130
|
+
* into `relMemberStrip` for {@link applyRelMemberStrip}, and a rel left with
|
|
131
|
+
* none is skipped. The first parent wins. A unified member with no parent yet
|
|
132
|
+
* is kept, since that rel is then its only parentage statement (#3550).
|
|
133
|
+
* - a SINGLE side (a property set's one definer, #5774): the rel is skipped.
|
|
134
|
+
* If its partner side is a list naming objects the owning rel does not, those
|
|
135
|
+
* are folded into the owning rel ({@link InverseClaims.fold}, written by
|
|
136
|
+
* {@link applyInverseFolds}), so the entity keeps one rel and loses no member.
|
|
137
|
+
* Where no fold is possible (a single partner, an owner of another rel type,
|
|
138
|
+
* or a partner list a WHERE rule bounds to one) the first rel wins, and
|
|
139
|
+
* {@link applyInverseFolds} reports the objects that lost the relationship.
|
|
140
|
+
*/
|
|
141
|
+
export function claimInverses(input, claims, findEntitiesByType, extractStepAttribute) {
|
|
142
|
+
const { dataStore, sharedRemap, idOffset, skipEntityIds, relMemberStrip, isEmitted, isIncluded, dedupe } = input;
|
|
143
|
+
const finalId = (ref) => sharedRemap.get(ref) ?? ref + idOffset;
|
|
144
|
+
for (const [relType, rules] of claims.rules) {
|
|
145
|
+
const indices = [...new Set(rules.flatMap(rule => [rule.claimed, rule.partner]))];
|
|
146
|
+
for (const relId of findEntitiesByType(dataStore, relType)) {
|
|
147
|
+
if (skipEntityIds.has(relId) || !isIncluded(relId))
|
|
148
|
+
continue;
|
|
149
|
+
const sides = new Map();
|
|
150
|
+
let written = true;
|
|
151
|
+
for (const index of indices) {
|
|
152
|
+
const side = readSide(extractStepAttribute(relId, dataStore, index), isEmitted);
|
|
153
|
+
if (side === 'withheld')
|
|
154
|
+
written = false;
|
|
155
|
+
else if (side !== null)
|
|
156
|
+
sides.set(index, side);
|
|
157
|
+
}
|
|
158
|
+
if (!written)
|
|
159
|
+
continue;
|
|
160
|
+
const strip = new Set();
|
|
161
|
+
const live = (index) => (sides.get(index)?.refs ?? []).filter(ref => !strip.has(ref));
|
|
162
|
+
let skip = false;
|
|
163
|
+
let fold;
|
|
164
|
+
const newOwners = [];
|
|
165
|
+
// List sides first: what they strip is no longer a partner a single side can fold.
|
|
166
|
+
for (const rule of [...rules].sort((a, b) => Number(!sides.get(a.claimed)?.list) - Number(!sides.get(b.claimed)?.list))) {
|
|
167
|
+
const claimed = sides.get(rule.claimed);
|
|
168
|
+
if (claimed === undefined)
|
|
169
|
+
continue;
|
|
170
|
+
if (claimed.list) {
|
|
171
|
+
const members = live(rule.claimed);
|
|
172
|
+
const claimedIds = claims.membersOf(rule.inverse);
|
|
173
|
+
const redundant = dedupe ? members.filter(ref => claimedIds.has(finalId(ref))) : [];
|
|
174
|
+
for (const ref of redundant)
|
|
175
|
+
strip.add(ref);
|
|
176
|
+
if (redundant.length > 0 && redundant.length === members.length)
|
|
177
|
+
skip = true;
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
const owners = claims.ownersOf(rule.inverse);
|
|
181
|
+
const owner = owners.get(finalId(claimed.refs[0]));
|
|
182
|
+
if (owner === undefined)
|
|
183
|
+
newOwners.push([owners, claimed.refs[0], rule]);
|
|
184
|
+
else if (dedupe) {
|
|
185
|
+
skip = true;
|
|
186
|
+
const fresh = [...new Set(live(rule.partner).map(finalId))].filter(id => !owner.partners.has(id));
|
|
187
|
+
const foldable = sides.get(rule.partner)?.list && owner.relType === relType && !rule.onePartner;
|
|
188
|
+
if (fresh.length > 0 && foldable)
|
|
189
|
+
fold = { owner, ids: fresh };
|
|
190
|
+
else if (fresh.length > 0)
|
|
191
|
+
claims.unfolded.set(finalId(relId), fresh.length);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (skip)
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
if (fold !== undefined)
|
|
198
|
+
claims.fold(fold.owner, fold.ids);
|
|
199
|
+
if (skip && fold === undefined) {
|
|
200
|
+
skipEntityIds.add(relId);
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
// Kept, or folded into its owner: either way its surviving members are now written.
|
|
204
|
+
for (const rule of rules) {
|
|
205
|
+
if (sides.get(rule.claimed)?.list)
|
|
206
|
+
for (const ref of live(rule.claimed))
|
|
207
|
+
claims.membersOf(rule.inverse).add(finalId(ref));
|
|
208
|
+
}
|
|
209
|
+
if (skip) {
|
|
210
|
+
skipEntityIds.add(relId);
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
if (strip.size > 0)
|
|
214
|
+
relMemberStrip.set(relId, strip);
|
|
215
|
+
for (const [owners, ref, rule] of newOwners) {
|
|
216
|
+
owners.set(finalId(ref), { rel: finalId(relId), relType, partnerIndex: rule.partner, partners: new Set(live(rule.partner).map(finalId)) });
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* One rel attribute as the output will carry it: `null` when it names nothing
|
|
223
|
+
* (`$`, a value), `'withheld'` when the line is not written because of it (a
|
|
224
|
+
* single ref, or every member of a list, that is not emitted).
|
|
225
|
+
*/
|
|
226
|
+
function readSide(attr, isEmitted) {
|
|
227
|
+
if (!attr)
|
|
228
|
+
return null;
|
|
229
|
+
const trimmed = attr.trim();
|
|
230
|
+
const list = trimmed.startsWith('(');
|
|
231
|
+
// A single side is claimable only as a bare ref: an IFC4 IfcPropertySetDefinitionSet(...) is not one entity.
|
|
232
|
+
if (!list && !/^#\d+$/.test(trimmed))
|
|
233
|
+
return null;
|
|
234
|
+
const all = listRefs(trimmed);
|
|
235
|
+
if (all.length === 0)
|
|
236
|
+
return null;
|
|
237
|
+
const refs = all.filter(isEmitted);
|
|
238
|
+
return refs.length === 0 ? 'withheld' : { list, refs };
|
|
239
|
+
}
|
|
240
|
+
/** The `#id`s in one STEP attribute, in order; `[]` for a missing one. */
|
|
241
|
+
function listRefs(attr) {
|
|
242
|
+
const refs = [];
|
|
243
|
+
const refRegex = /#(\d+)/g;
|
|
244
|
+
let match;
|
|
245
|
+
while ((match = refRegex.exec(attr)) !== null)
|
|
246
|
+
refs.push(parseInt(match[1], 10));
|
|
247
|
+
return refs;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Render-time counterpart of {@link claimInverses}: drop the claimed members
|
|
251
|
+
* of a partially redundant rel that already fill that inverse in the output.
|
|
252
|
+
* Reuses the same list/scalar-aware ref filter the `visibleOnly`/deletion
|
|
253
|
+
* dangling-ref path uses. Must run in LOCAL id space, before any id
|
|
254
|
+
* offset/remap — `localId` and the ids inside `relMemberStrip` are both local
|
|
255
|
+
* to the model being rendered.
|
|
256
|
+
*
|
|
257
|
+
* Returns `entityText` unchanged when `localId` has no strip entry, and
|
|
258
|
+
* `null` when the filter would withhold the whole line — a strip set built
|
|
259
|
+
* by {@link claimInverses} is a strict subset of the claimed list, so for
|
|
260
|
+
* well-formed input the filter only narrows, but a degenerate file (a
|
|
261
|
+
* stripped member id that also appears as a single-valued ref, e.g.
|
|
262
|
+
* self-aggregation) can null the line. The caller must withhold it, like
|
|
263
|
+
* every other user of the filter: every edge the line declared is already
|
|
264
|
+
* declared by the primary model, and emitting the unfiltered bytes instead
|
|
265
|
+
* would reintroduce the duplicate membership this module exists to remove.
|
|
266
|
+
*/
|
|
267
|
+
export function applyRelMemberStrip(entityText, localId, relMemberStrip) {
|
|
268
|
+
const toStrip = relMemberStrip.get(localId);
|
|
269
|
+
if (toStrip === undefined)
|
|
270
|
+
return entityText;
|
|
271
|
+
return filterHiddenRefsFromRelationshipLine(entityText, id => toStrip.has(id));
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Write the folds of {@link claimInverses} into the rendered output: each
|
|
275
|
+
* owning rel's partner list gains the members of the later rels folded into
|
|
276
|
+
* it. Runs once, on the final lines (final id space), after every model is
|
|
277
|
+
* rendered, since an owner may be written before the rel that folds into it.
|
|
278
|
+
* Returns a warning per later rel whose objects lost the relationship: one
|
|
279
|
+
* no owner could take (a different rel type, or a partner list bounded to
|
|
280
|
+
* one), and one folded into an owner that did not reach the output as a line
|
|
281
|
+
* with a partner list.
|
|
282
|
+
*/
|
|
283
|
+
export function applyInverseFolds(lines, claims) {
|
|
284
|
+
const lost = [...claims.unfolded].map(([rel, count]) => `A later model's relationship (merged id #${rel}) was not written: an earlier model already wrote one for the same merged entity, and it could not take the ${count} other object(s) the later one named, so those objects lost that relationship.`);
|
|
285
|
+
if (claims.folds.size === 0)
|
|
286
|
+
return lost;
|
|
287
|
+
const pending = new Map(claims.folds);
|
|
288
|
+
for (let i = 0; i < lines.length && pending.size > 0; i++) {
|
|
289
|
+
const rel = Number(/^#(\d+)=/.exec(lines[i])?.[1]);
|
|
290
|
+
const fold = pending.get(rel);
|
|
291
|
+
if (fold === undefined)
|
|
292
|
+
continue;
|
|
293
|
+
const list = readStepSlots(lines[i])?.slots[fold.partnerIndex]?.trim();
|
|
294
|
+
if (list === undefined || !list.startsWith('(') || !list.endsWith(')'))
|
|
295
|
+
continue;
|
|
296
|
+
const inner = list.slice(1, -1).trim();
|
|
297
|
+
const added = fold.ids.map(ref => `#${ref}`).join(',');
|
|
298
|
+
const next = replaceStepArgument(lines[i], fold.partnerIndex, `(${inner === '' ? added : `${inner},${added}`})`);
|
|
299
|
+
if (next === null)
|
|
300
|
+
continue;
|
|
301
|
+
lines[i] = next;
|
|
302
|
+
pending.delete(rel);
|
|
303
|
+
}
|
|
304
|
+
return [...lost, ...[...pending].map(([rel, { ids }]) => `Could not add ${ids.length} object(s) to relationship #${rel}, which a later model's duplicate relationship was merged into; those objects lost that relationship.`)];
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=merged-inverse-claims.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merged-inverse-claims.js","sourceRoot":"","sources":["../src/merged-inverse-claims.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** One model as {@link PlannerGuids.plan} sees it, in merge order. */
|
|
2
|
+
export interface PlannerGuidModel {
|
|
3
|
+
/** Rooted entities in emit order: local id → GlobalId (`planModel`'s `localGuids`, `readLocalGuids`). */
|
|
4
|
+
guids: ReadonlyMap<number, string>;
|
|
5
|
+
/** Uppercase STEP type of a local id. */
|
|
6
|
+
typeOf: (localId: number) => string;
|
|
7
|
+
isFirst: boolean;
|
|
8
|
+
compatible: boolean;
|
|
9
|
+
offset: number;
|
|
10
|
+
/** Unit scale the model's entities are recorded with (`ModelMode.effectiveScale`). */
|
|
11
|
+
effectiveScale: number;
|
|
12
|
+
/** Written with its source GlobalId unchanged: false when exported across schemas. */
|
|
13
|
+
keepsGuids: boolean;
|
|
14
|
+
/** Left out before GlobalId reconciliation: the unified IfcProject, a spatially unified container. */
|
|
15
|
+
unifiedEarlier: (localId: number) => boolean;
|
|
16
|
+
/** In the output at all (visibility closure). */
|
|
17
|
+
isIncluded: (localId: number) => boolean;
|
|
18
|
+
}
|
|
19
|
+
/** The emit pass's GlobalId records, replayed conservatively across one merge. */
|
|
20
|
+
export declare class PlannerGuids {
|
|
21
|
+
private readonly isPrimaryUnit;
|
|
22
|
+
private readonly isContainer;
|
|
23
|
+
private readonly records;
|
|
24
|
+
constructor(isPrimaryUnit: (scale: number) => boolean, isContainer: (typeUpper: string) => boolean);
|
|
25
|
+
/**
|
|
26
|
+
* `planModel`'s GlobalId step for one model, then the records its writes
|
|
27
|
+
* leave. Returns local id → final id for the entities the emit pass is sure
|
|
28
|
+
* to unify by GlobalId. Call once per model, in merge order.
|
|
29
|
+
*/
|
|
30
|
+
plan(model: PlannerGuidModel): Map<number, number>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=merged-planner-guids.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merged-planner-guids.d.ts","sourceRoot":"","sources":["../src/merged-planner-guids.ts"],"names":[],"mappings":"AA2CA,sEAAsE;AACtE,MAAM,WAAW,gBAAgB;IAC/B,yGAAyG;IACzG,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,yCAAyC;IACzC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,sFAAsF;IACtF,cAAc,EAAE,MAAM,CAAC;IACvB,sFAAsF;IACtF,UAAU,EAAE,OAAO,CAAC;IACpB,sGAAsG;IACtG,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC7C,iDAAiD;IACjD,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;CAC1C;AAED,kFAAkF;AAClF,qBAAa,YAAY;IAIrB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAJ9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;gBAGtC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,EACzC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO;IAG9D;;;;OAIG;IACH,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;CAsBnD"}
|
|
@@ -0,0 +1,79 @@
|
|
|
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
|
+
* The GlobalId half of the `dropEmptyContainers` planner's claim pass (#5937).
|
|
6
|
+
*
|
|
7
|
+
* The planner has to know, before anything is written, which aggregation edges
|
|
8
|
+
* the emit pass's one-parent claim pass (#5471, #5725) will withhold. That
|
|
9
|
+
* pass resolves ids through GlobalId reconciliation (`planModel`): a later
|
|
10
|
+
* model's entity that repeats a GlobalId an earlier model WROTE is unified
|
|
11
|
+
* onto it. The planner used to resolve through spatial unification only, so an
|
|
12
|
+
* edge withheld because its child unified by GlobalId still counted, and its
|
|
13
|
+
* container was written empty.
|
|
14
|
+
*
|
|
15
|
+
* {@link PlannerGuids} replays that reconciliation from what the planner can
|
|
16
|
+
* know up front. It must never unify two entities the emit pass keeps apart:
|
|
17
|
+
* then the planner would withhold an edge the emit pass writes, and could drop
|
|
18
|
+
* the parent of a full container (the WR41 invariant). So wherever the emit
|
|
19
|
+
* pass's verdict depends on something the planner cannot see, the GlobalId is
|
|
20
|
+
* marked UNKNOWN and nothing resolves through it afterwards. Missing a
|
|
21
|
+
* unification only keeps a container, which is #3643's behaviour before #5725.
|
|
22
|
+
* UNKNOWN covers:
|
|
23
|
+
* - a model exported across schemas: conversion may replace an entity with an
|
|
24
|
+
* IFCPROXY that carries a fresh GlobalId, so the source one is not recorded;
|
|
25
|
+
* - a relationship: the claim pass itself may withhold it;
|
|
26
|
+
* - an entity whose own GlobalId was already UNKNOWN.
|
|
27
|
+
* A GlobalId one model writes twice is recorded as the emit pass records it:
|
|
28
|
+
* the last copy in index order.
|
|
29
|
+
*
|
|
30
|
+
* Containers are the one thing written or not by the plan being made. A
|
|
31
|
+
* container unifies here only onto a container (and anything else only onto
|
|
32
|
+
* anything else), and only where `canonicalContainers` in
|
|
33
|
+
* `merged-empty-containers.ts` puts both on one node, so a container this pass
|
|
34
|
+
* treats as written but the plan drops takes every copy it was unified with
|
|
35
|
+
* along: the edges to them are withheld by the drop either way.
|
|
36
|
+
*/
|
|
37
|
+
import { isRelationshipType } from './merged-guid.js';
|
|
38
|
+
/** The emit pass's GlobalId records, replayed conservatively across one merge. */
|
|
39
|
+
export class PlannerGuids {
|
|
40
|
+
isPrimaryUnit;
|
|
41
|
+
isContainer;
|
|
42
|
+
records = new Map();
|
|
43
|
+
constructor(isPrimaryUnit, isContainer) {
|
|
44
|
+
this.isPrimaryUnit = isPrimaryUnit;
|
|
45
|
+
this.isContainer = isContainer;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* `planModel`'s GlobalId step for one model, then the records its writes
|
|
49
|
+
* leave. Returns local id → final id for the entities the emit pass is sure
|
|
50
|
+
* to unify by GlobalId. Call once per model, in merge order.
|
|
51
|
+
*/
|
|
52
|
+
plan(model) {
|
|
53
|
+
const unified = new Map();
|
|
54
|
+
const settled = new Set();
|
|
55
|
+
for (const [id, guid] of model.guids) {
|
|
56
|
+
if (model.unifiedEarlier(id) || !this.records.has(guid))
|
|
57
|
+
continue;
|
|
58
|
+
const type = model.typeOf(id);
|
|
59
|
+
// An earlier record exists: the emit pass unifies or re-stamps, and never records this GlobalId again.
|
|
60
|
+
settled.add(id);
|
|
61
|
+
const prior = this.records.get(guid);
|
|
62
|
+
const canUnify = !model.isFirst && model.compatible && prior !== null && this.isPrimaryUnit(prior.scale) && !isRelationshipType(type);
|
|
63
|
+
if (canUnify && prior.container === this.isContainer(type))
|
|
64
|
+
unified.set(id, prior.finalId);
|
|
65
|
+
}
|
|
66
|
+
const written = new Map();
|
|
67
|
+
for (const [id, guid] of model.guids) {
|
|
68
|
+
if (settled.has(id) || model.unifiedEarlier(id) || !model.isIncluded(id))
|
|
69
|
+
continue;
|
|
70
|
+
const type = model.typeOf(id);
|
|
71
|
+
const known = model.keepsGuids && !isRelationshipType(type);
|
|
72
|
+
written.set(guid, known ? { finalId: id + model.offset, scale: model.effectiveScale, container: this.isContainer(type) } : null);
|
|
73
|
+
}
|
|
74
|
+
for (const [guid, record] of written)
|
|
75
|
+
this.records.set(guid, record);
|
|
76
|
+
return unified;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=merged-planner-guids.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merged-planner-guids.js","sourceRoot":"","sources":["../src/merged-planner-guids.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAwBtD,kFAAkF;AAClF,MAAM,OAAO,YAAY;IAIJ;IACA;IAJF,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEzD,YACmB,aAAyC,EACzC,WAA2C;QAD3C,kBAAa,GAAb,aAAa,CAA4B;QACzC,gBAAW,GAAX,WAAW,CAAgC;IAC3D,CAAC;IAEJ;;;;OAIG;IACH,IAAI,CAAC,KAAuB;QAC1B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACrC,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAClE,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC9B,uGAAuG;YACvG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACtI,IAAI,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7F,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;QAC9C,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACrC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBAAE,SAAS;YACnF,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnI,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrE,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merged-subcontext.d.ts","sourceRoot":"","sources":["../src/merged-subcontext.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"merged-subcontext.d.ts","sourceRoot":"","sources":["../src/merged-subcontext.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAiFrD,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAQ5G;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,0BAA0B,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACzD,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,GACzB,IAAI,CAYN"}
|
|
@@ -21,6 +21,7 @@ function decodeEntity(dataStore, expressId) {
|
|
|
21
21
|
const source = dataStore.source;
|
|
22
22
|
if (!source)
|
|
23
23
|
return null;
|
|
24
|
+
// @raw-entity-enumeration-ok decode one source subcontext's STEP byte span during an overlay-free merge
|
|
24
25
|
const ref = dataStore.entityIndex.byId.get(expressId);
|
|
25
26
|
if (!ref)
|
|
26
27
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merged-subcontext.js","sourceRoot":"","sources":["../src/merged-subcontext.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"merged-subcontext.js","sourceRoot":"","sources":["../src/merged-subcontext.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AA+B/D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAEvE;;;;;;GAMG;AACH,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,sBAAsB,WAAW,8BAA8B,CAAC,CAAC;AAE9F,2FAA2F;AAC3F,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAClC,oFAAoF;AACpF,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,+FAA+F;AAC/F,MAAM,6BAA6B,GAAG,CAAC,CAAC;AAExC,SAAS,YAAY,CAAC,SAAuB,EAAE,SAAiB;IAC9D,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;IAChC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,wGAAwG;IACxG,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;AAC3F,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,WAAW,CAAC,SAAuB,EAAE,SAAiB,EAAE,KAAa;IAC5E,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,IAAI,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;IAC1B,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;AAC/C,CAAC;AAED,yFAAyF;AACzF,SAAS,cAAc,CAAC,GAAkB;IACxC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,EAAE,CAAC;IAClD,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACvC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACvD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,SAAuB,EAAE,SAAiB;IAC/D,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAC9F,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACvF,MAAM,qBAAqB,GAAG,UAAU,KAAK,aAAa;QACxD,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,6BAA6B,CAAC,CAAC;QAClF,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,GAAG,UAAU,SAAS,UAAU,SAAS,qBAAqB,EAAE,CAAC;AAC1E,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,qBAAqB,CAAC,SAAuB,EAAE,GAAsB;IACnF,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB,CAAC;IACxC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;YAAM,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAAuB,EACvB,OAA0B,EAC1B,0BAAyD,EACzD,gBAAwB,EACxB,WAAgC,EAChC,aAA0B;IAE1B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,0BAA0B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACzC,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM;YAAE,SAAS,CAAC,iDAAiD;QACnF,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QAC5B,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC;QAClD,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parquet-exporter.d.ts","sourceRoot":"","sources":["../src/parquet-exporter.ts"],"names":[],"mappings":"AAIA,uDAAuD;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"parquet-exporter.d.ts","sourceRoot":"","sources":["../src/parquet-exporter.ts"],"names":[],"mappings":"AAIA,uDAAuD;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAW/D,MAAM,WAAW,oBAAoB;IACjC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,qBAAa,eAAe;IACxB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,YAAY,CAA6B;IAEjD;;;;;;;;;;OAUG;gBACS,KAAK,EAAE,YAAY,EAAE,cAAc,CAAC,EAAE,cAAc,EAAE,YAAY,CAAC,EAAE,mBAAmB;IAMpG;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAWpB;;OAEG;IACG,SAAS,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,UAAU,CAAC;IA+BxE;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;YAkB3C,aAAa;YAoDb,eAAe;YAkDf,eAAe;YAmCf,kBAAkB;YAIlB,YAAY;YAkBZ,iBAAiB;YA+DjB,gBAAgB;YA6BhB,WAAW;YAyCX,qBAAqB;IA0FnC,OAAO,CAAC,aAAa;YA6BP,SAAS;YAMT,gBAAgB;CAOjC;AA8BD,OAAO,EAAE,oBAAoB,IAAI,oBAAoB,EAAE,MAAM,2BAA2B,CAAC"}
|
package/dist/parquet-exporter.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
4
|
import { IfcTypeEnum, EntityFlags, IFC_ENTITY_NAMES, exactTypeName } from '@ifc-lite/data';
|
|
5
5
|
import { getEffectiveEntityIndex } from './effective-index.js';
|
|
6
|
+
import { parquetSpatialRows } from './parquet-spatial-rows.js';
|
|
6
7
|
import { columnsToParquet } from './columns-to-parquet.js';
|
|
7
8
|
import { PARQUET_UINT32_COLUMNS } from './parquet-uint32-columns.js';
|
|
8
9
|
import { writePropertiesOnDemand, writeQuantitiesOnDemand } from './parquet-exporter-ondemand.js';
|
|
@@ -60,7 +61,8 @@ export class ParquetExporter {
|
|
|
60
61
|
let propertyCount = 0;
|
|
61
62
|
files.set('Properties.parquet', await this.writeProperties(count => { propertyCount = count; }));
|
|
62
63
|
files.set('Quantities.parquet', await this.writeQuantities());
|
|
63
|
-
const
|
|
64
|
+
const effective = this.getEffective();
|
|
65
|
+
const relationshipRows = parquetRelationshipRows(this.store, this.mutationView, effective);
|
|
64
66
|
files.set('Relationships.parquet', await this.toParquet(relationshipRows));
|
|
65
67
|
files.set('Strings.parquet', await this.writeStrings());
|
|
66
68
|
// Geometry files (if available)
|
|
@@ -70,8 +72,8 @@ export class ParquetExporter {
|
|
|
70
72
|
files.set('Meshes.parquet', await this.writeMeshes());
|
|
71
73
|
}
|
|
72
74
|
// Spatial hierarchy
|
|
73
|
-
if (this.store.spatialHierarchy) {
|
|
74
|
-
files.set('SpatialHierarchy.parquet', await this.writeSpatialHierarchy());
|
|
75
|
+
if (this.store.spatialHierarchy || effective) {
|
|
76
|
+
files.set('SpatialHierarchy.parquet', await this.writeSpatialHierarchy(relationshipRows, effective));
|
|
75
77
|
}
|
|
76
78
|
// Metadata
|
|
77
79
|
files.set('Metadata.json', this.writeMetadata(new Set(relationshipRows.RelId).size, propertyCount));
|
|
@@ -345,13 +347,22 @@ export class ParquetExporter {
|
|
|
345
347
|
IndexCount: indexCounts,
|
|
346
348
|
});
|
|
347
349
|
}
|
|
348
|
-
async writeSpatialHierarchy() {
|
|
350
|
+
async writeSpatialHierarchy(relationships, effective) {
|
|
351
|
+
if (effective) {
|
|
352
|
+
const rows = parquetSpatialRows(relationships, effective);
|
|
353
|
+
return this.toParquet({
|
|
354
|
+
ElementId: rows.map(r => r.ElementId),
|
|
355
|
+
StoreyId: rows.map(r => r.StoreyId),
|
|
356
|
+
BuildingId: rows.map(r => r.BuildingId),
|
|
357
|
+
SiteId: rows.map(r => r.SiteId),
|
|
358
|
+
SpaceId: rows.map(r => r.SpaceId),
|
|
359
|
+
});
|
|
360
|
+
}
|
|
349
361
|
if (!this.store.spatialHierarchy) {
|
|
350
362
|
throw new Error('Spatial hierarchy not available');
|
|
351
363
|
}
|
|
352
364
|
const rows = [];
|
|
353
365
|
const { spatialHierarchy } = this.store;
|
|
354
|
-
const effective = this.getEffective();
|
|
355
366
|
// Build lookup maps for fast parent access
|
|
356
367
|
const storeyToBuilding = new Map();
|
|
357
368
|
const buildingToSite = new Map();
|
|
@@ -376,24 +387,14 @@ export class ParquetExporter {
|
|
|
376
387
|
}
|
|
377
388
|
};
|
|
378
389
|
traverse(spatialHierarchy.project);
|
|
390
|
+
// @raw-entity-enumeration-ok source-only branch: a supplied mutationView takes the effective relationship-row path above
|
|
379
391
|
for (const [storeyId, elementIds] of spatialHierarchy.byStorey) {
|
|
380
392
|
const buildingId = storeyToBuilding.get(storeyId) ?? -1;
|
|
381
393
|
const siteId = buildingId >= 0 ? (buildingToSite.get(buildingId) ?? -1) : -1;
|
|
382
394
|
for (const elementId of elementIds) {
|
|
383
|
-
// A tombstoned element is not a row in Entities.parquet either
|
|
384
|
-
// (see writeEntities) — leaving it here would point
|
|
385
|
-
// SpatialHierarchy.parquet at an id no other table has.
|
|
386
|
-
//
|
|
387
|
-
// Deletion-only, and only for the element itself: a deleted
|
|
388
|
-
// STOREY/BUILDING/SITE still surfaces as StoreyId/BuildingId/
|
|
389
|
-
// SiteId on a surviving element's row (spatialHierarchy is a
|
|
390
|
-
// source-parse snapshot with no overlay-aware re-parenting —
|
|
391
|
-
// the same class of problem Ifc5Exporter's re-parenting pass
|
|
392
|
-
// solves, #2047 — not addressed here).
|
|
393
|
-
if (effective?.isDeleted(elementId))
|
|
394
|
-
continue;
|
|
395
395
|
// Check if element is in a space by iterating bySpace
|
|
396
396
|
let spaceId = -1;
|
|
397
|
+
// @raw-entity-enumeration-ok source-only branch: live sessions return before this parsed hierarchy walk
|
|
397
398
|
for (const [sid, spaceElementIds] of spatialHierarchy.bySpace) {
|
|
398
399
|
if (spaceElementIds.includes(elementId)) {
|
|
399
400
|
spaceId = sid;
|
|
@@ -446,13 +447,14 @@ export class ParquetExporter {
|
|
|
446
447
|
async toParquet(columns, floatColumns) {
|
|
447
448
|
return columnsToParquet(columns, floatColumns, PARQUET_UINT32_COLUMNS);
|
|
448
449
|
}
|
|
450
|
+
// fflate, not JSZip: JSZip writes "version needed to extract" 1.0 on
|
|
451
|
+
// DEFLATE entries, where the ZIP APPNOTE requires 2.0 (#3612).
|
|
449
452
|
async createZipArchive(files) {
|
|
450
|
-
const
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
}
|
|
455
|
-
return zip.generateAsync({ type: 'uint8array', compression: 'DEFLATE' });
|
|
453
|
+
const { zipSync } = await import('fflate');
|
|
454
|
+
// Entry names are file names with an extension, never integer-like
|
|
455
|
+
// keys, so the object keeps the Map's insertion order. zipSync rather
|
|
456
|
+
// than async `zip`, which starts uncapped workers (see bcf writer-archive).
|
|
457
|
+
return zipSync(Object.fromEntries(files), { level: 6 });
|
|
456
458
|
}
|
|
457
459
|
}
|
|
458
460
|
// Helper functions
|