ifc-alignment 0.5.0

IFC4x3 linear positioning: alignments, referents, linear placement, spirals.
Documentation
# ifc-alignment

IFC4X3 linear positioning: `IfcAlignment` with its horizontal, vertical and
cant layouts, referents and stationing, and linear placement. Alignment
curves are lowered exactly into the format-neutral Axiolid geometry model;
nothing is tessellated or numerically integrated. A segment form that cannot
be lowered exactly yet (the cubic spiral, circular and clothoid vertical
curves) is a typed refusal, and the open gaps are listed on the
[capabilities page](https://openbimrs.github.io/ifc/capabilities).

```bash
cargo add ifc-alignment
```

The [`openbim-ifc`](https://crates.io/crates/openbim-ifc) facade also provides it behind its
`alignment` feature.

- API documentation: [docs.rs/ifc-alignment]https://docs.rs/ifc-alignment
- Reference page: [openbimrs.github.io/ifc]https://openbimrs.github.io/ifc/reference/crates/ifc-alignment
- Source and issues: [github.com/openbimrs/ifc]https://github.com/openbimrs/ifc

## Design notes

- A vertical profile read from a file is checked at the seam tolerance the
  file declares: `IfcGeometricRepresentationContext.Precision` (3D, coarsest,
  in the project length unit, capped at 1 mm). Exporters that round stations
  and heights to their stated precision are accepted; a step beyond it is
  refused. Without a declared precision only floating-point rounding is
  tolerated (`SeamTolerance`, `vertical_profile_law`).
- A grade break at a height-continuous vertical seam is legal IFC4.3 and
  accepted; the piecewise elevation law carries it exactly, and
  `VerticalLayout::seams` reports it. `require_tangential` asks for a
  tangent profile explicitly.
- The zero-length segment IFC4.3 requires at the end of every layout adds
  no geometry; its start is checked against the layout's end like any
  seam. A zero-length segment anywhere else is refused.
- Cant is exact data per station (`CantLayout::frame_at_distance`: rail
  heights, cant, bank angle `arcsin(D / b)`, rotation-point elevation and
  the section frame). The cant-carrying centreline
  (`IfcSegmentedReferenceCurve`) is a typed refusal: the neutral curve
  vocabulary has no roll law yet (#93).
- A multi-segment horizontal layout elevates as one exact plan curve: the
  first segment's start frame plus one curvature piece per segment. Seams
  are checked in closed form: a heading kink, or a position gap after a
  line or arc, is refused; the position after a transition spiral, a
  Fresnel-type integral, is reported as authored rather than verified.

- This crate is the geometric bridge for alignments, not a road or rail
  application. Product workflows (corridors, cross-sections, track
  design) and rendering policy stay out of it and belong to the
  application that composes it.