@ifc-lite/create 3.2.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.
Files changed (149) hide show
  1. package/README.md +9 -0
  2. package/dist/in-store/auto-space-detect.d.ts +1 -1
  3. package/dist/in-store/auto-space-detect.js +1 -1
  4. package/dist/in-store/beam.d.ts +10 -1
  5. package/dist/in-store/beam.d.ts.map +1 -1
  6. package/dist/in-store/beam.js +14 -25
  7. package/dist/in-store/beam.js.map +1 -1
  8. package/dist/in-store/column.d.ts +10 -1
  9. package/dist/in-store/column.d.ts.map +1 -1
  10. package/dist/in-store/column.js +23 -22
  11. package/dist/in-store/column.js.map +1 -1
  12. package/dist/in-store/copy-frame.d.ts +52 -0
  13. package/dist/in-store/copy-frame.d.ts.map +1 -0
  14. package/dist/in-store/copy-frame.js +99 -0
  15. package/dist/in-store/copy-frame.js.map +1 -0
  16. package/dist/in-store/copy-product.d.ts +96 -0
  17. package/dist/in-store/copy-product.d.ts.map +1 -0
  18. package/dist/in-store/copy-product.js +318 -0
  19. package/dist/in-store/copy-product.js.map +1 -0
  20. package/dist/in-store/curtain-wall.d.ts +87 -0
  21. package/dist/in-store/curtain-wall.d.ts.map +1 -0
  22. package/dist/in-store/curtain-wall.js +237 -0
  23. package/dist/in-store/curtain-wall.js.map +1 -0
  24. package/dist/in-store/extract-grids.d.ts +46 -0
  25. package/dist/in-store/extract-grids.d.ts.map +1 -0
  26. package/dist/in-store/extract-grids.js +211 -0
  27. package/dist/in-store/extract-grids.js.map +1 -0
  28. package/dist/in-store/extract-walls.d.ts +12 -23
  29. package/dist/in-store/extract-walls.d.ts.map +1 -1
  30. package/dist/in-store/extract-walls.js +6 -69
  31. package/dist/in-store/extract-walls.js.map +1 -1
  32. package/dist/in-store/generate-spaces.d.ts +1 -1
  33. package/dist/in-store/grid.d.ts +118 -0
  34. package/dist/in-store/grid.d.ts.map +1 -0
  35. package/dist/in-store/grid.js +194 -0
  36. package/dist/in-store/grid.js.map +1 -0
  37. package/dist/in-store/host-geometry-frame.d.ts +44 -0
  38. package/dist/in-store/host-geometry-frame.d.ts.map +1 -0
  39. package/dist/in-store/host-geometry-frame.js +146 -0
  40. package/dist/in-store/host-geometry-frame.js.map +1 -0
  41. package/dist/in-store/hosted-element-edit.d.ts +29 -0
  42. package/dist/in-store/hosted-element-edit.d.ts.map +1 -0
  43. package/dist/in-store/hosted-element-edit.js +120 -0
  44. package/dist/in-store/hosted-element-edit.js.map +1 -0
  45. package/dist/in-store/hosted-element.d.ts +41 -0
  46. package/dist/in-store/hosted-element.d.ts.map +1 -0
  47. package/dist/in-store/hosted-element.js +124 -0
  48. package/dist/in-store/hosted-element.js.map +1 -0
  49. package/dist/in-store/hosted-fill-read.d.ts +56 -0
  50. package/dist/in-store/hosted-fill-read.d.ts.map +1 -0
  51. package/dist/in-store/hosted-fill-read.js +197 -0
  52. package/dist/in-store/hosted-fill-read.js.map +1 -0
  53. package/dist/in-store/hosted-global-id.d.ts +8 -0
  54. package/dist/in-store/hosted-global-id.d.ts.map +1 -0
  55. package/dist/in-store/hosted-global-id.js +53 -0
  56. package/dist/in-store/hosted-global-id.js.map +1 -0
  57. package/dist/in-store/hosted-placement-edit.d.ts +30 -0
  58. package/dist/in-store/hosted-placement-edit.d.ts.map +1 -0
  59. package/dist/in-store/hosted-placement-edit.js +123 -0
  60. package/dist/in-store/hosted-placement-edit.js.map +1 -0
  61. package/dist/in-store/hosted-scale-chain.d.ts +12 -0
  62. package/dist/in-store/hosted-scale-chain.d.ts.map +1 -0
  63. package/dist/in-store/hosted-scale-chain.js +74 -0
  64. package/dist/in-store/hosted-scale-chain.js.map +1 -0
  65. package/dist/in-store/hosted-shape-edit.d.ts +9 -0
  66. package/dist/in-store/hosted-shape-edit.d.ts.map +1 -0
  67. package/dist/in-store/hosted-shape-edit.js +79 -0
  68. package/dist/in-store/hosted-shape-edit.js.map +1 -0
  69. package/dist/in-store/index.d.ts +59 -0
  70. package/dist/in-store/index.d.ts.map +1 -0
  71. package/dist/in-store/index.js +64 -0
  72. package/dist/in-store/index.js.map +1 -0
  73. package/dist/in-store/member.d.ts +8 -2
  74. package/dist/in-store/member.d.ts.map +1 -1
  75. package/dist/in-store/member.js +12 -14
  76. package/dist/in-store/member.js.map +1 -1
  77. package/dist/in-store/placement-frame.d.ts +9 -4
  78. package/dist/in-store/placement-frame.d.ts.map +1 -1
  79. package/dist/in-store/placement-frame.js +20 -35
  80. package/dist/in-store/placement-frame.js.map +1 -1
  81. package/dist/in-store/profile.d.ts +141 -0
  82. package/dist/in-store/profile.d.ts.map +1 -0
  83. package/dist/in-store/profile.js +174 -0
  84. package/dist/in-store/profile.js.map +1 -0
  85. package/dist/in-store/railing.d.ts +65 -0
  86. package/dist/in-store/railing.d.ts.map +1 -0
  87. package/dist/in-store/railing.js +112 -0
  88. package/dist/in-store/railing.js.map +1 -0
  89. package/dist/in-store/rel-connects-path.d.ts +43 -0
  90. package/dist/in-store/rel-connects-path.d.ts.map +1 -0
  91. package/dist/in-store/rel-connects-path.js +65 -0
  92. package/dist/in-store/rel-connects-path.js.map +1 -0
  93. package/dist/in-store/resolve-host.d.ts +12 -1
  94. package/dist/in-store/resolve-host.d.ts.map +1 -1
  95. package/dist/in-store/resolve-host.js +169 -85
  96. package/dist/in-store/resolve-host.js.map +1 -1
  97. package/dist/in-store/resolve-source.d.ts.map +1 -1
  98. package/dist/in-store/resolve-source.js +39 -59
  99. package/dist/in-store/resolve-source.js.map +1 -1
  100. package/dist/in-store/schema-attributes.d.ts +5 -0
  101. package/dist/in-store/schema-attributes.d.ts.map +1 -1
  102. package/dist/in-store/schema-attributes.js +9 -2
  103. package/dist/in-store/schema-attributes.js.map +1 -1
  104. package/dist/in-store/space-footprints.d.ts +55 -0
  105. package/dist/in-store/space-footprints.d.ts.map +1 -0
  106. package/dist/in-store/space-footprints.js +260 -0
  107. package/dist/in-store/space-footprints.js.map +1 -0
  108. package/dist/in-store/space.d.ts.map +1 -1
  109. package/dist/in-store/space.js +15 -3
  110. package/dist/in-store/space.js.map +1 -1
  111. package/dist/in-store/spatial-children.d.ts +1 -1
  112. package/dist/in-store/spatial-children.js +1 -1
  113. package/dist/in-store/stair-edit.d.ts +24 -0
  114. package/dist/in-store/stair-edit.d.ts.map +1 -0
  115. package/dist/in-store/stair-edit.js +190 -0
  116. package/dist/in-store/stair-edit.js.map +1 -0
  117. package/dist/in-store/stair.d.ts +58 -0
  118. package/dist/in-store/stair.d.ts.map +1 -0
  119. package/dist/in-store/stair.js +156 -0
  120. package/dist/in-store/stair.js.map +1 -0
  121. package/dist/in-store/wall-join-apply.d.ts +74 -0
  122. package/dist/in-store/wall-join-apply.d.ts.map +1 -0
  123. package/dist/in-store/wall-join-apply.js +137 -0
  124. package/dist/in-store/wall-join-apply.js.map +1 -0
  125. package/dist/in-store/wall-join-edit.d.ts +70 -0
  126. package/dist/in-store/wall-join-edit.d.ts.map +1 -0
  127. package/dist/in-store/wall-join-edit.js +217 -0
  128. package/dist/in-store/wall-join-edit.js.map +1 -0
  129. package/dist/in-store/wall-join-read.d.ts +60 -0
  130. package/dist/in-store/wall-join-read.d.ts.map +1 -0
  131. package/dist/in-store/wall-join-read.js +230 -0
  132. package/dist/in-store/wall-join-read.js.map +1 -0
  133. package/dist/in-store/wall-join.d.ts +122 -0
  134. package/dist/in-store/wall-join.d.ts.map +1 -0
  135. package/dist/in-store/wall-join.js +231 -0
  136. package/dist/in-store/wall-join.js.map +1 -0
  137. package/dist/in-store/wall-opening-fit.d.ts +11 -0
  138. package/dist/in-store/wall-opening-fit.d.ts.map +1 -0
  139. package/dist/in-store/wall-opening-fit.js +27 -0
  140. package/dist/in-store/wall-opening-fit.js.map +1 -0
  141. package/dist/in-store/wall.d.ts +32 -0
  142. package/dist/in-store/wall.d.ts.map +1 -1
  143. package/dist/in-store/wall.js +77 -13
  144. package/dist/in-store/wall.js.map +1 -1
  145. package/dist/index.d.ts +1 -38
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +2 -40
  148. package/dist/index.js.map +1 -1
  149. package/package.json +6 -6
