@ifc-lite/export 3.0.1 → 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 +37 -1
- package/dist/anonymize-export.d.ts +60 -0
- package/dist/anonymize-export.d.ts.map +1 -0
- package/dist/anonymize-export.js +217 -0
- package/dist/anonymize-export.js.map +1 -0
- package/dist/anonymize-placement.d.ts +71 -0
- package/dist/anonymize-placement.d.ts.map +1 -0
- package/dist/anonymize-placement.js +266 -0
- package/dist/anonymize-placement.js.map +1 -0
- package/dist/anonymize-scrub.d.ts +64 -0
- package/dist/anonymize-scrub.d.ts.map +1 -0
- package/dist/anonymize-scrub.js +315 -0
- package/dist/anonymize-scrub.js.map +1 -0
- package/dist/anonymize-types.d.ts +235 -0
- package/dist/anonymize-types.d.ts.map +1 -0
- package/dist/anonymize-types.js +5 -0
- package/dist/anonymize-types.js.map +1 -0
- 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/entity-type-sets.d.ts +47 -0
- package/dist/entity-type-sets.d.ts.map +1 -0
- package/dist/entity-type-sets.js +91 -0
- package/dist/entity-type-sets.js.map +1 -0
- 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 +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -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 +68 -90
- 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 +47 -51
- package/dist/reference-collector.d.ts.map +1 -1
- package/dist/reference-collector.js +115 -171
- package/dist/reference-collector.js.map +1 -1
- package/dist/related-entities.d.ts +10 -0
- package/dist/related-entities.d.ts.map +1 -0
- package/dist/related-entities.js +274 -0
- package/dist/related-entities.js.map +1 -0
- 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 +51 -8
- package/dist/step-collection.js.map +1 -1
- package/dist/step-export-types.d.ts +42 -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-header.d.ts +1 -1
- package/dist/step-header.d.ts.map +1 -1
- package/dist/step-header.js +2 -2
- package/dist/step-header.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 +104 -0
- package/dist/subset-entity-reader.d.ts.map +1 -0
- package/dist/subset-entity-reader.js +112 -0
- package/dist/subset-entity-reader.js.map +1 -0
- package/dist/subset-roots.d.ts +74 -0
- package/dist/subset-roots.d.ts.map +1 -0
- package/dist/subset-roots.js +168 -0
- package/dist/subset-roots.js.map +1 -0
- 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 +8 -8
|
@@ -0,0 +1,266 @@
|
|
|
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 { attrIndex, readEntityArgs } from './subset-entity-reader.js';
|
|
5
|
+
import { splitTopLevelArgs } from './step-argument-parser.js';
|
|
6
|
+
import { entityRef, stepReal } from './step-serialization.js';
|
|
7
|
+
const IFC_SITE_ADDRESS_ATTRIBUTES = [
|
|
8
|
+
'RefLatitude',
|
|
9
|
+
'RefLongitude',
|
|
10
|
+
'RefElevation',
|
|
11
|
+
'LandTitleNumber',
|
|
12
|
+
'SiteAddress',
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* Zero every root `IfcLocalPlacement` translation reachable from
|
|
16
|
+
* `includedIds`, zero `WorldCoordinateSystem` on every
|
|
17
|
+
* `IfcGeometricRepresentationContext` (always exported — it is an
|
|
18
|
+
* `INFRASTRUCTURE_TYPES` member, `reference-collector.ts`), and blank
|
|
19
|
+
* `IfcSite` / `IfcBuilding` georeferencing and address attributes.
|
|
20
|
+
*
|
|
21
|
+
* `store`/`index` are read from (never mutated directly) — every change goes
|
|
22
|
+
* through `editor` (new entities, positional overrides) or `view` (named
|
|
23
|
+
* attribute overrides), so the private `MutablePropertyView` overlay the
|
|
24
|
+
* orchestrator built stays the ONE place this export's edits live.
|
|
25
|
+
*/
|
|
26
|
+
export function applyPlacementAnonymization(store, index, includedIds, editor, view, opts) {
|
|
27
|
+
const warnings = [];
|
|
28
|
+
const zeroedPlacements = [];
|
|
29
|
+
if (opts?.zeroRootPlacement !== false) {
|
|
30
|
+
zeroRootPlacements(store, index, includedIds, editor, warnings, zeroedPlacements);
|
|
31
|
+
zeroWorldCoordinateSystems(store, index, editor, warnings);
|
|
32
|
+
}
|
|
33
|
+
if (opts?.removeGeoreferencing !== false) {
|
|
34
|
+
blankSiteAndBuildingAddresses(index, includedIds, view);
|
|
35
|
+
}
|
|
36
|
+
return { zeroedPlacements, warnings };
|
|
37
|
+
}
|
|
38
|
+
function zeroRootPlacements(store, index, includedIds, editor, warnings, zeroedPlacements) {
|
|
39
|
+
// Memoised by placementId: the root a placement chain terminates at is a
|
|
40
|
+
// pure function of that id ("Bounding walks", AGENTS.md — global memoising
|
|
41
|
+
// is the right scope here, not path-scoped, since the answer never
|
|
42
|
+
// accumulates across callers), and many products in a subset commonly
|
|
43
|
+
// share one storey/building placement chain.
|
|
44
|
+
const rootCache = new Map();
|
|
45
|
+
const localPlacementRoots = new Set();
|
|
46
|
+
for (const id of includedIds) {
|
|
47
|
+
const rec = readEntityArgs(store, index, id);
|
|
48
|
+
if (!rec)
|
|
49
|
+
continue;
|
|
50
|
+
const objectPlacementIdx = attrIndex(rec.type, 'ObjectPlacement'); // declared on IfcProduct itself — slot order checked identical across ENTITIES_IFC2X3/_IFC4/_IFC4X3, no `schema` arg needed (#3309)
|
|
51
|
+
if (objectPlacementIdx < 0 || objectPlacementIdx >= rec.args.length)
|
|
52
|
+
continue;
|
|
53
|
+
const placementId = parseRef(rec.args[objectPlacementIdx]);
|
|
54
|
+
if (placementId === null)
|
|
55
|
+
continue;
|
|
56
|
+
let root = rootCache.get(placementId);
|
|
57
|
+
if (root === undefined) {
|
|
58
|
+
root = findRootPlacement(store, index, placementId, warnings);
|
|
59
|
+
rootCache.set(placementId, root);
|
|
60
|
+
}
|
|
61
|
+
if (!root)
|
|
62
|
+
continue;
|
|
63
|
+
if (root.rootType !== 'IFCLOCALPLACEMENT') {
|
|
64
|
+
warnings.push(`#${root.rootId} (${root.rootType}) is a root placement this export cannot zero — only ` +
|
|
65
|
+
`IfcLocalPlacement roots are supported; left untouched, so its absolute position is still in the file.`);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
localPlacementRoots.add(root.rootId);
|
|
69
|
+
}
|
|
70
|
+
for (const rootId of localPlacementRoots) {
|
|
71
|
+
const translation = zeroAxisPlacementSlot(store, index, editor, rootId, 'IFCLOCALPLACEMENT', 'RelativePlacement', warnings);
|
|
72
|
+
if (translation)
|
|
73
|
+
zeroedPlacements.push({ expressId: rootId, translation });
|
|
74
|
+
}
|
|
75
|
+
if (zeroedPlacements.length > 1) {
|
|
76
|
+
warnings.push(`${zeroedPlacements.length} independent root placements were each zeroed to the origin; ` +
|
|
77
|
+
`their original relative offset from one another is not preserved.`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Follow `PlacementRelTo` from `startPlacementId` while the current record is
|
|
82
|
+
* an `IfcLocalPlacement`, and return the terminal placement — either an
|
|
83
|
+
* `IfcLocalPlacement` with `PlacementRelTo = $` (a zeroable root) or a
|
|
84
|
+
* non-`IfcLocalPlacement` record the chain cannot continue past (an
|
|
85
|
+
* `IfcGridPlacement` / `IfcLinearPlacement`, reported by the caller). `null`
|
|
86
|
+
* when the chain could not be safely walked at all — a cycle, a hop past the
|
|
87
|
+
* 256-hop cap, or a link that does not resolve to a readable record — each
|
|
88
|
+
* case appending its own warning before returning.
|
|
89
|
+
*/
|
|
90
|
+
function findRootPlacement(store, index, startPlacementId, warnings) {
|
|
91
|
+
const visited = new Set();
|
|
92
|
+
let currentId = startPlacementId;
|
|
93
|
+
let hops = 0;
|
|
94
|
+
for (;;) {
|
|
95
|
+
if (visited.has(currentId)) {
|
|
96
|
+
warnings.push(`Placement chain from #${startPlacementId} revisits #${currentId} (PlacementRelTo cycle); left untouched.`);
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
visited.add(currentId);
|
|
100
|
+
hops++;
|
|
101
|
+
if (hops > 256) {
|
|
102
|
+
warnings.push(`Placement chain from #${startPlacementId} exceeds 256 hops; left untouched rather than followed indefinitely.`);
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
const rec = readEntityArgs(store, index, currentId);
|
|
106
|
+
if (!rec) {
|
|
107
|
+
warnings.push(`Placement #${currentId} in the chain from #${startPlacementId} could not be read; left untouched.`);
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
if (rec.type !== 'IFCLOCALPLACEMENT') {
|
|
111
|
+
return { rootId: currentId, rootType: rec.type };
|
|
112
|
+
}
|
|
113
|
+
const relToIdx = attrIndex(rec.type, 'PlacementRelTo'); // `rec.type` is always IFCLOCALPLACEMENT here — order verified identical across all 3 schemas (#3309)
|
|
114
|
+
const parentId = relToIdx >= 0 && relToIdx < rec.args.length ? parseRef(rec.args[relToIdx]) : null;
|
|
115
|
+
if (parentId === null) {
|
|
116
|
+
return { rootId: currentId, rootType: rec.type };
|
|
117
|
+
}
|
|
118
|
+
currentId = parentId;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// IfcGeometricRepresentationContext.WorldCoordinateSystem
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
/**
|
|
125
|
+
* Every `IfcGeometricRepresentationContext` in the model — not just
|
|
126
|
+
* `includedIds` — because it is an `INFRASTRUCTURE_TYPES` member
|
|
127
|
+
* (`reference-collector.ts`) and is therefore always carried into the
|
|
128
|
+
* export regardless of what the caller selected. A plain, non-recursive
|
|
129
|
+
* pass over `index`: bounded by the model's own (small) count of
|
|
130
|
+
* representation contexts, not a reference walk that needs its own guard.
|
|
131
|
+
*/
|
|
132
|
+
function zeroWorldCoordinateSystems(store, index, editor, warnings) {
|
|
133
|
+
for (const [id, ref] of index) {
|
|
134
|
+
if (index.effectiveType(id, ref.type) !== 'IFCGEOMETRICREPRESENTATIONCONTEXT')
|
|
135
|
+
continue;
|
|
136
|
+
// `TrueNorth` is deliberately left alone — only the origin offset is
|
|
137
|
+
// identifying; the survey rotation is exactly the kind of
|
|
138
|
+
// geometry-relevant signal this feature is written to keep (#2934).
|
|
139
|
+
zeroAxisPlacementSlot(store, index, editor, id, 'IFCGEOMETRICREPRESENTATIONCONTEXT', 'WorldCoordinateSystem', warnings);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
// Shared clone-and-repoint primitive
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
/**
|
|
146
|
+
* Zero the `IfcCartesianPoint.Location` reachable through
|
|
147
|
+
* `entityId.<slotName>` → `IfcAxis2Placement2D|3D` → `Location`, by CLONING
|
|
148
|
+
* the point and the axis placement (never rewriting either — see the module
|
|
149
|
+
* doc) and repointing `entityId.<slotName>` at the clone.
|
|
150
|
+
*
|
|
151
|
+
* Returns the original (pre-zero) coordinates when a zero-clone was
|
|
152
|
+
* performed, or `null` when there was nothing to do: the slot is `$`, it
|
|
153
|
+
* does not resolve to an `IfcAxis2Placement2D/3D` → `IfcCartesianPoint`
|
|
154
|
+
* chain (warned), or the point is already at the origin.
|
|
155
|
+
*/
|
|
156
|
+
function zeroAxisPlacementSlot(store, index, editor, entityId, entityType, slotName, warnings) {
|
|
157
|
+
const slotIdx = attrIndex(entityType, slotName); // entityType/slotName always fixed literals, order verified identical across all 3 schemas (#3309)
|
|
158
|
+
if (slotIdx < 0)
|
|
159
|
+
return null;
|
|
160
|
+
const rec = readEntityArgs(store, index, entityId);
|
|
161
|
+
if (!rec || slotIdx >= rec.args.length)
|
|
162
|
+
return null;
|
|
163
|
+
const axisId = parseRef(rec.args[slotIdx]);
|
|
164
|
+
if (axisId === null)
|
|
165
|
+
return null; // `$` — nothing placed here to zero.
|
|
166
|
+
const axisRec = readEntityArgs(store, index, axisId);
|
|
167
|
+
if (!axisRec) {
|
|
168
|
+
warnings.push(`#${entityId} ${slotName} references #${axisId}, which could not be read; left untouched.`);
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
const is3D = axisRec.type === 'IFCAXIS2PLACEMENT3D';
|
|
172
|
+
const is2D = axisRec.type === 'IFCAXIS2PLACEMENT2D';
|
|
173
|
+
if (!is3D && !is2D) {
|
|
174
|
+
warnings.push(`#${entityId} ${slotName} resolves to #${axisId} (${axisRec.type}), not an ` +
|
|
175
|
+
`IfcAxis2Placement2D/3D; left untouched.`);
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
const locationIdx = attrIndex(axisRec.type, 'Location'); // IfcAxis2Placement2D/3D — same verified-stable guarantee as slotIdx above (#3309)
|
|
179
|
+
const pointId = locationIdx >= 0 ? parseRef(axisRec.args[locationIdx]) : null;
|
|
180
|
+
if (pointId === null)
|
|
181
|
+
return null;
|
|
182
|
+
const pointRec = readEntityArgs(store, index, pointId);
|
|
183
|
+
if (!pointRec || pointRec.type !== 'IFCCARTESIANPOINT') {
|
|
184
|
+
warnings.push(`#${entityId} ${slotName} → #${axisId} → Location #${pointId} is not an IfcCartesianPoint; left untouched.`);
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
const coords = parseCoordinateList(pointRec.args[0]);
|
|
188
|
+
if (!coords || coords.every((c) => c === 0))
|
|
189
|
+
return null; // absent, or already at the origin.
|
|
190
|
+
// Clone the point at the origin, same dimensionality.
|
|
191
|
+
const newPoint = editor.addEntity('IfcCartesianPoint', [coords.map(() => stepReal(0))]);
|
|
192
|
+
// Clone the axis placement, carrying `Axis`/`RefDirection` over VERBATIM —
|
|
193
|
+
// the rotation is exactly what a reproduction needs to keep.
|
|
194
|
+
const newAxisAttrs = [entityRef(newPoint.expressId)];
|
|
195
|
+
for (const name of is3D ? ['Axis', 'RefDirection'] : ['RefDirection']) {
|
|
196
|
+
const idx = attrIndex(axisRec.type, name); // same guarantee as locationIdx above (#3309)
|
|
197
|
+
newAxisAttrs.push(idx >= 0 ? verbatimAttr(axisRec.args[idx]) : null);
|
|
198
|
+
}
|
|
199
|
+
const newAxis = editor.addEntity(is3D ? 'IfcAxis2Placement3D' : 'IfcAxis2Placement2D', newAxisAttrs);
|
|
200
|
+
editor.setPositionalAttribute(entityId, slotIdx, entityRef(newAxis.expressId));
|
|
201
|
+
return coords;
|
|
202
|
+
}
|
|
203
|
+
// ---------------------------------------------------------------------------
|
|
204
|
+
// IfcSite / IfcBuilding georeferencing + address blanking
|
|
205
|
+
// ---------------------------------------------------------------------------
|
|
206
|
+
/**
|
|
207
|
+
* `IfcMapConversion(Scaled)` / `IfcProjectedCRS` need no handling here, and the
|
|
208
|
+
* reason is conditional since #3351: `IDENTIFYING_TYPES` and inverse-only, so
|
|
209
|
+
* `removeGeoreferencing` ON leaves them absent, while OFF must ROOT them —
|
|
210
|
+
* merely not excluding an inverse-only entity still drops it silently.
|
|
211
|
+
*
|
|
212
|
+
* All six blanked slots are OPTIONAL but not all STRING-typed — a LIST OF
|
|
213
|
+
* INTEGER, a REAL, and two entity refs among them — so `$` (via
|
|
214
|
+
* `setPositionalAttribute` + `null`) is the only blank valid for all of them;
|
|
215
|
+
* `setAttribute` only emits a quoted STEP string and would corrupt the rest.
|
|
216
|
+
*/
|
|
217
|
+
function blankSiteAndBuildingAddresses(index, includedIds, view) {
|
|
218
|
+
for (const id of includedIds) {
|
|
219
|
+
const type = index.typeOf(id);
|
|
220
|
+
if (type === 'IFCSITE') {
|
|
221
|
+
for (const attr of IFC_SITE_ADDRESS_ATTRIBUTES) {
|
|
222
|
+
const idx = attrIndex(type, attr); // IfcSite's address slots verified stable across all 3 schemas (#3309)
|
|
223
|
+
if (idx >= 0)
|
|
224
|
+
view.setPositionalAttribute(id, idx, null);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
else if (type === 'IFCBUILDING') {
|
|
228
|
+
const idx = attrIndex(type, 'BuildingAddress'); // verified stable across all 3 schemas (#3309)
|
|
229
|
+
if (idx >= 0)
|
|
230
|
+
view.setPositionalAttribute(id, idx, null);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// ---------------------------------------------------------------------------
|
|
235
|
+
// Token helpers
|
|
236
|
+
// ---------------------------------------------------------------------------
|
|
237
|
+
/** `"#42"` → `42`; anything else (`$`, a literal, missing) → `null`. */
|
|
238
|
+
function parseRef(token) {
|
|
239
|
+
if (!token)
|
|
240
|
+
return null;
|
|
241
|
+
const match = /^#(\d+)$/.exec(token.trim());
|
|
242
|
+
return match ? Number(match[1]) : null;
|
|
243
|
+
}
|
|
244
|
+
/** Carry a verbatim STEP token (`$` or `#N`) into `StoreEditor.addEntity`'s
|
|
245
|
+
* attribute conventions: `$` becomes `null`, a reference token is passed
|
|
246
|
+
* through as the `"#42"` string `addEntity` recognizes. */
|
|
247
|
+
function verbatimAttr(token) {
|
|
248
|
+
if (!token)
|
|
249
|
+
return null;
|
|
250
|
+
const trimmed = token.trim();
|
|
251
|
+
return trimmed === '$' || trimmed === '' ? null : trimmed;
|
|
252
|
+
}
|
|
253
|
+
/** Parse an `IfcCartesianPoint.Coordinates` token — a parenthesized,
|
|
254
|
+
* top-level-comma-separated REAL list (`(1000.,2000.,30.)`) — into numbers.
|
|
255
|
+
* `null` when the token isn't a list, or any member doesn't parse as a
|
|
256
|
+
* finite number. */
|
|
257
|
+
function parseCoordinateList(token) {
|
|
258
|
+
if (!token)
|
|
259
|
+
return null;
|
|
260
|
+
const trimmed = token.trim();
|
|
261
|
+
if (!trimmed.startsWith('(') || !trimmed.endsWith(')'))
|
|
262
|
+
return null;
|
|
263
|
+
const numbers = splitTopLevelArgs(trimmed.slice(1, -1)).map((part) => Number(part.trim()));
|
|
264
|
+
return numbers.every((n) => Number.isFinite(n)) ? numbers : null;
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=anonymize-placement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anonymize-placement.js","sourceRoot":"","sources":["../src/anonymize-placement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scrub pass for the "anonymized isolated export" feature (#2934, plan A5):
|
|
3
|
+
* deterministic per-type pseudonyms for `Name`/`LongName`/`Description`/`Tag`
|
|
4
|
+
* on every included `IfcRoot`, `GlobalId` regeneration (the old->new map is
|
|
5
|
+
* handed back as `guidMap` rather than written into the file — see
|
|
6
|
+
* `AnonymizeResult.guidMap` on `anonymize-types.ts`), owner-history scrubbing
|
|
7
|
+
* (`IfcPerson`/`IfcOrganization`/`IfcPersonAndOrganization`), and clearing an
|
|
8
|
+
* included `IfcTypeObject`'s `HasPropertySets` slot.
|
|
9
|
+
*
|
|
10
|
+
* Expressed as mutations on a private `MutablePropertyView`, never as a text
|
|
11
|
+
* rewrite — see the plan's "Key mechanism choice": the effective-index
|
|
12
|
+
* closure walk (`effective-index.ts`) already reacts to a queued
|
|
13
|
+
* `setAttribute`/`setPositionalAttribute`, so these mutations are visible to
|
|
14
|
+
* `step-collection.ts`'s subset closure the same way any other overlay edit
|
|
15
|
+
* is, with no second code path that could disagree about what got scrubbed.
|
|
16
|
+
*
|
|
17
|
+
* Deliberately does NOT use `store.entities.getTypeName` for the pseudonym
|
|
18
|
+
* label despite the plan sketch spelling it that way: that table only
|
|
19
|
+
* indexes product-ish entities and answers `'Unknown'` for the rest (see its
|
|
20
|
+
* own doc) — including `IfcPropertySet` (an `IfcRoot` descendant this module
|
|
21
|
+
* must be able to pseudonymize under `keepPropertySets`) and every
|
|
22
|
+
* `IfcRel*` relationship (also `IfcRoot` descendants, per `IFC_ROOT_TYPES`).
|
|
23
|
+
* `'Unknown-1'`, `'Unknown-2'`, … colliding across every such class would be
|
|
24
|
+
* both a worse pseudonym AND a residual identifying signal (two entities
|
|
25
|
+
* sharing a label leaks that they were originally the SAME kind of thing).
|
|
26
|
+
* `normalizeIfcTypeName` off the effective index's own class answer has no
|
|
27
|
+
* such gap.
|
|
28
|
+
*/
|
|
29
|
+
import type { IfcSourceBytes } from '@ifc-lite/parser';
|
|
30
|
+
import type { MutablePropertyView } from '@ifc-lite/mutations';
|
|
31
|
+
import type { EffectiveEntityIndex } from './effective-index.js';
|
|
32
|
+
import type { AnonymizeOptions } from './anonymize-types.js';
|
|
33
|
+
/** The subset of `AnonymizeOptions` this pass reads. */
|
|
34
|
+
export type ScrubOptions = Pick<AnonymizeOptions, 'pseudonymizeNames' | 'pseudonymizeAllNames' | 'regenerateGlobalIds' | 'scrubOwnerHistory' | 'neutralizeCurrency' | 'keepPropertySets' | 'guidRandom'>;
|
|
35
|
+
/** What one `applyScrub` call produced. */
|
|
36
|
+
export interface ScrubResult {
|
|
37
|
+
/** Original `GlobalId` -> regenerated `GlobalId`, one entry per
|
|
38
|
+
* `includedIds` `IfcRoot` entity whose GlobalId this pass actually
|
|
39
|
+
* regenerated. Empty when `regenerateGlobalIds` is `false`. */
|
|
40
|
+
guidMap: Map<string, string>;
|
|
41
|
+
/** How many entities this pass wrote at least one mutation for: every
|
|
42
|
+
* scrubbed `includedIds` root, plus every `IfcPerson`/`IfcOrganization`/
|
|
43
|
+
* `IfcPersonAndOrganization` found anywhere in `index` and scrubbed. */
|
|
44
|
+
scrubbedCount: number;
|
|
45
|
+
/** Non-fatal notices — an `includedIds` root this pass could not read (no
|
|
46
|
+
* source bytes, or a record that does not parse) or whose `GlobalId`
|
|
47
|
+
* could not be decoded, left untouched by the affected sub-step. */
|
|
48
|
+
warnings: string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Scrub `includedIds`' `IfcRoot` entities plus every owner-history entity in
|
|
52
|
+
* `index`, queuing every change on `view` (never writing into `store`).
|
|
53
|
+
*
|
|
54
|
+
* `index` must be the EFFECTIVE index (`getEffectiveEntityIndex`), not a
|
|
55
|
+
* bare source index — see that module's doc for why an overlay-created or
|
|
56
|
+
* retyped entity answers differently through it. `store` need only expose
|
|
57
|
+
* `source`: `readEntityArgs` reads SOURCE-backed records only, which is the
|
|
58
|
+
* entire domain of what this pass mutates (it creates no entities).
|
|
59
|
+
*/
|
|
60
|
+
export declare function applyScrub(store: {
|
|
61
|
+
readonly source: IfcSourceBytes;
|
|
62
|
+
readonly schemaVersion?: string;
|
|
63
|
+
}, index: EffectiveEntityIndex, includedIds: ReadonlySet<number>, view: MutablePropertyView, opts?: ScrubOptions): ScrubResult;
|
|
64
|
+
//# sourceMappingURL=anonymize-scrub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anonymize-scrub.d.ts","sourceRoot":"","sources":["../src/anonymize-scrub.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AA0C7D,wDAAwD;AACxD,MAAM,MAAM,YAAY,GAAG,IAAI,CAC7B,gBAAgB,EACd,mBAAmB,GACnB,sBAAsB,GACtB,qBAAqB,GACrB,mBAAmB,GACnB,oBAAoB,GACpB,kBAAkB,GAClB,YAAY,CACf,CAAC;AAEF,2CAA2C;AAC3C,MAAM,WAAW,WAAW;IAC1B;;oEAEgE;IAChE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B;;6EAEyE;IACzE,aAAa,EAAE,MAAM,CAAC;IACtB;;yEAEqE;IACrE,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,EAC3E,KAAK,EAAE,oBAAoB,EAC3B,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,EAChC,IAAI,EAAE,mBAAmB,EACzB,IAAI,GAAE,YAAiB,GACtB,WAAW,CAsIb"}
|