Skip to main content

ifc_alignment/
lib.rs

1//! `ifc-alignment` -- Linear referencing and alignment -- the IFC4x3 civil layer.
2//!
3//!
4//! IFC4x3 adds 14 alignment entities plus spiral curve types (`IfcClothoid`,
5//! `IfcCosineSpiral`). Isolated in its own crate because building-only
6//! consumers should never compile spiral curve laws.
7//!
8//! # Module map
9//!
10//! | Module | Role |
11//! |---|---|
12//! | `horizontal` | Horizontal segments: line, arc, spiral transitions |
13//! | `vertical` | Vertical segments: grades and parabolic curves |
14//! | `cant` | Superelevation (`IfcAlignmentCant`) for rail |
15//! | `referent` | `IfcReferent` stationing and chainage |
16//! | `view` | The IFC4X3 profile pin and the `IfcAlignment` hierarchy |
17//! | `placement` | `IfcLinearPlacement` and distance expressions |
18//! | `error` | Why an alignment operation failed |
19//!
20//! Horizontal lines, circular arcs and transition spirals lower to exact
21//! neutral curve graphs; a spiral is stored as its curvature law
22//! (`Curve2::Intrinsic`), never integrated here. A whole layout is also one
23//! intrinsic plan curve with a piecewise curvature law, which is what an
24//! elevated 3D centreline carries. Families without an exact law are typed
25//! refusals, tracked in GitHub issues.
26
27pub mod authoring;
28mod cant;
29mod curve;
30mod error;
31mod horizontal;
32mod placement;
33mod referent;
34pub(crate) mod slot;
35mod vertical;
36mod view;
37
38pub use authoring::{
39    alignment, alignment_segment, axis2_placement_linear, cant_layout, cant_segment,
40    cartesian_point, horizontal_layout, horizontal_segment, linear_element, linear_placement,
41    linear_positioning_element, point_by_distance, referent, stationing, vertical_layout,
42    vertical_segment, CantSegmentDraft, HorizontalSegmentDraft, VerticalSegmentDraft,
43};
44pub use cant::{
45    cant_at, read_cant_segment, CantAtStation, CantFrame, CantLayout, CantSegment, CantSegmentType,
46};
47pub use curve::{
48    elevation_law, gradient_curve3, lower_gradient_curve, lower_horizontal_layout,
49    lower_horizontal_layout_partial, lower_horizontal_plan, lower_horizontal_segment,
50    lower_segmented_reference_curve, lower_vertical_segment, profile_law, profile_law_within,
51    vertical_profile_law, HorizontalPlan, HorizontalSeam, LoweredAlignmentCurve,
52    PartialHorizontalLayout, RefusedSegment, SeamCheck, SeamTolerance,
53};
54pub use error::{AlignmentError, AlignmentResult, ProfileSeam};
55pub use horizontal::{
56    read_horizontal_segment, AlignmentUnits, HorizontalSegment, HorizontalSegmentType,
57};
58pub use placement::{
59    resolve_linear_placement, resolve_point_by_distance, CurveMeasure, LinearPlacement,
60    PointByDistance,
61};
62#[allow(deprecated)]
63pub use referent::station_equations;
64pub use referent::{StationEquation, Stationing, STATION_TOLERANCE};
65pub use vertical::{
66    read_vertical_segment, VerticalLayout, VerticalSeam, VerticalSeamKind, VerticalSegment,
67    VerticalSegmentType,
68};
69pub use view::{AlignmentHierarchy, AlignmentView};