mirror of
https://github.com/bherbruck/solidcraft.git
synced 2026-11-03 10:35:58 +00:00
Kernel tests, fillet rig: a chamfer past its rim builds, cut by what lies past it
The owner's ruling of 2026-10-30 (d7): a chamfer that reaches or runs past a rim builds, everywhere, as SMLib's cliff overflow builds a convex blend: on its faces' continuations, then cut by what the cliff cuts away. The earlier rule refused a chamfer whose leg runs off its face. SolidCraft has no such refusal of its own; SMLib refuses these, so the cases fail on SMLib 985faaee and are listed with its reasons (traced in gdb at SmFilletErrorInfo::NoteError): - the sloped basin's single front edge past its rim (1 mm rim 2 and 3, 0.5 mm rim 4): CloseRemovalRegion, "a cliff overflow's fillet boundary lies on the surfaces of two faces": the sheet's boundary along the end wall's top edge line from the edge's vertex to the top's contact (x = 20, y from -1 to 1, z = 30) lies on the top's plane and the end wall's both. - the equal-slope basin's rim loop 2 and the 5 mm pocket's rim 5.5: CloseRemovalRegion, "a cliff overflow's fillet boundary closes on one face" (every edge of the loop blended). - the sloped basin's front and right edges 2: status 1001, SmFilletNx2Corner, CalcFilletIntSideFace. - the cylinder's rim 2 across the top and 25 down its 20 mm wall: status 1001, SmFilletNx1ClosedCorner cannot compute its geometry. Expectations, each from a closed form or an exact quadrature: - chamfer_wider_than_sloped_basin_rim_is_refused becomes chamfer_wider_than_sloped_basin_rim_builds, ignored until SMLib builds it: the triangle clipped to y >= 0, times 30 + z (shoelace): 73.450475, 142.112912, 184.526613; the rig's 1080-chamfer-sloped- basin-*-past-the-rim cases: V = 144459.882858, 144391.220421, 144082.140054. - blend_corner's a_rim_loop_chamfer_running_off_its_rim_is_refused becomes ..._builds, ignored likewise: sliced at depth t the mitred loop takes the pocket's rectangle grown by w(t) = d (1 - t / delta) on each side, clipped to y >= 0, less the rectangle, Simpson exact on each quadratic piece: 375.673069, V = 139957.660264 (the rig's 1080-chamfer-equal-slope-basin-1-mm-rim-loop-2 too). - 5835-chamfer-sloped-basin-1-mm-rim-2-two-edges: the same slicing with the front and right sides grown, 161.279149, V = 144372.054184. - every-chamfer-pocket-rim-5-5-past-the-floor: 50 d^2 + (4/3) d^3 at 5.5, the groove 0.5 deep round the floor included, V = 19265.666667, 15 faces. - 2893-chamfer-two-distances-past-the-bottom: the frustum r 8 to 9.6 over 20, pi 20 (64 + 76.8 + 92.16) / 3 = 4879.102831, 3 faces. Each drops "-refused" from its id (the 5.5 pocket's says past the floor). The same slicing reproduces the existing 5835-...-4-mm-rim-2-2-edges (176.006388), equal-slope loop 0.5 (24.455545) and half-width (5.426545) values. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -298,12 +298,19 @@ mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
/// A chamfer of a basin's rim loop whose leg would run off the 1 mm rim over the slab's front
|
||||
/// edge is refused as too large, the kind a fit can reduce. (The largest size that fits is
|
||||
/// the doc layer's to name; it and the loop's blends that fit, with their exact mitred
|
||||
/// volumes, are graded by the rig's fillets/1080-*-equal-slope-basin-* cases.)
|
||||
/// A chamfer 2 of a basin's rim loop (walls all sloping 10 over 20, the front rim 1 mm wide)
|
||||
/// whose front leg runs off the rim over the slab's front edge builds, cut by the front face
|
||||
/// (the owner's ruling of 2026-10-30, d7: a chamfer that reaches or runs past a rim builds).
|
||||
/// Sliced at depth t below the top, each chamfer's strip beside its wall is
|
||||
/// w(t) = d (1 − t/δ) wide, δ = d / √(1 + k²) with k = 1/2 the walls' run over drop; the four
|
||||
/// meet in mitres at the rim's corners, so the section removed is the pocket's rectangle at t,
|
||||
/// [20 + t/2, 80 − t/2] × [1 + t/2, 50 − t/2], grown by w(t) on every side and clipped to the
|
||||
/// slab's front face y >= 0, less that rectangle. Its area is quadratic in t between δ and
|
||||
/// where the front strip's edge 1 + t/2 − w(t) crosses y = 0, so Simpson's rule is exact on
|
||||
/// each piece: 375.673069 taken from V0 = 140333.333333 (the prismatoid), 139957.660264.
|
||||
#[test]
|
||||
fn a_rim_loop_chamfer_running_off_its_rim_is_refused() {
|
||||
#[ignore = "fails until SMLib builds the cliff overflow of a blended loop: CloseRemovalRegion refuses it (SM_FILERR_NO_ROOM, its fillet boundary closes on one face)"]
|
||||
fn a_rim_loop_chamfer_running_off_its_rim_builds() {
|
||||
use solidcraft_geom::{Loop2, Plane, Vec2};
|
||||
let rectangle = |x0, y0, x1, y1| Loop2::polygon(&[Vec2::new(x0, y0), Vec2::new(x1, y0), Vec2::new(x1, y1), Vec2::new(x0, y1)]);
|
||||
let slab = box_solid(Vec3::ZERO, Vec3::new(100.0, 60.0, 30.0)).unwrap();
|
||||
@@ -312,10 +319,25 @@ mod tests {
|
||||
.unwrap();
|
||||
let basin = crate::boolean(&slab, &pocket, crate::BoolOp::Cut).unwrap().unwrap();
|
||||
let picks = [Vec3::new(50.0, 1.0, 30.0), Vec3::new(80.0, 27.0, 30.0), Vec3::new(50.0, 50.0, 30.0), Vec3::new(20.0, 27.0, 30.0)];
|
||||
match crate::chamfer(&basin, &picks, 2.0) {
|
||||
Err(KernelError::TooLarge(_)) => {}
|
||||
Err(e) => panic!("refused, but not as too large: {e}"),
|
||||
Ok(_) => panic!("a chamfer whose leg runs off the rim was built"),
|
||||
}
|
||||
let (d, k) = (2.0_f64, 0.5_f64);
|
||||
let delta = d / (1.0 + k * k).sqrt();
|
||||
let area = |t: f64| {
|
||||
let w = d * (1.0 - t / delta);
|
||||
let (x0, x1, y0, y1) = (20.0 + k * t, 80.0 - k * t, 1.0 + k * t, 50.0 - k * t);
|
||||
(x1 - x0 + 2.0 * w) * (y1 + w - (y0 - w).max(0.0)) - (x1 - x0) * (y1 - y0)
|
||||
};
|
||||
// 1 + k t − d (1 − t/δ) = 0.
|
||||
let crossing = (d - 1.0) / (k + d / delta);
|
||||
let removed: f64 = [(0.0, crossing), (crossing, delta)]
|
||||
.iter()
|
||||
.map(|&(a, b)| (b - a) / 6.0 * (area(a) + 4.0 * area(0.5 * (a + b)) + area(b)))
|
||||
.sum();
|
||||
assert!((removed - 375.673069).abs() < 1e-6, "{removed}");
|
||||
let before = crate::measure(&basin).unwrap().volume;
|
||||
assert!((before - 140333.333333).abs() < 1e-5, "{before}");
|
||||
let result = crate::chamfer(&basin, &picks, d).unwrap_or_else(|e| panic!("{e}"));
|
||||
assert!(result.validity().is_empty(), "{:?}", result.validity());
|
||||
let v = crate::measure(&result).unwrap().volume;
|
||||
assert!((v - (before - removed)).abs() < 1e-6 * before, "{v} vs {}", before - removed);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1163,6 +1163,23 @@ fn chamfer_as_wide_as_sloped_basin_rim_builds() {
|
||||
}
|
||||
}
|
||||
|
||||
/// A chamfer wider than a basin's thin rim runs its leg off the rim's top, over the slab's front
|
||||
/// edge (a cliff): it builds as if the top went on and is cut by the front face (the owner's
|
||||
/// ruling of 2026-10-30, d7), lowering the front face where it crosses it
|
||||
/// ([`sloped_basin_rim_chamfer_removed`], clipped to y >= 0): 73.450475 for 2 and 142.112912 for
|
||||
/// 3 on the 1 mm rim, 184.526613 for 4 on the 0.5 mm one.
|
||||
#[test]
|
||||
#[ignore = "fails until SMLib builds the cliff overflow: CloseRemovalRegion refuses it (SM_FILERR_NO_ROOM, its fillet boundary along the side edge's line lies on the surfaces of two faces)"]
|
||||
fn chamfer_wider_than_sloped_basin_rim_builds() {
|
||||
for (margin, distance) in [(1.0, 2.0), (1.0, 3.0), (0.5, 4.0)] {
|
||||
let b = sloped_basin(margin);
|
||||
let made = chamfer(&b, &[Vec3::new(50.0, margin, 30.0)], distance).unwrap_or_else(|e| panic!("{margin}, {distance}: {e}"));
|
||||
assert!(made.validity().is_empty(), "{margin}, {distance}: {:?}", made.validity());
|
||||
let want = measure(&b).unwrap().volume - sloped_basin_rim_chamfer_removed(margin, distance);
|
||||
assert!(rel(measure(&made).unwrap().volume, want) < 1e-8, "{margin}, {distance}: {} vs {want}", measure(&made).unwrap().volume);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn debug_chamfer_cut() {
|
||||
|
||||
-10
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"sources": [
|
||||
"tangency-labs/solidcraft#1080"
|
||||
],
|
||||
"what": "all four top rim edges of a basin whose walls all slope 10 over 20, its front rim 1 mm wide, chamfered 2: the front chamfer's leg runs off the rim, so it is refused, naming the largest distance that fits",
|
||||
"source": "analytic",
|
||||
"method": "slab 100 x 60 x 30 less the loft from the rectangle (20, 1)-(80, 50) at z = 30 to (30, 11)-(70, 40) at z = 10 (planar walls, a prismatoid: 20/6 (A_top + A_bottom + 4 A_mid)): V0 = 140333.333333. The front chamfer's leg on the 1 mm rim would reach y = -1, over the slab's front face: refused (the owner's ruling of 2026-10-30).",
|
||||
"outcome": "refused",
|
||||
"refusal": "the largest distance that fits is"
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"sources": [
|
||||
"tangency-labs/solidcraft#1080"
|
||||
],
|
||||
"what": "all four top rim edges of a basin whose walls all slope 10 over 20, its front rim 1 mm wide, chamfered 2: the front chamfer's leg runs off the rim over the slab's front face (a cliff), so the loop builds as if the top went on, mitred at the rim's corners, and is cut by the front face",
|
||||
"source": "analytic",
|
||||
"method": "slab 100 x 60 x 30 less the loft from the rectangle (20, 1)-(80, 50) at z = 30 to (30, 11)-(70, 40) at z = 10 (planar walls, a prismatoid: 20/6 (A_top + A_bottom + 4 A_mid)): V0 = 140333.333333. Sliced at depth t below the top, each picked edge's chamfer is a strip beside its wall w(t) = d (1 - t/delta) wide, delta = d / sqrt(1 + k^2), k the wall's run over its drop; picked neighbours meet in mitres (each runs on past the corner and the quadrant beyond both walls loses what both take) and an unpicked neighbour's wall, extended, ends it, so the section removed is the pocket's rectangle at t grown by w(t) on each picked side, clipped to the slab's front face y >= 0 (the owner's ruling of 2026-10-30 (d7): a chamfer that reaches or runs past a rim builds), less the pocket's rectangle. That area is quadratic in t between the breakpoints (each delta, and where the front strip's edge y0 + k t - w(t) crosses y = 0), so Simpson's rule on each piece is exact. Removed 375.673069. V = 139957.660264",
|
||||
"body_count": 1,
|
||||
"volume_mm3": 139957.66026433042,
|
||||
"bbox": {
|
||||
"min": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"max": [
|
||||
100,
|
||||
60,
|
||||
30
|
||||
]
|
||||
},
|
||||
"tolerance": {
|
||||
"rel": 1e-06
|
||||
}
|
||||
}
|
||||
-10
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"sources": [
|
||||
"tangency-labs/solidcraft#1080"
|
||||
],
|
||||
"what": "the 0.5 mm front rim of a sloped basin's top chamfered 4: its leg on the top runs off the rim over the slab's front face, so it is refused, naming the largest distance that fits",
|
||||
"source": "analytic",
|
||||
"method": "slab 100 x 60 x 30 less the loft from the rectangle (20, 0.5)-(80, 50) at z = 30 to (30, 20)-(70, 40) at z = 10 (planar walls, a prismatoid: 20/6 (A_top + A_bottom + 4 A_mid)): V0 = 144266.666667. The chamfer's leg on the rim's top (0.5 mm wide) would reach y = -3.5, off the rim and over the slab's front face y = 0, lowering that face: the owner's ruling of 2026-10-30 refuses a chamfer whose leg runs off the face beside its edge, naming the largest distance that fits.",
|
||||
"outcome": "refused",
|
||||
"refusal": "the largest distance that fits is"
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"sources": [
|
||||
"tangency-labs/solidcraft#1080"
|
||||
],
|
||||
"what": "the 0.5 mm front rim of a sloped basin's top chamfered 4: its leg on the top runs off the rim over the slab's front face (a cliff), so it builds as if the top went on and is cut by the front face, which it lowers to z = 28.524233 where it crosses it",
|
||||
"source": "analytic",
|
||||
"method": "slab 100 x 60 x 30 less the loft from the rectangle (20, 0.5)-(80, 50) at z = 30 to (30, 20)-(70, 40) at z = 10 (planar walls, a prismatoid: 20/6 (A_top + A_bottom + 4 A_mid)): V0 = 144266.666667. The chamfer's triangle in (y, z): the edge (0.5, 30), its leg on the top to (-3.5, 30), past the front face y = 0, and d down the wall to (0.5 + d (20-0.5)/L, 30 - 20 d/L), L = sqrt((20-0.5)^2 + 400), built as if the top went on and cut by the front face (the owner's ruling of 2026-10-30 (d7): a chamfer that reaches or runs past a rim builds): the triangle clipped to y >= 0, the quadrilateral (0.5, 30), (0, 30), (0, 28.524233), (3.292401, 27.135999). At height z the blend runs between the sloped end walls x = 20 + (30-z)/2 and 80 - (30-z)/2 extended, which cut it: its length there is 30 + z, so it takes Int Int (30 + z) dy dz over its section (y, z). Removed (shoelace for the area and its first moment) 184.526613. V = 144082.140054",
|
||||
"body_count": 1,
|
||||
"volume_mm3": 144082.14005363008,
|
||||
"bbox": {
|
||||
"min": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"max": [
|
||||
100,
|
||||
60,
|
||||
30
|
||||
]
|
||||
},
|
||||
"tolerance": {
|
||||
"rel": 1e-06
|
||||
}
|
||||
}
|
||||
-10
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"sources": [
|
||||
"tangency-labs/solidcraft#1080"
|
||||
],
|
||||
"what": "the 1 mm front rim of a sloped basin's top chamfered 2: its leg on the top runs off the rim over the slab's front face, so it is refused, naming the largest distance that fits",
|
||||
"source": "analytic",
|
||||
"method": "slab 100 x 60 x 30 less the loft from the rectangle (20, 1)-(80, 50) at z = 30 to (30, 20)-(70, 40) at z = 10 (planar walls, a prismatoid: 20/6 (A_top + A_bottom + 4 A_mid)): V0 = 144533.333333. The chamfer's leg on the rim's top (1 mm wide) would reach y = -1, off the rim and over the slab's front face y = 0, lowering that face: the owner's ruling of 2026-10-30 refuses a chamfer whose leg runs off the face beside its edge, naming the largest distance that fits.",
|
||||
"outcome": "refused",
|
||||
"refusal": "the largest distance that fits is"
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"sources": [
|
||||
"tangency-labs/solidcraft#1080"
|
||||
],
|
||||
"what": "the 1 mm front rim of a sloped basin's top chamfered 2: its leg on the top runs off the rim over the slab's front face (a cliff), so it builds as if the top went on and is cut by the front face, which it lowers to z = 29.570689 where it crosses it",
|
||||
"source": "analytic",
|
||||
"method": "slab 100 x 60 x 30 less the loft from the rectangle (20, 1)-(80, 50) at z = 30 to (30, 20)-(70, 40) at z = 10 (planar walls, a prismatoid: 20/6 (A_top + A_bottom + 4 A_mid)): V0 = 144533.333333. The chamfer's triangle in (y, z): the edge (1, 30), its leg on the top to (-1, 30), past the front face y = 0, and d down the wall to (1 + d (20-1)/L, 30 - 20 d/L), L = sqrt((20-1)^2 + 400), built as if the top went on and cut by the front face (the owner's ruling of 2026-10-30 (d7): a chamfer that reaches or runs past a rim builds): the triangle clipped to y >= 0, the quadrilateral (1, 30), (0, 30), (0, 29.570689), (2.377499, 28.550001). At height z the blend runs between the sloped end walls x = 20 + (30-z)/2 and 80 - (30-z)/2 extended, which cut it: its length there is 30 + z, so it takes Int Int (30 + z) dy dz over its section (y, z). Removed (shoelace for the area and its first moment) 73.450475. V = 144459.882858",
|
||||
"body_count": 1,
|
||||
"volume_mm3": 144459.8828581631,
|
||||
"bbox": {
|
||||
"min": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"max": [
|
||||
100,
|
||||
60,
|
||||
30
|
||||
]
|
||||
},
|
||||
"tolerance": {
|
||||
"rel": 1e-06
|
||||
}
|
||||
}
|
||||
-10
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"sources": [
|
||||
"tangency-labs/solidcraft#1080"
|
||||
],
|
||||
"what": "the 1 mm front rim of a sloped basin's top chamfered 3: its leg on the top runs off the rim over the slab's front face, so it is refused, naming the largest distance that fits",
|
||||
"source": "analytic",
|
||||
"method": "slab 100 x 60 x 30 less the loft from the rectangle (20, 1)-(80, 50) at z = 30 to (30, 20)-(70, 40) at z = 10 (planar walls, a prismatoid: 20/6 (A_top + A_bottom + 4 A_mid)): V0 = 144533.333333. The chamfer's leg on the rim's top (1 mm wide) would reach y = -2, off the rim and over the slab's front face y = 0, lowering that face: the owner's ruling of 2026-10-30 refuses a chamfer whose leg runs off the face beside its edge, naming the largest distance that fits.",
|
||||
"outcome": "refused",
|
||||
"refusal": "the largest distance that fits is"
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"sources": [
|
||||
"tangency-labs/solidcraft#1080"
|
||||
],
|
||||
"what": "the 1 mm front rim of a sloped basin's top chamfered 3: its leg on the top runs off the rim over the slab's front face (a cliff), so it builds as if the top went on and is cut by the front face, which it lowers to z = 29.141377 where it crosses it",
|
||||
"source": "analytic",
|
||||
"method": "slab 100 x 60 x 30 less the loft from the rectangle (20, 1)-(80, 50) at z = 30 to (30, 20)-(70, 40) at z = 10 (planar walls, a prismatoid: 20/6 (A_top + A_bottom + 4 A_mid)): V0 = 144533.333333. The chamfer's triangle in (y, z): the edge (1, 30), its leg on the top to (-2, 30), past the front face y = 0, and d down the wall to (1 + d (20-1)/L, 30 - 20 d/L), L = sqrt((20-1)^2 + 400), built as if the top went on and cut by the front face (the owner's ruling of 2026-10-30 (d7): a chamfer that reaches or runs past a rim builds): the triangle clipped to y >= 0, the quadrilateral (1, 30), (0, 30), (0, 29.141377), (3.066248, 27.825002). At height z the blend runs between the sloped end walls x = 20 + (30-z)/2 and 80 - (30-z)/2 extended, which cut it: its length there is 30 + z, so it takes Int Int (30 + z) dy dz over its section (y, z). Removed (shoelace for the area and its first moment) 142.112912. V = 144391.220421",
|
||||
"body_count": 1,
|
||||
"volume_mm3": 144391.22042136008,
|
||||
"bbox": {
|
||||
"min": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"max": [
|
||||
100,
|
||||
60,
|
||||
30
|
||||
]
|
||||
},
|
||||
"tolerance": {
|
||||
"rel": 1e-06
|
||||
}
|
||||
}
|
||||
-10
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"sources": [
|
||||
"tangency-labs/solidcraft#2893"
|
||||
],
|
||||
"what": "the top rim of a cylinder r10 x 20 chamfered 2 across the top and 25 down a 20 mm wall: refused",
|
||||
"source": "analytic",
|
||||
"method": "25 down the 20 mm wall runs past the bottom face: no chamfer of the rim between the top and the wall has those sizes, so the right answer is a refusal saying why",
|
||||
"outcome": "refused",
|
||||
"refusal": "larger than"
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"sources": [
|
||||
"tangency-labs/solidcraft#2893"
|
||||
],
|
||||
"what": "the top rim of a cylinder r10 x 20 chamfered 2 across the top and 25 down a 20 mm wall: the leg down the wall runs 5 past the bottom rim, so it builds as if the wall went on and is cut by the bottom face, a cone frustum",
|
||||
"source": "analytic",
|
||||
"method": "The chamfer's line in (rho, z) runs from (8, 20) on the top to (10, -5) on the wall continued past the bottom face z = 0 (the owner's ruling of 2026-10-30 (d7): a chamfer that reaches or runs past a rim builds): built as if the wall went on and cut by the bottom face, it takes the whole wall, leaving the frustum from r 8 at z = 20 to r 8 + 2 (20/25) = 9.6 at z = 0: pi h (R1^2 + R1 R2 + R2^2) / 3 = pi 20 (64 + 76.8 + 92.16) / 3 = 4879.102831. Faces: the top, the cone and the bottom: 3.",
|
||||
"body_count": 1,
|
||||
"volume_mm3": 4879.102830535188,
|
||||
"faces": 3,
|
||||
"bbox": {
|
||||
"min": [
|
||||
-9.6,
|
||||
-9.6,
|
||||
0
|
||||
],
|
||||
"max": [
|
||||
9.6,
|
||||
9.6,
|
||||
20
|
||||
]
|
||||
}
|
||||
}
|
||||
-10
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"sources": [
|
||||
"tangency-labs/solidcraft#5835"
|
||||
],
|
||||
"what": "the front and right top rim edges of a sloped basin with a 1 mm front rim chamfered 2: the front chamfer's leg runs off the rim, so it is refused, naming the largest distance that fits",
|
||||
"source": "analytic",
|
||||
"method": "slab 100 x 60 x 30 less the loft from the rectangle (20, 1)-(80, 50) at z = 30 to (30, 20)-(70, 40) at z = 10 (planar walls, a prismatoid: 20/6 (A_top + A_bottom + 4 A_mid)): V0 = 144533.333333. The front chamfer's leg on the 1 mm rim would reach y = -1, over the slab's front face: refused (the owner's ruling of 2026-10-30).",
|
||||
"outcome": "refused",
|
||||
"refusal": "the largest distance that fits is"
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"sources": [
|
||||
"tangency-labs/solidcraft#5835"
|
||||
],
|
||||
"what": "the front and right top rim edges of a sloped basin with a 1 mm front rim chamfered 2: the front chamfer's leg runs off the rim over the slab's front face (a cliff), so they build as if the top went on, mitred at the rim's corner, and are cut by the front face",
|
||||
"source": "analytic",
|
||||
"method": "slab 100 x 60 x 30 less the loft from the rectangle (20, 1)-(80, 50) at z = 30 to (30, 20)-(70, 40) at z = 10 (planar walls, a prismatoid: 20/6 (A_top + A_bottom + 4 A_mid)): V0 = 144533.333333. Sliced at depth t below the top, each picked edge's chamfer is a strip beside its wall w(t) = d (1 - t/delta) wide, delta = d / sqrt(1 + k^2), k the wall's run over its drop; picked neighbours meet in mitres (each runs on past the corner and the quadrant beyond both walls loses what both take) and an unpicked neighbour's wall, extended, ends it, so the section removed is the pocket's rectangle at t grown by w(t) on each picked side, clipped to the slab's front face y >= 0 (the owner's ruling of 2026-10-30 (d7): a chamfer that reaches or runs past a rim builds), less the pocket's rectangle. That area is quadratic in t between the breakpoints (each delta, and where the front strip's edge y0 + k t - w(t) crosses y = 0), so Simpson's rule on each piece is exact. Removed 161.279149. V = 144372.054184",
|
||||
"body_count": 1,
|
||||
"volume_mm3": 144372.05418423912,
|
||||
"bbox": {
|
||||
"min": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"max": [
|
||||
100,
|
||||
60,
|
||||
30
|
||||
]
|
||||
},
|
||||
"tolerance": {
|
||||
"rel": 1e-06
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,10 @@
|
||||
# rig gate (.github/workflows/fillet-rig.yml) fails on a case that fails and is not listed here,
|
||||
# and on a listed case that passes: a fix removes its line in the same pull request.
|
||||
# Baseline: develop 242bbc89f with the SMLib fixes of 2026-10-29 (integration-overnight + b78bd4a), aarch64 Linux.
|
||||
1080-chamfer-equal-slope-basin-1-mm-rim-loop-2 SMLib refuses the chamfers' cliff overflow as too large (SM_FILERR_NO_ROOM, CloseRemovalRegion): the blended loop's boundary closes on one face, where it should build cut by the front face
|
||||
1080-chamfer-sloped-basin-0-5-mm-rim-4-past-the-rim SMLib refuses the chamfer past the rim as too large (SM_FILERR_NO_ROOM, CloseRemovalRegion): its sheet's boundary along the end wall's top edge line, past the rim, lies on the surfaces of two faces, where it should build cut by the front face
|
||||
1080-chamfer-sloped-basin-1-mm-rim-2-past-the-rim SMLib refuses the chamfer past the rim as too large (SM_FILERR_NO_ROOM, CloseRemovalRegion): its sheet's boundary along the end wall's top edge line, past the rim, lies on the surfaces of two faces, where it should build cut by the front face
|
||||
1080-chamfer-sloped-basin-1-mm-rim-3-past-the-rim SMLib refuses the chamfer past the rim as too large (SM_FILERR_NO_ROOM, CloseRemovalRegion): its sheet's boundary along the end wall's top edge line, past the rim, lies on the surfaces of two faces, where it should build cut by the front face
|
||||
1080-fillet-equal-slope-basin-1-mm-rim-loop-0-5 SMLib's check refuses the round: SmSurfOfRevolution Test #7, polar curve intervals do not match the surface's domain
|
||||
1080-fillet-equal-slope-basin-1-mm-rim-loop-4 not supported yet: a convex round past its face is not yet built by subtraction
|
||||
1080-fillet-notched-block-top-outline-r8 not supported yet: a convex round past its face is not yet built by subtraction (largest that fits named 7 mm)
|
||||
@@ -17,11 +21,11 @@
|
||||
2852-fillet-outer-round-r30-past-inner-round-refused refused for another reason: SMLib's result is not a closed solid, not too large naming 25.24
|
||||
2893-chamfer-distance-and-angle-past-the-wall-refused refused for another reason: SMLib SM_ERR_INVALID_INPUT, not a check saying the angle runs past the wall
|
||||
2893-chamfer-two-distances-elliptical-rim SMLib status 1001 on the elliptical rim's chamfer
|
||||
2893-chamfer-two-distances-past-the-bottom-refused refused for another reason: SMLib status 1001, not too large
|
||||
2893-chamfer-two-distances-past-the-bottom SMLib status 1001: SmFilletNx1ClosedCorner cannot compute the closed rim's corner geometry, where the chamfer past the bottom rim should build the frustum
|
||||
4782-fillet-bar-edge-wider-than-both-faces SMLib status 1001: a convex round past both its faces is not yet built by subtraction
|
||||
5158-fillet-round-just-past-a-10mm-face SMLib status 1001: a convex round 0.01 past its face is not yet built by subtraction (10.0001-10.04 open)
|
||||
5835-chamfer-sloped-basin-1-mm-rim-0-5-4-edges SMLib status 1001 on the chamfers meeting at the rim's re-entrant corners
|
||||
5835-chamfer-sloped-basin-1-mm-rim-2-two-edges-refused refused for another reason: SMLib status 1001, not too large naming the largest that fits
|
||||
5835-chamfer-sloped-basin-1-mm-rim-2-two-edges SMLib status 1001: SmFilletNx2Corner, CalcFilletIntSideFace cannot intersect a chamfer with the side face at the rim's corner, where the front chamfer past the rim should build cut by the front face
|
||||
5835-chamfer-sloped-basin-4-mm-rim-2-2-edges SMLib status 1001 on the chamfers meeting at the rim's re-entrant corner
|
||||
5835-chamfer-sloped-basin-4-mm-rim-2-4-edges SMLib status 1001 on the chamfers meeting at the rim's re-entrant corners
|
||||
851-chamfer-knife-edge-tip-0-5 SMLib SM_ERR_INVALID_INPUT on the knife edge (opposite normals on its two faces)
|
||||
@@ -36,7 +40,7 @@ cov-chamfer-concave-edge-through-up-down-joined-squares SMLib status 1001 on the
|
||||
cov-chamfer-outer-corner-edge-of-a-shelled-box-with-a-lip SMLib's chamfer result is not a closed solid where it ends on the lip
|
||||
cov-fillet-arc-edge-on-an-oblique-cut-of-a-bar SMLib's check refuses the round: internal coincident control points in a B-spline curve
|
||||
every-block-cylinder-crease-top-edge-after-arc-round-r1 the r1 round's contact seam with the block's side face reads 60 degrees (the cylinder wall's normal) at its end on the crease (8.660, 5, 15.284): G0 where the round is built tangent
|
||||
every-chamfer-pocket-rim-5-5-refused refused naming 5 mm as the largest distance: the full-width chamfer (legs as deep as the 5 mm walls) builds instead of being refused
|
||||
every-chamfer-pocket-rim-5-5-past-the-floor SMLib refuses the chamfers' cliff overflow as too large (SM_FILERR_NO_ROOM, CloseRemovalRegion): the blended loop's boundary closes on one face, where it should build with a groove round the floor
|
||||
every-hole-top-rim-r12-past-plate-bottom SMLib status 1001: a convex round past its face on the tangent side is not yet built by subtraction
|
||||
every-pocket-floor-and-rim-edges-r2 a corner patch where two rim rounds meet at each concave pocket corner (23 faces, not 19) instead of the mitre the rounds make running into each other
|
||||
every-pocket-rim-edges-r2 a corner patch where two rim rounds meet at each concave pocket corner (19 faces, not 15) instead of the mitre the rounds make running into each other
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"sources": [],
|
||||
"what": "a 5 mm deep pocket's rim edges chamfered 5.5: the legs run 0.5 past the walls' bottom, so it builds as if the walls went on below the floor, a groove 0.5 deep round the floor's edge",
|
||||
"source": "analytic",
|
||||
"method": "plate 60x40x10 with the pocket 30x20x5 (x 15..45, y 10..30, floor z = 5, sharp vertical corners): V0 = 24000 - 3000 = 21000. Each convex rim edge loses the triangle d^2/2 along its length (100 in all); at each pocket corner the two chamfers run on past it and meet in a mitre, the quadrant losing what both remove: points (s, t) past both walls with s + u < d and t + u < d (u the depth), int_0^d (d-u)^2 du = d^3/3: removed = 50 d^2 + (4/3) d^3. d = 5.5 runs 0.5 past the walls' bottom (the owner's ruling of 2026-10-30 (d7): a chamfer that reaches or runs past a rim builds): the chamfers are built as if the walls went on below the floor and what they take is cut from the plate; the formula holds as it is, its section at depth u in [5, 5.5] being the ring between the floor's rectangle and the rectangle grown by d - u, a groove round the floor's edge (the floor's own rectangle is not part of the blends). Faces: the plate's 6, the floor, the 4 chamfers and the groove's 4 walls (the walls' planes from z = 4.5 to 5): 15. Removed 1734.333333. V = 19265.666667.",
|
||||
"body_count": 1,
|
||||
"volume_mm3": 19265.666666666668,
|
||||
"faces": 15,
|
||||
"bbox": {
|
||||
"min": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"max": [
|
||||
60,
|
||||
40,
|
||||
10
|
||||
]
|
||||
},
|
||||
"continuity": {
|
||||
"order": "g0"
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"sources": [],
|
||||
"what": "a 5 mm deep pocket's rim edges chamfered 5.5: the legs would run off the walls over the floor: refused, naming the largest distance that fits",
|
||||
"source": "invariants",
|
||||
"method": "owner rule: a chamfer whose leg runs off the face beside its edge over another face is refused, naming the largest size that fits, and a full-width chamfer stays refused. The walls are 5 deep, so every distance below 5 fits (every-chamfer-pocket-rim-4-9-fits) and 5 does not; the search names the largest at the request's three significant digits (step 0.001): 4.999.",
|
||||
"outcome": "refused",
|
||||
"refusal": "the largest distance that fits is 4.999 mm"
|
||||
}
|
||||
Reference in New Issue
Block a user