use super::{BooleanClippingProcessor, OperandPath};
use crate::diagnostics::{BoolFailure, BoolFailureReason, BoolOp};
use crate::router::GeometryProcessor;
use crate::{Mesh, Result, TessellationQuality};
use ifc_lite_core::{DecodedEntity, EntityDecoder, IfcSchema, IfcType};
impl GeometryProcessor for BooleanClippingProcessor {
fn process(
&self,
entity: &DecodedEntity,
decoder: &mut EntityDecoder,
schema: &IfcSchema,
quality: TessellationQuality,
) -> Result<Mesh> {
let mut visited = OperandPath::default();
self.process_with_depth(entity, decoder, schema, 0, quality, &mut visited)
}
fn supported_types(&self) -> Vec<IfcType> {
vec![IfcType::IfcBooleanResult, IfcType::IfcBooleanClippingResult]
}
fn take_bool_failures(&self) -> Vec<BoolFailure> {
self.take_failures()
}
fn bool_failure_count(&self) -> usize {
self.failure_mark()
}
fn truncate_bool_failures_to(&self, since: usize) {
self.rewind_to(since);
}
}
impl BooleanClippingProcessor {
pub fn take_failures(&self) -> Vec<BoolFailure> {
std::mem::take(&mut *self.failures.borrow_mut())
}
pub(super) fn record_failure(&self, op: BoolOp, reason: BoolFailureReason) {
self.failures.borrow_mut().push(BoolFailure::new(op, reason));
}
pub(super) fn absorb_failures(&self, failures: Vec<BoolFailure>) {
self.failures.borrow_mut().extend(failures);
}
pub(super) fn failure_mark(&self) -> usize {
self.failures.borrow().len()
}
pub(super) fn rewind_to(&self, mark: usize) {
self.failures.borrow_mut().truncate(mark);
}
pub(super) fn defer_after(&self, mark: usize) -> crate::Result<Option<crate::Mesh>> {
self.rewind_to(mark);
Ok(None)
}
pub(super) fn record_empty_second_operand(&self, op: BoolOp, already_recorded: bool) {
if !already_recorded {
self.record_failure(op, BoolFailureReason::EmptyOperand);
}
}
}