@ifc-lite/export 4.0.1 → 4.2.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 +7 -0
- package/dist/anonymize-placement.d.ts.map +1 -1
- package/dist/anonymize-placement.js +3 -4
- package/dist/anonymize-placement.js.map +1 -1
- package/dist/appearance-dependencies.d.ts +12 -0
- package/dist/appearance-dependencies.d.ts.map +1 -0
- package/dist/appearance-dependencies.js +191 -0
- package/dist/appearance-dependencies.js.map +1 -0
- package/dist/authored-resource-cleanup.d.ts +14 -0
- package/dist/authored-resource-cleanup.d.ts.map +1 -0
- package/dist/authored-resource-cleanup.js +156 -0
- package/dist/authored-resource-cleanup.js.map +1 -0
- package/dist/effective-appearance-record.d.ts +8 -0
- package/dist/effective-appearance-record.d.ts.map +1 -0
- package/dist/effective-appearance-record.js +45 -0
- package/dist/effective-appearance-record.js.map +1 -0
- package/dist/ifc5-appearance.d.ts +20 -0
- package/dist/ifc5-appearance.d.ts.map +1 -0
- package/dist/ifc5-appearance.js +106 -0
- package/dist/ifc5-appearance.js.map +1 -0
- package/dist/ifc5-exporter.d.ts +3 -0
- package/dist/ifc5-exporter.d.ts.map +1 -1
- package/dist/ifc5-exporter.js +19 -9
- package/dist/ifc5-exporter.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/lod0-generator.js +1 -1
- package/dist/lod0-generator.js.map +1 -1
- package/dist/merged-context.d.ts.map +1 -1
- package/dist/merged-context.js +15 -1
- package/dist/merged-context.js.map +1 -1
- package/dist/merged-empty-containers.d.ts.map +1 -1
- package/dist/merged-empty-containers.js +3 -2
- package/dist/merged-empty-containers.js.map +1 -1
- package/dist/merged-subcontext.d.ts.map +1 -1
- package/dist/merged-subcontext.js +19 -1
- package/dist/merged-subcontext.js.map +1 -1
- package/dist/obj.d.ts +20 -0
- package/dist/obj.d.ts.map +1 -0
- package/dist/obj.js +40 -0
- package/dist/obj.js.map +1 -0
- package/dist/parquet-exporter.d.ts.map +1 -1
- package/dist/parquet-exporter.js +5 -5
- package/dist/parquet-exporter.js.map +1 -1
- package/dist/reference-collector.d.ts +1 -0
- package/dist/reference-collector.d.ts.map +1 -1
- package/dist/reference-collector.js +5 -4
- package/dist/reference-collector.js.map +1 -1
- package/dist/retype.d.ts +1 -1
- package/dist/retype.d.ts.map +1 -1
- package/dist/retype.js +13 -3
- package/dist/retype.js.map +1 -1
- package/dist/schema-converter-attr-remap.d.ts +26 -4
- package/dist/schema-converter-attr-remap.d.ts.map +1 -1
- package/dist/schema-converter-attr-remap.js +28 -46
- package/dist/schema-converter-attr-remap.js.map +1 -1
- package/dist/step-argument-parser.d.ts +8 -1
- package/dist/step-argument-parser.d.ts.map +1 -1
- package/dist/step-argument-parser.js +40 -1
- package/dist/step-argument-parser.js.map +1 -1
- package/dist/step-attribute-mutations.d.ts +32 -2
- package/dist/step-attribute-mutations.d.ts.map +1 -1
- package/dist/step-attribute-mutations.js +87 -6
- package/dist/step-attribute-mutations.js.map +1 -1
- package/dist/step-comment-skip.d.ts +13 -0
- package/dist/step-comment-skip.d.ts.map +1 -0
- package/dist/step-comment-skip.js +19 -0
- package/dist/step-comment-skip.js.map +1 -0
- package/dist/step-export-types.d.ts +51 -0
- package/dist/step-export-types.d.ts.map +1 -1
- package/dist/step-export-types.js +38 -0
- package/dist/step-export-types.js.map +1 -1
- package/dist/step-outer-args.d.ts +27 -0
- package/dist/step-outer-args.d.ts.map +1 -0
- package/dist/step-outer-args.js +64 -0
- package/dist/step-outer-args.js.map +1 -0
- package/dist/step-property-sets.d.ts.map +1 -1
- package/dist/step-property-sets.js +8 -2
- package/dist/step-property-sets.js.map +1 -1
- package/dist/step-slot-grammar.d.ts +24 -0
- package/dist/step-slot-grammar.d.ts.map +1 -0
- package/dist/step-slot-grammar.js +201 -0
- package/dist/step-slot-grammar.js.map +1 -0
- package/dist/step-source-iteration.d.ts.map +1 -1
- package/dist/step-source-iteration.js +26 -2
- package/dist/step-source-iteration.js.map +1 -1
- package/dist/style-closure.d.ts +3 -1
- package/dist/style-closure.d.ts.map +1 -1
- package/dist/style-closure.js +16 -1
- package/dist/style-closure.js.map +1 -1
- package/dist/texture-map-closure.d.ts +10 -0
- package/dist/texture-map-closure.d.ts.map +1 -0
- package/dist/texture-map-closure.js +22 -0
- package/dist/texture-map-closure.js.map +1 -0
- package/dist/unit-normalize.d.ts.map +1 -1
- package/dist/unit-normalize.js +12 -49
- package/dist/unit-normalize.js.map +1 -1
- package/package.json +8 -8
package/README.md
CHANGED
|
@@ -180,3 +180,10 @@ See the [Exporting Guide](https://ifclite.dev/docs/guide/exporting/) and [API Re
|
|
|
180
180
|
## License
|
|
181
181
|
|
|
182
182
|
[MPL-2.0](../../LICENSE)
|
|
183
|
+
|
|
184
|
+
IFCX geometry exports retain texture fragments and owner identity through a
|
|
185
|
+
versioned IFClite appearance extension, with bounded shared RGBA pixels and
|
|
186
|
+
optional `textureSources` containing original PNG/JPEG bytes. Unresolved images
|
|
187
|
+
fail explicitly. This preserves IFClite roundtrips; third-party readers must
|
|
188
|
+
implement the extension to recover textures. See
|
|
189
|
+
[IFCX texture portability](../../docs/guide/exporting.md#ifcx-texture-portability).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anonymize-placement.d.ts","sourceRoot":"","sources":["../src/anonymize-placement.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAE5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"anonymize-placement.d.ts","sourceRoot":"","sources":["../src/anonymize-placement.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAE5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAM7D,+DAA+D;AAC/D,MAAM,MAAM,6BAA6B,GAAG,IAAI,CAC9C,gBAAgB,EAChB,mBAAmB,GAAG,sBAAsB,CAC7C,CAAC;AAEF;2EAC2E;AAC3E,MAAM,WAAW,4BAA4B;IAC3C;6CACyC;IACzC,gBAAgB,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IACjE;;;iDAG6C;IAC7C,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAUD;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;CAAE,EAC1C,KAAK,EAAE,oBAAoB,EAC3B,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,EAChC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,mBAAmB,EACzB,IAAI,CAAC,EAAE,6BAA6B,GACnC,4BAA4B,CAc9B"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { attrIndex, readEntityArgs } from './subset-entity-reader.js';
|
|
5
5
|
import { splitTopLevelArgs } from './step-argument-parser.js';
|
|
6
6
|
import { entityRef, stepReal } from './step-serialization.js';
|
|
7
|
+
import { BARE_REF_RE } from './reference-collector.js';
|
|
7
8
|
const IFC_SITE_ADDRESS_ATTRIBUTES = [
|
|
8
9
|
'RefLatitude',
|
|
9
10
|
'RefLongitude',
|
|
@@ -234,11 +235,9 @@ function blankSiteAndBuildingAddresses(index, includedIds, view) {
|
|
|
234
235
|
// ---------------------------------------------------------------------------
|
|
235
236
|
// Token helpers
|
|
236
237
|
// ---------------------------------------------------------------------------
|
|
237
|
-
/** `"#42"` → `42
|
|
238
|
+
/** `"#42"` → `42` via shared, trivia-tolerant {@link BARE_REF_RE} (#4227 — a narrower regex here skipped a comment-wrapped `ObjectPlacement`); else `null`. */
|
|
238
239
|
function parseRef(token) {
|
|
239
|
-
|
|
240
|
-
return null;
|
|
241
|
-
const match = /^#(\d+)$/.exec(token.trim());
|
|
240
|
+
const match = token ? BARE_REF_RE.exec(token) : null;
|
|
242
241
|
return match ? Number(match[1]) : null;
|
|
243
242
|
}
|
|
244
243
|
/** Carry a verbatim STEP token (`$` or `#N`) into `StoreEditor.addEntity`'s
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anonymize-placement.js","sourceRoot":"","sources":["../src/anonymize-placement.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AA0C/D,OAAO,EAAE,SAAS,EAAE,cAAc,EAA6B,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"anonymize-placement.js","sourceRoot":"","sources":["../src/anonymize-placement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type IfcDataStore } from '@ifc-lite/parser';
|
|
2
|
+
import type { MutablePropertyView } from '@ifc-lite/mutations';
|
|
3
|
+
/**
|
|
4
|
+
* Capture effective geometry/placement/appearance dependencies for conditional
|
|
5
|
+
* replay (#4243). Source and authored references use the actual STEP writers.
|
|
6
|
+
* Property relationships are not traversed inversely; unrelated property edits
|
|
7
|
+
* therefore do not invalidate an appearance command's Undo/Redo.
|
|
8
|
+
*/
|
|
9
|
+
export declare function captureAppearanceDependencies(store: IfcDataStore, view: MutablePropertyView, roots: ReadonlySet<number>): {
|
|
10
|
+
validate(current: MutablePropertyView): void;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=appearance-dependencies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appearance-dependencies.d.ts","sourceRoot":"","sources":["../src/appearance-dependencies.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiD,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAgBlF;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GACzE;IAAE,QAAQ,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAA;CAAE,CA0HlD"}
|
|
@@ -0,0 +1,191 @@
|
|
|
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
|
+
/* This Source Code Form is subject to the Mozilla Public
|
|
5
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
6
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
7
|
+
import { asSourceBytes, getAttributeNamesAcrossSchemas } from '@ifc-lite/parser';
|
|
8
|
+
import { getEffectiveEntityIndex } from './effective-index.js';
|
|
9
|
+
import { effectiveAppearanceRecord } from './effective-appearance-record.js';
|
|
10
|
+
import { collectRefsInByteRange, refGroupFromArg } from './reference-collector.js';
|
|
11
|
+
import { splitTopLevelArgs } from './step-argument-parser.js';
|
|
12
|
+
const RELATING = new Map([['IFCRELASSOCIATESMATERIAL', 'RelatingMaterial'], ['IFCRELDEFINESBYTYPE', 'RelatingType']]);
|
|
13
|
+
const BINDINGS = new Map([
|
|
14
|
+
['IFCRELASSOCIATESMATERIAL', 'RelatedObjects'], ['IFCRELDEFINESBYTYPE', 'RelatedObjects'],
|
|
15
|
+
['IFCMATERIALDEFINITIONREPRESENTATION', 'RepresentedMaterial'],
|
|
16
|
+
['IFCSTYLEDITEM', 'Item'], ['IFCSTYLEDREPRESENTATION', 'Items'],
|
|
17
|
+
['IFCPRESENTATIONLAYERASSIGNMENT', 'AssignedItems'], ['IFCPRESENTATIONLAYERWITHSTYLE', 'AssignedItems'],
|
|
18
|
+
['IFCINDEXEDTRIANGLETEXTUREMAP', 'MappedTo'],
|
|
19
|
+
['IFCINDEXEDPOLYGONALTEXTUREMAP', 'MappedTo'], ['IFCTEXTUREMAP', 'MappedTo'],
|
|
20
|
+
]);
|
|
21
|
+
/**
|
|
22
|
+
* Capture effective geometry/placement/appearance dependencies for conditional
|
|
23
|
+
* replay (#4243). Source and authored references use the actual STEP writers.
|
|
24
|
+
* Property relationships are not traversed inversely; unrelated property edits
|
|
25
|
+
* therefore do not invalidate an appearance command's Undo/Redo.
|
|
26
|
+
*/
|
|
27
|
+
export function captureAppearanceDependencies(store, view, roots) {
|
|
28
|
+
const read = (current) => {
|
|
29
|
+
// Refuse a large source/overlay before the effective index copies its maps.
|
|
30
|
+
if (store.entityIndex.byId.size + (store.deferredEntityIndex?.size ?? 0) > 200_000
|
|
31
|
+
|| current.getNewEntities().length > 100_000) {
|
|
32
|
+
throw new Error('Appearance dependency validation exceeds its entity budget. Choose a smaller IFC model.');
|
|
33
|
+
}
|
|
34
|
+
const index = getEffectiveEntityIndex(store, current, true);
|
|
35
|
+
const source = asSourceBytes(store.source);
|
|
36
|
+
const rows = new Map();
|
|
37
|
+
let bytes = 0, values = 0, strings = 0, refs = 0;
|
|
38
|
+
// Native planning accepts 128MiB source + 64MiB output. The effective
|
|
39
|
+
// dependency graph may contain both, including higher precision new UVs.
|
|
40
|
+
const byteLimit = 192 * 1024 * 1024;
|
|
41
|
+
const encoder = new TextEncoder(), scratch = new Uint8Array(16 * 1024);
|
|
42
|
+
const refuse = () => { throw new Error(`Appearance dependency validation exceeds its safety budget (${bytes} bytes, ${values} attribute values). Choose a smaller scope.`); };
|
|
43
|
+
const inspect = (value) => {
|
|
44
|
+
const frames = [{ values: [value], cursor: 0 }];
|
|
45
|
+
while (frames.length) {
|
|
46
|
+
const frame = frames[frames.length - 1];
|
|
47
|
+
if (frame.cursor === frame.values.length) {
|
|
48
|
+
frames.pop();
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const value = frame.values[frame.cursor++];
|
|
52
|
+
if (++values > 8_000_000 || frames.length > 64)
|
|
53
|
+
refuse();
|
|
54
|
+
if (Array.isArray(value)) {
|
|
55
|
+
if (value.length > 8_000_000 - values)
|
|
56
|
+
refuse();
|
|
57
|
+
frames.push({ values: value, cursor: 0 });
|
|
58
|
+
}
|
|
59
|
+
else if (value && typeof value === 'object' && 'typed' in value) {
|
|
60
|
+
frames.push({ values: [value.typed.type, value.typed.value], cursor: 0 });
|
|
61
|
+
}
|
|
62
|
+
else if (typeof value === 'string') {
|
|
63
|
+
strings += value.length;
|
|
64
|
+
if (strings > 8 * 1024 * 1024)
|
|
65
|
+
refuse();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const row = (id) => {
|
|
70
|
+
let result = rows.get(id);
|
|
71
|
+
if (result)
|
|
72
|
+
return result;
|
|
73
|
+
if (rows.size >= 100_000)
|
|
74
|
+
refuse();
|
|
75
|
+
const record = index.get(id);
|
|
76
|
+
if (!record) {
|
|
77
|
+
result = { line: '', refs: [] };
|
|
78
|
+
rows.set(id, result);
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
if (record.byteLength > byteLimit - bytes)
|
|
82
|
+
refuse();
|
|
83
|
+
const type = index.typeOf(id) ?? '';
|
|
84
|
+
// Unchanged source dependencies are already represented by an immutable
|
|
85
|
+
// marker below. Scan their original bytes directly instead of decoding,
|
|
86
|
+
// rewriting and encoding large coordinate lists solely to find edges.
|
|
87
|
+
// Binding rows still need their EXPRESS target slot for inverse traversal.
|
|
88
|
+
const original = !index.isOverlayCreated(id) && !index.hasSourceMutation?.(id)
|
|
89
|
+
&& !current.getEntityTypeMutation(id);
|
|
90
|
+
if (original && !BINDINGS.has(type)) {
|
|
91
|
+
const span = source.slice(record.byteOffset, record.byteOffset + record.byteLength);
|
|
92
|
+
if (span.length !== record.byteLength)
|
|
93
|
+
throw new Error('Truncated IFC source during appearance validation.');
|
|
94
|
+
bytes += span.length;
|
|
95
|
+
for (let offset = 0; offset < span.length; offset++) {
|
|
96
|
+
if (span[offset] === 0x23 && ++refs > 2_000_000)
|
|
97
|
+
refuse();
|
|
98
|
+
}
|
|
99
|
+
result = { line: '', refs: collectRefsInByteRange(span, 0, span.length) };
|
|
100
|
+
rows.set(id, result);
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
inspect(current.getNewEntity(id)?.attributes);
|
|
104
|
+
for (const value of current.getPositionalMutationsForEntity(id)?.values() ?? [])
|
|
105
|
+
inspect(value);
|
|
106
|
+
for (const attribute of current.getAttributeMutationsForEntity(id))
|
|
107
|
+
inspect(attribute.value);
|
|
108
|
+
const line = effectiveAppearanceRecord(store, current, index, id);
|
|
109
|
+
// Exact UTF-8 work accounting with bounded scratch storage. Counting
|
|
110
|
+
// every ASCII character as three bytes rejected real Convento walls.
|
|
111
|
+
for (let offset = 0; offset < line.length;) {
|
|
112
|
+
const progress = encoder.encodeInto(line.slice(offset), scratch);
|
|
113
|
+
offset += progress.read;
|
|
114
|
+
bytes += progress.written;
|
|
115
|
+
if (!progress.read || bytes > byteLimit)
|
|
116
|
+
refuse();
|
|
117
|
+
}
|
|
118
|
+
for (const char of line)
|
|
119
|
+
if (char === '#' && ++refs > 2_000_000)
|
|
120
|
+
refuse();
|
|
121
|
+
const encoded = encoder.encode(line);
|
|
122
|
+
let forward = collectRefsInByteRange(encoded, 0, encoded.length);
|
|
123
|
+
const relating = RELATING.get(type);
|
|
124
|
+
if (relating) {
|
|
125
|
+
// Membership is validated by the complete row, but peer products sharing
|
|
126
|
+
// a type/material are not dependencies of this object's appearance.
|
|
127
|
+
const slot = getAttributeNamesAcrossSchemas(type).indexOf(relating);
|
|
128
|
+
if (slot < 0)
|
|
129
|
+
refuse();
|
|
130
|
+
const args = splitTopLevelArgs(line.slice(line.indexOf('(') + 1, line.lastIndexOf(')')));
|
|
131
|
+
const ref = args[slot] === undefined ? undefined : refGroupFromArg(args[slot]);
|
|
132
|
+
forward = typeof ref === 'number' ? [ref] : ref ?? [];
|
|
133
|
+
}
|
|
134
|
+
result = { line, refs: forward };
|
|
135
|
+
rows.set(id, result);
|
|
136
|
+
return result;
|
|
137
|
+
};
|
|
138
|
+
// Inverse bindings are discovered by their actual EXPRESS target slot, not
|
|
139
|
+
// by a shared texture/style reference that could belong to another object.
|
|
140
|
+
const inverse = new Map();
|
|
141
|
+
for (const [type, attribute] of BINDINGS) {
|
|
142
|
+
const slot = getAttributeNamesAcrossSchemas(type).indexOf(attribute);
|
|
143
|
+
if (slot < 0)
|
|
144
|
+
throw new Error(`Cannot resolve ${type}.${attribute} for appearance validation.`);
|
|
145
|
+
for (const id of index.byType.get(type) ?? []) {
|
|
146
|
+
const line = row(id).line;
|
|
147
|
+
const args = splitTopLevelArgs(line.slice(line.indexOf('(') + 1, line.lastIndexOf(')')));
|
|
148
|
+
const target = args[slot] === undefined ? null : refGroupFromArg(args[slot]);
|
|
149
|
+
for (const targetId of typeof target === 'number' ? [target] : target ?? []) {
|
|
150
|
+
if (!Number.isSafeInteger(targetId))
|
|
151
|
+
refuse();
|
|
152
|
+
const ids = inverse.get(targetId) ?? [];
|
|
153
|
+
ids.push(id);
|
|
154
|
+
inverse.set(targetId, ids);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (roots.size > 100_000)
|
|
159
|
+
refuse();
|
|
160
|
+
for (const id of roots)
|
|
161
|
+
if (!Number.isSafeInteger(id) || id <= 0)
|
|
162
|
+
refuse();
|
|
163
|
+
const pending = [...roots], visited = new Set(pending);
|
|
164
|
+
const result = new Map();
|
|
165
|
+
for (let cursor = 0; cursor < pending.length; cursor++) {
|
|
166
|
+
const id = pending[cursor], record = row(id);
|
|
167
|
+
// Immutable source rows need no duplicate string in each Undo/Redo
|
|
168
|
+
// checkpoint. An SDK override changes this marker to an effective row.
|
|
169
|
+
const original = index.has(id) && !index.isOverlayCreated(id)
|
|
170
|
+
&& !index.hasSourceMutation?.(id) && !current.getEntityTypeMutation(id);
|
|
171
|
+
result.set(id, original ? null : record.line);
|
|
172
|
+
for (const next of [...record.refs, ...(inverse.get(id) ?? [])]) {
|
|
173
|
+
if (!visited.has(next)) {
|
|
174
|
+
if (visited.size >= 100_000)
|
|
175
|
+
refuse();
|
|
176
|
+
visited.add(next);
|
|
177
|
+
pending.push(next);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return result;
|
|
182
|
+
};
|
|
183
|
+
const snapshot = read(view);
|
|
184
|
+
return { validate(current) {
|
|
185
|
+
const actual = read(current);
|
|
186
|
+
if (actual.size !== snapshot.size || [...snapshot].some(([id, line]) => actual.get(id) !== line)) {
|
|
187
|
+
throw new Error('The IFC geometry or appearance changed after this command. Undo the newer edit or reload the model.');
|
|
188
|
+
}
|
|
189
|
+
} };
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=appearance-dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appearance-dependencies.js","sourceRoot":"","sources":["../src/appearance-dependencies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type IfcDataStore } from '@ifc-lite/parser';
|
|
2
|
+
import type { IfcAttributeValue, MutablePropertyView } from '@ifc-lite/mutations';
|
|
3
|
+
/**
|
|
4
|
+
* Pure, conservative cleanup plan for explicitly owned appearance resources.
|
|
5
|
+
* Never returns source-backed entities or entities outside the candidate set.
|
|
6
|
+
* History supplies creation IDs and saved attribute values as protected values.
|
|
7
|
+
* Effective slots use the same named/positional precedence as STEP export.
|
|
8
|
+
* A budget refusal throws before returning any partial deletion plan.
|
|
9
|
+
*/
|
|
10
|
+
export declare function planAuthoredResourceCleanup(dataStore: IfcDataStore, view: MutablePropertyView, candidateIds: ReadonlySet<number>, protectedValues?: Iterable<IfcAttributeValue>): {
|
|
11
|
+
entityIds: Set<number>;
|
|
12
|
+
retainedImageUris: Set<string>;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=authored-resource-cleanup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-resource-cleanup.d.ts","sourceRoot":"","sources":["../src/authored-resource-cleanup.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAQlF;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,mBAAmB,EAClD,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,eAAe,GAAE,QAAQ,CAAC,iBAAiB,CAAM,GACnF;IAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAoG5D"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { asSourceBytes } from '@ifc-lite/parser';
|
|
5
|
+
import { authoredEntityRefs, getEffectiveEntityIndex } from './effective-index.js';
|
|
6
|
+
import { collectRefsInByteRange } from './reference-collector.js';
|
|
7
|
+
import { effectiveAppearanceRecord, effectiveImageUri } from './effective-appearance-record.js';
|
|
8
|
+
const RESOURCE_TYPES = new Set(['IFCIMAGETEXTURE', 'IFCTEXTUREVERTEXLIST', 'IFCSURFACESTYLE',
|
|
9
|
+
'IFCSURFACESTYLEWITHTEXTURES', 'IFCSURFACESTYLESHADING', 'IFCSURFACESTYLERENDERING', 'IFCCOLOURRGB']);
|
|
10
|
+
/**
|
|
11
|
+
* Pure, conservative cleanup plan for explicitly owned appearance resources.
|
|
12
|
+
* Never returns source-backed entities or entities outside the candidate set.
|
|
13
|
+
* History supplies creation IDs and saved attribute values as protected values.
|
|
14
|
+
* Effective slots use the same named/positional precedence as STEP export.
|
|
15
|
+
* A budget refusal throws before returning any partial deletion plan.
|
|
16
|
+
*/
|
|
17
|
+
export function planAuthoredResourceCleanup(dataStore, view, candidateIds, protectedValues = []) {
|
|
18
|
+
if (candidateIds.size > 250_000)
|
|
19
|
+
throw new Error('Authored appearance cleanup exceeds its entity budget; resources were retained.');
|
|
20
|
+
const index = getEffectiveEntityIndex(dataStore, view, true);
|
|
21
|
+
const candidates = new Set([...candidateIds].filter(id => index.isOverlayCreated(id)
|
|
22
|
+
&& !index.isDeleted(id) && RESOURCE_TYPES.has(index.typeOf(id) ?? '')));
|
|
23
|
+
const live = new Set();
|
|
24
|
+
const pending = [];
|
|
25
|
+
let work = 0;
|
|
26
|
+
const account = () => { if (++work > 2_000_000)
|
|
27
|
+
throw new Error('Authored appearance cleanup exceeds its reference budget; resources were retained.'); };
|
|
28
|
+
let valueWork = 0, stringUnits = 0;
|
|
29
|
+
const inspect = (value) => {
|
|
30
|
+
const frames = [{ values: [value], cursor: 0 }];
|
|
31
|
+
while (frames.length) {
|
|
32
|
+
const frame = frames[frames.length - 1];
|
|
33
|
+
if (frame.cursor === frame.values.length) {
|
|
34
|
+
frames.pop();
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const next = frame.values[frame.cursor++];
|
|
38
|
+
if (++valueWork > 8_000_000 || frames.length > 64)
|
|
39
|
+
throw new Error('Authored appearance cleanup exceeds its attribute budget; resources were retained.');
|
|
40
|
+
if (Array.isArray(next)) {
|
|
41
|
+
if (next.length > 8_000_000 - valueWork)
|
|
42
|
+
throw new Error('Authored appearance cleanup exceeds its attribute budget; resources were retained.');
|
|
43
|
+
frames.push({ values: next, cursor: 0 });
|
|
44
|
+
}
|
|
45
|
+
else if (next && typeof next === 'object' && 'typed' in next) {
|
|
46
|
+
frames.push({ values: [next.typed.type, next.typed.value], cursor: 0 });
|
|
47
|
+
}
|
|
48
|
+
else if (typeof next === 'string') {
|
|
49
|
+
stringUnits += next.length;
|
|
50
|
+
if (stringUnits > 128 * 1024 * 1024)
|
|
51
|
+
throw new Error('Authored appearance cleanup exceeds its attribute budget; resources were retained.');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
const retain = (id) => {
|
|
56
|
+
account();
|
|
57
|
+
if (candidates.has(id) && !live.has(id)) {
|
|
58
|
+
live.add(id);
|
|
59
|
+
pending.push(id);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
if (candidates.size)
|
|
63
|
+
for (const value of protectedValues) {
|
|
64
|
+
inspect(value);
|
|
65
|
+
for (const id of authoredEntityRefs(value))
|
|
66
|
+
retain(id);
|
|
67
|
+
if (live.size === candidates.size)
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
const source = asSourceBytes(dataStore.source);
|
|
71
|
+
const imageUris = new Map();
|
|
72
|
+
const needsGraph = live.size !== candidates.size;
|
|
73
|
+
const imageRecords = function* () {
|
|
74
|
+
for (const id of index.byType.get('IFCIMAGETEXTURE') ?? []) {
|
|
75
|
+
const record = index.get(id);
|
|
76
|
+
if (record)
|
|
77
|
+
yield [id, record];
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
// Non-candidates are roots. Visit candidates only after a live reference
|
|
81
|
+
// reaches them: unreachable history UV arrays need neither serialization nor
|
|
82
|
+
// recursive validation to prove that no surviving entity can refer to them.
|
|
83
|
+
const graphRecords = function* () {
|
|
84
|
+
for (const entry of index)
|
|
85
|
+
if (!candidates.has(entry[0]))
|
|
86
|
+
yield entry;
|
|
87
|
+
for (let cursor = 0; cursor < pending.length; cursor++) {
|
|
88
|
+
const id = pending[cursor], record = index.get(id);
|
|
89
|
+
if (record)
|
|
90
|
+
yield [id, record];
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
let sourceBytes = 0, sourceHashes = 0, emittedBytes = 0, emittedHashes = 0;
|
|
94
|
+
for (const [entityId, record] of needsGraph ? graphRecords() : imageRecords()) {
|
|
95
|
+
account();
|
|
96
|
+
inspect(view.getNewEntity(entityId)?.attributes);
|
|
97
|
+
for (const value of view.getPositionalMutationsForEntity(entityId)?.values() ?? [])
|
|
98
|
+
inspect(value);
|
|
99
|
+
for (const attribute of view.getAttributeMutationsForEntity(entityId))
|
|
100
|
+
inspect(attribute.value);
|
|
101
|
+
const isImage = index.typeOf(entityId) === 'IFCIMAGETEXTURE';
|
|
102
|
+
let bytes;
|
|
103
|
+
if (index.isOverlayCreated(entityId)) {
|
|
104
|
+
const line = effectiveAppearanceRecord(dataStore, view, index, entityId);
|
|
105
|
+
bytes = new TextEncoder().encode(line);
|
|
106
|
+
if (isImage) {
|
|
107
|
+
const uri = effectiveImageUri(line);
|
|
108
|
+
if (uri !== undefined)
|
|
109
|
+
imageUris.set(entityId, uri);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
sourceBytes += record.byteLength;
|
|
114
|
+
if (sourceBytes > 128 * 1024 * 1024)
|
|
115
|
+
throw new Error('Authored appearance cleanup exceeds its source byte budget; resources were retained.');
|
|
116
|
+
bytes = source.slice(record.byteOffset, record.byteOffset + record.byteLength);
|
|
117
|
+
if (bytes.length !== record.byteLength)
|
|
118
|
+
throw new Error('Incomplete IFC source during appearance cleanup; resources were retained.');
|
|
119
|
+
// Even an originally dangling source reference may name a later allocated ID.
|
|
120
|
+
// Account before the canonical writer/scanner allocates output arrays.
|
|
121
|
+
for (const byte of bytes)
|
|
122
|
+
if (byte === 35 && ++sourceHashes > 2_000_000) {
|
|
123
|
+
throw new Error('Authored appearance cleanup exceeds its reference budget; resources were retained.');
|
|
124
|
+
}
|
|
125
|
+
if (isImage || index.hasSourceMutation?.(entityId) || view.getEntityTypeMutation(entityId)) {
|
|
126
|
+
const line = effectiveAppearanceRecord(dataStore, view, index, entityId);
|
|
127
|
+
bytes = new TextEncoder().encode(line);
|
|
128
|
+
if (isImage) {
|
|
129
|
+
const uri = effectiveImageUri(line);
|
|
130
|
+
if (uri !== undefined)
|
|
131
|
+
imageUris.set(entityId, uri);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
emittedBytes += bytes.length;
|
|
136
|
+
if (emittedBytes > 128 * 1024 * 1024)
|
|
137
|
+
throw new Error('Authored appearance cleanup exceeds its emitted byte budget; resources were retained.');
|
|
138
|
+
if (needsGraph)
|
|
139
|
+
for (const byte of bytes)
|
|
140
|
+
if (byte === 35 && ++emittedHashes > 2_000_000) {
|
|
141
|
+
throw new Error('Authored appearance cleanup exceeds its reference budget; resources were retained.');
|
|
142
|
+
}
|
|
143
|
+
const groups = needsGraph ? collectRefsInByteRange(bytes, 0, bytes.length) : [];
|
|
144
|
+
for (const group of groups) {
|
|
145
|
+
for (const id of typeof group === 'number' ? [group] : group) {
|
|
146
|
+
retain(id);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Binding entities are intentionally never deletion candidates: their live
|
|
150
|
+
// inverse link to geometry roots the style/map resources they still name.
|
|
151
|
+
// Keeping an unbound binding is conservative and cannot break other edits.
|
|
152
|
+
}
|
|
153
|
+
const entityIds = new Set([...candidates].filter(id => !live.has(id)));
|
|
154
|
+
return { entityIds, retainedImageUris: new Set([...imageUris].filter(([id]) => !entityIds.has(id)).map(([, uri]) => uri)) };
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=authored-resource-cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authored-resource-cleanup.js","sourceRoot":"","sources":["../src/authored-resource-cleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type IfcDataStore } from '@ifc-lite/parser';
|
|
2
|
+
import type { MutablePropertyView } from '@ifc-lite/mutations';
|
|
3
|
+
import type { EffectiveEntityIndex } from './effective-index.js';
|
|
4
|
+
/** Compose the existing STEP writers; never invent a second override policy. */
|
|
5
|
+
export declare function effectiveAppearanceRecord(store: IfcDataStore, view: MutablePropertyView, index: EffectiveEntityIndex, id: number): string;
|
|
6
|
+
/** URLReference occupies slot 5 after the inherited IfcSurfaceTexture fields. */
|
|
7
|
+
export declare function effectiveImageUri(line: string): string | undefined;
|
|
8
|
+
//# sourceMappingURL=effective-appearance-record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effective-appearance-record.d.ts","sourceRoot":"","sources":["../src/effective-appearance-record.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiC,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAQjE,gFAAgF;AAChF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,EAAE,MAAM,GACtF,MAAM,CAmBR;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOlE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { asSourceBytes, parseStepValue } from '@ifc-lite/parser';
|
|
5
|
+
import { serializeEntityArgs } from './attribute-real-slots.js';
|
|
6
|
+
import { applyOverlayEntityOverrides } from './step-overlay-attribute-overrides.js';
|
|
7
|
+
import { applySourceLineMutations } from './step-attribute-mutations.js';
|
|
8
|
+
import { splitTopLevelArgs } from './step-argument-parser.js';
|
|
9
|
+
import { retypeArgTokens } from './retype.js';
|
|
10
|
+
/** Compose the existing STEP writers; never invent a second override policy. */
|
|
11
|
+
export function effectiveAppearanceRecord(store, view, index, id) {
|
|
12
|
+
const record = index.get(id);
|
|
13
|
+
if (!record)
|
|
14
|
+
throw new Error('Missing IFC entity during appearance cleanup; resources were retained.');
|
|
15
|
+
const schema = store.schemaVersion || 'IFC4';
|
|
16
|
+
const named = new Map(view.getAttributeMutationsForEntity(id).map(({ name, value }) => [name, value]));
|
|
17
|
+
const created = view.getNewEntity(id);
|
|
18
|
+
if (created) {
|
|
19
|
+
const retype = view.getEntityTypeMutation(id);
|
|
20
|
+
const type = retype?.newType ?? created.type;
|
|
21
|
+
let args = serializeEntityArgs(created.type, created.attributes, schema);
|
|
22
|
+
if (retype)
|
|
23
|
+
args = retypeArgTokens(splitTopLevelArgs(args), created.type, type, retype.predefinedType, schema).tokens.join(',');
|
|
24
|
+
args = applyOverlayEntityOverrides(args, type, named, view.getPositionalMutationsForEntity(id), schema);
|
|
25
|
+
return `#${id}=${type.toUpperCase()}(${args});`;
|
|
26
|
+
}
|
|
27
|
+
const source = asSourceBytes(store.source);
|
|
28
|
+
const original = source.decodeUtf8(record.byteOffset, record.byteOffset + record.byteLength);
|
|
29
|
+
const result = applySourceLineMutations(view, id, original, record.type, named, schema, true);
|
|
30
|
+
if (result.unreadable)
|
|
31
|
+
throw new Error('Unreadable edited IFC entity during appearance cleanup; resources were retained.');
|
|
32
|
+
return result.text;
|
|
33
|
+
}
|
|
34
|
+
/** URLReference occupies slot 5 after the inherited IfcSurfaceTexture fields. */
|
|
35
|
+
export function effectiveImageUri(line) {
|
|
36
|
+
const start = line.indexOf('('), end = line.lastIndexOf(')');
|
|
37
|
+
if (start < 0 || end < start)
|
|
38
|
+
throw new Error('Unreadable IFC image during appearance cleanup; resources were retained.');
|
|
39
|
+
const argument = splitTopLevelArgs(line.slice(start + 1, end))[5];
|
|
40
|
+
if (argument === undefined)
|
|
41
|
+
return undefined;
|
|
42
|
+
const value = parseStepValue(argument);
|
|
43
|
+
return typeof value === 'string' ? value : undefined;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=effective-appearance-record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effective-appearance-record.js","sourceRoot":"","sources":["../src/effective-appearance-record.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAC/D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAqB,MAAM,kBAAkB,CAAC;AAGpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,gFAAgF;AAChF,MAAM,UAAU,yBAAyB,CACvC,KAAmB,EAAE,IAAyB,EAAE,KAA2B,EAAE,EAAU;IAEvF,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IACvG,MAAM,MAAM,GAAI,KAAK,CAAC,aAAkC,IAAI,MAAM,CAAC;IACnE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACvG,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACtC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,EAAE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;QAC7C,IAAI,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACzE,IAAI,MAAM;YAAE,IAAI,GAAG,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChI,IAAI,GAAG,2BAA2B,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,+BAA+B,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACxG,OAAO,IAAI,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,IAAI,CAAC;IAClD,CAAC;IACD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7F,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC9F,IAAI,MAAM,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;IAC3H,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7D,IAAI,KAAK,GAAG,CAAC,IAAI,GAAG,GAAG,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;IAC1H,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7C,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { MeshData } from '@ifc-lite/geometry';
|
|
2
|
+
import { type IfcxNode, type IfcxEncodedImage } from '@ifc-lite/ifcx';
|
|
3
|
+
/** Packs canonical mesh fragments without evaluating styles or changing UV mappings. */
|
|
4
|
+
export declare class Ifc5AppearanceWriter {
|
|
5
|
+
private readonly occupiedPaths;
|
|
6
|
+
private readonly originals?;
|
|
7
|
+
readonly images: IfcxNode[];
|
|
8
|
+
private readonly imagePaths;
|
|
9
|
+
private readonly sourcePaths;
|
|
10
|
+
private imageBytes;
|
|
11
|
+
private nextFragment;
|
|
12
|
+
constructor(occupiedPaths: Set<string>, originals?: ReadonlyMap<string, IfcxEncodedImage> | undefined);
|
|
13
|
+
private uniquePath;
|
|
14
|
+
private image;
|
|
15
|
+
fragments(owner: IfcxNode, meshes: MeshData[], convert: (mesh: MeshData) => {
|
|
16
|
+
points: number[][];
|
|
17
|
+
faceVertexIndices: number[];
|
|
18
|
+
}): IfcxNode[];
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=ifc5-appearance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ifc5-appearance.d.ts","sourceRoot":"","sources":["../src/ifc5-appearance.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAgD,KAAK,QAAQ,EAAmB,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAErI,wFAAwF;AACxF,qBAAa,oBAAoB;IAOnB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAAe,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IANpF,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAM;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8C;IAC1E,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,YAAY,CAAK;gBAEI,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,EAAmB,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,YAAA;IAE3H,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,KAAK;IA2Cb,SAAS,CACP,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,QAAQ,EAAE,EAClB,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK;QAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;QAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;KAAE,GAC/E,QAAQ,EAAE;CA0Bd"}
|