use axiolid_brep::{ExactBRep, ExactBRepBuilder};
use axiolid_contracts::{GeomError, GeomResult};
use axiolid_topology::Solid;
pub(crate) fn merge_solids(mut pieces: Vec<ExactBRep>) -> GeomResult<ExactBRep> {
if pieces.len() == 1 {
return Ok(pieces.remove(0));
}
let mut builder = ExactBRepBuilder::default();
for piece in &pieces {
let shells = builder.append(piece, false);
for solid in piece.topology().solids() {
let outer = shells[solid.outer.index()];
let voids = solid
.voids
.iter()
.map(|void| shells[void.index()])
.collect();
builder.topology_mut().add_solid(Solid { outer, voids });
}
}
builder.finish().map_err(|error| {
GeomError::Degenerate(format!("disjoint solids did not assemble: {error}"))
})
}