@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.
Files changed (208) hide show
  1. package/README.md +9 -0
  2. package/dist/ifc-creator-math.d.ts +5 -7
  3. package/dist/ifc-creator-math.d.ts.map +1 -1
  4. package/dist/ifc-creator-math.js +8 -15
  5. package/dist/ifc-creator-math.js.map +1 -1
  6. package/dist/in-store/anchor.d.ts +25 -0
  7. package/dist/in-store/anchor.d.ts.map +1 -1
  8. package/dist/in-store/auto-space-detect.d.ts +1 -1
  9. package/dist/in-store/auto-space-detect.js +1 -1
  10. package/dist/in-store/beam.d.ts +10 -1
  11. package/dist/in-store/beam.d.ts.map +1 -1
  12. package/dist/in-store/beam.js +14 -25
  13. package/dist/in-store/beam.js.map +1 -1
  14. package/dist/in-store/column.d.ts +18 -1
  15. package/dist/in-store/column.d.ts.map +1 -1
  16. package/dist/in-store/column.js +37 -29
  17. package/dist/in-store/column.js.map +1 -1
  18. package/dist/in-store/copy-frame.d.ts +52 -0
  19. package/dist/in-store/copy-frame.d.ts.map +1 -0
  20. package/dist/in-store/copy-frame.js +99 -0
  21. package/dist/in-store/copy-frame.js.map +1 -0
  22. package/dist/in-store/copy-product.d.ts +96 -0
  23. package/dist/in-store/copy-product.d.ts.map +1 -0
  24. package/dist/in-store/copy-product.js +318 -0
  25. package/dist/in-store/copy-product.js.map +1 -0
  26. package/dist/in-store/curtain-wall.d.ts +87 -0
  27. package/dist/in-store/curtain-wall.d.ts.map +1 -0
  28. package/dist/in-store/curtain-wall.js +237 -0
  29. package/dist/in-store/curtain-wall.js.map +1 -0
  30. package/dist/in-store/door.d.ts +10 -4
  31. package/dist/in-store/door.d.ts.map +1 -1
  32. package/dist/in-store/door.js +23 -17
  33. package/dist/in-store/door.js.map +1 -1
  34. package/dist/in-store/element-type.d.ts +40 -0
  35. package/dist/in-store/element-type.d.ts.map +1 -0
  36. package/dist/in-store/element-type.js +60 -0
  37. package/dist/in-store/element-type.js.map +1 -0
  38. package/dist/in-store/extract-grids.d.ts +46 -0
  39. package/dist/in-store/extract-grids.d.ts.map +1 -0
  40. package/dist/in-store/extract-grids.js +211 -0
  41. package/dist/in-store/extract-grids.js.map +1 -0
  42. package/dist/in-store/extract-walls.d.ts +12 -23
  43. package/dist/in-store/extract-walls.d.ts.map +1 -1
  44. package/dist/in-store/extract-walls.js +14 -83
  45. package/dist/in-store/extract-walls.js.map +1 -1
  46. package/dist/in-store/generate-spaces.d.ts +1 -1
  47. package/dist/in-store/grid.d.ts +118 -0
  48. package/dist/in-store/grid.d.ts.map +1 -0
  49. package/dist/in-store/grid.js +194 -0
  50. package/dist/in-store/grid.js.map +1 -0
  51. package/dist/in-store/host-geometry-frame.d.ts +44 -0
  52. package/dist/in-store/host-geometry-frame.d.ts.map +1 -0
  53. package/dist/in-store/host-geometry-frame.js +146 -0
  54. package/dist/in-store/host-geometry-frame.js.map +1 -0
  55. package/dist/in-store/hosted-element-edit.d.ts +29 -0
  56. package/dist/in-store/hosted-element-edit.d.ts.map +1 -0
  57. package/dist/in-store/hosted-element-edit.js +120 -0
  58. package/dist/in-store/hosted-element-edit.js.map +1 -0
  59. package/dist/in-store/hosted-element.d.ts +41 -0
  60. package/dist/in-store/hosted-element.d.ts.map +1 -0
  61. package/dist/in-store/hosted-element.js +124 -0
  62. package/dist/in-store/hosted-element.js.map +1 -0
  63. package/dist/in-store/hosted-fill-read.d.ts +56 -0
  64. package/dist/in-store/hosted-fill-read.d.ts.map +1 -0
  65. package/dist/in-store/hosted-fill-read.js +197 -0
  66. package/dist/in-store/hosted-fill-read.js.map +1 -0
  67. package/dist/in-store/hosted-fill.d.ts +48 -0
  68. package/dist/in-store/hosted-fill.d.ts.map +1 -0
  69. package/dist/in-store/hosted-fill.js +58 -0
  70. package/dist/in-store/hosted-fill.js.map +1 -0
  71. package/dist/in-store/hosted-global-id.d.ts +8 -0
  72. package/dist/in-store/hosted-global-id.d.ts.map +1 -0
  73. package/dist/in-store/hosted-global-id.js +53 -0
  74. package/dist/in-store/hosted-global-id.js.map +1 -0
  75. package/dist/in-store/hosted-placement-edit.d.ts +30 -0
  76. package/dist/in-store/hosted-placement-edit.d.ts.map +1 -0
  77. package/dist/in-store/hosted-placement-edit.js +123 -0
  78. package/dist/in-store/hosted-placement-edit.js.map +1 -0
  79. package/dist/in-store/hosted-scale-chain.d.ts +12 -0
  80. package/dist/in-store/hosted-scale-chain.d.ts.map +1 -0
  81. package/dist/in-store/hosted-scale-chain.js +74 -0
  82. package/dist/in-store/hosted-scale-chain.js.map +1 -0
  83. package/dist/in-store/hosted-shape-edit.d.ts +9 -0
  84. package/dist/in-store/hosted-shape-edit.d.ts.map +1 -0
  85. package/dist/in-store/hosted-shape-edit.js +79 -0
  86. package/dist/in-store/hosted-shape-edit.js.map +1 -0
  87. package/dist/in-store/index.d.ts +59 -0
  88. package/dist/in-store/index.d.ts.map +1 -0
  89. package/dist/in-store/index.js +64 -0
  90. package/dist/in-store/index.js.map +1 -0
  91. package/dist/in-store/material.d.ts +62 -0
  92. package/dist/in-store/material.d.ts.map +1 -0
  93. package/dist/in-store/material.js +107 -0
  94. package/dist/in-store/material.js.map +1 -0
  95. package/dist/in-store/member.d.ts +8 -2
  96. package/dist/in-store/member.d.ts.map +1 -1
  97. package/dist/in-store/member.js +12 -14
  98. package/dist/in-store/member.js.map +1 -1
  99. package/dist/in-store/opening.d.ts +45 -0
  100. package/dist/in-store/opening.d.ts.map +1 -0
  101. package/dist/in-store/opening.js +104 -0
  102. package/dist/in-store/opening.js.map +1 -0
  103. package/dist/in-store/placement-frame.d.ts +9 -4
  104. package/dist/in-store/placement-frame.d.ts.map +1 -1
  105. package/dist/in-store/placement-frame.js +39 -39
  106. package/dist/in-store/placement-frame.js.map +1 -1
  107. package/dist/in-store/profile.d.ts +141 -0
  108. package/dist/in-store/profile.d.ts.map +1 -0
  109. package/dist/in-store/profile.js +174 -0
  110. package/dist/in-store/profile.js.map +1 -0
  111. package/dist/in-store/railing.d.ts +65 -0
  112. package/dist/in-store/railing.d.ts.map +1 -0
  113. package/dist/in-store/railing.js +112 -0
  114. package/dist/in-store/railing.js.map +1 -0
  115. package/dist/in-store/rel-connects-path.d.ts +43 -0
  116. package/dist/in-store/rel-connects-path.d.ts.map +1 -0
  117. package/dist/in-store/rel-connects-path.js +65 -0
  118. package/dist/in-store/rel-connects-path.js.map +1 -0
  119. package/dist/in-store/relate.d.ts +32 -0
  120. package/dist/in-store/relate.d.ts.map +1 -0
  121. package/dist/in-store/relate.js +39 -0
  122. package/dist/in-store/relate.js.map +1 -0
  123. package/dist/in-store/resolve-anchor.d.ts +21 -1
  124. package/dist/in-store/resolve-anchor.d.ts.map +1 -1
  125. package/dist/in-store/resolve-anchor.js +6 -2
  126. package/dist/in-store/resolve-anchor.js.map +1 -1
  127. package/dist/in-store/resolve-host.d.ts +16 -0
  128. package/dist/in-store/resolve-host.d.ts.map +1 -0
  129. package/dist/in-store/resolve-host.js +333 -0
  130. package/dist/in-store/resolve-host.js.map +1 -0
  131. package/dist/in-store/resolve-relations.d.ts +23 -0
  132. package/dist/in-store/resolve-relations.d.ts.map +1 -0
  133. package/dist/in-store/resolve-relations.js +57 -0
  134. package/dist/in-store/resolve-relations.js.map +1 -0
  135. package/dist/in-store/resolve-source.d.ts.map +1 -1
  136. package/dist/in-store/resolve-source.js +59 -63
  137. package/dist/in-store/resolve-source.js.map +1 -1
  138. package/dist/in-store/schema-attributes.d.ts +33 -0
  139. package/dist/in-store/schema-attributes.d.ts.map +1 -0
  140. package/dist/in-store/schema-attributes.js +102 -0
  141. package/dist/in-store/schema-attributes.js.map +1 -0
  142. package/dist/in-store/space-footprints.d.ts +55 -0
  143. package/dist/in-store/space-footprints.d.ts.map +1 -0
  144. package/dist/in-store/space-footprints.js +260 -0
  145. package/dist/in-store/space-footprints.js.map +1 -0
  146. package/dist/in-store/space.d.ts.map +1 -1
  147. package/dist/in-store/space.js +15 -3
  148. package/dist/in-store/space.js.map +1 -1
  149. package/dist/in-store/spatial-children.d.ts +1 -1
  150. package/dist/in-store/spatial-children.js +1 -1
  151. package/dist/in-store/stair-edit.d.ts +24 -0
  152. package/dist/in-store/stair-edit.d.ts.map +1 -0
  153. package/dist/in-store/stair-edit.js +190 -0
  154. package/dist/in-store/stair-edit.js.map +1 -0
  155. package/dist/in-store/stair.d.ts +58 -0
  156. package/dist/in-store/stair.d.ts.map +1 -0
  157. package/dist/in-store/stair.js +156 -0
  158. package/dist/in-store/stair.js.map +1 -0
  159. package/dist/in-store/wall-join-apply.d.ts +74 -0
  160. package/dist/in-store/wall-join-apply.d.ts.map +1 -0
  161. package/dist/in-store/wall-join-apply.js +137 -0
  162. package/dist/in-store/wall-join-apply.js.map +1 -0
  163. package/dist/in-store/wall-join-edit.d.ts +70 -0
  164. package/dist/in-store/wall-join-edit.d.ts.map +1 -0
  165. package/dist/in-store/wall-join-edit.js +217 -0
  166. package/dist/in-store/wall-join-edit.js.map +1 -0
  167. package/dist/in-store/wall-join-read.d.ts +60 -0
  168. package/dist/in-store/wall-join-read.d.ts.map +1 -0
  169. package/dist/in-store/wall-join-read.js +230 -0
  170. package/dist/in-store/wall-join-read.js.map +1 -0
  171. package/dist/in-store/wall-join.d.ts +122 -0
  172. package/dist/in-store/wall-join.d.ts.map +1 -0
  173. package/dist/in-store/wall-join.js +231 -0
  174. package/dist/in-store/wall-join.js.map +1 -0
  175. package/dist/in-store/wall-opening-fit.d.ts +11 -0
  176. package/dist/in-store/wall-opening-fit.d.ts.map +1 -0
  177. package/dist/in-store/wall-opening-fit.js +27 -0
  178. package/dist/in-store/wall-opening-fit.js.map +1 -0
  179. package/dist/in-store/wall.d.ts +32 -0
  180. package/dist/in-store/wall.d.ts.map +1 -1
  181. package/dist/in-store/wall.js +77 -13
  182. package/dist/in-store/wall.js.map +1 -1
  183. package/dist/in-store/window.d.ts +7 -0
  184. package/dist/in-store/window.d.ts.map +1 -1
  185. package/dist/in-store/window.js +24 -17
  186. package/dist/in-store/window.js.map +1 -1
  187. package/dist/index.d.ts +1 -31
  188. package/dist/index.d.ts.map +1 -1
  189. package/dist/index.js +2 -34
  190. package/dist/index.js.map +1 -1
  191. package/dist/landxml/cant-superelevation.d.ts +28 -0
  192. package/dist/landxml/cant-superelevation.d.ts.map +1 -0
  193. package/dist/landxml/cant-superelevation.js +31 -0
  194. package/dist/landxml/cant-superelevation.js.map +1 -0
  195. package/dist/landxml/landxml-to-ifc.d.ts +8 -2
  196. package/dist/landxml/landxml-to-ifc.d.ts.map +1 -1
  197. package/dist/landxml/landxml-to-ifc.js +34 -2
  198. package/dist/landxml/landxml-to-ifc.js.map +1 -1
  199. package/dist/landxml/refusals.d.ts.map +1 -1
  200. package/dist/landxml/refusals.js +8 -3
  201. package/dist/landxml/refusals.js.map +1 -1
  202. package/dist/landxml/result-types.d.ts +44 -0
  203. package/dist/landxml/result-types.d.ts.map +1 -1
  204. package/dist/landxml/writers.d.ts +4 -0
  205. package/dist/landxml/writers.d.ts.map +1 -1
  206. package/dist/landxml/writers.js +4 -2
  207. package/dist/landxml/writers.js.map +1 -1
  208. package/package.json +8 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curtain-wall.d.ts","sourceRoot":"","sources":["../../src/in-store/curtain-wall.ts"],"names":[],"mappings":"AAwCA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAkC,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAUjF,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,cAAc,CAAC;AAiBtB,gGAAgG;AAChG,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;AAE7D,MAAM,WAAW,wBAAwB;IACvC,kFAAkF;IAClF,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,sEAAsE;IACtE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B;;;;OAIG;IACH,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,4EAA4E;IAC5E,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,kDAAkD;IAClD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mEAAmE;IACnE,cAAc,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wHAAwH;IACxH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qGAAqG;AACrG,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,0EAA0E;IAC1E,QAAQ,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,uDAAuD;IACvD,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,iDAAiD;IACjD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAkBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,EAAE,EAAE,SAAsB,GAAG,iBAAiB,CAyD/G;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,wBAAwB,GAC/B,sBAAsB,CA2HxB"}
