BoolFailureReason

Enum BoolFailureReason 

Source
pub enum BoolFailureReason {
Show 16 variants OperandTooLarge { polys_a: usize, polys_b: usize, }, EmptyOperand, DegenerateOperand, NoBoundsOverlap, KernelOutputInvalid, SolidSolidDifferenceSkipped, PolygonalBoundedHalfSpaceFallback, CutterUnionUnavailable, UnknownBooleanOperator(String), OperandBudgetExhausted, ManifoldOutputDegenerate { host_tris: usize, result_tris: usize, }, KernelError(String), DifferenceEmptiedHost, UnsupportedOperand(String), OpenTopologyRejected, NonManifoldRejected { over_used: usize, same_direction: usize, },
}
Expand description

Why a boolean operation failed or was skipped.

Variants§

§

OperandTooLarge

HISTORICAL: at least one operand exceeded the deleted legacy BSP CSG polygon cap. The pure-Rust exact kernel has no operand cap, so this is no longer emitted by the boolean ops; the variant (and its JSON label) is kept for the frozen diagnostics surface and void-router plumbing.

Fields

§polys_a: usize
§polys_b: usize
§

EmptyOperand

One or both operand meshes were empty before polygon extraction.

§

DegenerateOperand

Polygon extraction yielded an empty list (degenerate / non-finite vertices).

§

NoBoundsOverlap

Operand bounding boxes don’t overlap. Informational — host returned unchanged.

§

KernelOutputInvalid

The CSG kernel returned malformed polygons (NaN / non-finite).

§

SolidSolidDifferenceSkipped

HISTORICAL: solid-vs-solid IfcBooleanResult.DIFFERENCE was not attempted because the deleted legacy BSP could stack-overflow on arbitrary solid combinations. No longer emitted — the exact kernel always attempts the cut. Variant kept for the frozen label surface.

§

PolygonalBoundedHalfSpaceFallback

IfcPolygonalBoundedHalfSpace prism-subtraction failed; the kernel fell back to an unbounded plane clip, silently dropping the polygonal boundary. The clip is applied but is a strict superset of the requested cut.

§

CutterUnionUnavailable

The chained-clip cutter prisms couldn’t be unioned into one watertight solid, so the single batched subtract (issue #960) was skipped and the chain fell back to sequential per-cutter subtraction. The cuts are applied, but abutting cutters may leave zero-thickness seam fins that the batched path would have eliminated.

§

UnknownBooleanOperator(String)

IfcBooleanResult operator string didn’t match any known op.

§

OperandBudgetExhausted

The operand walk under one representation item entered more boolean/CSG nodes than processors::boolean::MAX_OPERAND_VISITS allows and was stopped. The item is dropped (the walk returns Err), so this is the only trace of why. A shared SecondOperand re-meshed down m^levels paths is the shape that gets here; a real item does not.

§

ManifoldOutputDegenerate

HISTORICAL: the deleted Manifold C++ kernel’s difference returned output implausibly small relative to the host (a Linux-x86_64-only pathology). No longer emitted — the deterministic exact kernel replaced Manifold. Variant kept for the frozen label surface.

Fields

§host_tris: usize
§result_tris: usize
§

KernelError(String)

Catch-all for kernel-specific errors (free-form string).

§

DifferenceEmptiedHost

IfcBooleanResult.DIFFERENCE produced an empty mesh from a non-empty host. Almost always a buggy export — a clip plane authored AT the wall’s top with AgreementFlag = .T. (issue #821, Revit IFC2x3 TallBuilding.ifc) makes the half-space material region exactly cover the wall body, so the strict-spec subtract yields nothing. The caller falls back to the un-cut host (matching what BIMVision and similar viewers do in practice) and records this so the loss surfaces in diagnostics rather than as a silently missing element.

§

UnsupportedOperand(String)

A boolean operand’s IfcRepresentationItem type has no meshing branch in BooleanClippingProcessor::process_operand_checked, so the operand resolved to an EMPTY mesh. Carries the operand’s IFC type name.

As a FIRST operand this is a real element-geometry loss: the base solid is empty, the whole boolean result is empty, and the element renders nothing from that item. As a SECOND operand it means “unsupported cutter” — the host renders un-cut, and the pre-existing EmptyOperand record for the same step is also emitted (one record for the cause, one for the consequence).

§

OpenTopologyRejected

#3440 step 2: the kernel result passed validate_mesh (finite, in-bounds) but failed the directed-edge closure audit (topology_gate_reject — same predicate KernelError’s step-1 informational record already checks) and was REJECTED rather than merely flagged. Only ever constructed when this crate is built with the csg_topology_gate feature, which is off by default and enabled by nothing downstream — so this variant exists in every build (a stable thing for consumers to match on, per the crate’s convention for its other rarely-emitted variants above) but is only ever actually recorded in a --features csg_topology_gate build.

§

NonManifoldRejected

#3440 step 3: the kernel result passed validate_mesh AND the signed closure audit, but carries an edge-multiplicity defect that audit cannot express — an undirected edge used by more than two triangles, or used twice the same way round (edge_multiplicity_defects). Rejected, and the caller falls back exactly as it does for KernelOutputInvalid.

Like Self::OpenTopologyRejected, only ever constructed under a feature — its own csg_manifold_gate, kept separate from csg_topology_gate so a census can attribute a flip to one defect class rather than to whichever gate fired first. The variant exists in every build, per this enum’s convention for its other rarely-emitted reasons.

The gate reads a defect class benign tessellation cannot produce, so it was tried as a default; the fallback a rejection reaches turned out to be worse than the tear it replaces. The numbers behind that live in one place — csg_manifold_gate in Cargo.toml — with the corpus sweep in tests/issue_3440_manifold_gate_census.rs.

Carries the two counts (as OperandTooLarge carries its operand sizes) so the census can break the flip set down by defect class without a second sweep: the two say different things about the kernel, and a bare variant would force anyone measuring to re-derive them.

Fields

§over_used: usize

Undirected edges used by more than two triangles.

§same_direction: usize

Undirected edges used twice, both uses the same way round.

Implementations§

Source§

impl BoolFailureReason

Source

pub fn label(&self) -> &'static str

Stable short label for per-reason aggregation. Single home shared by the wasm console diagnostics and the server tracing summary so the two surfaces cannot drift (Rust-first).

Trait Implementations§

Source§

impl Clone for BoolFailureReason

Source§

fn clone(&self) -> BoolFailureReason

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BoolFailureReason

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for BoolFailureReason

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for BoolFailureReason

Source§

fn eq(&self, other: &BoolFailureReason) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Eq for BoolFailureReason

Source§

impl StructuralPartialEq for BoolFailureReason

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<U> As for U

§

fn as_<T>(self) -> T
where T: CastFrom<U>,

Casts self to type T. The semantics of numeric casting with the as operator are followed, so <T as As>::as_::<U> can be used in the same way as T as U for numeric conversions. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
Source§

impl<T> Scalar for T
where T: 'static + Clone + PartialEq + Debug,