@ifc-lite/export 2.9.3 → 2.9.4
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/merged-exporter.d.ts +3 -2
- package/dist/merged-exporter.d.ts.map +1 -1
- package/dist/merged-exporter.js +9 -3
- package/dist/merged-exporter.js.map +1 -1
- package/dist/parquet-exporter.js +2 -0
- package/dist/parquet-exporter.js.map +1 -1
- package/dist/reference-collector.d.ts +40 -17
- package/dist/reference-collector.d.ts.map +1 -1
- package/dist/reference-collector.js +89 -19
- package/dist/reference-collector.js.map +1 -1
- package/dist/schema-converter.d.ts.map +1 -1
- package/dist/schema-converter.js +27 -1
- package/dist/schema-converter.js.map +1 -1
- package/dist/source-ref-bounds.d.ts +16 -1
- package/dist/source-ref-bounds.d.ts.map +1 -1
- package/dist/source-ref-bounds.js +85 -0
- package/dist/source-ref-bounds.js.map +1 -1
- package/dist/step-exporter.d.ts +166 -188
- package/dist/step-exporter.d.ts.map +1 -1
- package/dist/step-exporter.js +738 -1442
- package/dist/step-exporter.js.map +1 -1
- package/dist/step-georeferencing.d.ts +58 -0
- package/dist/step-georeferencing.d.ts.map +1 -0
- package/dist/step-georeferencing.js +339 -0
- package/dist/step-georeferencing.js.map +1 -0
- package/dist/step-property-sets.d.ts +196 -0
- package/dist/step-property-sets.d.ts.map +1 -0
- package/dist/step-property-sets.js +842 -0
- package/dist/step-property-sets.js.map +1 -0
- package/package.json +6 -6
package/dist/step-exporter.d.ts
CHANGED
|
@@ -4,10 +4,15 @@
|
|
|
4
4
|
* Exports IFC data store to ISO 10303-21 STEP format.
|
|
5
5
|
* Supports applying property and root attribute mutations before export.
|
|
6
6
|
*/
|
|
7
|
-
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
7
|
+
import type { IfcDataStore, IfcAttributeValue, IfcSourceHeader } from '@ifc-lite/parser';
|
|
8
8
|
import { type MapConversion, type ProjectedCRS } from '@ifc-lite/parser';
|
|
9
9
|
import type { MutablePropertyView } from '@ifc-lite/mutations';
|
|
10
|
-
import {
|
|
10
|
+
import type { PropertySet, QuantitySet } from '@ifc-lite/data';
|
|
11
|
+
import type { RandomSource } from '@ifc-lite/encoding';
|
|
12
|
+
import { type IfcSchemaVersion } from './schema-converter.js';
|
|
13
|
+
import { type ModificationLedger, type SourceLineDelivery } from './delta-modification-ledger.js';
|
|
14
|
+
import { createSourceRefReader } from './source-ref-bounds.js';
|
|
15
|
+
import { type EffectiveEntityIndex } from './effective-index.js';
|
|
11
16
|
/**
|
|
12
17
|
* Options for STEP export
|
|
13
18
|
*/
|
|
@@ -51,14 +56,20 @@ export interface StepExportOptions {
|
|
|
51
56
|
* Seeded randomness for the GlobalIds this exporter SYNTHESIZES:
|
|
52
57
|
* the `IfcPropertySet` / `IfcElementQuantity` roots regenerated for
|
|
53
58
|
* mutated (or overlay-created) property and quantity sets, their
|
|
54
|
-
* `IfcRelDefinesByProperties` links
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
* breaks byte-reproducibility for in-store builds that call
|
|
59
|
+
* `IfcRelDefinesByProperties` links. Without it those come from the platform
|
|
60
|
+
* CSPRNG, so two exports of the same model differ in exactly those bytes -
|
|
61
|
+
* which breaks byte-reproducibility for in-store builds that call
|
|
58
62
|
* `addPropertySet` / `addQuantitySet` (the sets themselves live in the
|
|
59
63
|
* mutation overlay and only become IFC roots here). Pass the same seeded
|
|
60
64
|
* source used for `SpatialAnchor.guidRandom` to close that gap. Default
|
|
61
|
-
* (omitted) behaviour is unchanged: random.
|
|
65
|
+
* (omitted) behaviour for THESE ids is unchanged: random.
|
|
66
|
+
*
|
|
67
|
+
* NOT the `IFCPROXY` placeholders any more (#2733). Those used to be minted
|
|
68
|
+
* from this source too, so an omitted `guidRandom` made every downgraded
|
|
69
|
+
* IFC4X3 entity differ on re-export. They are now derived from the source
|
|
70
|
+
* line when this is omitted, and only fall back to this source when it is
|
|
71
|
+
* supplied - so passing a seeded source still pins them, but NOT passing one
|
|
72
|
+
* no longer makes them random. See `convertStepLine`.
|
|
62
73
|
*/
|
|
63
74
|
guidRandom?: RandomSource;
|
|
64
75
|
/**
|
|
@@ -104,17 +115,121 @@ export interface StepExportResult {
|
|
|
104
115
|
* Non-fatal refusals: things the caller asked for that this export could
|
|
105
116
|
* not write. Empty when the export did everything it was asked to do.
|
|
106
117
|
*
|
|
107
|
-
* A requested `georefMutations.mapConversion` is
|
|
108
|
-
*
|
|
118
|
+
* A requested `georefMutations.mapConversion` is one case: with no
|
|
119
|
+
* `IfcGeometricRepresentationContext` to reference as `SourceCRS`, the
|
|
109
120
|
* `IfcMapConversion` is skipped (writing it would produce a dangling
|
|
110
121
|
* reference) while the `IfcProjectedCRS` is still written — so the output
|
|
111
122
|
* is indistinguishable from "no map conversion was requested" unless the
|
|
112
|
-
* caller reads this (#2067).
|
|
113
|
-
*
|
|
123
|
+
* caller reads this (#2067).
|
|
124
|
+
*
|
|
125
|
+
* A WITHHELD RELATIONSHIP is the other: when a relationship names an
|
|
126
|
+
* entity this export is not writing, in a slot with no spelling for an
|
|
127
|
+
* omitted reference, the whole relationship line is dropped rather than
|
|
128
|
+
* shipped dangling — see {@link relationshipWithheldWarning}. This can
|
|
129
|
+
* happen on a plain full export with no options set at all, so it is
|
|
130
|
+
* reported rather than left to be discovered by a diff.
|
|
131
|
+
*
|
|
132
|
+
* Same `string[]` shape as `MergeExportResult.stats.warnings`.
|
|
114
133
|
*/
|
|
115
134
|
warnings: string[];
|
|
116
135
|
};
|
|
117
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* What {@link StepExporter.applySourceLineMutations} produced: the rewritten
|
|
139
|
+
* line, plus which edit kinds that rewrite actually delivered. The delivery
|
|
140
|
+
* half is {@link SourceLineDelivery} rather than three loose booleans so that
|
|
141
|
+
* the pipeline and the ledger cannot disagree about what a source line carries
|
|
142
|
+
* — an added kind has one place to be added.
|
|
143
|
+
*/
|
|
144
|
+
export type SourceLineMutations = SourceLineDelivery & {
|
|
145
|
+
text: string;
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* The state one `export()` call shares across its seven phases.
|
|
149
|
+
*
|
|
150
|
+
* Introduced by step 1 of #2475: `export()` is ~1267 lines and the phases a
|
|
151
|
+
* split would separate are held together by ~30 local bindings, most of which
|
|
152
|
+
* are read in three or more phases. Naming that set once — as an interface
|
|
153
|
+
* with a single construction site at the top of `export()` — is what lets a
|
|
154
|
+
* later phase extraction take one parameter instead of fifteen.
|
|
155
|
+
*
|
|
156
|
+
* Two properties of this object are load-bearing and must survive every later
|
|
157
|
+
* move:
|
|
158
|
+
*
|
|
159
|
+
* 1. **The predicates are members, not duplicated expressions.** Six of them
|
|
160
|
+
* (`isOverlayCreated`, `isReadableSourceRef`, `isGeometryExcluded`,
|
|
161
|
+
* `hasEmittableHostBytes`, `willBeEmitted`,
|
|
162
|
+
* `isRefExcludedDuringClosureWalk`) exist precisely so two phases cannot
|
|
163
|
+
* disagree about a gate — see the comments at their construction sites for
|
|
164
|
+
* the corrupt files the earlier, per-phase versions let through (#2491,
|
|
165
|
+
* #2414, #2398, #2637). A phase that reimplements one of these instead of
|
|
166
|
+
* reading it off the pass reintroduces exactly that class of defect.
|
|
167
|
+
* 2. **`allowedEntityIds` and `hiddenProductIds` are mutable, and the
|
|
168
|
+
* predicates close over the pass rather than over a snapshot.** The
|
|
169
|
+
* visible-only closure walk assigns both AFTER construction, and
|
|
170
|
+
* `isRefExcludedDuringClosureWalk` is handed to that walk while they are
|
|
171
|
+
* still null. The output-line filter reads them too, through
|
|
172
|
+
* `isOmittedFromOutput` -> `willBeEmitted`, so neither can be a snapshot
|
|
173
|
+
* taken before the walk ran — that is the invariant the #2637 regression
|
|
174
|
+
* broke.
|
|
175
|
+
*
|
|
176
|
+
* Deliberately NOT on the pass, and why: `isOmittedFromOutput`,
|
|
177
|
+
* `mayNameOmittedRefs` and
|
|
178
|
+
* `overlayNewEntityCount` are eagerly-computed values whose value is only
|
|
179
|
+
* defined after work that runs past this construction site, so hoisting them
|
|
180
|
+
* would change what they compute rather than where they are named;
|
|
181
|
+
* `generatedTypeOwnedPsetIds` is read in one phase only — a local inside
|
|
182
|
+
* `step-property-sets.ts:generatePropertyAndQuantitySetEntities`, which holds
|
|
183
|
+
* both the loop that writes it and the loop that reads it (#2475).
|
|
184
|
+
*/
|
|
185
|
+
export interface ExportPass {
|
|
186
|
+
/** Output accumulator: every DATA-section line this export will write. */
|
|
187
|
+
readonly entities: string[];
|
|
188
|
+
/** Lines contributed by entities that have no source record. */
|
|
189
|
+
newEntityCount: number;
|
|
190
|
+
readonly schema: IfcSchemaVersion;
|
|
191
|
+
readonly sourceSchema: IfcSchemaVersion;
|
|
192
|
+
readonly converting: boolean;
|
|
193
|
+
readonly sourceHeader: IfcSourceHeader | undefined;
|
|
194
|
+
readonly schemaToken: string;
|
|
195
|
+
readonly overlayActive: boolean;
|
|
196
|
+
readonly effective: EffectiveEntityIndex;
|
|
197
|
+
readonly modifications: ModificationLedger;
|
|
198
|
+
/** Widened from the imported `InPlaceNominees` (whose sets are readonly)
|
|
199
|
+
* because the collection passes below add to them. */
|
|
200
|
+
readonly inPlaceNominees: {
|
|
201
|
+
attribute: Set<number>;
|
|
202
|
+
georeferencing: Set<number>;
|
|
203
|
+
};
|
|
204
|
+
allowedEntityIds: Set<number> | null;
|
|
205
|
+
hiddenProductIds: ReadonlySet<number> | null;
|
|
206
|
+
readonly modifiedEntities: Set<number>;
|
|
207
|
+
readonly modifiedAttributes: Map<number, Map<string, string>>;
|
|
208
|
+
readonly newPropertySets: Array<{
|
|
209
|
+
entityId: number;
|
|
210
|
+
psets: PropertySet[];
|
|
211
|
+
}>;
|
|
212
|
+
readonly newQuantitySets: Array<{
|
|
213
|
+
entityId: number;
|
|
214
|
+
qsets: QuantitySet[];
|
|
215
|
+
}>;
|
|
216
|
+
readonly typeOwnedPsetNamesByEntity: Map<number, Set<string>>;
|
|
217
|
+
readonly typeOwnedPsetIdsByEntity: Map<number, number[]>;
|
|
218
|
+
readonly rewrittenEntityIds: Set<number>;
|
|
219
|
+
readonly rewrittenEntityLines: Map<number, string>;
|
|
220
|
+
readonly overlayTypeOwnedPsets: Map<number, IfcAttributeValue>;
|
|
221
|
+
readonly skipPropertySetIds: Set<number>;
|
|
222
|
+
readonly skipRelationshipIds: Set<number>;
|
|
223
|
+
readonly newGeorefLines: string[];
|
|
224
|
+
readonly warnings: string[];
|
|
225
|
+
readonly buildHeader: (modifications: number) => string;
|
|
226
|
+
readonly isOverlayCreated: (entityId: number) => boolean;
|
|
227
|
+
readonly isReadableSourceRef: ReturnType<typeof createSourceRefReader>;
|
|
228
|
+
readonly isGeometryExcluded: (entityId: number, recordType: string) => boolean;
|
|
229
|
+
readonly hasEmittableHostBytes: (entityId: number) => boolean;
|
|
230
|
+
readonly willBeEmitted: (entityId: number) => boolean;
|
|
231
|
+
readonly isRefExcludedDuringClosureWalk: (id: number) => boolean;
|
|
232
|
+
}
|
|
118
233
|
/**
|
|
119
234
|
* IFC STEP file exporter
|
|
120
235
|
*/
|
|
@@ -123,11 +238,16 @@ export declare class StepExporter {
|
|
|
123
238
|
private mutationView;
|
|
124
239
|
private nextExpressId;
|
|
125
240
|
private entityExtractor;
|
|
126
|
-
/**
|
|
127
|
-
*
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
241
|
+
/**
|
|
242
|
+
* The owner-history memos the property-set and quantity-set generators read.
|
|
243
|
+
*
|
|
244
|
+
* Owned here and handed to `step-property-sets.ts` BY REFERENCE rather than
|
|
245
|
+
* stored on its context: the reset below is an `export()`-level statement,
|
|
246
|
+
* and the comment there is where "per export, not per exporter" is argued.
|
|
247
|
+
* Moving the storage into a per-export context would make that reset
|
|
248
|
+
* implicit — the same invariant, in a place nothing says it (#2475 step 2b).
|
|
249
|
+
*/
|
|
250
|
+
private ownerHistory;
|
|
131
251
|
/**
|
|
132
252
|
* "Can this record's line actually be read out of this store's source?"
|
|
133
253
|
* (`source-ref-bounds.ts`, #2491). Built once — `dataStore` is assigned in
|
|
@@ -149,53 +269,6 @@ export declare class StepExporter {
|
|
|
149
269
|
* Export only property/quantity changes (lightweight export)
|
|
150
270
|
*/
|
|
151
271
|
exportPropertiesOnly(options: Omit<StepExportOptions, 'includeGeometry'>): StepExportResult;
|
|
152
|
-
/**
|
|
153
|
-
* Resolve a STEP reference to an existing IfcOwnerHistory for the
|
|
154
|
-
* IfcPropertySet / IfcRelDefinesByProperties / IfcElementQuantity entities we
|
|
155
|
-
* generate for `hostEntityId`'s mutations. OwnerHistory is optional in IFC4 but
|
|
156
|
-
* MANDATORY in IFC2X3 (IfcRoot.OwnerHistory), so emitting `$` yields an invalid
|
|
157
|
-
* IFC2X3 file that strict readers (e.g. BIM Vision) reject.
|
|
158
|
-
*
|
|
159
|
-
* Prefer the host element's OWN owner history, then any owner history that
|
|
160
|
-
* survives this export, then `$` only when none does.
|
|
161
|
-
*
|
|
162
|
-
* "Survives" is `willBeEmitted`, the same predicate that decides whether the
|
|
163
|
-
* host itself may have psets generated for it. A reference is a reference: it
|
|
164
|
-
* is no more acceptable to point an emitted `IfcPropertySet` at an owner
|
|
165
|
-
* history the session deleted than at a host it deleted. This used to consult
|
|
166
|
-
* only the `visibleOnly` closure, so an overlay-created OwnerHistory that was
|
|
167
|
-
* later deleted still got referenced — a dangling `#N`, reached through the
|
|
168
|
-
* one attribute the generators fill in for themselves.
|
|
169
|
-
*/
|
|
170
|
-
private resolveOwnerHistoryRef;
|
|
171
|
-
/**
|
|
172
|
-
* The overlay's answer for one positional slot of an overlay-created entity,
|
|
173
|
-
* falling back to the creation payload only when the overlay has NOTHING to
|
|
174
|
-
* say about that slot.
|
|
175
|
-
*
|
|
176
|
-
* **Ask `Map.has`, never `??`.** `setPositionalAttribute(id, slot, null)` is
|
|
177
|
-
* an explicit "clear this slot", and its value is `null`, so `??` reads the
|
|
178
|
-
* overlay's answer as an absence and reinstates the authored one. That is the
|
|
179
|
-
* same overlay-versus-buffer confusion this whole change is about, one
|
|
180
|
-
* attribute wide: an explicit null IS the overlay's answer, and the overlay is
|
|
181
|
-
* the authority. Cleared OwnerHistory came back as the authored reference, and
|
|
182
|
-
* a cleared `HasPropertySets` resurrected the list the user had removed.
|
|
183
|
-
*/
|
|
184
|
-
private overlaySlotValue;
|
|
185
|
-
/**
|
|
186
|
-
* Read an element's own OwnerHistory reference (`#id`), or null when the
|
|
187
|
-
* element omits one (`$`) or cannot be parsed. OwnerHistory is the second
|
|
188
|
-
* attribute of every IfcRoot subtype, immediately after the GlobalId string.
|
|
189
|
-
*/
|
|
190
|
-
private getOwnerHistoryRefOfEntity;
|
|
191
|
-
/**
|
|
192
|
-
* Generate STEP entities for property sets
|
|
193
|
-
*/
|
|
194
|
-
private generatePropertySetEntities;
|
|
195
|
-
/**
|
|
196
|
-
* Generate STEP entities for quantity sets (IfcElementQuantity)
|
|
197
|
-
*/
|
|
198
|
-
private generateQuantitySetEntities;
|
|
199
272
|
/**
|
|
200
273
|
* THE mutation pipeline for a line read out of the source buffer: retype,
|
|
201
274
|
* then named attribute edits, then positional edits.
|
|
@@ -256,6 +329,15 @@ export declare class StepExporter {
|
|
|
256
329
|
* with `$`. So the declared type decides first, and inference is the fallback
|
|
257
330
|
* for slots the schema does not classify (references, SELECTs, numerics),
|
|
258
331
|
* where reading the old token is exactly the right heuristic.
|
|
332
|
+
*
|
|
333
|
+
* Before this REAL check existed, "the declared type decides first" was true
|
|
334
|
+
* for enum/string slots only — a REAL-backed slot (`IfcMapConversion.
|
|
335
|
+
* OrthogonalHeight`, any other `IfcLengthMeasure`/`IfcReal`-typed attribute)
|
|
336
|
+
* fell straight to `serializeAttributeValue`'s token inference, which quotes
|
|
337
|
+
* anything it cannot recognize as numeric. A schema-legal `$` placeholder
|
|
338
|
+
* carries no digits to recognize, so setting such a field for the first time
|
|
339
|
+
* wrote `'12345'` in a slot ISO 10303-21 requires to be an unquoted REAL —
|
|
340
|
+
* silently invalid output (#2724, LTplus-AG/ifc-lite#2475).
|
|
259
341
|
*/
|
|
260
342
|
private serializeNamedAttribute;
|
|
261
343
|
/**
|
|
@@ -296,131 +378,40 @@ export declare class StepExporter {
|
|
|
296
378
|
* cover, so a whole-number edit can't silently downgrade the slot.
|
|
297
379
|
*/
|
|
298
380
|
private serializePositionalOverride;
|
|
299
|
-
private resolveMapUnitReference;
|
|
300
|
-
private normalizeMapUnitName;
|
|
301
|
-
/**
|
|
302
|
-
* `effective` filters the candidates the same way the georef reads above do:
|
|
303
|
-
* returning a tombstoned unit id hands the caller a `#id` for a line the
|
|
304
|
-
* export never writes. Returning null instead makes `resolveMapUnitReference`
|
|
305
|
-
* synthesise a fresh unit, which is the outcome a deleted unit deserves.
|
|
306
|
-
*/
|
|
307
|
-
private findLengthUnitReference;
|
|
308
|
-
/**
|
|
309
|
-
* Record that a requested IfcMapConversion could not be written. Emitting it
|
|
310
|
-
* anyway would leave `SourceCRS` pointing at nothing, so the refusal is the
|
|
311
|
-
* correct output — but the file alone cannot express it, which is why it goes
|
|
312
|
-
* back to the caller in `stats.warnings` as well as to the console (#2067).
|
|
313
|
-
*/
|
|
314
|
-
private reportMapConversionRefused;
|
|
315
|
-
/**
|
|
316
|
-
* Record that a requested IfcMapConversion could not be written because
|
|
317
|
-
* there is no IfcProjectedCRS to attach it to — a different refusal from
|
|
318
|
-
* {@link reportMapConversionRefused}: "no CRS to attach it to" rather than
|
|
319
|
-
* "no context to reference" (#2105).
|
|
320
|
-
*/
|
|
321
|
-
private reportMapConversionRefusedNoCrs;
|
|
322
|
-
/**
|
|
323
|
-
* `effective` again: the id returned here becomes the new IfcMapConversion's
|
|
324
|
-
* SourceCRS, so a tombstoned context would leave the created line pointing at
|
|
325
|
-
* a record the export skips — a dangling reference and an invalid file.
|
|
326
|
-
*/
|
|
327
|
-
private findPreferredGeometricRepresentationContextId;
|
|
328
|
-
/**
|
|
329
|
-
* Generate a new IFC GlobalId (22 character base64). `random` is the
|
|
330
|
-
* export's optional seeded source (`StepExportOptions.guidRandom`);
|
|
331
|
-
* undefined keeps the default random path.
|
|
332
|
-
*/
|
|
333
|
-
private generateGlobalId;
|
|
334
381
|
/**
|
|
335
382
|
* Find the maximum EXPRESS ID in the data store
|
|
336
383
|
*/
|
|
337
384
|
private findMaxExpressId;
|
|
338
385
|
/**
|
|
339
|
-
*
|
|
340
|
-
*/
|
|
341
|
-
private findUnitId;
|
|
342
|
-
/**
|
|
343
|
-
* Check if an entity type is a geometry-related type
|
|
344
|
-
*/
|
|
345
|
-
private isGeometryEntity;
|
|
346
|
-
/**
|
|
347
|
-
* Build a one-shot reverse index of every IfcRelDefinesByProperties in
|
|
348
|
-
* the source: for each related entity, list the rels and property/quantity
|
|
349
|
-
* sets that reference it. Used by the export pre-pass so the per-entity
|
|
350
|
-
* "find owning rels" step is O(K) rather than O(N) per modified entity.
|
|
386
|
+
* The exporter state `step-georeferencing.ts` cannot read off the pass.
|
|
351
387
|
*
|
|
352
|
-
* `
|
|
353
|
-
*
|
|
388
|
+
* `allocateExpressId` hands out ids from THIS exporter's `nextExpressId`,
|
|
389
|
+
* which the property-set and quantity-set generators in
|
|
390
|
+
* `step-property-sets.ts` increment at six further sites through the same
|
|
391
|
+
* callback — hoisting the counter onto the pass would change what it
|
|
392
|
+
* computes, not merely where it is named, so both phases get a callback
|
|
393
|
+
* instead (#2475 step 2a).
|
|
354
394
|
*/
|
|
355
|
-
private
|
|
395
|
+
private georefContext;
|
|
356
396
|
/**
|
|
357
|
-
* The
|
|
358
|
-
* to read.
|
|
359
|
-
*
|
|
360
|
-
* The byte check is on the RANGE, not on `dataStore.source`. `source` is a
|
|
361
|
-
* MANDATORY accessor — `EMPTY_SOURCE_BYTES` is how "this model kept no bytes"
|
|
362
|
-
* is spelled (server-parsed, synthetic, GLB and point-cloud stores all have
|
|
363
|
-
* one) — so the `!this.dataStore.source` guard the five readers below used to
|
|
364
|
-
* carry never fired. It was also redundant: a zero-length range decodes to
|
|
365
|
-
* `''`, which fails every regex those readers run, so they already answered
|
|
366
|
-
* "nothing" for a sourceless store. Scoping the check to the range is what
|
|
367
|
-
* makes the guard live without changing a single answer, the same shape and
|
|
368
|
-
* for the same reason as `reference-collector.ts` (#2339).
|
|
369
|
-
*
|
|
370
|
-
* An OVERLAY-created entity never reaches here: every caller resolves its id
|
|
371
|
-
* through `dataStore.entityIndex.byId`, which holds source records only
|
|
372
|
-
* (`effective-index.ts` synthesises the overlay refs on its own side and
|
|
373
|
-
* writes nothing back), so an overlay id is already `undefined` at the
|
|
374
|
-
* lookup and is served by the callers' documented "not a source record"
|
|
375
|
-
* path. That is why an early return is safe HERE and is NOT safe at the
|
|
376
|
-
* visible-only closure in `export` — see the comment there.
|
|
397
|
+
* The state `step-property-sets.ts` cannot read off the pass (#2475 2b/2c).
|
|
377
398
|
*
|
|
378
|
-
*
|
|
399
|
+
* `allocateExpressId` is the same callback `georefContext` hands out, over
|
|
400
|
+
* the same counter, so the ids the two phases allocate stay in one sequence.
|
|
401
|
+
* `ownerHistory` is passed by reference — the object is this exporter's, and
|
|
402
|
+
* `export()` resets it. `isReadableSourceRef` is the instance predicate, not
|
|
403
|
+
* `pass.isReadableSourceRef`, because two consumers of that module
|
|
404
|
+
* (`buildRelDefinesByPropertiesIndex`, `retainSharedAtoms`) run with no pass
|
|
405
|
+
* in hand; both readers are built over the same source.
|
|
379
406
|
*
|
|
380
|
-
*
|
|
381
|
-
*
|
|
382
|
-
* window over real file bytes — so these readers answer from somebody
|
|
383
|
-
* ELSE's record. `source-ref-bounds.ts` (#2491) carries the measured
|
|
384
|
-
* account of both shapes and of why "a clamped, empty decode already yields
|
|
385
|
-
* no match" is false; it is not restated here, because an argument kept in
|
|
386
|
-
* two files is an argument that has to stay true in two files.
|
|
387
|
-
*
|
|
388
|
-
* The consequence specific to THIS site is that the wrong answer is acted
|
|
389
|
-
* on. `retainSharedAtoms` un-skips every id `getPropertyIdsInSet` returns,
|
|
390
|
-
* so a member list read out of the wrong record un-skips the wrong atoms;
|
|
391
|
-
* and the source-iteration pass already refuses to emit a record whose ref
|
|
392
|
-
* fails `isReadableSourceRef` (see the `continue` in `export`), so before
|
|
393
|
-
* this gate these readers were making decisions on behalf of a container
|
|
394
|
-
* that the same export had decided not to write. Gating them on the same
|
|
395
|
-
* predicate is what makes the two passes agree.
|
|
396
|
-
*
|
|
397
|
-
* The degradation is the one the exporter already handles: a record with no
|
|
398
|
-
* emittable bytes, generating nothing and named by nothing. It costs one
|
|
399
|
-
* answer that used to be right by luck — an overrunning ref on the file's
|
|
400
|
-
* LAST record clamps back to exactly that record's text — but that record
|
|
401
|
-
* is one the emission pass drops anyway, so keeping the answer only kept
|
|
402
|
-
* the disagreement.
|
|
403
|
-
*/
|
|
404
|
-
private entityLineText;
|
|
405
|
-
/**
|
|
406
|
-
* Get entity IDs related by IfcRelDefinesByProperties (the related objects)
|
|
407
|
-
*/
|
|
408
|
-
private getRelatedEntities;
|
|
409
|
-
/**
|
|
410
|
-
* Get the property set ID from IfcRelDefinesByProperties
|
|
411
|
-
*/
|
|
412
|
-
private getRelatedPropertySet;
|
|
413
|
-
/**
|
|
414
|
-
* Get the name of a property set by parsing the entity
|
|
407
|
+
* Rebuilt per call, as `georefContext` is: every call site runs once per
|
|
408
|
+
* export bar `retainSharedAtoms`, which hoists it out of its loop.
|
|
415
409
|
*/
|
|
416
|
-
private
|
|
410
|
+
private propertySetContext;
|
|
417
411
|
/**
|
|
418
|
-
*
|
|
419
|
-
*/
|
|
420
|
-
private getElementQuantityName;
|
|
421
|
-
/**
|
|
422
|
-
* Get IDs of properties in a property set
|
|
412
|
+
* Check if an entity type is a geometry-related type
|
|
423
413
|
*/
|
|
414
|
+
private isGeometryEntity;
|
|
424
415
|
/**
|
|
425
416
|
* Un-skip property/quantity atoms that a surviving (non-skipped, and — under
|
|
426
417
|
* visible-only export — still-included) IfcPropertySet / IfcElementQuantity
|
|
@@ -435,19 +426,6 @@ export declare class StepExporter {
|
|
|
435
426
|
* original value.
|
|
436
427
|
*/
|
|
437
428
|
private retainSharedAtoms;
|
|
438
|
-
private getPropertyIdsInSet;
|
|
439
|
-
/**
|
|
440
|
-
* The full HasPropertySets id list of a type object, from whichever authority
|
|
441
|
-
* owns the record.
|
|
442
|
-
*
|
|
443
|
-
* Slot 5 is `HasPropertySets` on every `IfcTypeObject` subtype. For a source
|
|
444
|
-
* record the list is parsed out of the file; for an overlay-created type it is
|
|
445
|
-
* read off the authored payload, where a reference is the documented `'#42'`
|
|
446
|
-
* string form. Reading only the source made every pset on a created
|
|
447
|
-
* `IfcWallType` look unowned, which is how it ended up on an occurrence
|
|
448
|
-
* relation instead (#2012).
|
|
449
|
-
*/
|
|
450
|
-
private getTypeOwnedHasPropertySetIds;
|
|
451
429
|
}
|
|
452
430
|
/**
|
|
453
431
|
* Quick export function for simple use cases.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-exporter.d.ts","sourceRoot":"","sources":["../src/step-exporter.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"step-exporter.d.ts","sourceRoot":"","sources":["../src/step-exporter.ts"],"names":[],"mappings":"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"}
|