@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.
- package/dist/ifc-creator-alignment-referents.d.ts +35 -0
- package/dist/ifc-creator-alignment-referents.d.ts.map +1 -0
- package/dist/ifc-creator-alignment-referents.js +89 -0
- package/dist/ifc-creator-alignment-referents.js.map +1 -0
- package/dist/ifc-creator-alignment-vertical.d.ts +40 -0
- package/dist/ifc-creator-alignment-vertical.d.ts.map +1 -0
- package/dist/ifc-creator-alignment-vertical.js +182 -0
- package/dist/ifc-creator-alignment-vertical.js.map +1 -0
- package/dist/ifc-creator-alignment.d.ts +15 -0
- package/dist/ifc-creator-alignment.d.ts.map +1 -1
- package/dist/ifc-creator-alignment.js +27 -28
- package/dist/ifc-creator-alignment.js.map +1 -1
- package/dist/ifc-creator-math.d.ts +20 -0
- package/dist/ifc-creator-math.d.ts.map +1 -1
- package/dist/ifc-creator-math.js +62 -3
- package/dist/ifc-creator-math.js.map +1 -1
- package/dist/ifc-creator.d.ts.map +1 -1
- package/dist/ifc-creator.js +3 -7
- package/dist/ifc-creator.js.map +1 -1
- package/dist/in-store/_emit-helpers.d.ts +2 -1
- package/dist/in-store/_emit-helpers.d.ts.map +1 -1
- package/dist/in-store/_emit-helpers.js +7 -7
- package/dist/in-store/_emit-helpers.js.map +1 -1
- package/dist/in-store/anchor.d.ts +25 -0
- package/dist/in-store/anchor.d.ts.map +1 -1
- package/dist/in-store/column.d.ts +8 -0
- package/dist/in-store/column.d.ts.map +1 -1
- package/dist/in-store/column.js +16 -9
- package/dist/in-store/column.js.map +1 -1
- package/dist/in-store/door.d.ts +10 -4
- package/dist/in-store/door.d.ts.map +1 -1
- package/dist/in-store/door.js +23 -17
- package/dist/in-store/door.js.map +1 -1
- package/dist/in-store/element-type.d.ts +40 -0
- package/dist/in-store/element-type.d.ts.map +1 -0
- package/dist/in-store/element-type.js +60 -0
- package/dist/in-store/element-type.js.map +1 -0
- package/dist/in-store/extract-walls.d.ts.map +1 -1
- package/dist/in-store/extract-walls.js +17 -15
- package/dist/in-store/extract-walls.js.map +1 -1
- package/dist/in-store/hosted-fill.d.ts +48 -0
- package/dist/in-store/hosted-fill.d.ts.map +1 -0
- package/dist/in-store/hosted-fill.js +58 -0
- package/dist/in-store/hosted-fill.js.map +1 -0
- package/dist/in-store/material.d.ts +62 -0
- package/dist/in-store/material.d.ts.map +1 -0
- package/dist/in-store/material.js +107 -0
- package/dist/in-store/material.js.map +1 -0
- package/dist/in-store/opening.d.ts +45 -0
- package/dist/in-store/opening.d.ts.map +1 -0
- package/dist/in-store/opening.js +104 -0
- package/dist/in-store/opening.js.map +1 -0
- package/dist/in-store/placement-frame.d.ts.map +1 -1
- package/dist/in-store/placement-frame.js +19 -4
- package/dist/in-store/placement-frame.js.map +1 -1
- package/dist/in-store/relate.d.ts +32 -0
- package/dist/in-store/relate.d.ts.map +1 -0
- package/dist/in-store/relate.js +39 -0
- package/dist/in-store/relate.js.map +1 -0
- package/dist/in-store/resolve-anchor.d.ts +21 -1
- package/dist/in-store/resolve-anchor.d.ts.map +1 -1
- package/dist/in-store/resolve-anchor.js +6 -2
- package/dist/in-store/resolve-anchor.js.map +1 -1
- package/dist/in-store/resolve-host.d.ts +5 -0
- package/dist/in-store/resolve-host.d.ts.map +1 -0
- package/dist/in-store/resolve-host.js +249 -0
- package/dist/in-store/resolve-host.js.map +1 -0
- package/dist/in-store/resolve-relations.d.ts +23 -0
- package/dist/in-store/resolve-relations.d.ts.map +1 -0
- package/dist/in-store/resolve-relations.js +57 -0
- package/dist/in-store/resolve-relations.js.map +1 -0
- package/dist/in-store/resolve-source.d.ts.map +1 -1
- package/dist/in-store/resolve-source.js +20 -4
- package/dist/in-store/resolve-source.js.map +1 -1
- package/dist/in-store/schema-attributes.d.ts +28 -0
- package/dist/in-store/schema-attributes.d.ts.map +1 -0
- package/dist/in-store/schema-attributes.js +95 -0
- package/dist/in-store/schema-attributes.js.map +1 -0
- package/dist/in-store/spatial-zone.d.ts.map +1 -1
- package/dist/in-store/spatial-zone.js +5 -5
- package/dist/in-store/spatial-zone.js.map +1 -1
- package/dist/in-store/wall.d.ts.map +1 -1
- package/dist/in-store/wall.js +4 -14
- package/dist/in-store/wall.js.map +1 -1
- package/dist/in-store/window.d.ts +7 -0
- package/dist/in-store/window.d.ts.map +1 -1
- package/dist/in-store/window.js +24 -17
- package/dist/in-store/window.js.map +1 -1
- package/dist/index.d.ts +12 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/landxml/cant-superelevation.d.ts +28 -0
- package/dist/landxml/cant-superelevation.d.ts.map +1 -0
- package/dist/landxml/cant-superelevation.js +31 -0
- package/dist/landxml/cant-superelevation.js.map +1 -0
- package/dist/landxml/landxml-to-ifc.d.ts +8 -2
- package/dist/landxml/landxml-to-ifc.d.ts.map +1 -1
- package/dist/landxml/landxml-to-ifc.js +42 -4
- package/dist/landxml/landxml-to-ifc.js.map +1 -1
- package/dist/landxml/profile-geometry.d.ts +50 -0
- package/dist/landxml/profile-geometry.d.ts.map +1 -0
- package/dist/landxml/profile-geometry.js +221 -0
- package/dist/landxml/profile-geometry.js.map +1 -0
- package/dist/landxml/profile-mapping.d.ts +36 -0
- package/dist/landxml/profile-mapping.d.ts.map +1 -0
- package/dist/landxml/profile-mapping.js +181 -0
- package/dist/landxml/profile-mapping.js.map +1 -0
- package/dist/landxml/profile-record.d.ts +46 -0
- package/dist/landxml/profile-record.d.ts.map +1 -0
- package/dist/landxml/profile-record.js +38 -0
- package/dist/landxml/profile-record.js.map +1 -0
- package/dist/landxml/refusals.d.ts +5 -1
- package/dist/landxml/refusals.d.ts.map +1 -1
- package/dist/landxml/refusals.js +36 -8
- package/dist/landxml/refusals.js.map +1 -1
- package/dist/landxml/result-types.d.ts +49 -0
- package/dist/landxml/result-types.d.ts.map +1 -1
- package/dist/landxml/station-equations.d.ts +69 -0
- package/dist/landxml/station-equations.d.ts.map +1 -0
- package/dist/landxml/station-equations.js +140 -0
- package/dist/landxml/station-equations.js.map +1 -0
- package/dist/landxml/writers.d.ts +7 -1
- package/dist/landxml/writers.d.ts.map +1 -1
- package/dist/landxml/writers.js +22 -3
- package/dist/landxml/writers.js.map +1 -1
- package/dist/types.d.ts +13 -9
- package/dist/types.d.ts.map +1 -1
- 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":"
|
|
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
|
|
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
|
-
|
|
149
|
-
|
|
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
|
-
|
|
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
|
|
158
|
-
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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":"AAAA;;+DAE+D;AAE/D
|
|
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;
|
|
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"}
|