pub enum ExtendRefusal {
ClosedDirection {
direction_u: bool,
},
DegenerateIncrement {
delta: f64,
},
UnsupportedKnots {
multiplicity: usize,
expected: usize,
},
InvalidWeight {
weight: f64,
site: WeightSite,
},
Fold {
angle: f64,
limit: f64,
},
ExcessiveGrowth {
ratio: f64,
limit: f64,
},
Failed(String),
}Expand description
Why a natural extension produced nothing. Each variant carries what was measured, so a caller can report the number rather than the verdict.
Variants§
ClosedDirection
The requested direction joins itself. A closed direction has no outside
to extend INTO — it wraps — and appending a span there would overlay the
surface on itself. direction_u says which direction was asked for.
DegenerateIncrement
The parameter increment is not one: not positive, not finite, or not
large enough to be a knot of its own. KNOT_IDENTITY_TOL is the band
within which this kernel treats two knots as THE SAME knot, so an
increment inside it appends a zero-width span whose basis functions are
all zero — an extension that evaluates to a zero-weight point everywhere
it was supposed to be new. Measured 2026-09-12: a caller asking for a
3e-18 extension off a noise-level overrun estimate produced exactly that.
UnsupportedKnots
The knot vector’s clamped end is not at multiplicity degree + 1, so
the terminal degree + 1 control points are not the terminal Bézier
span’s and the construction does not apply. Vendor exporters do emit
over-clamped ends (see knot_find_span); extending one needs the extra
knots stripped first, which this does not do.
InvalidWeight
The rational extension’s denominator has stopped being positive — at an
extrapolated control point, or at a parameter between them. A rational
patch extrapolated far enough reaches this whenever its weight
polynomial has a real root outside the interval it was fitted on, and a
patch whose control weights are all still positive can already have
dipped through zero between them (measured on imported B-spline faces:
abc_00000013.step does both).
Fold
The extension turns back on itself: the cross-boundary tangent at some
station of the extension makes angle with the same tangent at the
boundary, exceeding limit.
ExcessiveGrowth
The appended strip reaches ratio times the surface’s own 3D extent in
the extended direction, exceeding limit.
Failed(String)
A lower-level failure (knot insertion, a surface constructor, an evaluation), carried verbatim so the call site can prefix it with its own operation name.