axiolid-brep-boolean
General exact B-rep booleans over analytic faces (ADR 0075).
| Latest release | 0.1.15 (2026-11-13) |
| crates.io | axiolid-brep-boolean |
| Layer | algorithms (algorithm.construction) |
| API documentation | rustdoc · docs.rs |
| Source | crates/algorithms/construction/brep-boolean/ |
Overview
Exact union, intersection and difference of two exact B-rep solids whose faces lie on planes, cylinders, elliptical cylinders, cones, spheres, tori and B-spline surfaces: the general-fuse pipeline of ADR 0075 (section edges, face splitting in each face's own parameters, certified classification, sewing). Operands that touch rather than cross are handled. Nothing is meshed or fitted: a configuration the pipeline cannot build exactly is refused with a typed error. Faces that agree only up to rounding (operands placed separately) are read within the caller's tolerance; the result is then the exact boolean of operands moved by at most that tolerance (see the crate docs). It does not tessellate its result and does not work on meshes; mesh booleans are operation providers selected through the execution layer.
Design notes
axiolid-construct keeps narrower exact booleans that predate this crate: planar polyhedra (polyhedron::boolean_polyhedra_exact) and coaxial prisms and plane cuts over one arc arrangement (boolean_exact). They are independent exact paths, and this crate's tests check vertical-column results against them.
Depends on
axiolid-brepaxiolid-coreaxiolid-curveaxiolid-evaluateaxiolid-exactaxiolid-measureaxiolid-nurbsaxiolid-surfaceaxiolid-topology
Changes
Latest release, 0.1.15 (2026-11-13):
Added
BooleanError::VertexOffCurve(#445): a result is checked before it is returned, and refused by name when a vertex lies off the curve of an edge it bounds, or off an edge use's pcurve lifted at its end, by more thanmin(eps, rounding floor)for an exact report, the floor alone atTolerance::ZERO, andepsotherwise. The check runs inside the cut, so the finer, extending and rounding-end retries apply to it, and again after the result is moved back from a recentred cut.
Fixed
- A difference or union far from the origin returned a vertex off its curve with an exact report (#445): a window's crossing 1.2e-6 past a face replaced a feature cut within the parameter-relative dedup slack of
pieces(5.6e-6 at a parameter of 5.6e6), so the column less a corbel at(6e5, 5.6e6, 200)had a vertex 1.2e-6 off its edge, the union was refused as not sewing atTolerance::METRE, and at 1e-7 andTolerance::ZEROthe union's volume was 1.8e-8 off. A window end never replaces a feature cut now; the corners are the corbel's own vertices bit for bit and every volume is exact. - A loop reaching a pole or apex along a seam was read as winding and given a second seam, so the boolean was refused with
TangentSplitorAssembly; a partial revolution's apex included (#379). A step over a pole or apex is no longer counted as a turn. - Unions far from the origin sew their kept faces and classify points near a face boundary (#418, #419): operands whose common vertex box lies four or more diagonals from the origin on an axis are recentred on that axis exactly before the cut and the result moved back (
ExactBRep::translated_exactlyproves every coordinate moves with no rounding, else the operands are cut where they are; so are operands whose recentred cut is refused, as planar faces charted in world coordinates, #227, keep parameters as far out as before). The #356 column and corbel at(6e5, 5.6e6, 200)was refused in 132 of 200 turns (117 "do not sew", 15 "too close to a face boundary to classify"); every turn is now one solid. The report refers to the operands as given; operands nearer the origin are cut bit for bit as before. The next release needsaxiolid-brepwithtranslated_exactly.
Full history: crates/algorithms/construction/brep-boolean/CHANGELOG.md