@ifc-lite/create 2.9.2 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/dist/ifc-creator-alignment-referents.d.ts +35 -0
  2. package/dist/ifc-creator-alignment-referents.d.ts.map +1 -0
  3. package/dist/ifc-creator-alignment-referents.js +89 -0
  4. package/dist/ifc-creator-alignment-referents.js.map +1 -0
  5. package/dist/ifc-creator-alignment-vertical.d.ts +40 -0
  6. package/dist/ifc-creator-alignment-vertical.d.ts.map +1 -0
  7. package/dist/ifc-creator-alignment-vertical.js +182 -0
  8. package/dist/ifc-creator-alignment-vertical.js.map +1 -0
  9. package/dist/ifc-creator-alignment.d.ts +15 -0
  10. package/dist/ifc-creator-alignment.d.ts.map +1 -1
  11. package/dist/ifc-creator-alignment.js +27 -28
  12. package/dist/ifc-creator-alignment.js.map +1 -1
  13. package/dist/ifc-creator-math.d.ts +20 -0
  14. package/dist/ifc-creator-math.d.ts.map +1 -1
  15. package/dist/ifc-creator-math.js +62 -3
  16. package/dist/ifc-creator-math.js.map +1 -1
  17. package/dist/ifc-creator.d.ts.map +1 -1
  18. package/dist/ifc-creator.js +3 -7
  19. package/dist/ifc-creator.js.map +1 -1
  20. package/dist/in-store/_emit-helpers.d.ts +2 -1
  21. package/dist/in-store/_emit-helpers.d.ts.map +1 -1
  22. package/dist/in-store/_emit-helpers.js +7 -7
  23. package/dist/in-store/_emit-helpers.js.map +1 -1
  24. package/dist/in-store/anchor.d.ts +25 -0
  25. package/dist/in-store/anchor.d.ts.map +1 -1
  26. package/dist/in-store/column.d.ts +8 -0
  27. package/dist/in-store/column.d.ts.map +1 -1
  28. package/dist/in-store/column.js +16 -9
  29. package/dist/in-store/column.js.map +1 -1
  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-walls.d.ts.map +1 -1
  39. package/dist/in-store/extract-walls.js +17 -15
  40. package/dist/in-store/extract-walls.js.map +1 -1
  41. package/dist/in-store/hosted-fill.d.ts +48 -0
  42. package/dist/in-store/hosted-fill.d.ts.map +1 -0
  43. package/dist/in-store/hosted-fill.js +58 -0
  44. package/dist/in-store/hosted-fill.js.map +1 -0
  45. package/dist/in-store/material.d.ts +62 -0
  46. package/dist/in-store/material.d.ts.map +1 -0
  47. package/dist/in-store/material.js +107 -0
  48. package/dist/in-store/material.js.map +1 -0
  49. package/dist/in-store/opening.d.ts +45 -0
  50. package/dist/in-store/opening.d.ts.map +1 -0
  51. package/dist/in-store/opening.js +104 -0
  52. package/dist/in-store/opening.js.map +1 -0
  53. package/dist/in-store/placement-frame.d.ts.map +1 -1
  54. package/dist/in-store/placement-frame.js +19 -4
  55. package/dist/in-store/placement-frame.js.map +1 -1
  56. package/dist/in-store/relate.d.ts +32 -0
  57. package/dist/in-store/relate.d.ts.map +1 -0
  58. package/dist/in-store/relate.js +39 -0
  59. package/dist/in-store/relate.js.map +1 -0
  60. package/dist/in-store/resolve-anchor.d.ts +21 -1
  61. package/dist/in-store/resolve-anchor.d.ts.map +1 -1
  62. package/dist/in-store/resolve-anchor.js +6 -2
  63. package/dist/in-store/resolve-anchor.js.map +1 -1
  64. package/dist/in-store/resolve-host.d.ts +5 -0
  65. package/dist/in-store/resolve-host.d.ts.map +1 -0
  66. package/dist/in-store/resolve-host.js +249 -0
  67. package/dist/in-store/resolve-host.js.map +1 -0
  68. package/dist/in-store/resolve-relations.d.ts +23 -0
  69. package/dist/in-store/resolve-relations.d.ts.map +1 -0
  70. package/dist/in-store/resolve-relations.js +57 -0
  71. package/dist/in-store/resolve-relations.js.map +1 -0
  72. package/dist/in-store/resolve-source.d.ts.map +1 -1
  73. package/dist/in-store/resolve-source.js +20 -4
  74. package/dist/in-store/resolve-source.js.map +1 -1
  75. package/dist/in-store/schema-attributes.d.ts +28 -0
  76. package/dist/in-store/schema-attributes.d.ts.map +1 -0
  77. package/dist/in-store/schema-attributes.js +95 -0
  78. package/dist/in-store/schema-attributes.js.map +1 -0
  79. package/dist/in-store/spatial-zone.d.ts.map +1 -1
  80. package/dist/in-store/spatial-zone.js +5 -5
  81. package/dist/in-store/spatial-zone.js.map +1 -1
  82. package/dist/in-store/wall.d.ts.map +1 -1
  83. package/dist/in-store/wall.js +4 -14
  84. package/dist/in-store/wall.js.map +1 -1
  85. package/dist/in-store/window.d.ts +7 -0
  86. package/dist/in-store/window.d.ts.map +1 -1
  87. package/dist/in-store/window.js +24 -17
  88. package/dist/in-store/window.js.map +1 -1
  89. package/dist/index.d.ts +12 -2
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +6 -0
  92. package/dist/index.js.map +1 -1
  93. package/dist/landxml/cant-superelevation.d.ts +28 -0
  94. package/dist/landxml/cant-superelevation.d.ts.map +1 -0
  95. package/dist/landxml/cant-superelevation.js +31 -0
  96. package/dist/landxml/cant-superelevation.js.map +1 -0
  97. package/dist/landxml/landxml-to-ifc.d.ts +8 -2
  98. package/dist/landxml/landxml-to-ifc.d.ts.map +1 -1
  99. package/dist/landxml/landxml-to-ifc.js +42 -4
  100. package/dist/landxml/landxml-to-ifc.js.map +1 -1
  101. package/dist/landxml/profile-geometry.d.ts +50 -0
  102. package/dist/landxml/profile-geometry.d.ts.map +1 -0
  103. package/dist/landxml/profile-geometry.js +221 -0
  104. package/dist/landxml/profile-geometry.js.map +1 -0
  105. package/dist/landxml/profile-mapping.d.ts +36 -0
  106. package/dist/landxml/profile-mapping.d.ts.map +1 -0
  107. package/dist/landxml/profile-mapping.js +181 -0
  108. package/dist/landxml/profile-mapping.js.map +1 -0
  109. package/dist/landxml/profile-record.d.ts +46 -0
  110. package/dist/landxml/profile-record.d.ts.map +1 -0
  111. package/dist/landxml/profile-record.js +38 -0
  112. package/dist/landxml/profile-record.js.map +1 -0
  113. package/dist/landxml/refusals.d.ts +5 -1
  114. package/dist/landxml/refusals.d.ts.map +1 -1
  115. package/dist/landxml/refusals.js +36 -8
  116. package/dist/landxml/refusals.js.map +1 -1
  117. package/dist/landxml/result-types.d.ts +49 -0
  118. package/dist/landxml/result-types.d.ts.map +1 -1
  119. package/dist/landxml/station-equations.d.ts +69 -0
  120. package/dist/landxml/station-equations.d.ts.map +1 -0
  121. package/dist/landxml/station-equations.js +140 -0
  122. package/dist/landxml/station-equations.js.map +1 -0
  123. package/dist/landxml/writers.d.ts +7 -1
  124. package/dist/landxml/writers.d.ts.map +1 -1
  125. package/dist/landxml/writers.js +22 -3
  126. package/dist/landxml/writers.js.map +1 -1
  127. package/dist/types.d.ts +13 -9
  128. package/dist/types.d.ts.map +1 -1
  129. package/package.json +8 -7
