@ifc-lite/create 3.1.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/ifc-creator-math.d.ts +5 -7
- package/dist/ifc-creator-math.d.ts.map +1 -1
- package/dist/ifc-creator-math.js +8 -15
- package/dist/ifc-creator-math.js.map +1 -1
- package/dist/in-store/anchor.d.ts +25 -0
- package/dist/in-store/anchor.d.ts.map +1 -1
- package/dist/in-store/auto-space-detect.d.ts +1 -1
- package/dist/in-store/auto-space-detect.js +1 -1
- package/dist/in-store/beam.d.ts +10 -1
- package/dist/in-store/beam.d.ts.map +1 -1
- package/dist/in-store/beam.js +14 -25
- package/dist/in-store/beam.js.map +1 -1
- package/dist/in-store/column.d.ts +18 -1
- package/dist/in-store/column.d.ts.map +1 -1
- package/dist/in-store/column.js +37 -29
- package/dist/in-store/column.js.map +1 -1
- package/dist/in-store/copy-frame.d.ts +52 -0
- package/dist/in-store/copy-frame.d.ts.map +1 -0
- package/dist/in-store/copy-frame.js +99 -0
- package/dist/in-store/copy-frame.js.map +1 -0
- package/dist/in-store/copy-product.d.ts +96 -0
- package/dist/in-store/copy-product.d.ts.map +1 -0
- package/dist/in-store/copy-product.js +318 -0
- package/dist/in-store/copy-product.js.map +1 -0
- package/dist/in-store/curtain-wall.d.ts +87 -0
- package/dist/in-store/curtain-wall.d.ts.map +1 -0
- package/dist/in-store/curtain-wall.js +237 -0
- package/dist/in-store/curtain-wall.js.map +1 -0
- package/dist/in-store/door.d.ts +10 -4
- package/dist/in-store/door.d.ts.map +1 -1
- package/dist/in-store/door.js +23 -17
- package/dist/in-store/door.js.map +1 -1
- package/dist/in-store/element-type.d.ts +40 -0
- package/dist/in-store/element-type.d.ts.map +1 -0
- package/dist/in-store/element-type.js +60 -0
- package/dist/in-store/element-type.js.map +1 -0
- package/dist/in-store/extract-grids.d.ts +46 -0
- package/dist/in-store/extract-grids.d.ts.map +1 -0
- package/dist/in-store/extract-grids.js +211 -0
- package/dist/in-store/extract-grids.js.map +1 -0
- package/dist/in-store/extract-walls.d.ts +12 -23
- package/dist/in-store/extract-walls.d.ts.map +1 -1
- package/dist/in-store/extract-walls.js +14 -83
- package/dist/in-store/extract-walls.js.map +1 -1
- package/dist/in-store/generate-spaces.d.ts +1 -1
- package/dist/in-store/grid.d.ts +118 -0
- package/dist/in-store/grid.d.ts.map +1 -0
- package/dist/in-store/grid.js +194 -0
- package/dist/in-store/grid.js.map +1 -0
- package/dist/in-store/host-geometry-frame.d.ts +44 -0
- package/dist/in-store/host-geometry-frame.d.ts.map +1 -0
- package/dist/in-store/host-geometry-frame.js +146 -0
- package/dist/in-store/host-geometry-frame.js.map +1 -0
- package/dist/in-store/hosted-element-edit.d.ts +29 -0
- package/dist/in-store/hosted-element-edit.d.ts.map +1 -0
- package/dist/in-store/hosted-element-edit.js +120 -0
- package/dist/in-store/hosted-element-edit.js.map +1 -0
- package/dist/in-store/hosted-element.d.ts +41 -0
- package/dist/in-store/hosted-element.d.ts.map +1 -0
- package/dist/in-store/hosted-element.js +124 -0
- package/dist/in-store/hosted-element.js.map +1 -0
- package/dist/in-store/hosted-fill-read.d.ts +56 -0
- package/dist/in-store/hosted-fill-read.d.ts.map +1 -0
- package/dist/in-store/hosted-fill-read.js +197 -0
- package/dist/in-store/hosted-fill-read.js.map +1 -0
- package/dist/in-store/hosted-fill.d.ts +48 -0
- package/dist/in-store/hosted-fill.d.ts.map +1 -0
- package/dist/in-store/hosted-fill.js +58 -0
- package/dist/in-store/hosted-fill.js.map +1 -0
- package/dist/in-store/hosted-global-id.d.ts +8 -0
- package/dist/in-store/hosted-global-id.d.ts.map +1 -0
- package/dist/in-store/hosted-global-id.js +53 -0
- package/dist/in-store/hosted-global-id.js.map +1 -0
- package/dist/in-store/hosted-placement-edit.d.ts +30 -0
- package/dist/in-store/hosted-placement-edit.d.ts.map +1 -0
- package/dist/in-store/hosted-placement-edit.js +123 -0
- package/dist/in-store/hosted-placement-edit.js.map +1 -0
- package/dist/in-store/hosted-scale-chain.d.ts +12 -0
- package/dist/in-store/hosted-scale-chain.d.ts.map +1 -0
- package/dist/in-store/hosted-scale-chain.js +74 -0
- package/dist/in-store/hosted-scale-chain.js.map +1 -0
- package/dist/in-store/hosted-shape-edit.d.ts +9 -0
- package/dist/in-store/hosted-shape-edit.d.ts.map +1 -0
- package/dist/in-store/hosted-shape-edit.js +79 -0
- package/dist/in-store/hosted-shape-edit.js.map +1 -0
- package/dist/in-store/index.d.ts +59 -0
- package/dist/in-store/index.d.ts.map +1 -0
- package/dist/in-store/index.js +64 -0
- package/dist/in-store/index.js.map +1 -0
- package/dist/in-store/material.d.ts +62 -0
- package/dist/in-store/material.d.ts.map +1 -0
- package/dist/in-store/material.js +107 -0
- package/dist/in-store/material.js.map +1 -0
- package/dist/in-store/member.d.ts +8 -2
- package/dist/in-store/member.d.ts.map +1 -1
- package/dist/in-store/member.js +12 -14
- package/dist/in-store/member.js.map +1 -1
- package/dist/in-store/opening.d.ts +45 -0
- package/dist/in-store/opening.d.ts.map +1 -0
- package/dist/in-store/opening.js +104 -0
- package/dist/in-store/opening.js.map +1 -0
- package/dist/in-store/placement-frame.d.ts +9 -4
- package/dist/in-store/placement-frame.d.ts.map +1 -1
- package/dist/in-store/placement-frame.js +39 -39
- package/dist/in-store/placement-frame.js.map +1 -1
- package/dist/in-store/profile.d.ts +141 -0
- package/dist/in-store/profile.d.ts.map +1 -0
- package/dist/in-store/profile.js +174 -0
- package/dist/in-store/profile.js.map +1 -0
- package/dist/in-store/railing.d.ts +65 -0
- package/dist/in-store/railing.d.ts.map +1 -0
- package/dist/in-store/railing.js +112 -0
- package/dist/in-store/railing.js.map +1 -0
- package/dist/in-store/rel-connects-path.d.ts +43 -0
- package/dist/in-store/rel-connects-path.d.ts.map +1 -0
- package/dist/in-store/rel-connects-path.js +65 -0
- package/dist/in-store/rel-connects-path.js.map +1 -0
- package/dist/in-store/relate.d.ts +32 -0
- package/dist/in-store/relate.d.ts.map +1 -0
- package/dist/in-store/relate.js +39 -0
- package/dist/in-store/relate.js.map +1 -0
- package/dist/in-store/resolve-anchor.d.ts +21 -1
- package/dist/in-store/resolve-anchor.d.ts.map +1 -1
- package/dist/in-store/resolve-anchor.js +6 -2
- package/dist/in-store/resolve-anchor.js.map +1 -1
- package/dist/in-store/resolve-host.d.ts +16 -0
- package/dist/in-store/resolve-host.d.ts.map +1 -0
- package/dist/in-store/resolve-host.js +333 -0
- package/dist/in-store/resolve-host.js.map +1 -0
- package/dist/in-store/resolve-relations.d.ts +23 -0
- package/dist/in-store/resolve-relations.d.ts.map +1 -0
- package/dist/in-store/resolve-relations.js +57 -0
- package/dist/in-store/resolve-relations.js.map +1 -0
- package/dist/in-store/resolve-source.d.ts.map +1 -1
- package/dist/in-store/resolve-source.js +59 -63
- package/dist/in-store/resolve-source.js.map +1 -1
- package/dist/in-store/schema-attributes.d.ts +33 -0
- package/dist/in-store/schema-attributes.d.ts.map +1 -0
- package/dist/in-store/schema-attributes.js +102 -0
- package/dist/in-store/schema-attributes.js.map +1 -0
- package/dist/in-store/space-footprints.d.ts +55 -0
- package/dist/in-store/space-footprints.d.ts.map +1 -0
- package/dist/in-store/space-footprints.js +260 -0
- package/dist/in-store/space-footprints.js.map +1 -0
- package/dist/in-store/space.d.ts.map +1 -1
- package/dist/in-store/space.js +15 -3
- package/dist/in-store/space.js.map +1 -1
- package/dist/in-store/spatial-children.d.ts +1 -1
- package/dist/in-store/spatial-children.js +1 -1
- package/dist/in-store/stair-edit.d.ts +24 -0
- package/dist/in-store/stair-edit.d.ts.map +1 -0
- package/dist/in-store/stair-edit.js +190 -0
- package/dist/in-store/stair-edit.js.map +1 -0
- package/dist/in-store/stair.d.ts +58 -0
- package/dist/in-store/stair.d.ts.map +1 -0
- package/dist/in-store/stair.js +156 -0
- package/dist/in-store/stair.js.map +1 -0
- package/dist/in-store/wall-join-apply.d.ts +74 -0
- package/dist/in-store/wall-join-apply.d.ts.map +1 -0
- package/dist/in-store/wall-join-apply.js +137 -0
- package/dist/in-store/wall-join-apply.js.map +1 -0
- package/dist/in-store/wall-join-edit.d.ts +70 -0
- package/dist/in-store/wall-join-edit.d.ts.map +1 -0
- package/dist/in-store/wall-join-edit.js +217 -0
- package/dist/in-store/wall-join-edit.js.map +1 -0
- package/dist/in-store/wall-join-read.d.ts +60 -0
- package/dist/in-store/wall-join-read.d.ts.map +1 -0
- package/dist/in-store/wall-join-read.js +230 -0
- package/dist/in-store/wall-join-read.js.map +1 -0
- package/dist/in-store/wall-join.d.ts +122 -0
- package/dist/in-store/wall-join.d.ts.map +1 -0
- package/dist/in-store/wall-join.js +231 -0
- package/dist/in-store/wall-join.js.map +1 -0
- package/dist/in-store/wall-opening-fit.d.ts +11 -0
- package/dist/in-store/wall-opening-fit.d.ts.map +1 -0
- package/dist/in-store/wall-opening-fit.js +27 -0
- package/dist/in-store/wall-opening-fit.js.map +1 -0
- package/dist/in-store/wall.d.ts +32 -0
- package/dist/in-store/wall.d.ts.map +1 -1
- package/dist/in-store/wall.js +77 -13
- package/dist/in-store/wall.js.map +1 -1
- package/dist/in-store/window.d.ts +7 -0
- package/dist/in-store/window.d.ts.map +1 -1
- package/dist/in-store/window.js +24 -17
- package/dist/in-store/window.js.map +1 -1
- package/dist/index.d.ts +1 -31
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -34
- package/dist/index.js.map +1 -1
- package/dist/landxml/cant-superelevation.d.ts +28 -0
- package/dist/landxml/cant-superelevation.d.ts.map +1 -0
- package/dist/landxml/cant-superelevation.js +31 -0
- package/dist/landxml/cant-superelevation.js.map +1 -0
- package/dist/landxml/landxml-to-ifc.d.ts +8 -2
- package/dist/landxml/landxml-to-ifc.d.ts.map +1 -1
- package/dist/landxml/landxml-to-ifc.js +34 -2
- package/dist/landxml/landxml-to-ifc.js.map +1 -1
- package/dist/landxml/refusals.d.ts.map +1 -1
- package/dist/landxml/refusals.js +8 -3
- package/dist/landxml/refusals.js.map +1 -1
- package/dist/landxml/result-types.d.ts +44 -0
- package/dist/landxml/result-types.d.ts.map +1 -1
- package/dist/landxml/writers.d.ts +4 -0
- package/dist/landxml/writers.d.ts.map +1 -1
- package/dist/landxml/writers.js +4 -2
- package/dist/landxml/writers.js.map +1 -1
- package/package.json +8 -7
|
@@ -0,0 +1,120 @@
|
|
|
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 { fromNativeLength, toNativeLength } from './anchor.js';
|
|
5
|
+
import { AnchorEntityReader } from './resolve-anchor.js';
|
|
6
|
+
import { localBodyExtent, placedBodyExtent, resolveHostAnchor } from './resolve-host.js';
|
|
7
|
+
import { readHostedFill } from './hosted-fill-read.js';
|
|
8
|
+
import { validateWallOpeningBounds } from './hosted-element.js';
|
|
9
|
+
import { scaleHostedShape } from './hosted-shape-edit.js';
|
|
10
|
+
import { moveHostedOpeningPlacement } from './hosted-placement-edit.js';
|
|
11
|
+
import { placementInAncestor, refId, transformBounds } from './host-geometry-frame.js';
|
|
12
|
+
import { safeLengthUnitScale } from './length-unit-scale.js';
|
|
13
|
+
function geometry(store, reader, id, view, withSize = true) {
|
|
14
|
+
const read = readHostedFill(store, id, view);
|
|
15
|
+
const host = read ? reader.entity(read.hostId) : null;
|
|
16
|
+
const hostPlacement = host ? refId(host.attributes[5]) : null;
|
|
17
|
+
const opening = read ? reader.entity(read.openingId) : null;
|
|
18
|
+
const openingPlacement = opening ? refId(opening.attributes[5]) : null;
|
|
19
|
+
const openingFrame = hostPlacement === null || openingPlacement === null ? null : placementInAncestor(reader, openingPlacement, hostPlacement);
|
|
20
|
+
const cut = read ? placedBodyExtent(store, read.openingId, view) : null;
|
|
21
|
+
if (!read || !cut || !openingFrame || hostPlacement === null)
|
|
22
|
+
return null;
|
|
23
|
+
if (read.fillingId === null)
|
|
24
|
+
return { read, cut, openingFrame, fillingFrame: null, size: null };
|
|
25
|
+
const filling = reader.entity(read.fillingId);
|
|
26
|
+
if (!filling || !['IFCDOOR', 'IFCWINDOW'].includes(filling.type.toUpperCase()))
|
|
27
|
+
return null;
|
|
28
|
+
const fillingPlacement = refId(filling.attributes[5]);
|
|
29
|
+
const fillingFrame = fillingPlacement === null ? null : placementInAncestor(reader, fillingPlacement, hostPlacement);
|
|
30
|
+
if (!fillingFrame)
|
|
31
|
+
return null;
|
|
32
|
+
// Movement needs a valid placement and opening, even when the filling's
|
|
33
|
+
// optional Body is absent or outside the conservative size reader (#6571).
|
|
34
|
+
if (!withSize)
|
|
35
|
+
return { read, cut, openingFrame, fillingFrame, size: null };
|
|
36
|
+
const local = localBodyExtent(store, read.fillingId, view);
|
|
37
|
+
if (!local)
|
|
38
|
+
return null;
|
|
39
|
+
const body = transformBounds(local, fillingFrame);
|
|
40
|
+
const scale = store.source.byteLength > 0 ? safeLengthUnitScale(store.source, store.entityIndex, 'readHostedElementSize') ?? 1 : 1;
|
|
41
|
+
const dimension = (name, axis) => {
|
|
42
|
+
const index = filling.names.indexOf(name);
|
|
43
|
+
const value = index < 0 ? null : filling.attributes[index];
|
|
44
|
+
const native = value === null || value === undefined ? body.max[axis] - body.min[axis] : value;
|
|
45
|
+
return typeof native === 'number' && Number.isFinite(native) && native > 0 ? fromNativeLength({ lengthUnitScale: scale }, native) : null;
|
|
46
|
+
};
|
|
47
|
+
const OverallWidth = dimension('OverallWidth', 0), OverallHeight = dimension('OverallHeight', 2);
|
|
48
|
+
return OverallWidth === null || OverallHeight === null ? null : {
|
|
49
|
+
read, cut, openingFrame, fillingFrame, size: { OverallWidth, OverallHeight },
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** Read through the effective overlay, including imported mapped geometry.
|
|
53
|
+
* A missing or unsupported physical shape is unreadable, never a rectangle. */
|
|
54
|
+
export function readHostedElementSize(store, id, view) {
|
|
55
|
+
return geometry(store, new AnchorEntityReader(store, view), id, view)?.size ?? null;
|
|
56
|
+
}
|
|
57
|
+
/** Atomic params-to-commit operation. Affine resizing is centred across the
|
|
58
|
+
* existing cut and held at its bottom; host thickness stays unchanged. Only
|
|
59
|
+
* the occurrence's Representation/placement/dimensions change, never its type
|
|
60
|
+
* maps, GlobalId, metadata or relationships. Refusals leave no overlay writes. */
|
|
61
|
+
export function editHostedElementInStore(store, editor, id, patch) {
|
|
62
|
+
if (!['IFC2X3', 'IFC4', 'IFC4X3'].includes(store.schemaVersion ?? 'IFC4'))
|
|
63
|
+
throw new Error('Hosted edits support IFC2X3, IFC4 and IFC4X3 only');
|
|
64
|
+
for (const [name, value] of Object.entries(patch)) {
|
|
65
|
+
if (value !== undefined && (!Number.isFinite(value) || ((name === 'OverallWidth' || name === 'OverallHeight') && value <= 0))) {
|
|
66
|
+
throw new Error(`${name} must be ${name.startsWith('Overall') ? 'positive and ' : ''}finite`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return editor.runAtomic(draft => {
|
|
70
|
+
const view = draft.getMutationView(), reader = new AnchorEntityReader(store, view);
|
|
71
|
+
const sizing = patch.OverallWidth !== undefined || patch.OverallHeight !== undefined;
|
|
72
|
+
const current = geometry(store, reader, id, view, sizing);
|
|
73
|
+
if (!current)
|
|
74
|
+
throw new Error(`The hosted geometry of #${id} cannot be read, so the edit is refused`);
|
|
75
|
+
const { read, cut, size } = current;
|
|
76
|
+
const host = resolveHostAnchor(store, read.hostId, view);
|
|
77
|
+
if (host.hostKind !== 'wall')
|
|
78
|
+
throw new Error('Hosted size/position edits require a wall host');
|
|
79
|
+
if (sizing && !size)
|
|
80
|
+
throw new Error('Overall dimensions apply to a hosted IfcDoor or IfcWindow');
|
|
81
|
+
const widthScale = patch.OverallWidth === undefined || !size ? 1 : patch.OverallWidth / size.OverallWidth;
|
|
82
|
+
const heightScale = patch.OverallHeight === undefined || !size ? 1 : patch.OverallHeight / size.OverallHeight;
|
|
83
|
+
const dx = patch.Offset === undefined ? 0 : toNativeLength(host, patch.Offset) - read.location[0];
|
|
84
|
+
const dz = patch.Sill === undefined ? 0 : toNativeLength(host, patch.Sill) - read.location[2];
|
|
85
|
+
const anchor = [(cut.min[0] + cut.max[0]) / 2, (cut.min[1] + cut.max[1]) / 2, cut.min[2]];
|
|
86
|
+
const proposed = {
|
|
87
|
+
min: [anchor[0] + (cut.min[0] - anchor[0]) * widthScale + dx, cut.min[1], cut.min[2] + dz],
|
|
88
|
+
max: [anchor[0] + (cut.max[0] - anchor[0]) * widthScale + dx, cut.max[1], cut.min[2] + (cut.max[2] - cut.min[2]) * heightScale + dz],
|
|
89
|
+
};
|
|
90
|
+
validateWallOpeningBounds(store, view, host, proposed, read.openingId);
|
|
91
|
+
if (widthScale !== 1 || heightScale !== 1) {
|
|
92
|
+
scaleHostedShape(reader, draft, read.openingId, current.openingFrame, anchor, widthScale, heightScale);
|
|
93
|
+
if (read.fillingId !== null && current.fillingFrame) {
|
|
94
|
+
scaleHostedShape(reader, draft, read.fillingId, current.fillingFrame, anchor, widthScale, heightScale);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (read.fillingId !== null && size) {
|
|
98
|
+
const filling = reader.entity(read.fillingId);
|
|
99
|
+
for (const name of ['OverallWidth', 'OverallHeight']) {
|
|
100
|
+
const value = patch[name], index = filling.names.indexOf(name);
|
|
101
|
+
if (value !== undefined) {
|
|
102
|
+
if (index < 0)
|
|
103
|
+
throw new Error(`${filling.type} has no ${name} attribute in this schema`);
|
|
104
|
+
draft.setPositionalAttribute(read.fillingId, index, toNativeLength(host, value));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (dx !== 0 || dz !== 0)
|
|
109
|
+
moveHostedOpeningPlacement(reader, draft, read, [read.location[0] + dx, read.location[1], read.location[2] + dz]);
|
|
110
|
+
const updated = readHostedFill(store, id, view);
|
|
111
|
+
const actual = placedBodyExtent(store, read.openingId, view);
|
|
112
|
+
const eps = toNativeLength(host, 1e-6);
|
|
113
|
+
if (!updated || !actual || actual.min.some((value, axis) => Math.abs(value - proposed.min[axis]) > eps)
|
|
114
|
+
|| actual.max.some((value, axis) => Math.abs(value - proposed.max[axis]) > eps)) {
|
|
115
|
+
throw new Error('The hosted edit cannot reproduce its validated bounds; all writes were rolled back');
|
|
116
|
+
}
|
|
117
|
+
return updated;
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=hosted-element-edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-element-edit.js","sourceRoot":"","sources":["../../src/in-store/hosted-element-edit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** Params-to-commit core for hosted placement (#6232 D5). Hosts supply their
|
|
2
|
+
* editor and history/remesh policy; the IFC graph and refusal rules live here. */
|
|
3
|
+
import type { StoreEditor, MutablePropertyView } from '@ifc-lite/mutations';
|
|
4
|
+
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
5
|
+
import { type HostAnchor, type HostBounds } from './anchor.js';
|
|
6
|
+
import { type OpeningInStoreParams } from './opening.js';
|
|
7
|
+
import { type HostedDoorInStoreParams, type HostedWindowInStoreParams } from './hosted-fill.js';
|
|
8
|
+
import { type HostedFillRead } from './hosted-fill-read.js';
|
|
9
|
+
export type HostedElementInStoreSpec = {
|
|
10
|
+
readonly kind: 'opening';
|
|
11
|
+
readonly params: OpeningInStoreParams;
|
|
12
|
+
} | {
|
|
13
|
+
readonly kind: 'door';
|
|
14
|
+
readonly params: HostedDoorInStoreParams;
|
|
15
|
+
} | {
|
|
16
|
+
readonly kind: 'window';
|
|
17
|
+
readonly params: HostedWindowInStoreParams;
|
|
18
|
+
};
|
|
19
|
+
export interface HostedElementInStoreResult {
|
|
20
|
+
readonly expressId: number;
|
|
21
|
+
readonly openingId: number;
|
|
22
|
+
readonly hostId: number;
|
|
23
|
+
}
|
|
24
|
+
export interface HostedOpeningExtent extends HostedFillRead {
|
|
25
|
+
/** Cut bounds in the host's placement frame, in the file's native units. */
|
|
26
|
+
readonly bounds: HostBounds;
|
|
27
|
+
}
|
|
28
|
+
/** Effective void relationships, including this session's creations, edits
|
|
29
|
+
* and deletions. Unreadable placement/geometry is reported rather than guessed. */
|
|
30
|
+
export declare function readHostOpeningExtents(store: IfcDataStore, hostId: number, view?: MutablePropertyView | null): {
|
|
31
|
+
cuts: HostedOpeningExtent[];
|
|
32
|
+
unreadable: number[];
|
|
33
|
+
};
|
|
34
|
+
/** Package-private fit/overlap decision shared by placement and edits. The
|
|
35
|
+
* selected cut alone is excluded; every other unreadable cut still refuses. */
|
|
36
|
+
export declare function validateWallOpeningBounds(store: IfcDataStore, view: MutablePropertyView, host: HostAnchor, proposed: HostBounds, excludeOpeningId?: number): void;
|
|
37
|
+
/** Write an opening or wall-hosted filling in one atomic overlay operation.
|
|
38
|
+
* The viewer, SDK and MCP share this core; callers group its mutation records
|
|
39
|
+
* into their own undo batch. Every refusal leaves the overlay unchanged. */
|
|
40
|
+
export declare function addHostedElementInStore(store: IfcDataStore, editor: StoreEditor, hostId: number, spec: HostedElementInStoreSpec): HostedElementInStoreResult;
|
|
41
|
+
//# sourceMappingURL=hosted-element.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-element.d.ts","sourceRoot":"","sources":["../../src/in-store/hosted-element.ts"],"names":[],"mappings":"AAIA;kFACkF;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAkB,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE/E,OAAO,EAAqB,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAEL,KAAK,uBAAuB,EAAE,KAAK,yBAAyB,EAC7D,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAK5E,MAAM,MAAM,wBAAwB,GAChC;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAA;CAAE,GACnE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAA;CAAE,GACnE;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,yBAAyB,CAAA;CAAE,CAAC;AAE5E,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;CAC7B;AAED;mFACmF;AACnF,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,mBAAmB,GAAG,IAAI,GAChC;IAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAoBvD;AAuBD;+EAC+E;AAC/E,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,mBAAmB,EACzB,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,UAAU,EACpB,gBAAgB,CAAC,EAAE,MAAM,GACxB,IAAI,CAsBN;AAED;;4EAE4E;AAC5E,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,wBAAwB,GAC7B,0BAA0B,CAqB5B"}
|
|
@@ -0,0 +1,124 @@
|
|
|
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 { toNativeLength } from './anchor.js';
|
|
5
|
+
import { assertPositiveFinite } from './_emit-helpers.js';
|
|
6
|
+
import { addOpeningToStore } from './opening.js';
|
|
7
|
+
import { addHostedDoorToStore, addHostedWindowToStore, } from './hosted-fill.js';
|
|
8
|
+
import { readHostedFill } from './hosted-fill-read.js';
|
|
9
|
+
import { AnchorEntityReader } from './resolve-anchor.js';
|
|
10
|
+
import { placedBodyExtent, resolveHostAnchor } from './resolve-host.js';
|
|
11
|
+
import { assertHostedGlobalIdAvailable } from './hosted-global-id.js';
|
|
12
|
+
/** Effective void relationships, including this session's creations, edits
|
|
13
|
+
* and deletions. Unreadable placement/geometry is reported rather than guessed. */
|
|
14
|
+
export function readHostOpeningExtents(store, hostId, view) {
|
|
15
|
+
const reader = new AnchorEntityReader(store, view);
|
|
16
|
+
const cuts = [];
|
|
17
|
+
const unreadable = [];
|
|
18
|
+
for (const id of reader.ids('IFCRELVOIDSELEMENT')) {
|
|
19
|
+
const rel = reader.entity(id);
|
|
20
|
+
if (!rel) {
|
|
21
|
+
unreadable.push(id);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const relatingHost = refId(rel.attributes[4]);
|
|
25
|
+
// An unreadable host reference cannot establish that this cut belongs to
|
|
26
|
+
// a different wall, so fail conservatively instead of skipping it.
|
|
27
|
+
if (relatingHost === null) {
|
|
28
|
+
unreadable.push(id);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (relatingHost !== hostId)
|
|
32
|
+
continue;
|
|
33
|
+
const openingId = refId(rel.attributes[5]);
|
|
34
|
+
if (openingId === null) {
|
|
35
|
+
unreadable.push(id);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const fill = readHostedFill(store, openingId, view);
|
|
39
|
+
const bounds = fill ? placedBodyExtent(store, openingId, view) : null;
|
|
40
|
+
if (!fill || fill.hostId !== hostId || !bounds)
|
|
41
|
+
unreadable.push(openingId);
|
|
42
|
+
else
|
|
43
|
+
cuts.push({ ...fill, bounds });
|
|
44
|
+
}
|
|
45
|
+
return { cuts, unreadable };
|
|
46
|
+
}
|
|
47
|
+
function refId(value) {
|
|
48
|
+
if (typeof value === 'number' && Number.isInteger(value) && value > 0)
|
|
49
|
+
return value;
|
|
50
|
+
return typeof value === 'string' && /^#[1-9][0-9]*$/.test(value) ? Number(value.slice(1)) : null;
|
|
51
|
+
}
|
|
52
|
+
function validateWallCut(store, view, host, spec) {
|
|
53
|
+
if (host.hostKind !== 'wall')
|
|
54
|
+
return; // Slab openings retain their existing builder contract.
|
|
55
|
+
const params = spec.params;
|
|
56
|
+
if (!('Offset' in params))
|
|
57
|
+
throw new Error('Hosted wall placement requires Offset, Width and Height');
|
|
58
|
+
assertPositiveFinite([params.Width, params.Height], 'Hosted wall placement: Width and Height must be positive');
|
|
59
|
+
const sill = params.Sill ?? 0;
|
|
60
|
+
if (!Number.isFinite(params.Offset) || !Number.isFinite(sill))
|
|
61
|
+
throw new Error('Hosted wall placement: Offset and Sill must be finite');
|
|
62
|
+
const bounds = host.hostBounds;
|
|
63
|
+
if (!bounds)
|
|
64
|
+
throw new Error(`The body of host #${host.hostId} cannot be read, so hosted placement is refused`);
|
|
65
|
+
const x = toNativeLength(host, params.Offset), w = toNativeLength(host, params.Width);
|
|
66
|
+
const z = toNativeLength(host, sill), h = toNativeLength(host, params.Height);
|
|
67
|
+
validateWallOpeningBounds(store, view, host, {
|
|
68
|
+
min: [x - w / 2, bounds.min[1], z], max: [x + w / 2, bounds.max[1], z + h],
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/** Package-private fit/overlap decision shared by placement and edits. The
|
|
72
|
+
* selected cut alone is excluded; every other unreadable cut still refuses. */
|
|
73
|
+
export function validateWallOpeningBounds(store, view, host, proposed, excludeOpeningId) {
|
|
74
|
+
if (host.hostKind !== 'wall')
|
|
75
|
+
return;
|
|
76
|
+
if ([...proposed.min, ...proposed.max].some(value => !Number.isFinite(value))
|
|
77
|
+
|| proposed.min.some((value, axis) => value >= proposed.max[axis])) {
|
|
78
|
+
throw new Error('Hosted opening bounds must be finite with positive dimensions');
|
|
79
|
+
}
|
|
80
|
+
const bounds = host.hostBounds;
|
|
81
|
+
if (!bounds)
|
|
82
|
+
throw new Error(`The body of host #${host.hostId} cannot be read, so hosted placement is refused`);
|
|
83
|
+
const eps = toNativeLength(host, 1e-6);
|
|
84
|
+
if (proposed.min[0] < bounds.min[0] - eps || proposed.max[0] > bounds.max[0] + eps
|
|
85
|
+
|| proposed.min[2] < bounds.min[2] - eps || proposed.max[2] > bounds.max[2] + eps) {
|
|
86
|
+
throw new Error("It doesn't fit in this wall: change its offset or sill");
|
|
87
|
+
}
|
|
88
|
+
const existing = readHostOpeningExtents(store, host.hostId, view);
|
|
89
|
+
if (existing.unreadable.length) {
|
|
90
|
+
throw new Error(`Opening geometry ${existing.unreadable.map(id => `#${id}`).join(', ')} cannot be read, so hosted placement is refused`);
|
|
91
|
+
}
|
|
92
|
+
const overlap = existing.cuts.find(({ openingId, bounds: cut }) => openingId !== excludeOpeningId
|
|
93
|
+
&& Math.min(proposed.max[0], cut.max[0]) - Math.max(proposed.min[0], cut.min[0]) > eps
|
|
94
|
+
&& Math.min(proposed.max[2], cut.max[2]) - Math.max(proposed.min[2], cut.min[2]) > eps
|
|
95
|
+
&& Math.min(bounds.max[1], proposed.max[1], cut.max[1]) - Math.max(bounds.min[1], proposed.min[1], cut.min[1]) > eps);
|
|
96
|
+
if (overlap)
|
|
97
|
+
throw new Error(`The new opening overlaps opening #${overlap.openingId} in wall #${host.hostId}`);
|
|
98
|
+
}
|
|
99
|
+
/** Write an opening or wall-hosted filling in one atomic overlay operation.
|
|
100
|
+
* The viewer, SDK and MCP share this core; callers group its mutation records
|
|
101
|
+
* into their own undo batch. Every refusal leaves the overlay unchanged. */
|
|
102
|
+
export function addHostedElementInStore(store, editor, hostId, spec) {
|
|
103
|
+
const schema = store.schemaVersion ?? 'IFC4';
|
|
104
|
+
if (!['IFC2X3', 'IFC4', 'IFC4X3'].includes(schema)) {
|
|
105
|
+
throw new Error(`Hosted placement supports IFC2X3, IFC4 and IFC4X3 only; ${schema} is refused`);
|
|
106
|
+
}
|
|
107
|
+
return editor.runAtomic(draft => {
|
|
108
|
+
const view = draft.getMutationView();
|
|
109
|
+
if (spec.params.GlobalId !== undefined) {
|
|
110
|
+
assertHostedGlobalIdAvailable(store, view, spec.params.GlobalId);
|
|
111
|
+
}
|
|
112
|
+
const host = resolveHostAnchor(store, hostId, view);
|
|
113
|
+
validateWallCut(store, view, host, spec);
|
|
114
|
+
if (spec.kind === 'opening') {
|
|
115
|
+
const opening = addOpeningToStore(draft, host, spec.params);
|
|
116
|
+
return { expressId: opening.openingId, openingId: opening.openingId, hostId };
|
|
117
|
+
}
|
|
118
|
+
const fill = spec.kind === 'door'
|
|
119
|
+
? addHostedDoorToStore(draft, host, spec.params)
|
|
120
|
+
: addHostedWindowToStore(draft, host, spec.params);
|
|
121
|
+
return { expressId: fill.fillingId, openingId: fill.opening.openingId, hostId };
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=hosted-element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-element.js","sourceRoot":"","sources":["../../src/in-store/hosted-element.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Live reads for wall-hosted openings, doors and windows (#6232): the host
|
|
3
|
+
* wall's frame on its storey, and where an opening sits in its host.
|
|
4
|
+
*
|
|
5
|
+
* `addOpeningToStore` places the opening relative to the host's
|
|
6
|
+
* IfcLocalPlacement with its Location at `[Offset, …, Sill]` in the host's
|
|
7
|
+
* frame, and `addHostedDoorToStore` / `addHostedWindowToStore` place the
|
|
8
|
+
* filling relative to the opening. So a placing gesture needs the host's
|
|
9
|
+
* frame to turn a cursor into `Offset`, and an edit of Offset or Sill is one
|
|
10
|
+
* write to the opening's Location point: the filling follows it.
|
|
11
|
+
*
|
|
12
|
+
* Every read goes through the mutation overlay, so a wall or opening authored
|
|
13
|
+
* this session reads like one from the file, and a deleted one is gone.
|
|
14
|
+
*/
|
|
15
|
+
import { type IfcDataStore } from '@ifc-lite/parser';
|
|
16
|
+
import type { MutablePropertyView } from '@ifc-lite/mutations';
|
|
17
|
+
export interface HostPlanFrame {
|
|
18
|
+
/** The host's placement origin, storey-local metres; z is its height above the storey's placement. */
|
|
19
|
+
origin: [number, number, number];
|
|
20
|
+
/** The host's local +X on the storey plane, unit length. */
|
|
21
|
+
axisX: [number, number];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The host's placement frame on storey `storeyExpressId`, composed through
|
|
25
|
+
* every `PlacementRelTo` hop the same way the storey's wall axes are
|
|
26
|
+
* (`extractWallSegmentsForStorey`), so a point read against one lines up
|
|
27
|
+
* with the other. Null when the host has no readable placement.
|
|
28
|
+
*/
|
|
29
|
+
export declare function hostPlanFrame(store: IfcDataStore, hostExpressId: number, storeyExpressId: number, view?: MutablePropertyView | null): HostPlanFrame | null;
|
|
30
|
+
export interface HostedFillRead {
|
|
31
|
+
/** The voided wall or slab (IfcRelVoidsElement.RelatingBuildingElement). */
|
|
32
|
+
hostId: number;
|
|
33
|
+
openingId: number;
|
|
34
|
+
/** The IfcDoor / IfcWindow in the opening (IfcRelFillsElement); null for a bare opening. */
|
|
35
|
+
fillingId: number | null;
|
|
36
|
+
/** The opening placement's Location point: Offset is its x, Sill its z (native units). */
|
|
37
|
+
locationPointId: number;
|
|
38
|
+
/** Its current coordinates, native units. */
|
|
39
|
+
location: [number, number, number];
|
|
40
|
+
/** Along the host's local X to the opening's placement origin, metres (the centre, for an authored one). */
|
|
41
|
+
offset: number;
|
|
42
|
+
/** The opening's bottom above the host's placement origin, metres. */
|
|
43
|
+
sill: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Where an opening, or the door or window filling one, sits in its host.
|
|
47
|
+
* Null when `expressId` is neither, when it has no live host, or when the
|
|
48
|
+
* opening is not placed relative to its host (an absolutely placed opening
|
|
49
|
+
* has no offset along the wall to edit).
|
|
50
|
+
*/
|
|
51
|
+
export declare function readHostedFill(store: IfcDataStore, expressId: number, view?: MutablePropertyView | null): HostedFillRead | null;
|
|
52
|
+
/** Package-private batch reader: one relation walk for any number of cuts.
|
|
53
|
+
* Reuses the single-read placement contract; source relations are indexed
|
|
54
|
+
* before the atomic writer starts moving any occurrence (#6232). */
|
|
55
|
+
export declare function readHostedOpeningBatch(store: IfcDataStore, openingIds: ReadonlySet<number>, view?: MutablePropertyView | null): ReadonlyMap<number, HostedFillRead | null>;
|
|
56
|
+
//# sourceMappingURL=hosted-fill-read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-fill-read.d.ts","sourceRoot":"","sources":["../../src/in-store/hosted-fill-read.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAa/D,MAAM,WAAW,aAAa;IAC5B,sGAAsG;IACtG,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,4DAA4D;IAC5D,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzB;AAQD;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,YAAY,EACnB,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,MAAM,EACvB,IAAI,CAAC,EAAE,mBAAmB,GAAG,IAAI,GAChC,aAAa,GAAG,IAAI,CAatB;AA6CD,MAAM,WAAW,cAAc;IAC7B,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,4FAA4F;IAC5F,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,0FAA0F;IAC1F,eAAe,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,4GAA4G;IAC5G,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;CACd;AAUD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,mBAAmB,GAAG,IAAI,GAChC,cAAc,GAAG,IAAI,CAyBvB;AAED;;oEAEoE;AACpE,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,IAAI,GACtF,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC,CAoB5C"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
/**
|
|
5
|
+
* Live reads for wall-hosted openings, doors and windows (#6232): the host
|
|
6
|
+
* wall's frame on its storey, and where an opening sits in its host.
|
|
7
|
+
*
|
|
8
|
+
* `addOpeningToStore` places the opening relative to the host's
|
|
9
|
+
* IfcLocalPlacement with its Location at `[Offset, …, Sill]` in the host's
|
|
10
|
+
* frame, and `addHostedDoorToStore` / `addHostedWindowToStore` place the
|
|
11
|
+
* filling relative to the opening. So a placing gesture needs the host's
|
|
12
|
+
* frame to turn a cursor into `Offset`, and an edit of Offset or Sill is one
|
|
13
|
+
* write to the opening's Location point: the filling follows it.
|
|
14
|
+
*
|
|
15
|
+
* Every read goes through the mutation overlay, so a wall or opening authored
|
|
16
|
+
* this session reads like one from the file, and a deleted one is gone.
|
|
17
|
+
*/
|
|
18
|
+
import { EntityExtractor } from '@ifc-lite/parser';
|
|
19
|
+
import { fromNativeLength } from './anchor.js';
|
|
20
|
+
import { safeLengthUnitScale } from './length-unit-scale.js';
|
|
21
|
+
import { frameInStoreyFrame, numericAttr, readEntity, readVec3, storeyPlacementChain, } from './placement-frame.js';
|
|
22
|
+
import { AnchorEntityReader } from './resolve-anchor.js';
|
|
23
|
+
function lengthScale(store, context) {
|
|
24
|
+
return store.source && store.source.byteLength > 0
|
|
25
|
+
? safeLengthUnitScale(store.source, store.entityIndex, context) ?? 1
|
|
26
|
+
: 1;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The host's placement frame on storey `storeyExpressId`, composed through
|
|
30
|
+
* every `PlacementRelTo` hop the same way the storey's wall axes are
|
|
31
|
+
* (`extractWallSegmentsForStorey`), so a point read against one lines up
|
|
32
|
+
* with the other. Null when the host has no readable placement.
|
|
33
|
+
*/
|
|
34
|
+
export function hostPlanFrame(store, hostExpressId, storeyExpressId, view) {
|
|
35
|
+
if (!store.source || store.source.byteLength === 0)
|
|
36
|
+
return null;
|
|
37
|
+
const extractor = new EntityExtractor(store.source);
|
|
38
|
+
const overlay = view ?? undefined;
|
|
39
|
+
const host = readEntity(store, extractor, overlay, hostExpressId);
|
|
40
|
+
const placementId = host ? numericAttr(host.attributes[5]) : null;
|
|
41
|
+
if (placementId === null)
|
|
42
|
+
return null;
|
|
43
|
+
const chain = storeyPlacementChain(store, extractor, overlay, storeyExpressId);
|
|
44
|
+
const frame = frameInStoreyFrame(store, extractor, overlay, placementId, chain);
|
|
45
|
+
if (!frame)
|
|
46
|
+
return null;
|
|
47
|
+
const z = heightAboveStorey(store, extractor, overlay, placementId, chain);
|
|
48
|
+
const k = lengthScale(store, 'hostPlanFrame');
|
|
49
|
+
return { origin: [frame.origin[0] * k, frame.origin[1] * k, z * k], axisX: [frame.axisX[0], frame.axisX[1]] };
|
|
50
|
+
}
|
|
51
|
+
/** One placement's own Location z (in its parent's frame), 0 when unreadable. */
|
|
52
|
+
function ownZ(store, extractor, overlay, placementId) {
|
|
53
|
+
const placement = readEntity(store, extractor, overlay, placementId);
|
|
54
|
+
const axisId = placement ? numericAttr(placement.attributes[1]) : null;
|
|
55
|
+
const axis = axisId === null ? null : readEntity(store, extractor, overlay, axisId);
|
|
56
|
+
const pointId = axis ? numericAttr(axis.attributes[0]) : null;
|
|
57
|
+
const point = pointId === null ? null : readEntity(store, extractor, overlay, pointId);
|
|
58
|
+
return (point && readVec3(point.attributes[0])?.[2]) ?? 0;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Native-unit height of `placementId` above the storey's placement: the z of
|
|
62
|
+
* every hop up to where the walk meets the storey's own chain, minus the
|
|
63
|
+
* storey's hops above that point. Upright placements only (a wall's), like
|
|
64
|
+
* the planar frames it goes with.
|
|
65
|
+
*/
|
|
66
|
+
function heightAboveStorey(store, extractor, overlay, placementId, chain) {
|
|
67
|
+
let z = 0;
|
|
68
|
+
const seen = new Set();
|
|
69
|
+
let id = placementId;
|
|
70
|
+
while (id !== null && !seen.has(id) && !chain?.has(id)) {
|
|
71
|
+
seen.add(id);
|
|
72
|
+
z += ownZ(store, extractor, overlay, id);
|
|
73
|
+
const placement = readEntity(store, extractor, overlay, id);
|
|
74
|
+
id = placement ? numericAttr(placement.attributes[0]) : null;
|
|
75
|
+
}
|
|
76
|
+
if (!chain)
|
|
77
|
+
return z;
|
|
78
|
+
// Joined the storey's chain `hops` above its own placement (or ran out at the root).
|
|
79
|
+
const hops = id !== null && chain.has(id) ? chain.get(id) : id === null ? chain.size : 0;
|
|
80
|
+
let walked = 0;
|
|
81
|
+
for (const storeyHop of chain.keys()) {
|
|
82
|
+
if (walked++ >= hops)
|
|
83
|
+
break;
|
|
84
|
+
z -= ownZ(store, extractor, overlay, storeyHop);
|
|
85
|
+
}
|
|
86
|
+
return z;
|
|
87
|
+
}
|
|
88
|
+
function refId(value) {
|
|
89
|
+
if (typeof value === 'number' && Number.isInteger(value) && value > 0)
|
|
90
|
+
return value;
|
|
91
|
+
if (typeof value === 'string' && /^#[1-9][0-9]*$/.test(value))
|
|
92
|
+
return Number(value.slice(1));
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
const OPENING_TYPES = new Set(['IFCOPENINGELEMENT', 'IFCOPENINGSTANDARDCASE']);
|
|
96
|
+
/**
|
|
97
|
+
* Where an opening, or the door or window filling one, sits in its host.
|
|
98
|
+
* Null when `expressId` is neither, when it has no live host, or when the
|
|
99
|
+
* opening is not placed relative to its host (an absolutely placed opening
|
|
100
|
+
* has no offset along the wall to edit).
|
|
101
|
+
*/
|
|
102
|
+
export function readHostedFill(store, expressId, view) {
|
|
103
|
+
const reader = new AnchorEntityReader(store, view);
|
|
104
|
+
const self = reader.entity(expressId);
|
|
105
|
+
if (!self)
|
|
106
|
+
return null;
|
|
107
|
+
// IfcRelFillsElement: RelatingOpeningElement(4), RelatedBuildingElement(5).
|
|
108
|
+
let openingId = OPENING_TYPES.has(self.type.toUpperCase()) ? expressId : null;
|
|
109
|
+
let fillingId = null;
|
|
110
|
+
for (const relId of reader.ids('IFCRELFILLSELEMENT')) {
|
|
111
|
+
const rel = reader.entity(relId);
|
|
112
|
+
if (!rel)
|
|
113
|
+
continue;
|
|
114
|
+
const opening = refId(rel.attributes[4]);
|
|
115
|
+
const filling = refId(rel.attributes[5]);
|
|
116
|
+
if (openingId === null && filling === expressId) {
|
|
117
|
+
openingId = opening;
|
|
118
|
+
fillingId = expressId;
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
if (openingId !== null && opening === openingId && filling !== null && reader.entity(filling)) {
|
|
122
|
+
fillingId = filling;
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (openingId === null)
|
|
127
|
+
return null;
|
|
128
|
+
// IfcRelVoidsElement: RelatingBuildingElement(4), RelatedOpeningElement(5).
|
|
129
|
+
let hostId = null;
|
|
130
|
+
for (const relId of reader.ids('IFCRELVOIDSELEMENT')) {
|
|
131
|
+
const rel = reader.entity(relId);
|
|
132
|
+
if (rel && refId(rel.attributes[5]) === openingId) {
|
|
133
|
+
hostId = refId(rel.attributes[4]);
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return readOpeningInHost(reader, lengthScale(store, 'readHostedFill'), openingId, hostId, fillingId);
|
|
138
|
+
}
|
|
139
|
+
/** Package-private batch reader: one relation walk for any number of cuts.
|
|
140
|
+
* Reuses the single-read placement contract; source relations are indexed
|
|
141
|
+
* before the atomic writer starts moving any occurrence (#6232). */
|
|
142
|
+
export function readHostedOpeningBatch(store, openingIds, view) {
|
|
143
|
+
const result = new Map();
|
|
144
|
+
if (openingIds.size === 0)
|
|
145
|
+
return result;
|
|
146
|
+
const reader = new AnchorEntityReader(store, view), hosts = new Map(), fills = new Map();
|
|
147
|
+
for (const id of reader.ids('IFCRELVOIDSELEMENT')) {
|
|
148
|
+
const rel = reader.entity(id), openingId = rel ? refId(rel.attributes[5]) : null;
|
|
149
|
+
if (openingId !== null && openingIds.has(openingId) && !hosts.has(openingId))
|
|
150
|
+
hosts.set(openingId, refId(rel.attributes[4]));
|
|
151
|
+
}
|
|
152
|
+
for (const id of reader.ids('IFCRELFILLSELEMENT')) {
|
|
153
|
+
const rel = reader.entity(id), openingId = rel ? refId(rel.attributes[4]) : null;
|
|
154
|
+
const fillingId = rel ? refId(rel.attributes[5]) : null;
|
|
155
|
+
if (openingId !== null && openingIds.has(openingId) && !fills.has(openingId) && fillingId !== null && reader.entity(fillingId))
|
|
156
|
+
fills.set(openingId, fillingId);
|
|
157
|
+
}
|
|
158
|
+
const scale = lengthScale(store, 'readHostedFill');
|
|
159
|
+
for (const openingId of openingIds) {
|
|
160
|
+
const type = reader.entity(openingId)?.type.toUpperCase();
|
|
161
|
+
result.set(openingId, type && OPENING_TYPES.has(type)
|
|
162
|
+
? readOpeningInHost(reader, scale, openingId, hosts.get(openingId) ?? null, fills.get(openingId) ?? null) : null);
|
|
163
|
+
}
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
function readOpeningInHost(reader, scale, openingId, hostId, fillingId) {
|
|
167
|
+
const host = hostId === null ? null : reader.entity(hostId);
|
|
168
|
+
const opening = reader.entity(openingId);
|
|
169
|
+
if (hostId === null || !host || !opening)
|
|
170
|
+
return null;
|
|
171
|
+
const hostPlacement = refId(host.attributes[5]);
|
|
172
|
+
const placementId = refId(opening.attributes[5]);
|
|
173
|
+
const placement = placementId === null ? null : reader.entity(placementId);
|
|
174
|
+
if (!placement || hostPlacement === null || refId(placement.attributes[0]) !== hostPlacement)
|
|
175
|
+
return null;
|
|
176
|
+
const axisId = refId(placement.attributes[1]);
|
|
177
|
+
const axis = axisId === null ? null : reader.entity(axisId);
|
|
178
|
+
const locationPointId = axis ? refId(axis.attributes[0]) : null;
|
|
179
|
+
const point = locationPointId === null ? null : reader.entity(locationPointId);
|
|
180
|
+
const coords = point?.attributes[0];
|
|
181
|
+
if (locationPointId === null || !Array.isArray(coords))
|
|
182
|
+
return null;
|
|
183
|
+
const location = [0, 1, 2].map((i) => (typeof coords[i] === 'number' ? coords[i] : 0));
|
|
184
|
+
if (!location.every(Number.isFinite))
|
|
185
|
+
return null;
|
|
186
|
+
const unit = { lengthUnitScale: scale };
|
|
187
|
+
return {
|
|
188
|
+
hostId,
|
|
189
|
+
openingId,
|
|
190
|
+
fillingId,
|
|
191
|
+
locationPointId,
|
|
192
|
+
location,
|
|
193
|
+
offset: fromNativeLength(unit, location[0]),
|
|
194
|
+
sill: fromNativeLength(unit, location[2]),
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=hosted-fill-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-fill-read.js","sourceRoot":"","sources":["../../src/in-store/hosted-fill-read.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,eAAe,EAAqB,MAAM,kBAAkB,CAAC;AAEtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,QAAQ,EACR,oBAAoB,GAErB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AASzD,SAAS,WAAW,CAAC,KAAmB,EAAE,OAAe;IACvD,OAAO,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC;QAChD,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC;QACpE,CAAC,CAAC,CAAC,CAAC;AACR,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAmB,EACnB,aAAqB,EACrB,eAAuB,EACvB,IAAiC;IAEjC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAChE,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,OAAO,GAAkC,IAAI,IAAI,SAAS,CAAC;IACjE,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,IAAI,WAAW,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IAChF,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IAC3E,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IAC9C,OAAO,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAChH,CAAC;AAED,iFAAiF;AACjF,SAAS,IAAI,CAAC,KAAmB,EAAE,SAA0B,EAAE,OAAsC,EAAE,WAAmB;IACxH,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,MAAM,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACpF,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,MAAM,KAAK,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACvF,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CACxB,KAAmB,EACnB,SAA0B,EAC1B,OAAsC,EACtC,WAAmB,EACnB,KAAyC;IAEzC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,EAAE,GAAkB,WAAW,CAAC;IACpC,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5D,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/D,CAAC;IACD,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IACrB,qFAAqF;IACrF,MAAM,IAAI,GAAG,EAAE,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QACrC,IAAI,MAAM,EAAE,IAAI,IAAI;YAAE,MAAM;QAC5B,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAkBD,SAAS,KAAK,CAAC,KAAc;IAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACpF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,mBAAmB,EAAE,wBAAwB,CAAC,CAAC,CAAC;AAE/E;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAmB,EACnB,SAAiB,EACjB,IAAiC;IAEjC,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,4EAA4E;IAC5E,IAAI,SAAS,GAAkB,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7F,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,SAAS,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAAC,SAAS,GAAG,OAAO,CAAC;YAAC,SAAS,GAAG,SAAS,CAAC;YAAC,MAAM;QAAC,CAAC;QACvG,IAAI,SAAS,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAAC,SAAS,GAAG,OAAO,CAAC;YAAC,MAAM;QAAC,CAAC;IAChI,CAAC;IACD,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEpC,4EAA4E;IAC5E,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAAC,MAAM;QAAC,CAAC;IAClG,CAAC;IACD,OAAO,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,gBAAgB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AACvG,CAAC;AAED;;oEAEoE;AACpE,MAAM,UAAU,sBAAsB,CACpC,KAAmB,EAAE,UAA+B,EAAE,IAAiC;IAEvF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiC,CAAC;IACxD,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,EAAyB,EAAE,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChI,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjF,IAAI,SAAS,KAAK,IAAI,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,GAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChI,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjF,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACxD,IAAI,SAAS,KAAK,IAAI,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAClK,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACnD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YACnD,CAAC,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,MAA0B,EAAE,KAAa,EAAE,SAAiB,EAAE,MAAqB,EAAE,SAAwB;IACtI,MAAM,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAEtD,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3E,IAAI,CAAC,SAAS,IAAI,aAAa,KAAK,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,aAAa;QAAE,OAAO,IAAI,CAAC;IAC1G,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,MAAM,KAAK,GAAG,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,eAAe,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACpE,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAA6B,CAAC;IAC7H,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAElD,MAAM,IAAI,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IACxC,OAAO;QACL,MAAM;QACN,SAAS;QACT,SAAS;QACT,eAAe;QACf,QAAQ;QACR,MAAM,EAAE,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;KAC1C,CAAC;AACJ,CAAC"}
|