@@ -0,0 +1,237 @@
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
+ * Anchored builder for a straight curtain wall (#6232): an IfcCurtainWall
6
+ * contained in the storey that aggregates its real parts, IfcMember mullions
7
+ * and transoms and IfcPlate panels, laid out on a U/V grid.
8
+ *
9
+ * `IfcCreator.addIfcCurtainWall` writes one thin box. This builder writes the
10
+ * system instead:
11
+ *
12
+ * - U grid lines run up the wall at offsets along the path, V grid lines run
13
+ * along it at heights above the base. Either is a bay count (equal bays)
14
+ * or the explicit interior offsets.
15
+ * - Mullions stand on every U line, full height. Transoms lie on every V
16
+ * line, bay by bay between the mullion faces (a stick system with
17
+ * continuous mullions).
18
+ * - With `EdgeMembers` (the default) the perimeter is framed too, with the
19
+ * edge members set inside the outline, so the whole curtain wall spans
20
+ * exactly `Start -> End` and `0 -> Height`, like IfcCreator's box.
21
+ * - One panel fills each clear opening between member faces, `PanelThickness`
22
+ * thick, centred on the path line like the members.
23
+ *
24
+ * The member section comes from the shared profile factory (`ProfileSection`,
25
+ * any of rectangle, I, L, T, U, C, circle, hollow). Profile X lies in the wall
26
+ * plane across the member and profile Y across the wall, towards the left of
27
+ * `Start -> End`, for mullions and transoms alike, so an asymmetric section
28
+ * faces the same side on both.
29
+ *
30
+ * The IfcCurtainWall has no representation of its own; its geometry is its
31
+ * parts' (IfcRelAggregates), and every part is placed relative to the curtain
32
+ * wall, so moving the curtain wall moves the lot.
33
+ *
34
+ * Schema gating (D2): attributes are laid out from the anchor schema's
35
+ * registry. IFC4/IFC4X3 get `PredefinedType`s (MULLION members, CURTAIN_PANEL
36
+ * plates); IFC2X3 has none on these classes; IFC5 is refused.
37
+ */
38
+ import { generateIfcGuid } from '@ifc-lite/encoding';
39
+ import { assertFinitePoint3 } from '../ifc-creator-math.js';
40
+ import { toNativeLength, toNativePoint3 } from './anchor.js';
41
+ import { assertPositiveFinite, emitBodyRepresentation, emitLocalPlacement, emitRectangleProfile, emitRelContainedInSpatialStructure, ownerHistoryRef, productGuid, } from './_emit-helpers.js';
42
+ import { assertProfileSectionAuthorable, emitProfileSection, profileSectionExtent, validateProfileSection, } from './profile.js';
43
+ import { schemaAttributes } from './schema-attributes.js';
44
+ const DEFAULT_MULLION = { Type: 'Rectangle', XDim: 0.05, YDim: 0.15 };
45
+ const DEFAULT_PANEL_THICKNESS = 0.024;
46
+ /** Widest bay the default U grid makes (metres). */
47
+ const DEFAULT_MAX_BAY = 1.5;
48
+ const EPS = 1e-9;
49
+ /**
50
+ * Round away the float noise of the face arithmetic (0.975 - 0.05 =
51
+ * 0.9249999999999999) so the STEP file carries the dimensions as authored.
52
+ */
53
+ const snap = (x) => Math.round(x * 1e9) / 1e9;
54
+ function gridLines(extent, spec, name, op) {
55
+ if (typeof spec === 'number') {
56
+ if (!Number.isInteger(spec) || spec < 1)
57
+ throw new Error(`${op}: ${name} bay count must be a positive integer`);
58
+ return Array.from({ length: spec + 1 }, (_, i) => (i === spec ? extent : (extent * i) / spec));
59
+ }
60
+ if (!Array.isArray(spec))
61
+ throw new Error(`${op}: ${name} must be a bay count or an array of offsets`);
62
+ let previous = 0;
63
+ for (const value of spec) {
64
+ if (!Number.isFinite(value) || value <= previous + EPS || value >= extent - EPS) {
65
+ throw new Error(`${op}: ${name} offsets must be finite, strictly increasing and inside (0, ${extent})`);
66
+ }
67
+ previous = value;
68
+ }
69
+ return [0, ...spec, extent];
70
+ }
71
+ /**
72
+ * The curtain wall's members and panels, in metres, without emitting anything.
73
+ * Refuses a layout whose members leave no clear opening.
74
+ */
75
+ export function curtainWallLayout(params, op = 'curtainWallLayout') {
76
+ assertFinitePoint3({ Start: params.Start, End: params.End }, op);
77
+ if (Math.abs(params.End[2] - params.Start[2]) > EPS) {
78
+ throw new Error(`${op}: Start and End must be at the same height (the base elevation)`);
79
+ }
80
+ const length = Math.hypot(params.End[0] - params.Start[0], params.End[1] - params.Start[1]);
81
+ if (length <= EPS)
82
+ throw new Error(`${op}: Start and End must be distinct points`);
83
+ assertPositiveFinite([params.Height], `${op}: Height must be a finite positive number`);
84
+ const height = params.Height;
85
+ const mullion = params.MullionProfile ?? DEFAULT_MULLION;
86
+ const transom = params.TransomProfile ?? mullion;
87
+ validateProfileSection(mullion, op);
88
+ validateProfileSection(transom, op);
89
+ const [w] = profileSectionExtent(mullion);
90
+ const [h] = profileSectionExtent(transom);
91
+ const edge = params.EdgeMembers ?? true;
92
+ const uLines = gridLines(length, params.UGrid ?? Math.max(1, Math.ceil(length / DEFAULT_MAX_BAY - EPS)), 'UGrid', op);
93
+ const vLines = gridLines(height, params.VGrid ?? 1, 'VGrid', op);
94
+ const nu = uLines.length - 1;
95
+ const nv = vLines.length - 1;
96
+ const mullions = edge ? [w / 2, ...uLines.slice(1, -1), length - w / 2] : uLines.slice(1, -1);
97
+ const bayU = (j) => [
98
+ j === 0 ? (edge ? w : 0) : uLines[j] + w / 2,
99
+ j === nu - 1 ? (edge ? length - w : length) : uLines[j + 1] - w / 2,
100
+ ];
101
+ const bayV = (k) => [
102
+ k === 0 ? (edge ? h : 0) : vLines[k] + h / 2,
103
+ k === nv - 1 ? (edge ? height - h : height) : vLines[k + 1] - h / 2,
104
+ ];
105
+ const rows = edge ? [h / 2, ...vLines.slice(1, -1), height - h / 2] : vLines.slice(1, -1);
106
+ const transoms = [];
107
+ const panels = [];
108
+ for (let j = 0; j < nu; j++) {
109
+ const [u0, u1] = bayU(j);
110
+ if (u1 - u0 <= EPS)
111
+ throw new Error(`${op}: the mullions leave no clear opening in bay ${j + 1}; widen the bays or slim the mullion`);
112
+ for (const v of rows)
113
+ transoms.push({ v, u0, u1 });
114
+ }
115
+ for (let k = 0; k < nv; k++) {
116
+ const [v0, v1] = bayV(k);
117
+ if (v1 - v0 <= EPS)
118
+ throw new Error(`${op}: the transoms leave no clear opening in row ${k + 1}; raise the rows or slim the transom`);
119
+ for (let j = 0; j < nu; j++) {
120
+ const [u0, u1] = bayU(j);
121
+ panels.push({ u0, u1, v0, v1 });
122
+ }
123
+ }
124
+ return {
125
+ length,
126
+ height,
127
+ uLines: uLines.map(snap),
128
+ vLines: vLines.map(snap),
129
+ mullions: mullions.map(snap),
130
+ transoms: transoms.map((t) => ({ v: snap(t.v), u0: snap(t.u0), u1: snap(t.u1) })),
131
+ panels: panels.map((p) => ({ u0: snap(p.u0), u1: snap(p.u1), v0: snap(p.v0), v1: snap(p.v1) })),
132
+ };
133
+ }
134
+ export function addCurtainWallToStore(editor, anchor, params) {
135
+ const op = 'addCurtainWallToStore';
136
+ const mullionSection = params.MullionProfile ?? DEFAULT_MULLION;
137
+ const transomSection = params.TransomProfile ?? mullionSection;
138
+ const registry = assertProfileSectionAuthorable(anchor, mullionSection, op);
139
+ assertProfileSectionAuthorable(anchor, transomSection, op);
140
+ const panelThickness = params.PanelThickness ?? DEFAULT_PANEL_THICKNESS;
141
+ assertPositiveFinite([panelThickness], `${op}: PanelThickness must be a finite positive number`);
142
+ if (params.EdgeMembers !== undefined && typeof params.EdgeMembers !== 'boolean') {
143
+ throw new Error(`${op}: EdgeMembers must be a boolean`);
144
+ }
145
+ const layout = curtainWallLayout(params, op);
146
+ const isIfc2x3 = registry.name.toUpperCase() === 'IFC2X3';
147
+ const owner = ownerHistoryRef(anchor.ownerHistoryId);
148
+ const wallName = params.Name ?? 'Curtain Wall';
149
+ const curtainWallGuid = productGuid(params, anchor.guidRandom);
150
+ const curtainWallValues = (placement) => ({
151
+ GlobalId: curtainWallGuid,
152
+ OwnerHistory: owner,
153
+ Name: wallName,
154
+ Description: params.Description,
155
+ ObjectType: params.ObjectType,
156
+ ObjectPlacement: placement,
157
+ Tag: params.Tag,
158
+ ...(isIfc2x3 ? {} : { PredefinedType: params.PredefinedType ?? 'NOTDEFINED' }),
159
+ });
160
+ const partValues = (name, placement, shape, predefinedType) => ({
161
+ GlobalId: generateIfcGuid(anchor.guidRandom),
162
+ OwnerHistory: owner,
163
+ Name: name,
164
+ ObjectPlacement: placement,
165
+ Representation: shape,
166
+ ...(isIfc2x3 ? {} : { PredefinedType: predefinedType }),
167
+ });
168
+ // Lay every record class out once before the first emit, so a bad
169
+ // PredefinedType or a missing IFC2X3 OwnerHistory refuses cleanly.
170
+ schemaAttributes(registry, 'IfcCurtainWall', curtainWallValues(null), op);
171
+ schemaAttributes(registry, 'IfcMember', partValues('', null, null, 'MULLION'), op);
172
+ schemaAttributes(registry, 'IfcPlate', partValues('', null, null, 'CURTAIN_PANEL'), op);
173
+ const n = (metres) => toNativeLength(anchor, metres);
174
+ const start = toNativePoint3(anchor, params.Start);
175
+ const dx = params.End[0] - params.Start[0];
176
+ const dy = params.End[1] - params.Start[1];
177
+ const placementId = emitLocalPlacement(editor, anchor.storeyPlacementId, start, [0, 0, 1], [dx / layout.length, dy / layout.length, 0]);
178
+ // Shared across every part: one extrusion frame and direction.
179
+ const solidOrigin = editor.addEntity('IfcCartesianPoint', [[0, 0, 0]]).expressId;
180
+ const solidPosition = editor.addEntity('IfcAxis2Placement3D', [`#${solidOrigin}`, null, null]).expressId;
181
+ const up = editor.addEntity('IfcDirection', [[0, 0, 1]]).expressId;
182
+ const extrude = (profileId, depth) => editor.addEntity('IfcExtrudedAreaSolid', [
183
+ `#${profileId}`, `#${solidPosition}`, `#${up}`, n(depth),
184
+ ]).expressId;
185
+ const part = (type, name, placement, solid, predefinedType) => {
186
+ const { productShapeId } = emitBodyRepresentation(editor, anchor.bodyContextId, solid);
187
+ return editor.addEntity(type, schemaAttributes(registry, type, partValues(name, `#${placement}`, `#${productShapeId}`, predefinedType), op)).expressId;
188
+ };
189
+ const mullionProfileId = emitProfileSection(editor, anchor, mullionSection, op);
190
+ const transomProfileId = params.TransomProfile === undefined
191
+ ? mullionProfileId
192
+ : emitProfileSection(editor, anchor, transomSection, op);
193
+ // Mullions: local Z up the wall, profile X along the path, Y across it.
194
+ const mullionIds = layout.mullions.map((u, i) => {
195
+ const placement = emitLocalPlacement(editor, placementId, [n(u), 0, 0]);
196
+ return part('IfcMember', `Mullion ${i + 1}`, placement, extrude(mullionProfileId, layout.height), 'MULLION');
197
+ });
198
+ // Transoms: local Z along the path; RefDirection down, so profile X lies in
199
+ // the wall plane and profile Y (Z x X) across it, the same side as the mullions'.
200
+ const transomIds = layout.transoms.map((t, i) => {
201
+ const placement = emitLocalPlacement(editor, placementId, [n(t.u0), 0, n(t.v)], [1, 0, 0], [0, 0, -1]);
202
+ return part('IfcMember', `Transom ${i + 1}`, placement, extrude(transomProfileId, snap(t.u1 - t.u0)), 'MULLION');
203
+ });
204
+ // Panels: one rectangle per clear width (shared between panels of the same width).
205
+ const panelProfiles = new Map();
206
+ const panelIds = layout.panels.map((p, i) => {
207
+ const width = n(snap(p.u1 - p.u0));
208
+ let profileId = panelProfiles.get(width);
209
+ if (profileId === undefined) {
210
+ profileId = emitRectangleProfile(editor, width, n(panelThickness), width / 2, 0);
211
+ panelProfiles.set(width, profileId);
212
+ }
213
+ const placement = emitLocalPlacement(editor, placementId, [n(p.u0), 0, n(p.v0)]);
214
+ return part('IfcPlate', `Panel ${i + 1}`, placement, extrude(profileId, snap(p.v1 - p.v0)), 'CURTAIN_PANEL');
215
+ });
216
+ const curtainWallId = editor.addEntity('IfcCurtainWall', schemaAttributes(registry, 'IfcCurtainWall', curtainWallValues(`#${placementId}`), op)).expressId;
217
+ const relAggregatesId = editor.addEntity('IfcRelAggregates', schemaAttributes(registry, 'IfcRelAggregates', {
218
+ GlobalId: generateIfcGuid(anchor.guidRandom),
219
+ OwnerHistory: owner,
220
+ RelatingObject: `#${curtainWallId}`,
221
+ RelatedObjects: [...mullionIds, ...transomIds, ...panelIds].map((id) => `#${id}`),
222
+ }, op)).expressId;
223
+ const relContainedId = emitRelContainedInSpatialStructure(editor, anchor.ownerHistoryId, curtainWallId, anchor.storeyId, anchor.guidRandom);
224
+ return {
225
+ curtainWallId,
226
+ placementId,
227
+ mullionIds,
228
+ transomIds,
229
+ panelIds,
230
+ mullionProfileId,
231
+ transomProfileId,
232
+ relAggregatesId,
233
+ relContainedId,
234
+ layout,
235
+ };
236
+ }
237
+ //# sourceMappingURL=curtain-wall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curtain-wall.js","sourceRoot":"","sources":["../../src/in-store/curtain-wall.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,9 @@
1
1
  /**
2
2
  * Anchored builder for IfcDoor — a free-standing rectangular leaf.
3
3
  *
4
- * v1 places a door without cutting an opening in any wall (callers
5
- * who need a wall-hosted door can use `IfcCreator.addIfcWallDoor`
6
- * for now). Geometry is a thin solid: `Width × FrameThickness ×
7
- * Height` extruded up.
4
+ * This variant places a door without cutting an opening in any wall;
5
+ * `addHostedDoorToStore` (hosted-fill.ts) cuts the opening and fills it.
6
+ * Geometry is a thin solid: `Width × FrameThickness × Height` extruded up.
8
7
  *
9
8
  * The IFC4 IfcDoor entity adds `OverallHeight`, `OverallWidth`,
10
9
  * `PredefinedType`, `OperationType`, `UserDefinedOperationType` to
@@ -43,4 +42,11 @@ export interface DoorBuildResult {
43
42
  relContainedId: number;
44
43
  }
45
44
  export declare function addDoorToStore(editor: StoreEditor, anchor: SpatialAnchor, params: DoorInStoreParams): DoorBuildResult;
45
+ /**
46
+ * IfcDoor's attributes after the IfcElement header: OverallHeight and
47
+ * OverallWidth in every schema, then PredefinedType / OperationType /
48
+ * UserDefinedOperationType from IFC4 on. Shared by the hosted door builder.
49
+ * `Height`/`Width` must already be in the native length unit.
50
+ */
51
+ export declare function doorAttributeTail(schema: SpatialAnchor['schema'], params: Pick<DoorInStoreParams, 'Height' | 'Width' | 'PredefinedType' | 'OperationType' | 'UserDefinedOperationType'>): unknown[];
46
52
  //# sourceMappingURL=door.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"door.d.ts","sourceRoot":"","sources":["../../src/in-store/door.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAkC,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAuCjF,MAAM,WAAW,iBAAiB;IAChC,mEAAmE;IACnE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,aAAa,GAAG,YAAY,CAAC;IAC7E,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,iBAAiB,GACxB,eAAe,CAiDjB"}
1
+ {"version":3,"file":"door.d.ts","sourceRoot":"","sources":["../../src/in-store/door.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAkC,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAuCjF,MAAM,WAAW,iBAAiB;IAChC,mEAAmE;IACnE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,aAAa,GAAG,YAAY,CAAC;IAC7E,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,iBAAiB,GACxB,eAAe,CAiCjB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,EAC/B,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,OAAO,GAAG,gBAAgB,GAAG,eAAe,GAAG,0BAA0B,CAAC,GACpH,OAAO,EAAE,CAcX"}
@@ -52,26 +52,32 @@ export function addDoorToStore(editor, anchor, params) {
52
52
  const profileId = emitRectangleProfile(editor, params.Width, thickness);
53
53
  const solidId = emitExtrudedSolid(editor, profileId, params.Height);
54
54
  const { shapeRepId, productShapeId } = emitBodyRepresentation(editor, anchor.bodyContextId, solidId);
55
- const isIFC2X3 = (anchor.schema ?? 'IFC4') === 'IFC2X3';
56
55
  const attrs = ifcElementHeader(anchor.ownerHistoryId, placementId, productShapeId, params, 'Door', anchor.guidRandom);
57
- // OverallHeight / OverallWidth are present on IfcDoor in both schemas.
58
- attrs.push(params.Height, params.Width);
59
- if (!isIFC2X3) {
60
- // Free-form values outside IfcDoorTypeOperationEnum are normalised
61
- // to USERDEFINED + UserDefinedOperationType so the exported STEP
62
- // carries a valid enum token rather than `.<value>.`.
63
- const requested = params.OperationType ?? 'SINGLE_SWING_LEFT';
64
- const isKnownEnum = DOOR_OPERATION_ENUM.has(requested);
65
- const operationType = isKnownEnum ? requested : 'USERDEFINED';
66
- const userDefined = operationType === 'USERDEFINED'
67
- ? (isKnownEnum ? params.UserDefinedOperationType ?? null : requested)
68
- : null;
69
- attrs.push(`.${params.PredefinedType ?? 'NOTDEFINED'}.`);
70
- attrs.push(`.${operationType}.`);
71
- attrs.push(userDefined);
72
- }
56
+ attrs.push(...doorAttributeTail(anchor.schema, params));
73
57
  const doorId = editor.addEntity('IfcDoor', attrs).expressId;
74
58
  const relContainedId = emitRelContainedInSpatialStructure(editor, anchor.ownerHistoryId, doorId, anchor.storeyId, anchor.guidRandom);
75
59
  return { doorId, placementId, profileId, solidId, shapeRepId, productShapeId, relContainedId };
76
60
  }
61
+ /**
62
+ * IfcDoor's attributes after the IfcElement header: OverallHeight and
63
+ * OverallWidth in every schema, then PredefinedType / OperationType /
64
+ * UserDefinedOperationType from IFC4 on. Shared by the hosted door builder.
65
+ * `Height`/`Width` must already be in the native length unit.
66
+ */
67
+ export function doorAttributeTail(schema, params) {
68
+ const tail = [params.Height, params.Width];
69
+ if ((schema ?? 'IFC4') === 'IFC2X3')
70
+ return tail;
71
+ // Free-form values outside IfcDoorTypeOperationEnum are normalised
72
+ // to USERDEFINED + UserDefinedOperationType so the exported STEP
73
+ // carries a valid enum token rather than `.<value>.`.
74
+ const requested = params.OperationType ?? 'SINGLE_SWING_LEFT';
75
+ const isKnownEnum = DOOR_OPERATION_ENUM.has(requested);
76
+ const operationType = isKnownEnum ? requested : 'USERDEFINED';
77
+ const userDefined = operationType === 'USERDEFINED'
78
+ ? (isKnownEnum ? params.UserDefinedOperationType ?? null : requested)
79
+ : null;
80
+ tail.push(`.${params.PredefinedType ?? 'NOTDEFINED'}.`, `.${operationType}.`, userDefined);
81
+ return tail;
82
+ }
77
83
  //# sourceMappingURL=door.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"door.js","sourceRoot":"","sources":["../../src/in-store/door.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"door.js","sourceRoot":"","sources":["../../src/in-store/door.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { StoreEditor } from '@ifc-lite/mutations';
2
+ import type { SpatialAnchor } from './anchor.js';
3
+ import { type OneToManyResult } from './relate.js';
4
+ import type { ExistingRelatedList } from './cost.js';
5
+ /** What the type and material builders need from the model: no storey, no geometry context. */
6
+ export type AuthoringAnchor = Pick<SpatialAnchor, 'ownerHistoryId' | 'schema' | 'guidRandom' | 'lengthUnitScale'>;
7
+ export interface ElementTypeInStoreParams {
8
+ /** EXPRESS class of the type object, e.g. `'IfcWallType'`. Must be an IfcElementType subtype in the model's schema. */
9
+ Type: string;
10
+ Name: string;
11
+ Description?: string;
12
+ ApplicableOccurrence?: string;
13
+ Tag?: string;
14
+ ElementType?: string;
15
+ /** Enumeration value without dots. Defaults to NOTDEFINED where the attribute is mandatory. */
16
+ PredefinedType?: string;
17
+ /** IfcDoorType (IFC4+). */
18
+ OperationType?: string;
19
+ UserDefinedOperationType?: string;
20
+ /** IfcWindowType (IFC4+). */
21
+ PartitioningType?: string;
22
+ UserDefinedPartitioningType?: string;
23
+ /** IfcDoorType / IfcWindowType (IFC4+). */
24
+ ParameterTakesPrecedence?: boolean;
25
+ /** Explicit GlobalId (22-char IFC GUID); generated when omitted. */
26
+ GlobalId?: string;
27
+ }
28
+ export interface ElementTypeBuildResult {
29
+ typeId: number;
30
+ }
31
+ export declare function addElementTypeToStore(editor: StoreEditor, anchor: AuthoringAnchor, params: ElementTypeInStoreParams): ElementTypeBuildResult;
32
+ /**
33
+ * Type `objectIds` by `typeId` through IfcRelDefinesByType. `existing` is every
34
+ * IfcRelDefinesByType in the model (see `readRelatedLists`): the type's own
35
+ * relationship is extended rather than duplicated, and an object typed by a
36
+ * different type is detached from it first, since an occurrence has at most
37
+ * one type.
38
+ */
39
+ export declare function assignTypeInStore(editor: StoreEditor, anchor: AuthoringAnchor, typeId: number, objectIds: readonly number[], existing: readonly ExistingRelatedList[]): OneToManyResult;
40
+ //# sourceMappingURL=element-type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-type.d.ts","sourceRoot":"","sources":["../../src/in-store/element-type.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErD,+FAA+F;AAC/F,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,gBAAgB,GAAG,QAAQ,GAAG,YAAY,GAAG,iBAAiB,CAAC,CAAC;AAElH,MAAM,WAAW,wBAAwB;IACvC,uHAAuH;IACvH,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+FAA+F;IAC/F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2BAA2B;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,6BAA6B;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,2CAA2C;IAC3C,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,wBAAwB,GAC/B,sBAAsB,CAkBxB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,QAAQ,EAAE,SAAS,mBAAmB,EAAE,GACvC,eAAe,CAejB"}
@@ -0,0 +1,60 @@
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
+ * Type objects on a loaded model (#6232): an `IfcElementType` subtype
6
+ * (`IfcWallType`, `IfcSlabType`, `IfcDoorType`, ...) and its
7
+ * `IfcRelDefinesByType` to the occurrences it types.
8
+ *
9
+ * The attribute layout is read from the target schema's registry, so the same
10
+ * call writes a valid IFC2X3, IFC4 or IFC4X3 record, and a class the schema
11
+ * does not have (IFC2X3 has no `IfcDoorType`) is refused by name.
12
+ */
13
+ import { generateIfcGuid } from '@ifc-lite/encoding';
14
+ import { ownerHistoryRef, productGuid } from './_emit-helpers.js';
15
+ import { canonicalEntity, schemaAttributes, schemaRegistry } from './schema-attributes.js';
16
+ import { relateOneToManyInStore } from './relate.js';
17
+ export function addElementTypeToStore(editor, anchor, params) {
18
+ const op = 'addElementTypeToStore';
19
+ const registry = schemaRegistry(anchor.schema, op);
20
+ const type = canonicalEntity(registry, params.Type);
21
+ if (!type)
22
+ throw new Error(`${op}: ${params.Type} does not exist in ${registry.name}`);
23
+ const entity = registry.entities[type];
24
+ if (entity.isAbstract || !(entity.inheritanceChain ?? []).includes('IfcElementType')) {
25
+ throw new Error(`${op}: ${type} is not an instantiable IfcElementType subtype`);
26
+ }
27
+ if (typeof params.Name !== 'string' || params.Name.length === 0)
28
+ throw new Error(`${op}: Name is required`);
29
+ const { Type: _type, GlobalId: _guid, ...named } = params;
30
+ const attrs = schemaAttributes(registry, type, {
31
+ ...named,
32
+ GlobalId: productGuid(params, anchor.guidRandom),
33
+ OwnerHistory: ownerHistoryRef(anchor.ownerHistoryId),
34
+ }, op);
35
+ return { typeId: editor.addEntity(type, attrs).expressId };
36
+ }
37
+ /**
38
+ * Type `objectIds` by `typeId` through IfcRelDefinesByType. `existing` is every
39
+ * IfcRelDefinesByType in the model (see `readRelatedLists`): the type's own
40
+ * relationship is extended rather than duplicated, and an object typed by a
41
+ * different type is detached from it first, since an occurrence has at most
42
+ * one type.
43
+ */
44
+ export function assignTypeInStore(editor, anchor, typeId, objectIds, existing) {
45
+ return relateOneToManyInStore(editor, {
46
+ relType: 'IfcRelDefinesByType',
47
+ relatingId: typeId,
48
+ relatedIds: objectIds,
49
+ existing,
50
+ create: (related) => [
51
+ generateIfcGuid(anchor.guidRandom),
52
+ ownerHistoryRef(anchor.ownerHistoryId),
53
+ null,
54
+ null,
55
+ related,
56
+ `#${typeId}`,
57
+ ],
58
+ }, 'assignTypeInStore');
59
+ }
60
+ //# sourceMappingURL=element-type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-type.js","sourceRoot":"","sources":["../../src/in-store/element-type.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,sBAAsB,EAAwB,MAAM,aAAa,CAAC;AAgC3E,MAAM,UAAU,qBAAqB,CACnC,MAAmB,EACnB,MAAuB,EACvB,MAAgC;IAEhC,MAAM,EAAE,GAAG,uBAAuB,CAAC;IACnC,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,KAAK,MAAM,CAAC,IAAI,sBAAsB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACvF,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrF,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,KAAK,IAAI,gDAAgD,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IAE5G,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC;IAC1D,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE;QAC7C,GAAG,KAAK;QACR,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC;QAChD,YAAY,EAAE,eAAe,CAAC,MAAM,CAAC,cAAc,CAAC;KACrD,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,KAAgD,CAAC,CAAC,SAAS,EAAE,CAAC;AACxG,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAmB,EACnB,MAAuB,EACvB,MAAc,EACd,SAA4B,EAC5B,QAAwC;IAExC,OAAO,sBAAsB,CAAC,MAAM,EAAE;QACpC,OAAO,EAAE,qBAAqB;QAC9B,UAAU,EAAE,MAAM;QAClB,UAAU,EAAE,SAAS;QACrB,QAAQ;QACR,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC;YACnB,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC;YAClC,eAAe,CAAC,MAAM,CAAC,cAAc,CAAC;YACtC,IAAI;YACJ,IAAI;YACJ,OAAO;YACP,IAAI,MAAM,EAAE;SACb;KACF,EAAE,mBAAmB,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * The design-grid axes visible on a storey, in the storey's own frame
3
+ * (metres): what a snap source needs to let walls, columns and curtain walls
4
+ * land on grid lines and grid intersections (#6232).
5
+ *
6
+ * An IfcGrid is contained in a storey, or (very often) in the building or site
7
+ * above it, so grids contained in any spatial ancestor of the storey count.
8
+ * Both file grids and grids authored this session (`addGridToStore`) are read
9
+ * through the same overlay-aware entity reader the wall extractor uses, so an
10
+ * axis edited or deleted this session reads as it now is.
11
+ *
12
+ * Each axis curve is read as a straight segment: a two-point IfcPolyline (the
13
+ * form `addGridToStore`, Revit and most exporters write), or an IfcTrimmedCurve
14
+ * over an IfcLine trimmed by points or by parameters (ArchiCAD). Other curves
15
+ * (arcs of a radial grid) are skipped and counted, never guessed at.
16
+ * `IfcGridAxis.SameSense` is ignored, as everywhere else the grid is read.
17
+ */
18
+ import { type IfcDataStore } from '@ifc-lite/parser';
19
+ import type { Vec2 } from './auto-space-detect.js';
20
+ import { type OverlayWallReader } from './placement-frame.js';
21
+ export interface GridAxisSegment {
22
+ /** The IfcGrid this axis belongs to. */
23
+ gridId: number;
24
+ axisId: number;
25
+ /** The IfcGridAxis.AxisTag ('1', 'A', ...). */
26
+ AxisTag: string;
27
+ family: 'U' | 'V' | 'W';
28
+ /** Axis ends in storey-local metres. */
29
+ a: Vec2;
30
+ b: Vec2;
31
+ }
32
+ export interface StoreyGridAxes {
33
+ axes: GridAxisSegment[];
34
+ /** IfcGrid entities found. */
35
+ gridIds: number[];
36
+ /** Axes with unreadable placement frames or unsupported curves: not offered. */
37
+ skippedAxes: number;
38
+ }
39
+ /**
40
+ * The grid axes that apply to `storeyId`, in storey-local metres. Empty (never
41
+ * throwing) for a store without source bytes. An unplaced grid uses identity
42
+ * only when the readable storey also explicitly omits ObjectPlacement;
43
+ * otherwise its axes are counted in skippedAxes.
44
+ */
45
+ export declare function extractGridAxesForStorey(store: IfcDataStore, storeyId: number, overlay?: OverlayWallReader): StoreyGridAxes;
46
+ //# sourceMappingURL=extract-grids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-grids.d.ts","sourceRoot":"","sources":["../../src/in-store/extract-grids.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAGnD,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAQ9B,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACxB,wCAAwC;IACxC,CAAC,EAAE,IAAI,CAAC;IACR,CAAC,EAAE,IAAI,CAAC;CACT;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gFAAgF;IAChF,WAAW,EAAE,MAAM,CAAC;CACrB;AAkGD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,cAAc,CAqEhB"}