diff --git a/tests/kernel-cases/fillets/KNOWN_FAILING b/tests/kernel-cases/fillets/KNOWN_FAILING index b897ee7573..170fc6f1ea 100644 --- a/tests/kernel-cases/fillets/KNOWN_FAILING +++ b/tests/kernel-cases/fillets/KNOWN_FAILING @@ -7,6 +7,7 @@ 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) 9-fillet-corner-curvature-with-reduce-fit not supported yet: solid.fillet builds corner g2 with the exact fit only 9-fillet-corner-curvature-with-taper-fit not supported yet: solid.fillet builds corner g2 with the exact fit only +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-hole-top-rim-chamfer-10-full-depth-refused the full-width chamfer (leg as deep as the 10 mm plate) builds instead of being refused 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 diff --git a/tests/kernel-cases/fillets/every-block-cylinder-crease-top-edge-after-arc-round-r1/expected.json b/tests/kernel-cases/fillets/every-block-cylinder-crease-top-edge-after-arc-round-r1/expected.json new file mode 100644 index 0000000000..7d4b7dd217 --- /dev/null +++ b/tests/kernel-cases/fillets/every-block-cylinder-crease-top-edge-after-arc-round-r1/expected.json @@ -0,0 +1,10 @@ +{ + "sources": [], + "what": "a block's concave arc at the cylinder it is joined to rounded r2, then the block's long top edge rounded r1, which ends on the arc's round", + "source": "invariants", + "method": "block 40x10x15 (x 0..40, y -5..5) joined to the cylinder R10 x 30 on the z axis, the block's end on the cylinder's diameter x = 0 so its sides y = +-5 meet the wall at vertical creases: V0 = 6000 + 3000 pi - 15 * (the disc's part with x > 0, |y| <= 5: 2 (y/2 sqrt(100-y^2) + 50 asin(y/10)) at y=5 = 95.661148) = 13989.8607 and the arc rounded r2 (every-block-cylinder-crease-concave-arc-r2). The top edge y = 5, z = 15 now ends where the top face meets the arc round (x = sqrt(144-25)); its tangent chain goes on up the edge between the side face and the arc round (the round's end, a curve on the plane y = 5 tangent to the top edge there) to the cylinder's crease. The r1 round along that curve has no closed-form volume (the curve is a torus cut by a plane): one valid body, blend seams G1.", + "body_count": 1, + "continuity": { + "order": "g1" + } +} \ No newline at end of file diff --git a/tests/kernel-cases/fillets/every-block-cylinder-crease-top-edge-after-arc-round-r1/recipe.json b/tests/kernel-cases/fillets/every-block-cylinder-crease-top-edge-after-arc-round-r1/recipe.json new file mode 100644 index 0000000000..85b5f1c49a --- /dev/null +++ b/tests/kernel-cases/fillets/every-block-cylinder-crease-top-edge-after-arc-round-r1/recipe.json @@ -0,0 +1,60 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 40, + "width": 10, + "height": 15, + "corner": [ + 0, + -5, + 0 + ], + "body_name": "Block" + } + }, + { + "command": "solid.cylinder", + "params": { + "radius": 10, + "height": 30, + "base": [ + 0, + 0, + 0 + ], + "operation": "join", + "targets": [ + "Block" + ] + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 10, + 0, + 15 + ] + ], + "radius": 2 + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 30, + 5, + 15 + ] + ], + "radius": 1 + } + } + ] +} \ No newline at end of file diff --git a/tests/kernel-cases/fillets/every-fillet-after-fillet-curvature-front-then-side-r3/expected.json b/tests/kernel-cases/fillets/every-fillet-after-fillet-curvature-front-then-side-r3/expected.json new file mode 100644 index 0000000000..e1b8f5409f --- /dev/null +++ b/tests/kernel-cases/fillets/every-fillet-after-fillet-curvature-front-then-side-r3/expected.json @@ -0,0 +1,12 @@ +{ + "sources": [], + "what": "a box's top front edge rounded curvature-continuous size 3, then the top side edge meeting it at the corner rounded the same way alone (Tangent chain off)", + "source": "invariants", + "method": "box 40x30x20; the edge y=0, z=20 rounded type curvature 3 (every-box-edge-r3-curvature's section), then the edge x=40, z=20 (now y 3..30) rounded type curvature 3 alone: at y = 3 it runs on tangentially into the first round's end curve on x = 40 (the quintic, tangent to the top there), so the second round ends on a curved round, not a planar end face: no closed form. A valid body with every blend seam G2, or a refusal saying the edge continues tangentially (the 1207 precedent).", + "body_count": 1, + "outcome": "solid_or_refused", + "refusal": "continues tangentially", + "continuity": { + "order": "g2" + } +} \ No newline at end of file diff --git a/tests/kernel-cases/fillets/every-fillet-after-fillet-curvature-front-then-side-r3/recipe.json b/tests/kernel-cases/fillets/every-fillet-after-fillet-curvature-front-then-side-r3/recipe.json new file mode 100644 index 0000000000..70928417e9 --- /dev/null +++ b/tests/kernel-cases/fillets/every-fillet-after-fillet-curvature-front-then-side-r3/recipe.json @@ -0,0 +1,42 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 40, + "width": 30, + "height": 20, + "body_name": "Part" + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 20, + 0, + 20 + ] + ], + "radius": 3, + "type": "curvature" + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 40, + 15, + 20 + ] + ], + "radius": 3, + "type": "curvature", + "tangent_chain": false + } + } + ] +} \ No newline at end of file diff --git a/tests/kernel-cases/fillets/every-fillet-after-fillet-front-r3-then-vertical-r2/expected.json b/tests/kernel-cases/fillets/every-fillet-after-fillet-front-r3-then-vertical-r2/expected.json new file mode 100644 index 0000000000..7510e3c71c --- /dev/null +++ b/tests/kernel-cases/fillets/every-fillet-after-fillet-front-r3-then-vertical-r2/expected.json @@ -0,0 +1,24 @@ +{ + "sources": [], + "what": "a box's top front edge rounded r3, then the vertical edge meeting it rounded r2: the smaller round runs on round the bigger round's end and along the top side edge", + "source": "analytic", + "method": "box 40x30x20; the edge y=0, z=20 rounded r3 removes 40 (1-pi/4) 9 = 77.2567. The edge x=40, y=0 (now z 0..17) rounded r2 with its tangent chain: the end arc of the r3 round on x = 40 and the edge x=40, z=20 (y 3..30). Along the arc the r2 ball rolls between the plane x = 40 and the r3 cylinder: its section in each half-plane through that cylinder's axis is the square-corner spandrel with its corner 3 from the axis, the material towards it, turned a quarter turn (Pappus): (pi/2)(3 A2 - M2), A2 = (1-pi/4) 4 = 0.858407, M2 = 8 (5/6-pi/4) = 0.383481. Removed = 40 A3 + 17 A2 + (pi/2)(3 A2 - M2) + 27 A2 = 118.4694. V = 23881.5306. Faces 6 + 3 rounds + the torus piece = 10.", + "body_count": 1, + "volume_mm3": 23881.530637372005, + "faces": 10, + "bbox": { + "min": [ + 0, + 0, + 0 + ], + "max": [ + 40, + 30, + 20 + ] + }, + "continuity": { + "order": "g1" + } +} \ No newline at end of file diff --git a/tests/kernel-cases/fillets/every-fillet-after-fillet-front-r3-then-vertical-r2/recipe.json b/tests/kernel-cases/fillets/every-fillet-after-fillet-front-r3-then-vertical-r2/recipe.json new file mode 100644 index 0000000000..fc4ca4ebbf --- /dev/null +++ b/tests/kernel-cases/fillets/every-fillet-after-fillet-front-r3-then-vertical-r2/recipe.json @@ -0,0 +1,39 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 40, + "width": 30, + "height": 20, + "body_name": "Part" + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 20, + 0, + 20 + ] + ], + "radius": 3 + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 40, + 0, + 10 + ] + ], + "radius": 2 + } + } + ] +} \ No newline at end of file diff --git a/tests/kernel-cases/fillets/every-fillet-after-fillet-front-then-vertical-r2/expected.json b/tests/kernel-cases/fillets/every-fillet-after-fillet-front-then-vertical-r2/expected.json new file mode 100644 index 0000000000..77268e5736 --- /dev/null +++ b/tests/kernel-cases/fillets/every-fillet-after-fillet-front-then-vertical-r2/expected.json @@ -0,0 +1,24 @@ +{ + "sources": [], + "what": "a box's top front edge rounded r2, then the vertical edge meeting it at the corner rounded r2 (Tangent chain on)", + "source": "analytic", + "method": "box 40x30x20; the edge y=0, z=20 rounded r2, then the edge x=40, y=0: rounding the second edge after the first, its tangent chain (the default) runs on along the first round's end arc (on the end face, tangent to it) and the third edge at the corner; the rolling ball along that arc, between the end face and the first round of the same radius, is the corner's sphere, so the result is the three-edge rolling-ball corner: V = 24000 - (1-pi/4) 4 (40+20+30-6) - 8 (1-pi/6) = 23924.0826 (every-box-corner-three-edges-r1-tangent's formula at r2). Faces 10. The same as every-fillet-after-fillet-vertical-then-front-r2: the order does not matter.", + "body_count": 1, + "volume_mm3": 23924.08257310633, + "faces": 10, + "bbox": { + "min": [ + 0, + 0, + 0 + ], + "max": [ + 40, + 30, + 20 + ] + }, + "continuity": { + "order": "g1" + } +} \ No newline at end of file diff --git a/tests/kernel-cases/fillets/every-fillet-after-fillet-front-then-vertical-r2/recipe.json b/tests/kernel-cases/fillets/every-fillet-after-fillet-front-then-vertical-r2/recipe.json new file mode 100644 index 0000000000..26a7881f5c --- /dev/null +++ b/tests/kernel-cases/fillets/every-fillet-after-fillet-front-then-vertical-r2/recipe.json @@ -0,0 +1,39 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 40, + "width": 30, + "height": 20, + "body_name": "Part" + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 20, + 0, + 20 + ] + ], + "radius": 2 + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 40, + 0, + 10 + ] + ], + "radius": 2 + } + } + ] +} \ No newline at end of file diff --git a/tests/kernel-cases/fillets/every-fillet-after-fillet-vertical-then-front-r2/expected.json b/tests/kernel-cases/fillets/every-fillet-after-fillet-vertical-then-front-r2/expected.json new file mode 100644 index 0000000000..b211aed15d --- /dev/null +++ b/tests/kernel-cases/fillets/every-fillet-after-fillet-vertical-then-front-r2/expected.json @@ -0,0 +1,24 @@ +{ + "sources": [], + "what": "a box's vertical edge rounded r2, then the top front edge meeting it at the corner rounded r2 (Tangent chain on)", + "source": "analytic", + "method": "box 40x30x20; the edge x=40, y=0 rounded r2, then the edge y=0, z=20: rounding the second edge after the first, its tangent chain (the default) runs on along the first round's end arc (on the end face, tangent to it) and the third edge at the corner; the rolling ball along that arc, between the end face and the first round of the same radius, is the corner's sphere, so the result is the three-edge rolling-ball corner: V = 23924.0826, as every-fillet-after-fillet-front-then-vertical-r2. Faces 10.", + "body_count": 1, + "volume_mm3": 23924.08257310633, + "faces": 10, + "bbox": { + "min": [ + 0, + 0, + 0 + ], + "max": [ + 40, + 30, + 20 + ] + }, + "continuity": { + "order": "g1" + } +} \ No newline at end of file diff --git a/tests/kernel-cases/fillets/every-fillet-after-fillet-vertical-then-front-r2/recipe.json b/tests/kernel-cases/fillets/every-fillet-after-fillet-vertical-then-front-r2/recipe.json new file mode 100644 index 0000000000..1060430448 --- /dev/null +++ b/tests/kernel-cases/fillets/every-fillet-after-fillet-vertical-then-front-r2/recipe.json @@ -0,0 +1,39 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 40, + "width": 30, + "height": 20, + "body_name": "Part" + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 40, + 0, + 10 + ] + ], + "radius": 2 + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 20, + 0, + 20 + ] + ], + "radius": 2 + } + } + ] +} \ No newline at end of file diff --git a/tests/kernel-cases/fillets/every-l-bracket-front-inner-outline-after-bend-round-r1/expected.json b/tests/kernel-cases/fillets/every-l-bracket-front-inner-outline-after-bend-round-r1/expected.json new file mode 100644 index 0000000000..35bd6778d3 --- /dev/null +++ b/tests/kernel-cases/fillets/every-l-bracket-front-inner-outline-after-bend-round-r1/expected.json @@ -0,0 +1,24 @@ +{ + "sources": [], + "what": "an L-bracket's inside bend rounded r3, then the front edge of its upright's inner face rounded r1: the round runs on along the bend round's front arc and the foot's front top edge", + "source": "analytic", + "method": "L-bracket: the legs 40x20x5 (x 0..40, z 0..5) and 5x20x40 (x 0..5, z 0..40) joined, 20 deep in y: V0 = 4000 + 4000 - 500 = 7500, 8 faces. The bend r3 adds 20 (1-pi/4) 9 = 38.6283. The edge x = 5, y = 0 (z 8..40) rounded r1 with its tangent chain: the bend round's arc on y = 0 and the edge y = 0, z = 5 (x 8..40). Straight parts 32 + 32 remove (1-pi/4) each mm; along the arc the ball rolls between y = 0 and the concave r3 cylinder (axis (8, y, 8)), the material away from the axis: the spandrel with its corner 3 from the axis turned a quarter turn, (pi/2)(3 A1 + M1), M1 = 5/6 - pi/4. V = 7500 + 20 A3 - 64 A1 - (pi/2)(3 A1 + M1) = 7523.8072. Faces 9 + 3 = 12.", + "body_count": 1, + "volume_mm3": 7523.80722932706, + "faces": 12, + "bbox": { + "min": [ + 0, + 0, + 0 + ], + "max": [ + 40, + 20, + 40 + ] + }, + "continuity": { + "order": "g1" + } +} \ No newline at end of file diff --git a/tests/kernel-cases/fillets/every-l-bracket-front-inner-outline-after-bend-round-r1/recipe.json b/tests/kernel-cases/fillets/every-l-bracket-front-inner-outline-after-bend-round-r1/recipe.json new file mode 100644 index 0000000000..098600a23f --- /dev/null +++ b/tests/kernel-cases/fillets/every-l-bracket-front-inner-outline-after-bend-round-r1/recipe.json @@ -0,0 +1,61 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 40, + "width": 20, + "height": 5, + "corner": [ + 0, + 0, + 0 + ], + "body_name": "Bracket" + } + }, + { + "command": "solid.box", + "params": { + "length": 5, + "width": 20, + "height": 40, + "corner": [ + 0, + 0, + 0 + ], + "operation": "join", + "targets": [ + "Bracket" + ] + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 5, + 10, + 5 + ] + ], + "radius": 3 + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 5, + 0, + 25 + ] + ], + "radius": 1 + } + } + ] +} \ No newline at end of file