@@ -0,0 +1,137 @@
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 { relConnectsPathElementsAttributes } from './rel-connects-path.js';
5
+ import { schemaRegistry } from './schema-attributes.js';
6
+ import { emitWallAxisRepresentation, emitWallBodyProfile, wallJoinWallFromParams } from './wall.js';
7
+ import { computeWallJoin } from './wall-join.js';
8
+ /** The join target for a wall `addWallToStore` just built from `params`. */
9
+ export function wallJoinTargetFromBuild(build, params) {
10
+ return {
11
+ wallId: build.wallId,
12
+ solidId: build.solidId,
13
+ profileId: build.profileId,
14
+ productShapeId: build.productShapeId,
15
+ representationIds: build.axisRepId === null ? [build.shapeRepId] : [build.shapeRepId, build.axisRepId],
16
+ axisRepId: build.axisRepId,
17
+ origin: [params.Start[0], params.Start[1]],
18
+ wall: wallJoinWallFromParams(params),
19
+ };
20
+ }
21
+ /**
22
+ * Join walls `a` and `b` in the store. See `computeWallJoin` for the geometry
23
+ * and `options`. Refuses IFC5 / IFCX anchors; IFC2X3, IFC4 and IFC4X3 are
24
+ * written by their own attribute layouts.
25
+ */
26
+ export function applyWallJoinToStore(editor, anchor, a, b, options = {}) {
27
+ const op = 'applyWallJoinToStore';
28
+ schemaRegistry(anchor.schema, op);
29
+ if (a.wallId === b.wallId)
30
+ throw new Error(`${op}: a wall cannot join itself`);
31
+ for (const target of [a, b]) {
32
+ for (const id of [target.wallId, target.solidId, target.profileId, target.productShapeId]) {
33
+ if (!editor.hasEntity(id))
34
+ throw new Error(`${op}: #${id} of wall #${target.wallId} is not a live entity`);
35
+ }
36
+ if (editor.getEntityType(target.solidId)?.toUpperCase() !== 'IFCEXTRUDEDAREASOLID') {
37
+ throw new Error(`${op}: wall #${target.wallId} body #${target.solidId} is not an IfcExtrudedAreaSolid`);
38
+ }
39
+ }
40
+ // Everything that can refuse runs before the first write: the geometry, then
41
+ // the relationship's attributes (schema layout, element classes, OwnerHistory).
42
+ const join = computeWallJoin(a.wall, b.wall, options);
43
+ const relatingIsA = join.relating === 'a';
44
+ const [relating, related] = relatingIsA ? [join.a, join.b] : [join.b, join.a];
45
+ const relAttributes = relConnectsPathElementsAttributes(editor, anchor, {
46
+ RelatingElement: (relatingIsA ? a : b).wallId,
47
+ RelatedElement: (relatingIsA ? b : a).wallId,
48
+ RelatingConnectionType: relating.connection,
49
+ RelatedConnectionType: related.connection,
50
+ RelatingPriorities: relatingIsA ? options.priorities?.a : options.priorities?.b,
51
+ RelatedPriorities: relatingIsA ? options.priorities?.b : options.priorities?.a,
52
+ Name: options.Name,
53
+ }, op);
54
+ // The through wall of a T keeps its body; it only gains an Axis if it has none,
55
+ // so every joined wall carries one.
56
+ const nextA = join.a.connection === 'ATPATH' ? ensureAxis(editor, anchor, a) : rewriteWall(editor, anchor, a, join.a.wall);
57
+ const nextB = join.b.connection === 'ATPATH' ? ensureAxis(editor, anchor, b) : rewriteWall(editor, anchor, b, join.b.wall);
58
+ const relId = editor.addEntity('IfcRelConnectsPathElements', relAttributes).expressId;
59
+ return { join, relId, a: nextA, b: nextB };
60
+ }
61
+ /** Where plan point `p` sits along the wall frame's X, metres from the placement origin. */
62
+ function alongFrame(target, p) {
63
+ const { start, end } = target.wall;
64
+ const length = Math.hypot(end[0] - start[0], end[1] - start[1]);
65
+ return ((p[0] - target.origin[0]) * (end[0] - start[0]) + (p[1] - target.origin[1]) * (end[1] - start[1])) / length;
66
+ }
67
+ /**
68
+ * Give `target` the body and `Axis` of `wall`, written in the frame of the
69
+ * placement at `target.origin` (`wall`'s axis runs along that frame's +X).
70
+ */
71
+ export function rewriteWall(editor, anchor, target, wall) {
72
+ const startX = alongFrame(target, wall.start);
73
+ const endX = alongFrame(target, wall.end);
74
+ const profileId = emitWallBodyProfile(editor, anchor, wall, startX);
75
+ editor.setPositionalAttribute(target.solidId, 0, `#${profileId}`);
76
+ removeOverlayProfile(editor, target.profileId);
77
+ return { ...writeAxis(editor, anchor, target, startX, endX), profileId, wall };
78
+ }
79
+ /** Replace the wall's Axis representation (or append one) with `startX..endX` in its frame. */
80
+ function writeAxis(editor, anchor, target, startX, endX) {
81
+ const axisRepId = emitWallAxisRepresentation(editor, anchor, startX, endX);
82
+ const representationIds = target.axisRepId !== null && target.representationIds.includes(target.axisRepId)
83
+ ? target.representationIds.map((id) => (id === target.axisRepId ? axisRepId : id))
84
+ : [...target.representationIds, axisRepId];
85
+ editor.setPositionalAttribute(target.productShapeId, 2, representationIds.map((id) => `#${id}`));
86
+ if (target.axisRepId !== null)
87
+ removeOverlayAxis(editor, target.axisRepId);
88
+ return { ...target, representationIds, axisRepId };
89
+ }
90
+ /** A wall the join leaves as it is: give it an Axis when it has none. */
91
+ function ensureAxis(editor, anchor, target) {
92
+ if (target.axisRepId !== null)
93
+ return { ...target };
94
+ return writeAxis(editor, anchor, target, alongFrame(target, target.wall.start), alongFrame(target, target.wall.end));
95
+ }
96
+ function refId(value) {
97
+ return typeof value === 'string' && /^#\d+$/.test(value) ? Number(value.slice(1)) : null;
98
+ }
99
+ /** Remove overlay entity `id` when it is one of `types`; returns its attributes, else null. */
100
+ function removeOverlay(editor, id, types) {
101
+ if (id === null)
102
+ return null;
103
+ const entity = editor.getNewEntity(id);
104
+ const type = editor.getEntityType(id)?.toUpperCase();
105
+ if (!entity || !types.some((t) => t.toUpperCase() === type))
106
+ return null;
107
+ editor.removeEntity(id);
108
+ return entity.attributes;
109
+ }
110
+ /** A profile this session built: the profile, its Position and origin point, or its polyline and points. */
111
+ function removeOverlayProfile(editor, profileId) {
112
+ const profile = removeOverlay(editor, profileId, ['IfcRectangleProfileDef', 'IfcArbitraryClosedProfileDef']);
113
+ if (!profile)
114
+ return;
115
+ // IfcRectangleProfileDef.Position (slot 2) / IfcArbitraryClosedProfileDef.OuterCurve (slot 2).
116
+ const inner = refId(profile[2]);
117
+ const position = removeOverlay(editor, inner, ['IfcAxis2Placement2D']);
118
+ if (position)
119
+ removeOverlay(editor, refId(position[0]), ['IfcCartesianPoint']);
120
+ const polyline = position ? null : removeOverlay(editor, inner, ['IfcPolyline']);
121
+ // A closed polyline repeats its first point; remove each point once.
122
+ const points = new Set(Array.isArray(polyline?.[0]) ? polyline[0].map(refId) : []);
123
+ for (const point of points)
124
+ removeOverlay(editor, point, ['IfcCartesianPoint']);
125
+ }
126
+ /** An Axis representation this session built: the representation, its polyline and points. */
127
+ function removeOverlayAxis(editor, axisRepId) {
128
+ const rep = removeOverlay(editor, axisRepId, ['IfcShapeRepresentation']);
129
+ const items = Array.isArray(rep?.[3]) ? rep[3] : [];
130
+ for (const item of items) {
131
+ const polyline = removeOverlay(editor, refId(item), ['IfcPolyline']);
132
+ const points = new Set(Array.isArray(polyline?.[0]) ? polyline[0].map(refId) : []);
133
+ for (const point of points)
134
+ removeOverlay(editor, point, ['IfcCartesianPoint']);
135
+ }
136
+ }
137
+ //# sourceMappingURL=wall-join-apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wall-join-apply.js","sourceRoot":"","sources":["../../src/in-store/wall-join-apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Editing joined walls in the store (#6232 B2): join two walls that are
3
+ * already there, and move wall ends with their joins following.
4
+ *
5
+ * - `joinWallsInStore` reads both walls, then writes the join. Two walls that
6
+ * are already joined get the new `IfcRelConnectsPathElements` in place of
7
+ * the old one, never a second beside it.
8
+ * - `reshapeWallsInStore` gives walls new axis ends. A dragged corner brings
9
+ * the walls joined at that end along, changed ends are made square while
10
+ * unchanged ends retain their cuts, and every affected join is recomputed. A join that
11
+ * no longer holds (the axes no longer meet) is removed and the wall that did
12
+ * not move stops square at its own end.
13
+ *
14
+ * Both write through the editor only. Joining is atomic; reshaping runs inside
15
+ * the caller's transaction. Hosts record either as one undo step. Every length
16
+ * in and out is metres, storey-local.
17
+ */
18
+ import type { StoreEditor } from '@ifc-lite/mutations';
19
+ import type { IfcDataStore } from '@ifc-lite/parser';
20
+ import { resolveAuthoringAnchor } from './resolve-relations.js';
21
+ import { type JoinAnchor, type WallJoinApplyOptions, type WallJoinApplyResult } from './wall-join-apply.js';
22
+ import { type PlanPoint } from './wall-join.js';
23
+ /** What a join write needs from the model: the authoring anchor plus the context an `Axis` representation lives in. */
24
+ export declare function resolveWallJoinAnchor(store: IfcDataStore, view?: Parameters<typeof resolveAuthoringAnchor>[1]): JoinAnchor;
25
+ export interface WallJoinInStoreResult extends WallJoinApplyResult {
26
+ /** The relationships this join replaced, now removed. */
27
+ replacedRelIds: number[];
28
+ }
29
+ /**
30
+ * Join walls `aId` and `bId`. See `computeWallJoin` for the geometry and
31
+ * options. When the pair is already joined, the old relationship is removed
32
+ * (its name and priorities carried over) and the wall that ran through then
33
+ * still does, unless `options.priority` says otherwise. Nothing is written
34
+ * when the join is refused.
35
+ */
36
+ export declare function joinWallsInStore(editor: StoreEditor, store: IfcDataStore, anchor: JoinAnchor, aId: number, bId: number, options?: WallJoinApplyOptions): WallJoinInStoreResult;
37
+ /** A wall's new axis ends and thickness, storey-local metres. What is left out stays. */
38
+ export interface WallReshape {
39
+ wallId: number;
40
+ start?: PlanPoint;
41
+ end?: PlanPoint;
42
+ thickness?: number;
43
+ }
44
+ export interface WallReshapeOptions {
45
+ /** A moved end takes the walls joined end to end with it (an L corner or a butt join) along. */
46
+ moveJoinedEnds?: boolean;
47
+ /** Tolerance of the recomputed joins, see `computeWallJoin`. */
48
+ tolerance?: number;
49
+ /**
50
+ * Walls that were moved as a whole (a rigid move or turn) and are NOT
51
+ * rewritten here: the joins they are part of are recomputed against the
52
+ * walls that are.
53
+ */
54
+ refresh?: readonly number[];
55
+ }
56
+ export interface WallReshapeResult {
57
+ /** Every wall whose geometry was written, moved or re-cut: the ones to re-mesh. */
58
+ walls: number[];
59
+ /** The relationships written. */
60
+ relIds: number[];
61
+ /** Relationships removed because their walls no longer meet. */
62
+ droppedRelIds: number[];
63
+ }
64
+ /**
65
+ * Give walls new axis ends and keep every join that touches them current.
66
+ * Refuses (writing nothing) a wall this module cannot read, a wall that would
67
+ * have no length or leave its storey plane is the caller's to check.
68
+ */
69
+ export declare function reshapeWallsInStore(editor: StoreEditor, store: IfcDataStore, anchor: JoinAnchor, edits: readonly WallReshape[], options?: WallReshapeOptions): WallReshapeResult;
70
+ //# sourceMappingURL=wall-join-edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wall-join-edit.d.ts","sourceRoot":"","sources":["../../src/in-store/wall-join-edit.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAAqC,KAAK,UAAU,EAAE,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE/I,OAAO,EAAoC,KAAK,SAAS,EAAqB,MAAM,gBAAgB,CAAC;AAGrG,uHAAuH;AACvH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAM1H;AAQD,MAAM,WAAW,qBAAsB,SAAQ,mBAAmB;IAChE,yDAAyD;IACzD,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,oBAAyB,GACjC,qBAAqB,CAEvB;AA4BD,yFAAyF;AACzF,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,gGAAgG;IAChG,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,mFAAmF;IACnF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,iCAAiC;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gEAAgE;IAChE,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAKD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,CAkFnB"}
@@ -0,0 +1,217 @@
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 { resolveAuthoringAnchor } from './resolve-relations.js';
6
+ import { AnchorEntityReader } from './resolve-anchor.js';
7
+ import { applyWallJoinToStore, rewriteWall } from './wall-join-apply.js';
8
+ import { readWallJoinRels, readWallJoinTarget } from './wall-join-read.js';
9
+ import { computeWallJoin, reshapeWallAxis } from './wall-join.js';
10
+ import { assertWallOpeningsFit } from './wall-opening-fit.js';
11
+ /** What a join write needs from the model: the authoring anchor plus the context an `Axis` representation lives in. */
12
+ export function resolveWallJoinAnchor(store, view) {
13
+ const base = resolveAuthoringAnchor(store, view);
14
+ const reader = new AnchorEntityReader(store, view);
15
+ const axisContextId = reader.contextId('axis', reader.rootContextId());
16
+ if (axisContextId === null)
17
+ throw new Error('resolveWallJoinAnchor: no IfcGeometricRepresentationContext (or Axis subcontext) found in store');
18
+ return { ownerHistoryId: base.ownerHistoryId, schema: base.schema, lengthUnitScale: base.lengthUnitScale, axisContextId };
19
+ }
20
+ function mustRead(store, editor, wallId, scale, op) {
21
+ const read = readWallJoinTarget(store, editor.getMutationView(), wallId, scale);
22
+ if (!read)
23
+ throw new Error(`${op}: #${wallId} is not a straight wall with a body this editor can rewrite`);
24
+ return read;
25
+ }
26
+ /**
27
+ * Join walls `aId` and `bId`. See `computeWallJoin` for the geometry and
28
+ * options. When the pair is already joined, the old relationship is removed
29
+ * (its name and priorities carried over) and the wall that ran through then
30
+ * still does, unless `options.priority` says otherwise. Nothing is written
31
+ * when the join is refused.
32
+ */
33
+ export function joinWallsInStore(editor, store, anchor, aId, bId, options = {}) {
34
+ return editor.runAtomic(draft => joinWalls(draft, store, anchor, aId, bId, options));
35
+ }
36
+ function joinWalls(editor, store, anchor, aId, bId, options) {
37
+ const op = 'joinWallsInStore';
38
+ const a = mustRead(store, editor, aId, anchor.lengthUnitScale ?? 1, op);
39
+ const b = mustRead(store, editor, bId, anchor.lengthUnitScale ?? 1, op);
40
+ if (a.parentPlacementId !== b.parentPlacementId)
41
+ throw new Error(`${op}: walls #${aId} and #${bId} are not placed in the same frame`);
42
+ const existing = readWallJoinRels(store, editor.getMutationView(), new Set([aId, bId]))
43
+ .filter((rel) => (rel.relatingId === aId && rel.relatedId === bId) || (rel.relatingId === bId && rel.relatedId === aId));
44
+ const first = existing[0];
45
+ const priority = options.priority ?? (first ? (first.relatingId === aId ? 'a' : 'b') : undefined);
46
+ const priorities = options.priorities ?? (first
47
+ ? (first.relatingId === aId
48
+ ? { a: first.relatingPriorities, b: first.relatedPriorities }
49
+ : { a: first.relatedPriorities, b: first.relatingPriorities })
50
+ : undefined);
51
+ const joinOptions = { ...options, priority, priorities, Name: options.Name ?? first?.name ?? undefined };
52
+ // Refuse before the old relationship is touched.
53
+ const join = computeWallJoin(a.wall, b.wall, joinOptions);
54
+ assertWallOpeningsFit(store, editor.getMutationView(), a, join.a.wall, anchor.lengthUnitScale ?? 1);
55
+ assertWallOpeningsFit(store, editor.getMutationView(), b, join.b.wall, anchor.lengthUnitScale ?? 1);
56
+ for (const rel of existing)
57
+ editor.removeEntity(rel.relId);
58
+ return { ...applyWallJoinToStore(editor, anchor, a, b, joinOptions), replacedRelIds: existing.map((rel) => rel.relId) };
59
+ }
60
+ const MOVE_EPS = 1e-9;
61
+ const MIN_LENGTH = 1e-6;
62
+ /**
63
+ * Give walls new axis ends and keep every join that touches them current.
64
+ * Refuses (writing nothing) a wall this module cannot read, a wall that would
65
+ * have no length or leave its storey plane is the caller's to check.
66
+ */
67
+ export function reshapeWallsInStore(editor, store, anchor, edits, options = {}) {
68
+ const op = 'reshapeWallsInStore';
69
+ const scale = anchor.lengthUnitScale ?? 1;
70
+ const view = () => editor.getMutationView();
71
+ const targets = new Map();
72
+ const load = (id) => {
73
+ let read = targets.get(id);
74
+ if (!read)
75
+ targets.set(id, (read = mustRead(store, editor, id, scale, op)));
76
+ return read;
77
+ };
78
+ // The requested axes, then the walls a moved corner drags along.
79
+ const axes = new Map();
80
+ for (const edit of edits) {
81
+ const read = load(edit.wallId);
82
+ const start = edit.start ?? read.wall.start;
83
+ const end = edit.end ?? read.wall.end;
84
+ if (![...start, ...end].every(Number.isFinite))
85
+ throw new Error(`${op}: wall #${edit.wallId} has a non-finite end`);
86
+ if (Math.hypot(end[0] - start[0], end[1] - start[1]) < MIN_LENGTH)
87
+ throw new Error(`${op}: wall #${edit.wallId} would have no length`);
88
+ if (edit.thickness !== undefined && !(Number.isFinite(edit.thickness) && edit.thickness > 0)) {
89
+ throw new Error(`${op}: wall #${edit.wallId} thickness must be positive`);
90
+ }
91
+ axes.set(edit.wallId, { start, end, thickness: edit.thickness });
92
+ }
93
+ if (options.moveJoinedEnds) {
94
+ for (const rel of readWallJoinRels(store, view(), new Set(axes.keys()))) {
95
+ for (const [self, other, selfConn, otherConn] of [
96
+ [rel.relatingId, rel.relatedId, rel.relatingConnection, rel.relatedConnection],
97
+ [rel.relatedId, rel.relatingId, rel.relatedConnection, rel.relatingConnection],
98
+ ]) {
99
+ const moved = axes.get(self);
100
+ if (!moved || axes.has(other) || selfConn === 'ATPATH' || otherConn === 'ATPATH')
101
+ continue;
102
+ const from = load(self).wall;
103
+ const key = selfConn === 'ATSTART' ? 'start' : 'end';
104
+ if (Math.hypot(moved[key][0] - from[key][0], moved[key][1] - from[key][1]) <= MOVE_EPS)
105
+ continue;
106
+ const partner = load(other).wall;
107
+ const newAxis = { start: partner.start, end: partner.end };
108
+ newAxis[otherConn === 'ATSTART' ? 'start' : 'end'] = moved[key];
109
+ axes.set(other, newAxis);
110
+ }
111
+ }
112
+ }
113
+ for (const id of axes.keys())
114
+ load(id);
115
+ // Everything that can refuse has run: write. Each moved wall gets a fresh
116
+ // placement point and direction (the old ones may be shared with other
117
+ // walls), retaining supported cuts at unchanged ends on the same direction.
118
+ const rels = readWallJoinRels(store, view(), new Set([...axes.keys(), ...(options.refresh ?? [])]));
119
+ const touched = new Set(axes.keys());
120
+ for (const [id, { start, end, thickness }] of axes)
121
+ targets.set(id, writeAxis(editor, anchor, load(id), start, end, thickness));
122
+ // Recompute every join that touches a moved wall: the joined end snaps to the
123
+ // crossing and is cut to the other wall's face. The relating wall runs through.
124
+ const relIds = [];
125
+ const droppedRelIds = [];
126
+ for (const rel of rels) {
127
+ const a = readOrNull(store, editor, targets, rel.relatingId, scale);
128
+ const b = readOrNull(store, editor, targets, rel.relatedId, scale);
129
+ if (!a || !b)
130
+ continue;
131
+ const joinOptions = joinOptionsOf(rel, options.tolerance);
132
+ try {
133
+ computeWallJoin(a.wall, b.wall, joinOptions);
134
+ }
135
+ catch {
136
+ // The walls no longer meet: the join goes, and a wall that did not move stops square at that end.
137
+ editor.removeEntity(rel.relId);
138
+ droppedRelIds.push(rel.relId);
139
+ for (const [wall, connection] of [[a, rel.relatingConnection], [b, rel.relatedConnection]]) {
140
+ if (axes.has(wall.wallId) || connection === 'ATPATH')
141
+ continue;
142
+ targets.set(wall.wallId, squareEnd(editor, anchor, wall, connection));
143
+ touched.add(wall.wallId);
144
+ }
145
+ continue;
146
+ }
147
+ editor.removeEntity(rel.relId);
148
+ const written = applyWallJoinToStore(editor, anchor, a, b, joinOptions);
149
+ relIds.push(written.relId);
150
+ for (const [id, next] of [[a.wallId, written.a], [b.wallId, written.b]]) {
151
+ targets.set(id, { ...load(id), ...next });
152
+ touched.add(id);
153
+ }
154
+ }
155
+ return { walls: [...touched], relIds, droppedRelIds };
156
+ }
157
+ function readOrNull(store, editor, targets, id, scale) {
158
+ const known = targets.get(id);
159
+ if (known)
160
+ return known;
161
+ const read = readWallJoinTarget(store, editor.getMutationView(), id, scale);
162
+ if (read)
163
+ targets.set(id, read);
164
+ return read;
165
+ }
166
+ /** The recompute options of an existing join: the relating wall (`a`) keeps running through, its name and priorities stay. */
167
+ function joinOptionsOf(rel, tolerance) {
168
+ return {
169
+ priority: 'a',
170
+ ...(tolerance === undefined ? {} : { tolerance }),
171
+ priorities: { a: rel.relatingPriorities, b: rel.relatedPriorities },
172
+ Name: rel.name ?? undefined,
173
+ };
174
+ }
175
+ /**
176
+ * Move `read` onto the axis `start`..`end`, retaining unchanged end cuts. The placement
177
+ * stays where it is when the start does not move and the direction holds (a
178
+ * far-end drag: the openings hosted in the wall keep their place); otherwise it
179
+ * gets a fresh point and direction at the new start (the old ones may be
180
+ * shared with other walls).
181
+ */
182
+ function writeAxis(editor, anchor, read, start, end, thickness = read.wall.thickness) {
183
+ const length = Math.hypot(end[0] - start[0], end[1] - start[1]);
184
+ const native = (v) => toNativeLength(anchor, v);
185
+ const reshaped = reshapeWallAxis({ ...read.wall, thickness }, start, end);
186
+ const old = read.wall;
187
+ const oldLength = Math.hypot(old.end[0] - old.start[0], old.end[1] - old.start[1]);
188
+ const ux = (end[0] - start[0]) / length;
189
+ const uy = (end[1] - start[1]) / length;
190
+ const ox = (old.end[0] - old.start[0]) / oldLength;
191
+ const oy = (old.end[1] - old.start[1]) / oldLength;
192
+ const startHeld = Math.hypot(start[0] - old.start[0], start[1] - old.start[1]) <= MOVE_EPS;
193
+ const directionHeld = ux * ox + uy * oy > 1 - 1e-12;
194
+ if (startHeld && directionHeld) {
195
+ return { ...read, ...rewriteWall(editor, anchor, { ...read, wall: reshaped }, reshaped), wall: reshaped, plain: false };
196
+ }
197
+ const point = editor.addEntity('IfcCartesianPoint', [[native(start[0]), native(start[1]), read.location[2]]]).expressId;
198
+ const direction = editor.addEntity('IfcDirection', [[ux, uy, 0]]).expressId;
199
+ editor.setPositionalAttribute(read.axisPlacementId, 0, `#${point}`);
200
+ editor.setPositionalAttribute(read.axisPlacementId, 2, `#${direction}`);
201
+ const moved = rewriteWall(editor, anchor, { ...read, origin: start, wall: reshaped }, reshaped);
202
+ return {
203
+ ...read, ...moved, locationPointId: point, refDirectionId: direction,
204
+ location: [native(start[0]), native(start[1]), read.location[2]], origin: start, wall: reshaped, plain: false,
205
+ };
206
+ }
207
+ /** `read`'s wall with its joined end cut square again. */
208
+ function squareEnd(editor, anchor, read, connection) {
209
+ const { startCut, endCut, ...rest } = read.wall;
210
+ const wall = {
211
+ ...rest,
212
+ ...(connection === 'ATEND' && startCut ? { startCut } : {}),
213
+ ...(connection === 'ATSTART' && endCut ? { endCut } : {}),
214
+ };
215
+ return { ...read, ...rewriteWall(editor, anchor, read, wall), wall };
216
+ }
217
+ //# sourceMappingURL=wall-join-edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wall-join-edit.js","sourceRoot":"","sources":["../../src/in-store/wall-join-edit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Read side of the wall joins (#6232 B2): a wall already in the store, source
3
+ * or authored, as the `WallJoinTarget` a join rewrites, and the
4
+ * `IfcRelConnectsPathElements` that tie walls together. Reads go through the
5
+ * mutation overlay, so a wall or join written earlier in the session counts.
6
+ *
7
+ * A wall is readable when it is a straight wall with a placement that names its
8
+ * direction, an extruded body over a rectangle or a four-point polygon (what
9
+ * `addWallToStore` and `applyWallJoinToStore` write), and an optional `Axis`
10
+ * polyline on the wall's own centreline. Anything else reads as null: it can
11
+ * neither be re-shaped nor joined.
12
+ */
13
+ import type { IfcDataStore } from '@ifc-lite/parser';
14
+ import type { MutablePropertyView } from '@ifc-lite/mutations';
15
+ import type { WallJoinTarget } from './wall-join-apply.js';
16
+ import type { WallConnectionType } from './wall-join.js';
17
+ /** A wall as the join tools see it, with the ids and native-unit values a re-shape writes. */
18
+ export interface WallJoinRead extends WallJoinTarget {
19
+ /** IfcAxis2Placement3D of the wall's placement. */
20
+ axisPlacementId: number;
21
+ /** IfcCartesianPoint of the placement's Location. */
22
+ locationPointId: number;
23
+ /** IfcDirection of the placement's RefDirection. */
24
+ refDirectionId: number;
25
+ /** The Location, in the file's native unit. */
26
+ location: [number, number, number];
27
+ /** `PlacementRelTo` of the wall's placement: two walls join only in the same frame. */
28
+ parentPlacementId: number | null;
29
+ /** Extrusion depth in metres, `NaN` when the slot is not a number. */
30
+ height: number;
31
+ /**
32
+ * The body is the plain rectangle `addWallToStore` writes without cuts,
33
+ * offset or axis alignment: the four coupled entities (placement, direction,
34
+ * XDim, profile origin) describe the wall completely.
35
+ */
36
+ plain: boolean;
37
+ }
38
+ export interface WallJoinRel {
39
+ relId: number;
40
+ relatingId: number;
41
+ relatedId: number;
42
+ relatingConnection: WallConnectionType;
43
+ relatedConnection: WallConnectionType;
44
+ relatingPriorities: number[];
45
+ relatedPriorities: number[];
46
+ name: string | null;
47
+ }
48
+ /**
49
+ * Read wall `wallId` as a join target. `lengthUnitScale` is the model's native
50
+ * unit in metres; the target's plan values are metres.
51
+ */
52
+ export declare function readWallJoinTarget(store: IfcDataStore, view: MutablePropertyView | null | undefined, wallId: number, lengthUnitScale: number): WallJoinRead | null;
53
+ /**
54
+ * Every live `IfcRelConnectsPathElements` that touches one of `wallIds` (all
55
+ * of them when omitted). The attribute slots (Relating 5, Related 6,
56
+ * priorities 7 and 8, connection types 9 and 10) are the same in IFC2X3,
57
+ * IFC4 and IFC4X3.
58
+ */
59
+ export declare function readWallJoinRels(store: IfcDataStore, view: MutablePropertyView | null | undefined, wallIds?: ReadonlySet<number>): WallJoinRel[];
60
+ //# sourceMappingURL=wall-join-read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wall-join-read.d.ts","sourceRoot":"","sources":["../../src/in-store/wall-join-read.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAa,kBAAkB,EAA4B,MAAM,gBAAgB,CAAC;AAE9F,8FAA8F;AAC9F,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,mDAAmD;IACnD,eAAe,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,eAAe,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,cAAc,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,uFAAuF;IACvF,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAyFD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,EAC5C,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,GACtB,YAAY,GAAG,IAAI,CA4FrB;AAYD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,EAC5C,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAC5B,WAAW,EAAE,CAoBf"}