perf: prism pairs before the mesh, bodies measured once, and a STEP import that copies less (#714)

A cut or an intersection between prisms (a plate and the tools through it) is now decided in 2D before either operand is meshed. A body's size and volume are measured once, a placement reads its orientation from its matrix, the evaluation cache is bounded to 64 MiB, and STEP import copies fewer shells. Hole plates evaluate 20-30% faster with less memory, and models are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
SahenandClaude Opus 5.5 authored and GitHub committed 2026-10-13 10:55:56 -04:00
1 parent a1cb8d4d36
commit 2bb24d1d2a
13 files changed
+630 -71

No files matched your search

+24 -7
View File
@@ -395,12 +395,29 @@ pub(crate) fn read_item(cx: &Ctx, id: u64) -> R<BrepOut> {
if shells.is_empty() {
return Err(failed.first().cloned().unwrap_or_else(|| "no shells".into()));
}
let solid = match guard("step solid", || mt::Solid::try_new(shells.clone()).map_err(|e| crate::KernelError::Failed(e.to_string()))) {
Ok(s) => s,
Err(_) => {
closed = false;
mt::Solid::new_unchecked(shells)
// `mt::Solid::try_new` only checks each shell (non-empty, connected, closed, no singular
// vertex) and hands the shells back unchanged (truck-topology 0.6.0), so the same checks run
// here on the borrowed shells. The successful path used to clone every face, edge, vertex,
// curve and surface to keep a copy that was then dropped.
let checked = guard("step solid", || {
for shell in &shells {
if shell.is_empty() {
return Err(crate::KernelError::Failed("empty shell".into()));
}
if !shell.is_connected() {
return Err(crate::KernelError::Failed("shell is not connected".into()));
}
if shell.shell_condition() != mt::ShellCondition::Closed {
return Err(crate::KernelError::Failed("shell is not closed".into()));
}
if !shell.singular_vertices().is_empty() {
return Err(crate::KernelError::Failed("shell is not manifold".into()));
}
}
};
Ok(BrepOut { solid, failed, closed, file_faces, face_origin })
Ok(())
});
if checked.is_err() {
closed = false;
}
Ok(BrepOut { solid: mt::Solid::new_unchecked(shells), failed, closed, file_faces, face_origin })
}