From ba38fbd2afd48aaa4a05f5c71ba3233710b71228 Mon Sep 17 00:00:00 2001 From: jyviko <2501648+jyviko@users.noreply.github.com> Date: Mon, 26 Oct 2026 13:37:34 -0400 Subject: [PATCH] kernel-cases: ladder 07/019, a concave corner's G2 patch The inner corner of a 20 x 20 x 10 notch in the 60 x 40 x 20 box, three concave r5 rounds with corner: g2: one valid body of 13 faces within the box, the patch's twelve seams jumping at most 1e-3 per mm clear of the hole's six corners (2.7e-4 measured; the ball corner jumps 0.2). The continuity check looks within 11 mm of the corner: the vertical round, 2.5 mm long past its setback, meets its faces 11.2 mm out with every round's G1 jump. Co-Authored-By: Claude Opus 5.5 --- .../019-concave-corner-g2-patch/expected.json | 30 +++++++++++ .../019-concave-corner-g2-patch/recipe.json | 53 +++++++++++++++++++ tests/kernel-cases/ladder/golden.json | 12 +++++ tests/kernel-cases/ladder/ladder.json | 1 + tools/kernel-ladder/cases.py | 11 ++++ 5 files changed, 107 insertions(+) create mode 100644 tests/kernel-cases/ladder/07-fillets/019-concave-corner-g2-patch/expected.json create mode 100644 tests/kernel-cases/ladder/07-fillets/019-concave-corner-g2-patch/recipe.json diff --git a/tests/kernel-cases/ladder/07-fillets/019-concave-corner-g2-patch/expected.json b/tests/kernel-cases/ladder/07-fillets/019-concave-corner-g2-patch/expected.json new file mode 100644 index 0000000000..0ede2bac07 --- /dev/null +++ b/tests/kernel-cases/ladder/07-fillets/019-concave-corner-g2-patch/expected.json @@ -0,0 +1,30 @@ +{ + "sources": [], + "what": "three concave r5 rounds at the inner corner of a 20x20x10 notch, with the g2 corner patch", + "source": "invariants", + "method": "the notch's inner corner (40,20,10), three concave edges, set back 1.5 r = 7.5 and filled with one patch G2 to the three rounds and the three faces; one valid body with the faces of the ball corner (13); across the patch's seams the curvature jump is at most 1e-3 per mm (the ball's corner jumps 1/r = 0.2) clear of the six points where a round's section ends on a face (within 11 mm of the corner: the hole reaches 7.5 sqrt 2; the vertical round, 2.5 mm long past its setback, meets its faces 11.2 mm out, with the G1 jump every round has)", + "body_count": 1, + "faces": 13, + "bbox": { + "min": [ + 0, + 0, + 0 + ], + "max": [ + 60, + 40, + 20 + ] + }, + "continuity": { + "near": [ + 40, + 20, + 10 + ], + "within_mm": 11, + "clear_mm": 1.2, + "curvature_jump_per_mm": 0.001 + } +} diff --git a/tests/kernel-cases/ladder/07-fillets/019-concave-corner-g2-patch/recipe.json b/tests/kernel-cases/ladder/07-fillets/019-concave-corner-g2-patch/recipe.json new file mode 100644 index 0000000000..0a98532720 --- /dev/null +++ b/tests/kernel-cases/ladder/07-fillets/019-concave-corner-g2-patch/recipe.json @@ -0,0 +1,53 @@ +{ + "base": "../../01-primitives/001-box", + "commands": [ + { + "command": "solid.box", + "params": { + "corner": [ + 40, + 20, + 10 + ], + "length": 30, + "width": 30, + "height": 20, + "body_name": "Notch" + } + }, + { + "command": "solid.combine", + "params": { + "target": "Part", + "tools": [ + "Notch" + ], + "operation": "cut" + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 50, + 20, + 10 + ], + [ + 40, + 30, + 10 + ], + [ + 40, + 20, + 15 + ] + ], + "radius": 5, + "corner": "g2" + } + } + ] +} diff --git a/tests/kernel-cases/ladder/golden.json b/tests/kernel-cases/ladder/golden.json index 2e17a58170..53aa862d7d 100644 --- a/tests/kernel-cases/ladder/golden.json +++ b/tests/kernel-cases/ladder/golden.json @@ -1200,6 +1200,18 @@ "seconds": 2.184099933, "status": "pass" }, + "ladder/07-fillets/019-concave-corner-g2-patch": { + "measured": { + "area_mm2": 8702.800595617835, + "body_count": 1, + "edges": 33, + "faces": 13, + "vertices": 22, + "volume_mm3": 44254.3419135911 + }, + "seconds": 2.217877403, + "status": "pass" + }, "ladder/07-fillets/016-corner-three-sequential-r5-r3-r7": { "seconds": 0.045599545, "status": "pass" diff --git a/tests/kernel-cases/ladder/ladder.json b/tests/kernel-cases/ladder/ladder.json index 22df15ac63..ae3c21f85c 100644 --- a/tests/kernel-cases/ladder/ladder.json +++ b/tests/kernel-cases/ladder/ladder.json @@ -124,6 +124,7 @@ { "cases": [ "ladder/07-fillets/015-corner-g2-patch", + "ladder/07-fillets/019-concave-corner-g2-patch", "ladder/07-fillets/006-variable-r5-to-zero", "ladder/07-fillets/001-single-edge-r5", "ladder/07-fillets/007-variable-r5-to-1e-3", diff --git a/tools/kernel-ladder/cases.py b/tools/kernel-ladder/cases.py index 06a5021473..562a4e09aa 100644 --- a/tools/kernel-ladder/cases.py +++ b/tools/kernel-ladder/cases.py @@ -871,6 +871,17 @@ case(T7, "015-corner-g2-patch", "three r5 rounds at a corner with the g2 corner "(the ball's corner, 009, jumps 1/r = 0.2) clear of the six points where a round's section ends on a face, where the round's " "own G1 seam with the face ends (the patch passes from one curvature to the other within 15% of each side: 1.2 mm covers it)", base=B1, source="invariants") +notch = [[50, 20, 10], [40, 30, 10], [40, 20, 15]] +case(T7, "019-concave-corner-g2-patch", "three concave r5 rounds at the inner corner of a 20x20x10 notch, with the g2 corner patch", + [box([40, 20, 10], 30, 30, 20, body_name="Notch"), C("solid.combine", target="Part", tools=["Notch"], operation="cut"), + F(notch, 5, corner="g2")], + {"body_count": 1, "faces": 13, "bbox": {"min": [0, 0, 0], "max": [60, 40, 20]}, + "continuity": {"near": [40, 20, 10], "within_mm": 11, "clear_mm": 1.2, "curvature_jump_per_mm": 0.001}}, + "the notch's inner corner (40,20,10), three concave edges, set back 1.5 r = 7.5 and filled with one patch G2 to the three " + "rounds and the three faces; one valid body with the faces of the ball corner (13); across the patch's seams the curvature " + "jump is at most 1e-3 per mm (the ball's corner jumps 1/r = 0.2) clear of the six points where a round's section ends on a face (within 11 mm of the corner: the hole reaches 7.5 sqrt 2; " + "the vertical round, 2.5 mm long past its setback, meets its faces 11.2 mm out, with the G1 jump every round has)", + base=B1, source="invariants") V7 = V5 - 2 * SPANDREL * 25 * 20 - SPANDREL * 9 * 60 + SPANDREL * 1 * 2 * PI * (8 + XBAR * 1) case(T7, "017-part-rounds", "the running part: r5 on the front vertical edges, r3 on the back wall's top front edge, r1 where the boss meets the top", [F([[0, 0, 10], [60, 0, 10]], 5), F([[30, 30, 35]], 3), F([[23, 15, 20]], 1)],