arris-math 0.5.0

Arris kernel: points, vectors, frames, intervals, exact predicates, root finding and Precision
Documentation

arris

A B-Rep geometric kernel written from scratch in Rust.

An arris is the sharp edge where two surfaces meet — the thing a B-Rep kernel exists to compute.

Arris is a library, not an application: it builds solids, cuts and fuses them, blends their edges, measures, tessellates and exports them. It carries a tolerance on every entity rather than one global epsilon, returns a typed error naming the entities involved rather than panicking on geometry it cannot do, and returns a provenance record from every operation so that a parametric application can name the faces an operation made. Same input, same output, same entity ids, on every platform. Pure Rust, no unsafe, builds for wasm32.

State

Pre-1.0 and under development. The public API breaks between minor versions, and each break is listed, with its fix, in CHANGELOG.md. What is in today:

  • primitives, rigid transforms, and extrude and revolve of a profile of lines, arcs and elliptic arcs;
  • booleans — cut, fuse, common — over every analytic face (plane, cylinder, elliptic cylinder, cone, sphere, torus) in any pose, with multi-shell results (cavities, split cuts, disjoint fuses); sections are exact where they are conics and traced and fitted to NURBS elsewhere;
  • constant-radius fillet and chamfer on plane–plane and plane–cylinder edges, with miters, corners and hole rims;
  • tessellation to a chord tolerance, mass properties (volume, centroid, inertia), plane projection and face frames;
  • a STEP reader that returns a checked body, or a typed refusal naming why, for every solid in a file; STEP AP214, STL and OBJ export; a deterministic native format in JSON and bytes; and one body, with its provenance, as bytes that any later release reads.

Not in yet: booleans with a NURBS face as an operand, blends between faces outside the plane and cylinder pairs, variable-radius blends, sheet and non-manifold bodies, and healing of what a STEP file leaves open. Each of those is a typed refusal today, never a wrong answer.

From Python

pip install arris gives a binding over the same kernel: build a body from primitives and profiles, fillet and cut it, ask what it measures and what the checker says, tessellate it, and write and read STEP, STL, OBJ and body bytes, without compiling a crate. Every operation returns the body and its provenance, and every error is a typed exception.

import arris

model = arris.Model()
plate, _ = model.primitive_box((0, 0, 0), (100, 100, 10))
hole, _ = model.primitive_cylinder((50, 50, -1), (0, 0, 1), 5, 12)
part, record = model.cut(plate, hole)
print(model.mass_properties(part).volume, bool(model.check(part, "full")))

Correctness

Every operation returns a shape that passes the invariant checker, and the checker runs after every operation in debug builds. Every fixture in the test corpus carries an oracle value — volume, area, centroid, counts, point classifications — computed by Open CASCADE, which Arris must match within the fixture's stated tolerance. Open CASCADE is run as the oracle through Python; it is never a build or runtime dependency, and PROVENANCE.md says how it is used and read. Properties (volume additivity, cut-then-fuse, commutativity, STEP round-trip) are tested over random operands in random poses from a fixed seed.

Workspace

Arris is a Cargo workspace. crates/arris is the facade a consumer depends on; it re-exports the layered crates beneath it — arris-math, arris-geom, arris-topo (the representation), arris-check (the invariant checker), arris-ops, arris-mesh, arris-io (the algorithms) and arris-debug (dev-facing: rasteriser, fixtures, property-test strategies; it is not published). crates/arris-py is the Python binding, above the facade and published to PyPI rather than crates.io. A crate never depends on one above it; tools/check-layers.sh enforces that in CI and in the pre-commit hook. The layout and the reasons are in docs/ARCHITECTURE.md; tools/oracle/ is the Open CASCADE test oracle, run through Python and never linked.

Licence

MIT or Apache-2.0, at your option. See LICENSE-MIT and LICENSE-APACHE.