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:
1 parent
774a8b1d9a
commit
00fdcf3e72
4 files changed
+56
-48
No files matched your search
+6
-1
@@ -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
@@ -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
|
||||
|
||||
Reference in new issue
Block a user