@@ -0,0 +1,35 @@
1
+ import { type HorizontalSegment } from './landxml/alignment-mapping.js';
2
+ /** One station equation (§14.1): all lengths in the file's length unit. */
3
+ export interface StationEquationParams {
4
+ /** Distance along the alignment's basis curve from its start. */
5
+ DistanceAlong: number;
6
+ /** `Pset_Stationing.Station` — the station from here on. */
7
+ Station: number;
8
+ /** `Pset_Stationing.IncomingStation` — the station arriving here. */
9
+ IncomingStation: number;
10
+ /** `Pset_Stationing.HasIncreasingStation`; omitted when `null` or absent. */
11
+ HasIncreasingStation?: boolean | null;
12
+ /** GlobalId seed role; defaults to `station-equation:<n>` (1-based). */
13
+ Role?: string;
14
+ }
15
+ export interface StationingContext {
16
+ emit: (type: string, attrs: string) => number;
17
+ ownerRef: string;
18
+ guid: (role: string) => string;
19
+ }
20
+ export interface StationingParams {
21
+ alignmentId: number;
22
+ compositeCurveId: number;
23
+ segments: readonly HorizontalSegment[];
24
+ startStation: number;
25
+ equations: readonly StationEquationParams[];
26
+ }
27
+ /** `0+123.456` — kilometres and metres, the usual stationing label. */
28
+ export declare function stationLabel(station: number): string;
29
+ /**
30
+ * Write the start referent (distance 0) and one referent per station
31
+ * equation, nest them under the alignment in order along it, and position
32
+ * the alignment by the start referent. Returns the referent ids, start first.
33
+ */
34
+ export declare function emitStationing(params: StationingParams, ctx: StationingContext): number[];
35
+ //# sourceMappingURL=ifc-creator-alignment-referents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ifc-creator-alignment-referents.d.ts","sourceRoot":"","sources":["../src/ifc-creator-alignment-referents.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEzF,2EAA2E;AAC3E,MAAM,WAAW,qBAAqB;IACpC,iEAAiE;IACjE,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,eAAe,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,oBAAoB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACtC,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,SAAS,qBAAqB,EAAE,CAAC;CAC7C;AAED,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMpD;AAmDD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAoCzF"}
@@ -0,0 +1,89 @@
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
+ * An alignment's stationing: `IfcReferent`s / `.STATION.` carrying
6
+ * `Pset_Stationing`, nested under the alignment in order along it (mapping
7
+ * spec §11.1, §14).
8
+ *
9
+ * Each referent is placed the way IfcOpenShell 0.8.5's
10
+ * `add_stationing_referent` places one: an `IfcLinearPlacement` whose
11
+ * `IfcPointByDistanceExpression` measures `DistanceAlong` on the alignment's
12
+ * own composite curve, with the evaluated point and tangent as its
13
+ * `CartesianPosition`.
14
+ */
15
+ import { esc, num } from './ifc-creator-math.js';
16
+ import { evaluateSegment } from './landxml/alignment-mapping.js';
17
+ /** `0+123.456` — kilometres and metres, the usual stationing label. */
18
+ export function stationLabel(station) {
19
+ const sign = station < 0 ? '-' : '';
20
+ const abs = Math.abs(station);
21
+ const km = Math.floor(abs / 1000);
22
+ const m = (abs - km * 1000).toFixed(3).padStart(7, '0');
23
+ return `${sign}${km}+${m}`;
24
+ }
25
+ /** Point and tangent direction at `distance` along the layout's segments. */
26
+ function pointAlong(segments, distance) {
27
+ let remaining = distance;
28
+ for (let index = 0; index < segments.length; index += 1) {
29
+ const segment = segments[index];
30
+ if (remaining <= segment.length || index === segments.length - 1) {
31
+ return evaluateSegment(segment.start, segment.direction, segment.startCurvature, segment.endCurvature, segment.length, Math.min(remaining, segment.length));
32
+ }
33
+ remaining -= segment.length;
34
+ }
35
+ throw new Error('addAlignment: cannot place a referent on an alignment with no segments');
36
+ }
37
+ function linearPlacement(ctx, compositeCurveId, distance, at) {
38
+ const along = ctx.emit('IFCPOINTBYDISTANCEEXPRESSION', `IFCLENGTHMEASURE(${num(distance)}),$,$,$,#${compositeCurveId}`);
39
+ const linear = ctx.emit('IFCAXIS2PLACEMENTLINEAR', `#${along},$,$`);
40
+ const point = ctx.emit('IFCCARTESIANPOINT', `(${num(at.point[0])},${num(at.point[1])},0.)`);
41
+ const up = ctx.emit('IFCDIRECTION', '(0.,0.,1.)');
42
+ const ahead = ctx.emit('IFCDIRECTION', `(${num(Math.cos(at.direction))},${num(Math.sin(at.direction))},0.)`);
43
+ const cartesian = ctx.emit('IFCAXIS2PLACEMENT3D', `#${point},#${up},#${ahead}`);
44
+ return ctx.emit('IFCLINEARPLACEMENT', `$,#${linear},#${cartesian}`);
45
+ }
46
+ function stationReferent(ctx, placement, station, roles, extra = []) {
47
+ const referentId = ctx.emit('IFCREFERENT', `'${ctx.guid(roles.referent)}',${ctx.ownerRef},'${esc(stationLabel(station))}',$,$,#${placement},$,.STATION.`);
48
+ const properties = [
49
+ ctx.emit('IFCPROPERTYSINGLEVALUE', `'Station',$,IFCLENGTHMEASURE(${num(station)}),$`),
50
+ ...extra.map((attrs) => ctx.emit('IFCPROPERTYSINGLEVALUE', attrs)),
51
+ ];
52
+ const pset = ctx.emit('IFCPROPERTYSET', `'${ctx.guid(roles.pset)}',${ctx.ownerRef},'Pset_Stationing',$,(${properties.map((id) => `#${id}`).join(',')})`);
53
+ ctx.emit('IFCRELDEFINESBYPROPERTIES', `'${ctx.guid(roles.rel)}',${ctx.ownerRef},$,$,(#${referentId}),#${pset}`);
54
+ return referentId;
55
+ }
56
+ /**
57
+ * Write the start referent (distance 0) and one referent per station
58
+ * equation, nest them under the alignment in order along it, and position
59
+ * the alignment by the start referent. Returns the referent ids, start first.
60
+ */
61
+ export function emitStationing(params, ctx) {
62
+ const first = params.segments[0];
63
+ const startPlacement = linearPlacement(ctx, params.compositeCurveId, 0, { point: first.start, direction: first.direction });
64
+ const startId = stationReferent(ctx, startPlacement, params.startStation, {
65
+ referent: 'referent:start', pset: 'pset:stationing', rel: 'rel:stationing',
66
+ });
67
+ let previous = 0;
68
+ const equationIds = params.equations.map((equation, index) => {
69
+ if (!(equation.DistanceAlong > previous)) {
70
+ throw new Error(`addAlignment: station equation ${index + 1} is at ${equation.DistanceAlong} along the alignment, `
71
+ + 'not after the previous referent; referents are nested in order along it');
72
+ }
73
+ previous = equation.DistanceAlong;
74
+ const role = equation.Role ?? `station-equation:${index + 1}`;
75
+ const placement = linearPlacement(ctx, params.compositeCurveId, equation.DistanceAlong, pointAlong(params.segments, equation.DistanceAlong));
76
+ const extra = [`'IncomingStation',$,IFCLENGTHMEASURE(${num(equation.IncomingStation)}),$`];
77
+ if (equation.HasIncreasingStation !== null && equation.HasIncreasingStation !== undefined) {
78
+ extra.push(`'HasIncreasingStation',$,IFCBOOLEAN(${equation.HasIncreasingStation ? '.T.' : '.F.'}),$`);
79
+ }
80
+ return stationReferent(ctx, placement, equation.Station, {
81
+ referent: role, pset: `${role}:pset`, rel: `${role}:rel`,
82
+ }, extra);
83
+ });
84
+ const referents = [startId, ...equationIds];
85
+ ctx.emit('IFCRELNESTS', `'${ctx.guid('nests:referents')}',${ctx.ownerRef},$,$,#${params.alignmentId},(${referents.map((id) => `#${id}`).join(',')})`);
86
+ ctx.emit('IFCRELPOSITIONS', `'${ctx.guid('positions')}',${ctx.ownerRef},$,$,#${startId},(#${params.alignmentId})`);
87
+ return referents;
88
+ }
89
+ //# sourceMappingURL=ifc-creator-alignment-referents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ifc-creator-alignment-referents.js","sourceRoot":"","sources":["../src/ifc-creator-alignment-referents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { type VerticalSegment } from './landxml/profile-geometry.js';
2
+ /** The creator hooks this emitter needs (a subset of `AlignmentContext`). */
3
+ export interface VerticalContext {
4
+ emit: (type: string, attrs: string) => number;
5
+ ownerRef: string;
6
+ }
7
+ /** A vertical layout for `AlignmentParams.Vertical`. Distances and heights in metres. */
8
+ export interface AlignmentVerticalParams {
9
+ Name?: string;
10
+ GlobalId?: string;
11
+ /** In order along the alignment; the zero-length terminator is added here. */
12
+ Segments: readonly VerticalSegment[];
13
+ }
14
+ /**
15
+ * Arc length of `A + Bx + Cx²` over `[0, L]`.
16
+ *
17
+ * IfcOpenShell's `_polynomial_length` closed form, where it is well
18
+ * conditioned. Its terms grow like `1/C` and cancel, so as `C·L` shrinks the
19
+ * result loses digits (1e-9 relative by `C·L = 1e-7`) and at `C ≈ 1e-19`
20
+ * returns 0 for an 80 m curve (#5930 review). Below `|C·L| = 1e-5` — where the
21
+ * closed form is still good to ~1e-11 — the nearly constant integrand
22
+ * `sqrt(1 + (B + 2Cx)²)` is integrated by Simpson's rule instead, exact to
23
+ * rounding for so gentle a curve.
24
+ */
25
+ export declare function polynomialLength(B: number, C: number, L: number): number;
26
+ /**
27
+ * The `IfcGradientCurve` over `compositeCurveId`, one curve segment per layout
28
+ * segment, the last `DISCONTINUOUS` (`IfcCompositeCurve.CurveContinuous`).
29
+ */
30
+ export declare function emitGradientCurve(ctx: VerticalContext, params: AlignmentVerticalParams, compositeCurveId: number): number;
31
+ /**
32
+ * The semantic layout: `IfcAlignmentVertical` and its segments, nested in
33
+ * order. The caller nests the layout itself under the alignment, beside the
34
+ * horizontal one.
35
+ */
36
+ export declare function emitVerticalLayout(ctx: VerticalContext, params: AlignmentVerticalParams, guid: (role: string) => string): {
37
+ verticalId: number;
38
+ segmentIds: number[];
39
+ };
40
+ //# sourceMappingURL=ifc-creator-alignment-vertical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ifc-creator-alignment-vertical.d.ts","sourceRoot":"","sources":["../src/ifc-creator-alignment-vertical.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEvF,6EAA6E;AAC7E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,yFAAyF;AACzF,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;CACtC;AAyBD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAuBxE;AA4FD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAMzH;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GACpF;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAgB9C"}
@@ -0,0 +1,182 @@
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
+ * `IfcAlignmentVertical` emitter (mapping spec §12) — the vertical half of an
6
+ * `IfcAlignment`, called from `emitAlignment`.
7
+ *
8
+ * Writes both halves IFC 4.3 defines: the semantic layout (`IfcAlignmentVertical`
9
+ * nesting `IfcAlignmentSegment`s) and the geometry (`IfcGradientCurve` over the
10
+ * horizontal `IfcCompositeCurve`). Each `IfcCurveSegment` follows IfcOpenShell
11
+ * 0.8.5's `_map_alignment_vertical_segment` exactly, computed from the design
12
+ * parameters alone, so the geometry is the one a consumer derives from the
13
+ * semantics.
14
+ */
15
+ import { esc, num } from './ifc-creator-math.js';
16
+ import { ALIGNMENT_POSITION_TOLERANCE_M } from './landxml/alignment-mapping.js';
17
+ import { evaluateVertical } from './landxml/profile-geometry.js';
18
+ const allclose = (a, b) => Math.abs(a - b) <= 1e-8 + 1e-5 * Math.abs(b);
19
+ /** Curvature of the distance/height curve: `y'' / (1 + y'²)^1.5` for a parabola. */
20
+ function curvature(segment, x) {
21
+ if (segment.type === 'CONSTANTGRADIENT' || segment.horizontalLength === 0)
22
+ return 0;
23
+ if (segment.type === 'CIRCULARARC')
24
+ return 1 / (segment.radiusOfCurvature ?? Infinity);
25
+ const g = evaluateVertical(segment, x).gradient;
26
+ const second = (segment.endGradient - segment.startGradient) / segment.horizontalLength;
27
+ return second / (1 + g * g) ** 1.5;
28
+ }
29
+ function transitionCode(segment, next) {
30
+ const end = evaluateVertical(segment, segment.horizontalLength);
31
+ const samePosition = Math.abs(segment.startDistAlong + segment.horizontalLength - next.startDistAlong) <= ALIGNMENT_POSITION_TOLERANCE_M
32
+ && Math.abs(end.height - next.startHeight) <= ALIGNMENT_POSITION_TOLERANCE_M;
33
+ if (!samePosition)
34
+ return '.DISCONTINUOUS.';
35
+ const a = Math.atan(end.gradient);
36
+ const b = Math.atan(next.startGradient);
37
+ if (!(allclose(Math.cos(a), Math.cos(b)) && allclose(Math.sin(a), Math.sin(b))))
38
+ return '.CONTINUOUS.';
39
+ return allclose(curvature(segment, segment.horizontalLength), curvature(next, 0))
40
+ ? '.CONTSAMEGRADIENTSAMECURVATURE.' : '.CONTSAMEGRADIENT.';
41
+ }
42
+ /**
43
+ * Arc length of `A + Bx + Cx²` over `[0, L]`.
44
+ *
45
+ * IfcOpenShell's `_polynomial_length` closed form, where it is well
46
+ * conditioned. Its terms grow like `1/C` and cancel, so as `C·L` shrinks the
47
+ * result loses digits (1e-9 relative by `C·L = 1e-7`) and at `C ≈ 1e-19`
48
+ * returns 0 for an 80 m curve (#5930 review). Below `|C·L| = 1e-5` — where the
49
+ * closed form is still good to ~1e-11 — the nearly constant integrand
50
+ * `sqrt(1 + (B + 2Cx)²)` is integrated by Simpson's rule instead, exact to
51
+ * rounding for so gentle a curve.
52
+ */
53
+ export function polynomialLength(B, C, L) {
54
+ if (Math.abs(C * L) < 1e-5) {
55
+ const steps = 64;
56
+ const h = L / steps;
57
+ let sum = 0;
58
+ for (let i = 0; i <= steps; i += 1) {
59
+ const weight = i === 0 || i === steps ? 1 : i % 2 === 1 ? 4 : 2;
60
+ const slope = B + 2 * C * i * h;
61
+ sum += weight * Math.sqrt(1 + slope * slope);
62
+ }
63
+ return (sum * h) / 3;
64
+ }
65
+ const a = 4 * C * C;
66
+ const b = 4 * B * C;
67
+ const c = B * B + 1;
68
+ const fn = (x) => {
69
+ const v1 = (b + 2 * a * x) / (4 * a);
70
+ const v2 = Math.sqrt(a * x * x + b * x + c);
71
+ const v3 = (4 * a * c - b * b) / (8 * a ** 1.5);
72
+ const v4 = Math.log(Math.abs(2 * a * x + b + 2 * Math.sqrt(a * (a * x * x + b * x + c))));
73
+ return v1 * v2 + v3 * v4;
74
+ };
75
+ return fn(L) - fn(0);
76
+ }
77
+ function point2d(ctx, x, y) {
78
+ return ctx.emit('IFCCARTESIANPOINT', `(${num(x)},${num(y)})`);
79
+ }
80
+ function direction2d(ctx, x, y) {
81
+ return ctx.emit('IFCDIRECTION', `(${num(x)},${num(y)})`);
82
+ }
83
+ /** `IfcCurveSegment` for one vertical segment — IfcOpenShell's mapping, term for term. */
84
+ function curveSegment(ctx, segment, transition) {
85
+ const { startDistAlong: d, horizontalLength: L, startHeight: h, startGradient: g0, endGradient: g1 } = segment;
86
+ const placement = ctx.emit('IFCAXIS2PLACEMENT2D', `#${point2d(ctx, d, h)},#${direction2d(ctx, Math.cos(Math.atan(g0)), Math.sin(Math.atan(g0)))}`);
87
+ let parent;
88
+ let segmentStart = 0;
89
+ let segmentLength;
90
+ if (segment.type === 'CONSTANTGRADIENT') {
91
+ const vector = ctx.emit('IFCVECTOR', `#${direction2d(ctx, 1, 0)},1.`);
92
+ parent = ctx.emit('IFCLINE', `#${point2d(ctx, 0, 0)},#${vector}`);
93
+ segmentLength = L / Math.cos(Math.atan(g0));
94
+ }
95
+ else if (segment.type === 'PARABOLICARC') {
96
+ const C = (g1 - g0) / (2 * L);
97
+ const position = ctx.emit('IFCAXIS2PLACEMENT2D', `#${point2d(ctx, 0, 0)},#${direction2d(ctx, 1, 0)}`);
98
+ parent = ctx.emit('IFCPOLYNOMIALCURVE', `#${position},(0.,1.),(${num(h)},${num(g0)},${num(C)}),$`);
99
+ segmentLength = polynomialLength(g0, C, L);
100
+ }
101
+ else {
102
+ let startAngle = Math.atan(g0);
103
+ let endAngle = Math.atan(g1);
104
+ let radius;
105
+ let x;
106
+ let y;
107
+ if (startAngle < endAngle) {
108
+ radius = L / (Math.sin(endAngle) - Math.sin(startAngle));
109
+ x = -radius * Math.sin(startAngle);
110
+ y = radius * Math.cos(startAngle);
111
+ startAngle += (3 * Math.PI) / 2;
112
+ endAngle += (3 * Math.PI) / 2;
113
+ }
114
+ else {
115
+ radius = L / (Math.sin(startAngle) - Math.sin(endAngle));
116
+ x = radius * Math.sin(startAngle);
117
+ y = -radius * Math.cos(startAngle);
118
+ startAngle += Math.PI / 2;
119
+ endAngle += Math.PI / 2;
120
+ }
121
+ const position = ctx.emit('IFCAXIS2PLACEMENT2D', `#${point2d(ctx, x, y)},#${direction2d(ctx, 1, 0)}`);
122
+ parent = ctx.emit('IFCCIRCLE', `#${position},${num(radius)}`);
123
+ segmentStart = radius * startAngle;
124
+ segmentLength = radius * (endAngle - startAngle);
125
+ }
126
+ return ctx.emit('IFCCURVESEGMENT', `${transition},#${placement},IFCLENGTHMEASURE(${num(segmentStart)}),IFCLENGTHMEASURE(${num(segmentLength)}),#${parent}`);
127
+ }
128
+ /** The zero-length `CONSTANTGRADIENT` IFC 4.3 requires at the end of every layout. */
129
+ function terminator(last) {
130
+ const end = evaluateVertical(last, last.horizontalLength);
131
+ return {
132
+ sourceId: `${last.sourceId}:end`, type: 'CONSTANTGRADIENT',
133
+ startDistAlong: last.startDistAlong + last.horizontalLength, horizontalLength: 0,
134
+ startHeight: end.height, startGradient: end.gradient, endGradient: end.gradient, radiusOfCurvature: null,
135
+ };
136
+ }
137
+ function layoutOf(params) {
138
+ if (params.Segments.length === 0) {
139
+ throw new Error('addAlignment: Vertical.Segments is empty — a vertical layout needs at least one segment');
140
+ }
141
+ // As `emitAlignment` does for the horizontal: a gap would be a mid-curve
142
+ // `.DISCONTINUOUS.`, which `IfcCompositeCurve.CurveContinuous` forbids for an
143
+ // open curve (exactly one, the last).
144
+ params.Segments.slice(1).forEach((next, index) => {
145
+ const previous = params.Segments[index];
146
+ const end = evaluateVertical(previous, previous.horizontalLength);
147
+ const distGap = Math.abs(previous.startDistAlong + previous.horizontalLength - next.startDistAlong);
148
+ const heightGap = Math.abs(end.height - next.startHeight);
149
+ if (distGap > ALIGNMENT_POSITION_TOLERANCE_M || heightGap > ALIGNMENT_POSITION_TOLERANCE_M) {
150
+ throw new Error(`addAlignment: vertical segment ${index + 2} starts ${distGap.toFixed(3)} m along and `
151
+ + `${heightGap.toFixed(3)} m in height from where segment ${index + 1} ends; `
152
+ + 'an open IfcGradientCurve may be discontinuous only at its last segment');
153
+ }
154
+ });
155
+ return [...params.Segments, terminator(params.Segments[params.Segments.length - 1])];
156
+ }
157
+ /**
158
+ * The `IfcGradientCurve` over `compositeCurveId`, one curve segment per layout
159
+ * segment, the last `DISCONTINUOUS` (`IfcCompositeCurve.CurveContinuous`).
160
+ */
161
+ export function emitGradientCurve(ctx, params, compositeCurveId) {
162
+ const layout = layoutOf(params);
163
+ const segments = layout.map((segment, index) => curveSegment(ctx, segment, index === layout.length - 1 ? '.DISCONTINUOUS.' : transitionCode(segment, layout[index + 1])));
164
+ return ctx.emit('IFCGRADIENTCURVE', `(${segments.map((id) => `#${id}`).join(',')}),.F.,#${compositeCurveId},$`);
165
+ }
166
+ /**
167
+ * The semantic layout: `IfcAlignmentVertical` and its segments, nested in
168
+ * order. The caller nests the layout itself under the alignment, beside the
169
+ * horizontal one.
170
+ */
171
+ export function emitVerticalLayout(ctx, params, guid) {
172
+ const verticalId = ctx.emit('IFCALIGNMENTVERTICAL', `'${params.GlobalId ?? guid('vertical')}',${ctx.ownerRef},${params.Name !== undefined ? `'${esc(params.Name)}'` : '$'},$,$,$,$`);
173
+ const segmentIds = layoutOf(params).map((segment, index) => {
174
+ const design = ctx.emit('IFCALIGNMENTVERTICALSEGMENT', `$,$,${num(segment.startDistAlong)},${num(segment.horizontalLength)},${num(segment.startHeight)},`
175
+ + `${num(segment.startGradient)},${num(segment.endGradient)},`
176
+ + `${segment.radiusOfCurvature === null ? '$' : num(segment.radiusOfCurvature)},.${segment.type}.`);
177
+ return ctx.emit('IFCALIGNMENTSEGMENT', `'${guid(`vertical:segment:${index}`)}',${ctx.ownerRef},$,$,$,$,$,#${design}`);
178
+ });
179
+ ctx.emit('IFCRELNESTS', `'${guid('nests:vertical-segments')}',${ctx.ownerRef},$,$,#${verticalId},(${segmentIds.map((id) => `#${id}`).join(',')})`);
180
+ return { verticalId, segmentIds };
181
+ }
182
+ //# sourceMappingURL=ifc-creator-alignment-vertical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ifc-creator-alignment-vertical.js","sourceRoot":"","sources":["../src/ifc-creator-alignment-vertical.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import { type HorizontalSegment } from './landxml/alignment-mapping.js';
2
+ import { type AlignmentVerticalParams } from './ifc-creator-alignment-vertical.js';
3
+ import { type StationEquationParams } from './ifc-creator-alignment-referents.js';
2
4
  /** The creator hooks this emitter needs. */
3
5
  export interface AlignmentContext {
4
6
  emit: (type: string, attrs: string) => number;
@@ -15,6 +17,14 @@ export interface AlignmentParams {
15
17
  /** Station at distance 0, metres — written to the start referent's `Pset_Stationing`. */
16
18
  StartStation: number;
17
19
  Segments: readonly HorizontalSegment[];
20
+ /**
21
+ * The vertical layout (mapping spec §12). When present the alignment also
22
+ * gets an `IfcAlignmentVertical` and an `IfcGradientCurve` 'Axis'
23
+ * representation, and the composite curve moves to 'FootPrint'.
24
+ */
25
+ Vertical?: AlignmentVerticalParams;
26
+ /** Station equations (§14), in order along the alignment; each becomes an `IfcReferent`. */
27
+ StationEquations?: readonly StationEquationParams[];
18
28
  /** Deterministic GlobalId seed for this alignment's owned entities. */
19
29
  guidFor?: (role: string) => string;
20
30
  }
@@ -25,6 +35,11 @@ export interface AlignmentResult {
25
35
  /** `IfcAlignmentSegment` ids in order, including the terminating one. */
26
36
  segmentIds: number[];
27
37
  referentId: number;
38
+ /** Present when `Vertical` was given. */
39
+ verticalId?: number;
40
+ gradientCurveId?: number;
41
+ /** One `IfcReferent` per station equation, in order along the alignment. */
42
+ equationReferentIds: number[];
28
43
  }
29
44
  export declare function emitAlignment(params: AlignmentParams, ctx: AlignmentContext): AlignmentResult;
30
45
  //# sourceMappingURL=ifc-creator-alignment.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ifc-creator-alignment.d.ts","sourceRoot":"","sources":["../src/ifc-creator-alignment.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAkC,KAAK,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAExG,4CAA4C;AAC5C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,cAAc,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACvC,uEAAuE;IACvE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AA6HD,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,gBAAgB,GAAG,eAAe,CA6D7F"}
1
+ {"version":3,"file":"ifc-creator-alignment.d.ts","sourceRoot":"","sources":["../src/ifc-creator-alignment.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAkC,KAAK,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACxG,OAAO,EAAyC,KAAK,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC1H,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAElG,4CAA4C;AAC5C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,cAAc,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACvC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,4FAA4F;IAC5F,gBAAgB,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACpD,uEAAuE;IACvE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4EAA4E;IAC5E,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAoHD,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,gBAAgB,GAAG,eAAe,CA8D7F"}
@@ -2,7 +2,8 @@
2
2
  * License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
4
  /**
5
- * `IfcAlignment` emitter — horizontal layout only (mapping spec §11).
5
+ * `IfcAlignment` emitter — horizontal layout (mapping spec §11), plus the
6
+ * vertical layout from `ifc-creator-alignment-vertical.ts` when given (§12).
6
7
  *
7
8
  * Writes BOTH halves IFC 4.3 defines for an alignment: the semantic layout
8
9
  * (`IfcAlignmentHorizontal` nesting `IfcAlignmentSegment`s) and the geometry
@@ -17,6 +18,8 @@
17
18
  */
18
19
  import { esc, num } from './ifc-creator-math.js';
19
20
  import { ALIGNMENT_POSITION_TOLERANCE_M } from './landxml/alignment-mapping.js';
21
+ import { emitGradientCurve, emitVerticalLayout } from './ifc-creator-alignment-vertical.js';
22
+ import { emitStationing } from './ifc-creator-alignment-referents.js';
20
23
  /**
21
24
  * Direction and curvature equality for the transition code use the
22
25
  * `numpy.allclose` defaults, as IfcOpenShell's
@@ -119,14 +122,6 @@ function terminator(last) {
119
122
  endCurvature: 0,
120
123
  };
121
124
  }
122
- /** `0+123.456` — kilometres and metres, the usual stationing label. */
123
- function stationLabel(station) {
124
- const sign = station < 0 ? '-' : '';
125
- const abs = Math.abs(station);
126
- const km = Math.floor(abs / 1000);
127
- const m = (abs - km * 1000).toFixed(3).padStart(7, '0');
128
- return `${sign}${km}+${m}`;
129
- }
130
125
  export function emitAlignment(params, ctx) {
131
126
  if (params.Segments.length === 0) {
132
127
  throw new Error('addAlignment: Segments is empty — an alignment needs at least one horizontal segment');
@@ -145,30 +140,34 @@ export function emitAlignment(params, ctx) {
145
140
  // `IfcCompositeCurve.CurveContinuous` requires exactly one for an open curve.
146
141
  const curveSegments = layout.map((segment, index) => curveSegment(ctx, segment, index === layout.length - 1 ? '.DISCONTINUOUS.' : transitionCode(segment, layout[index + 1])));
147
142
  const compositeCurveId = ctx.emit('IFCCOMPOSITECURVE', `(${curveSegments.map((id) => `#${id}`).join(',')}),.F.`);
148
- const representation = ctx.emit('IFCSHAPEREPRESENTATION', `${ctx.axisContextRef},'Axis','Curve2D',(#${compositeCurveId})`);
149
- const shape = ctx.emit('IFCPRODUCTDEFINITIONSHAPE', `$,$,(#${representation})`);
143
+ // With a vertical layout: the composite curve as 'FootPrint' first, the
144
+ // gradient curve as 'Axis' — IfcOpenShell's horizontal + vertical case (§12.1).
145
+ const gradientCurveId = params.Vertical ? emitGradientCurve(ctx, params.Vertical, compositeCurveId) : undefined;
146
+ const representations = gradientCurveId === undefined
147
+ ? [ctx.emit('IFCSHAPEREPRESENTATION', `${ctx.axisContextRef},'Axis','Curve2D',(#${compositeCurveId})`)]
148
+ : [
149
+ ctx.emit('IFCSHAPEREPRESENTATION', `${ctx.axisContextRef},'FootPrint','Curve2D',(#${compositeCurveId})`),
150
+ ctx.emit('IFCSHAPEREPRESENTATION', `${ctx.axisContextRef},'Axis','Curve3D',(#${gradientCurveId})`),
151
+ ];
152
+ const shape = ctx.emit('IFCPRODUCTDEFINITIONSHAPE', `$,$,(${representations.map((id) => `#${id}`).join(',')})`);
150
153
  const alignmentId = ctx.emit('IFCALIGNMENT', `'${params.GlobalId ?? guid('alignment')}',${ctx.ownerRef},'${esc(params.Name)}',$,$,${ctx.placementRef},#${shape},$`);
151
154
  // Semantics: horizontal layout nested under the alignment, segments nested
152
155
  // in order under the layout.
153
156
  const horizontalId = ctx.emit('IFCALIGNMENTHORIZONTAL', `'${guid('horizontal')}',${ctx.ownerRef},$,$,$,$,$`);
154
- ctx.emit('IFCRELNESTS', `'${guid('nests:layouts')}',${ctx.ownerRef},$,$,#${alignmentId},(#${horizontalId})`);
157
+ const vertical = params.Vertical ? emitVerticalLayout(ctx, params.Vertical, guid) : undefined;
158
+ const layouts = vertical ? `#${horizontalId},#${vertical.verticalId}` : `#${horizontalId}`;
159
+ ctx.emit('IFCRELNESTS', `'${guid('nests:layouts')}',${ctx.ownerRef},$,$,#${alignmentId},(${layouts})`);
155
160
  const segmentIds = layout.map((segment, index) => ctx.emit('IFCALIGNMENTSEGMENT', `'${guid(`segment:${index}`)}',${ctx.ownerRef},$,$,$,$,$,#${designParameters(ctx, segment)}`));
156
161
  ctx.emit('IFCRELNESTS', `'${guid('nests:segments')}',${ctx.ownerRef},$,$,#${horizontalId},(${segmentIds.map((id) => `#${id}`).join(',')})`);
157
- // Stationing: an IfcReferent at distance 0 along the alignment's own curve.
158
- const first = params.Segments[0];
159
- const along = ctx.emit('IFCPOINTBYDISTANCEEXPRESSION', `IFCLENGTHMEASURE(0.),$,$,$,#${compositeCurveId}`);
160
- const linear = ctx.emit('IFCAXIS2PLACEMENTLINEAR', `#${along},$,$`);
161
- const at = ctx.emit('IFCCARTESIANPOINT', `(${num(first.start[0])},${num(first.start[1])},0.)`);
162
- const up = ctx.emit('IFCDIRECTION', '(0.,0.,1.)');
163
- const ahead = ctx.emit('IFCDIRECTION', `(${num(Math.cos(first.direction))},${num(Math.sin(first.direction))},0.)`);
164
- const cartesian = ctx.emit('IFCAXIS2PLACEMENT3D', `#${at},#${up},#${ahead}`);
165
- const placement = ctx.emit('IFCLINEARPLACEMENT', `$,#${linear},#${cartesian}`);
166
- const referentId = ctx.emit('IFCREFERENT', `'${guid('referent:start')}',${ctx.ownerRef},'${stationLabel(params.StartStation)}',$,$,#${placement},$,.STATION.`);
167
- const station = ctx.emit('IFCPROPERTYSINGLEVALUE', `'Station',$,IFCLENGTHMEASURE(${num(params.StartStation)}),$`);
168
- const pset = ctx.emit('IFCPROPERTYSET', `'${guid('pset:stationing')}',${ctx.ownerRef},'Pset_Stationing',$,(#${station})`);
169
- ctx.emit('IFCRELDEFINESBYPROPERTIES', `'${guid('rel:stationing')}',${ctx.ownerRef},$,$,(#${referentId}),#${pset}`);
170
- ctx.emit('IFCRELNESTS', `'${guid('nests:referents')}',${ctx.ownerRef},$,$,#${alignmentId},(#${referentId})`);
171
- ctx.emit('IFCRELPOSITIONS', `'${guid('positions')}',${ctx.ownerRef},$,$,#${referentId},(#${alignmentId})`);
172
- return { alignmentId, horizontalId, compositeCurveId, segmentIds, referentId };
162
+ // Stationing (§11.1, §14): the start referent, then one per station
163
+ // equation, nested in order along the alignment.
164
+ const [referentId, ...equationReferentIds] = emitStationing({
165
+ alignmentId, compositeCurveId, segments: params.Segments, startStation: params.StartStation,
166
+ equations: params.StationEquations ?? [],
167
+ }, { emit: ctx.emit, ownerRef: ctx.ownerRef, guid });
168
+ return {
169
+ alignmentId, horizontalId, compositeCurveId, segmentIds, referentId, equationReferentIds,
170
+ ...(vertical ? { verticalId: vertical.verticalId, gradientCurveId } : {}),
171
+ };
173
172
  }
174
173
  //# sourceMappingURL=ifc-creator-alignment.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ifc-creator-alignment.js","sourceRoot":"","sources":["../src/ifc-creator-alignment.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ifc-creator-alignment.js","sourceRoot":"","sources":["../src/ifc-creator-alignment.ts"],"names":[],"mappings":"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"}
@@ -51,6 +51,26 @@ export declare function assertPositiveFinite(values: Record<string, number>, con
51
51
  export declare function assertFinitePoint3(points: Record<string, Point3D>, context: string): void;
52
52
  /** Cross product */
53
53
  export declare function vecCross(a: Point3D, b: Point3D): Point3D;
54
+ /**
55
+ * Complete an `IfcAxis2Placement3D` `Axis`/`RefDirection` pair (#5469).
56
+ *
57
+ * The schema rule `IfcAxis2Placement3D.AxisAndRefDirProvision` requires the two
58
+ * to be both present or both absent, so a placement that only rotates about Z
59
+ * (a `RefDirection` with no `Axis`) is invalid as written. Returns `undefined`
60
+ * when neither is given (the `$,$` form stays), otherwise both, with the
61
+ * missing one set to the value the schema implies for it when absent, so the
62
+ * placement's geometry is unchanged:
63
+ * - no `Axis`: `(0,0,1)`, the `IfcAxis2Placement3D.P` default;
64
+ * - no `RefDirection`: `firstProjAxis(Axis)`, the fill ifc-lite's renderer
65
+ * reads a `$` there as (world X projected onto the plane normal to
66
+ * `Axis`, per `IfcFirstProjAxis`; `(0,-1,0)` for an Axis of exactly -X,
67
+ * where the schema's projection vanishes). Writing that value keeps what
68
+ * is drawn identical to the `$` it replaces (#5922).
69
+ */
70
+ export declare function completePlacementAxes(axis: Point3D | undefined, refDirection: Point3D | undefined): {
71
+ Axis: Point3D;
72
+ RefDirection: Point3D;
73
+ } | undefined;
54
74
  /** Emit an optional STEP string: `'value'` when present, `$` otherwise. */
55
75
  export declare function optStr(v: string | undefined | null): string;
56
76
  /** Emit an optional STEP enum: `.VALUE.` when present, `$` otherwise. */
@@ -1 +1 @@
1
- {"version":3,"file":"ifc-creator-math.d.ts","sourceRoot":"","sources":["../src/ifc-creator-math.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAMpE,sCAAsC;AACtC,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvC;AAED,0CAA0C;AAC1C,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQrC;AAED,oBAAoB;AACpB,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAEzC;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,aAG5B,CAAC;AAEH,2FAA2F;AAC3F,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAI3C;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAM1F;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAMzF;AAED,oBAAoB;AACpB,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAMxD;AASD,2EAA2E;AAC3E,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAE3D;AAED,yEAAyE;AACzE,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAE5D;AAED,sDAAsD;AACtD,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAE7D;AAED,0DAA0D;AAC1D,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAE5D;AAED,sDAAsD;AACtD,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAE3D;AAED,sEAAsE;AACtE,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,CAE7C;AAED,kEAAkE;AAClE,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,CAI5D;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAgBhE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAY3D"}
1
+ {"version":3,"file":"ifc-creator-math.d.ts","sourceRoot":"","sources":["../src/ifc-creator-math.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAMpE,sCAAsC;AACtC,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvC;AAED,0CAA0C;AAC1C,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQrC;AAED,oBAAoB;AACpB,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAEzC;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,aAG5B,CAAC;AAEH,2FAA2F;AAC3F,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAI3C;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAM1F;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAMzF;AAED,oBAAoB;AACpB,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAMxD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,OAAO,GAAG,SAAS,EACzB,YAAY,EAAE,OAAO,GAAG,SAAS,GAChC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAMtD;AASD,2EAA2E;AAC3E,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAE3D;AAED,yEAAyE;AACzE,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAE5D;AAED,sDAAsD;AACtD,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAE7D;AAED,0DAA0D;AAC1D,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAE5D;AAED,sDAAsD;AACtD,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAE3D;AAED,sEAAsE;AACtE,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,CAE7C;AAED,kEAAkE;AAClE,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,CAI5D;AAwBD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CA8BhE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAY3D"}