fix: grid lines for split ruling edges only in display and export meshes; record the moved seeds (#961)

#921's grid lines through the vertices that split a ruling edge also went into the meshes Boolean operations intersect, which changed seven robustness seeds (seed 2's sphere cut failed). Deflection::rulings now asks for them only in the kernel's own tessellation (display, export, measurement). The seeds #936 (rejected instead of unsupported), #946 (26 and 85 build, others fail differently) and #921's display side (about 1e-6) moved are recorded with their reasons.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
bherbruckandClaude Opus 5.5 authored and GitHub committed 2026-10-14 00:14:18 -04:00
1 parent 774a8b1d9a
commit 00fdcf3e72
4 files changed
+56 -48

No files matched your search

+6 -1
View File
@@ -64,6 +64,10 @@ pub struct Deflection {
pub angle: f64,
/// Sag below which `angle` no longer splits a facet.
pub floor: f64,
/// SolidCraft: grid lines through the vertices that split a face's ruling edges (see
/// `with_ruling_vertices`). Meshes for display and export ask for them; the meshes Boolean
/// operations intersect do not, so a Boolean's result does not depend on them.
pub rulings: bool,
}
impl Deflection {
@@ -83,6 +87,7 @@ impl Deflection {
chord: tol,
angle: f64::INFINITY,
floor: 0.0,
rulings: false,
}
}
@@ -95,7 +100,7 @@ impl Deflection {
let angle = self.angle * f64::from(1u32 << level.min(Self::MAX_RELAX));
match level == 0 || (level < Self::MAX_RELAX && angle < std::f64::consts::PI) {
true => Self { angle, ..*self },
false => Self::chord(self.chord),
false => Self { rulings: self.rulings, ..Self::chord(self.chord) },
}
}
+2 -2
View File
@@ -789,8 +789,8 @@ fn insert_surface(
let (u, v) = bounded_surface_division(&surface, range, tol, cap);
let (u_ruled, v_ruled) = (u.len() <= 3, v.len() <= 3);
let (u, v) = balanced_grid(&surface, u, v, cap);
let v = with_ruling_vertices(v, polyline, 1, v_ruled, u.len(), cap);
let u = with_ruling_vertices(u, polyline, 0, u_ruled, v.len(), cap);
let v = with_ruling_vertices(v, polyline, 1, tol.rulings && v_ruled, u.len(), cap);
let u = with_ruling_vertices(u, polyline, 0, tol.rulings && u_ruled, v.len(), cap);
(u, v)
};
let insert_res: Vec<Vec<Option<_>>> = udiv