diff --git a/tests/kernel-cases/fillets/KNOWN_FAILING b/tests/kernel-cases/fillets/KNOWN_FAILING index aab567e6df..ab9b1c817e 100644 --- a/tests/kernel-cases/fillets/KNOWN_FAILING +++ b/tests/kernel-cases/fillets/KNOWN_FAILING @@ -16,6 +16,9 @@ cov-fillet-g2-corner-beside-a-cylinder not supported yet: the curvature fillet b cov-fillet-g2-five-edge-apex-corner refused: the default setback is shorter than where the rounds' contact lines meet (3.5056 mm from the apex); the corner should take a setback that works cov-fillet-g2-four-edge-apex-corner refused: the default setback is shorter than where the rounds' contact lines meet (3.9027 mm from the apex); the corner should take a setback that works cov-fillet-g2-mixed-corner not supported yet: SMLib sets back a corner only where its edges are all convex or all concave +cov-fillet-section-curvature-boss-root-r2 the curvature round's section is SMLib's quintic blend curve, not the order-2 section: volume 26042.0901 against 26042.0732 (rel 6.5e-7) +cov-fillet-section-curvature-pipe-on-plate-r2 the curvature round's section is SMLib's quintic blend curve, not the order-2 section: volume 40255.6308 against 40256.1327 (rel 1.2e-5) +cov-fillet-variable-box-edge-1-to-5-on-its-cone the variable round's sections are the balls' great circles, not the circles their envelope touches them along: volume 11955.6466 against 11956.2224 (rel 4.8e-5) report-drafted-peg-front-and-concave-rounds-together-r2 not supported yet: SMLib refuses the corner where the drafted front top edge runs tangent into the concave arc (on the cone) as of no kind its blend corners take report-fillet-concave-arc-and-front-top-edge-together-r5-solver-residues the corner patch where the convex and concave rounds meet stands 0.128 out of the front face (box y min -0.0699 against 0.0579) report-fillet-concave-arc-and-front-top-edge-together-r7-solver-residues the corner patch where the convex and concave rounds meet stands 0.230 out of the front face (box y min -0.1723 against 0.0579) diff --git a/tests/kernel-cases/fillets/cov-fillet-section-chamfer-box-edge-3/expected.json b/tests/kernel-cases/fillets/cov-fillet-section-chamfer-box-edge-3/expected.json new file mode 100644 index 0000000000..e68a667945 --- /dev/null +++ b/tests/kernel-cases/fillets/cov-fillet-section-chamfer-box-edge-3/expected.json @@ -0,0 +1,28 @@ +{ + "sources": [], + "what": "a box's top back edge chamfered 3: the chord between the faces' contact lines, a crease with each face", + "source": "analytic", + "method": "box 40x30x20, the top back edge (y = 30, z = 20, 40 long) between the planar end faces x = 0 and 40, set back s = 3 along both faces (square to each other): the chord cuts s^2/2 = 4.5 off the corner: V = 24000 - 40 * 4.5 = 23820. Faces 7; both seams of the chamfer with the faces G0, and not G1 (45 degrees).", + "body_count": 1, + "volume_mm3": 23820.0, + "faces": 7, + "bbox": { + "min": [ + 0, + 0, + 0 + ], + "max": [ + 40, + 30, + 20 + ] + }, + "continuity": { + "order": "g0", + "exact": true + }, + "tolerance": { + "rel": 1e-07 + } +} diff --git a/tests/kernel-cases/fillets/cov-fillet-section-chamfer-box-edge-3/recipe.json b/tests/kernel-cases/fillets/cov-fillet-section-chamfer-box-edge-3/recipe.json new file mode 100644 index 0000000000..e0455bcf8c --- /dev/null +++ b/tests/kernel-cases/fillets/cov-fillet-section-chamfer-box-edge-3/recipe.json @@ -0,0 +1,26 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 40, + "width": 30, + "height": 20, + "body_name": "Part" + } + }, + { + "command": "solid.chamfer", + "params": { + "distance": 3, + "edges": [ + [ + 20, + 30, + 20 + ] + ] + } + } + ] +} diff --git a/tests/kernel-cases/fillets/cov-fillet-section-chamfer-pipe-on-plate-2/expected.json b/tests/kernel-cases/fillets/cov-fillet-section-chamfer-pipe-on-plate-2/expected.json new file mode 100644 index 0000000000..5c31c505eb --- /dev/null +++ b/tests/kernel-cases/fillets/cov-fillet-section-chamfer-pipe-on-plate-2/expected.json @@ -0,0 +1,15 @@ +{ + "sources": [], + "what": "the concave edge where a pipe dips into a plate chamfered 2: the chord between the contact lines on the plane and on the pipe", + "source": "analytic", + "method": "plate 60x40x10 (z 0..10) joined to a pipe R10 along x (0..60) whose axis is at (y, z) = (20, 16): the pipe dips 4 into the plate and leaves it along y = 20 +- 8, z = 10, the edges ending on the planar faces x = 0 and 60. V0 = 24000 + 60 (100 pi - (100 acos 0.6 - 48)) = 40165.7846. The concave edge y = 28: in a plane x = const, the point at distance d from both faces is (20 + g, 10 + d), g = sqrt(64 + 32 d); its feet are F1 = (20 + g, 10) on the plate and F2 = (20 + 10 g / (10 + d), 26 - 160 / (10 + d)) on the pipe. The chamfer 2 back from the edge rolls the ball of radius 2 sqrt((1 - c) / (1 + c)) = 1 (c = 0.6, the cosine between the faces' directions (1, 0) and (0.6, 0.8) away from the edge): the chord between F1(1) = (29.797959, 10) and F2(1) = (28.907235, 11.454545) adds the area between it, the plate and the pipe (Green's theorem along the plate, the chord and the pipe's arc) 1.265531: V = 40165.7846 + 60 * 1.265531 = 40241.7165. Both seams G0.", + "body_count": 1, + "volume_mm3": 40241.7164766411, + "continuity": { + "order": "g0", + "exact": true + }, + "tolerance": { + "rel": 1e-07 + } +} diff --git a/tests/kernel-cases/fillets/cov-fillet-section-chamfer-pipe-on-plate-2/recipe.json b/tests/kernel-cases/fillets/cov-fillet-section-chamfer-pipe-on-plate-2/recipe.json new file mode 100644 index 0000000000..b60ee407e6 --- /dev/null +++ b/tests/kernel-cases/fillets/cov-fillet-section-chamfer-pipe-on-plate-2/recipe.json @@ -0,0 +1,47 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 60, + "width": 40, + "height": 10, + "body_name": "Plate" + } + }, + { + "command": "solid.cylinder", + "params": { + "radius": 10, + "height": 60, + "base": [ + 0, + 20, + 16 + ], + "axis": [ + 1, + 0, + 0 + ], + "operation": "join", + "targets": [ + "Plate" + ] + } + }, + { + "command": "solid.chamfer", + "params": { + "distance": 2, + "edges": [ + [ + 30, + 28, + 10 + ] + ] + } + } + ] +} diff --git a/tests/kernel-cases/fillets/cov-fillet-section-curvature-boss-root-r2/expected.json b/tests/kernel-cases/fillets/cov-fillet-section-curvature-boss-root-r2/expected.json new file mode 100644 index 0000000000..cc677aa60f --- /dev/null +++ b/tests/kernel-cases/fillets/cov-fillet-section-curvature-boss-root-r2/expected.json @@ -0,0 +1,16 @@ +{ + "sources": [], + "what": "the root circle of a boss R8 on a plate rounded curvature-continuous size 2: the order-2 section revolved", + "source": "analytic", + "method": "plate 60x40x10 with a boss R8 x 10 at (30, 20): V0 = 24000 + 640 pi = 26010.6193. In each meridian plane (rho, z) the plate's top and the boss's wall are the lines z = 10 and rho = 8, the feet of the point at distance d from both (8 + d, 10) and (8, 10 + d): the order-2 section at the default thumbweight is that of a square corner (cov-fillet-section-curvature-box-edge-r3), area 113/756 s^2 = 0.597884 (s = 2), first moment about the wall 0.222979 (Green's theorem on the section), revolved (Pappus): 2 pi (8 A + M) = 31.454. V = 26042.0732. Faces 9; both seams G2, not G3.", + "body_count": 1, + "volume_mm3": 26042.0732245589, + "faces": 9, + "continuity": { + "order": "g2", + "exact": true + }, + "tolerance": { + "rel": 1e-07 + } +} diff --git a/tests/kernel-cases/fillets/cov-fillet-section-curvature-boss-root-r2/recipe.json b/tests/kernel-cases/fillets/cov-fillet-section-curvature-boss-root-r2/recipe.json new file mode 100644 index 0000000000..8ae967a2de --- /dev/null +++ b/tests/kernel-cases/fillets/cov-fillet-section-curvature-boss-root-r2/recipe.json @@ -0,0 +1,43 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 60, + "width": 40, + "height": 10, + "body_name": "Plate" + } + }, + { + "command": "solid.cylinder", + "params": { + "radius": 8, + "height": 10, + "base": [ + 30, + 20, + 10 + ], + "operation": "join", + "targets": [ + "Plate" + ] + } + }, + { + "command": "solid.fillet", + "params": { + "radius": 2, + "type": "curvature", + "edges": [ + [ + 38, + 20, + 10 + ] + ] + } + } + ] +} diff --git a/tests/kernel-cases/fillets/cov-fillet-section-curvature-box-edge-r3/expected.json b/tests/kernel-cases/fillets/cov-fillet-section-curvature-box-edge-r3/expected.json new file mode 100644 index 0000000000..bbbc842e75 --- /dev/null +++ b/tests/kernel-cases/fillets/cov-fillet-section-curvature-box-edge-r3/expected.json @@ -0,0 +1,28 @@ +{ + "sources": [], + "what": "a box's top back edge rounded curvature-continuous size 3: the order-2 section meets each face with its curvature (0), and not its third derivative", + "source": "analytic", + "method": "box 40x30x20, the top back edge (y = 30, z = 20, 40 long) between the planar end faces x = 0 and 40, set back s = 3 along both faces (square to each other). In a plane x = const the faces' feet of the point at distance d from both are (30 - d, 20) and (30, 20 - d), so the order-2 section is S(t) = f(t) (e + (1 - p1(t)) (rho1 - e)) + (1 - f(t)) (e + p2(t) (rho2 - e)), f = (1-t)^3 / ((1-t)^3 + t^3), p1 = t / (1 - w + w t), p2 = t (1 - w) / (1 - w t), e the edge and rho_i the contacts, at the default thumbweight w = 0.0342934022666073, which is defined by this section cutting 113/756 s^2 off the corner (Green's theorem on S): 1.345238. V = 24000 - 40 * 1.345238 = 23946.1905. Faces 7; both seams G2, not G3.", + "body_count": 1, + "volume_mm3": 23946.190476190477, + "faces": 7, + "bbox": { + "min": [ + 0, + 0, + 0 + ], + "max": [ + 40, + 30, + 20 + ] + }, + "continuity": { + "order": "g2", + "exact": true + }, + "tolerance": { + "rel": 1e-07 + } +} diff --git a/tests/kernel-cases/fillets/cov-fillet-section-curvature-box-edge-r3/recipe.json b/tests/kernel-cases/fillets/cov-fillet-section-curvature-box-edge-r3/recipe.json new file mode 100644 index 0000000000..0269366900 --- /dev/null +++ b/tests/kernel-cases/fillets/cov-fillet-section-curvature-box-edge-r3/recipe.json @@ -0,0 +1,27 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 40, + "width": 30, + "height": 20, + "body_name": "Part" + } + }, + { + "command": "solid.fillet", + "params": { + "radius": 3, + "type": "curvature", + "edges": [ + [ + 20, + 30, + 20 + ] + ] + } + } + ] +} diff --git a/tests/kernel-cases/fillets/cov-fillet-section-curvature-pipe-on-plate-r2/expected.json b/tests/kernel-cases/fillets/cov-fillet-section-curvature-pipe-on-plate-r2/expected.json new file mode 100644 index 0000000000..fa027248c7 --- /dev/null +++ b/tests/kernel-cases/fillets/cov-fillet-section-curvature-pipe-on-plate-r2/expected.json @@ -0,0 +1,15 @@ +{ + "sources": [], + "what": "the concave edge where a pipe dips into a plate rounded curvature-continuous size 2: the order-2 section meets the plane with curvature 0 and the pipe with its curvature 1/10", + "source": "analytic", + "method": "plate 60x40x10 (z 0..10) joined to a pipe R10 along x (0..60) whose axis is at (y, z) = (20, 16): the pipe dips 4 into the plate and leaves it along y = 20 +- 8, z = 10, the edges ending on the planar faces x = 0 and 60. V0 = 24000 + 60 (100 pi - (100 acos 0.6 - 48)) = 40165.7846. The concave edge y = 28: in a plane x = const, the point at distance d from both faces is (20 + g, 10 + d), g = sqrt(64 + 32 d); its feet are F1 = (20 + g, 10) on the plate and F2 = (20 + 10 g / (10 + d), 26 - 160 / (10 + d)) on the pipe. The order-2 section between the r = 2 ball's contacts: S(t) = f(t) T1(1 - p1(t)) + (1 - f(t)) T2(p2(t)), f = (1-t)^3 / ((1-t)^3 + t^3), p1 = t / (1 - w + w t), p2 = t (1 - w) / (1 - w t), w = 0.0342934022666073 (the default thumbweight), T_i(u) = sum_{k<=2} 2^k / k! F_i^(k)(2) (u - 1)^k (g' = 16 / g, g'' = -256 / g^3). It adds the area between it, the plate and the pipe, 1.505802 (Green's theorem): V = 40165.7846 + 60 * 1.505802 = 40256.1327. Both seams G2, not G3.", + "body_count": 1, + "volume_mm3": 40256.132731918, + "continuity": { + "order": "g2", + "exact": true + }, + "tolerance": { + "rel": 1e-07 + } +} diff --git a/tests/kernel-cases/fillets/cov-fillet-section-curvature-pipe-on-plate-r2/recipe.json b/tests/kernel-cases/fillets/cov-fillet-section-curvature-pipe-on-plate-r2/recipe.json new file mode 100644 index 0000000000..674a7501a1 --- /dev/null +++ b/tests/kernel-cases/fillets/cov-fillet-section-curvature-pipe-on-plate-r2/recipe.json @@ -0,0 +1,48 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 60, + "width": 40, + "height": 10, + "body_name": "Plate" + } + }, + { + "command": "solid.cylinder", + "params": { + "radius": 10, + "height": 60, + "base": [ + 0, + 20, + 16 + ], + "axis": [ + 1, + 0, + 0 + ], + "operation": "join", + "targets": [ + "Plate" + ] + } + }, + { + "command": "solid.fillet", + "params": { + "radius": 2, + "type": "curvature", + "edges": [ + [ + 30, + 28, + 10 + ] + ] + } + } + ] +} diff --git a/tests/kernel-cases/fillets/cov-fillet-section-round-box-edge-r3/expected.json b/tests/kernel-cases/fillets/cov-fillet-section-round-box-edge-r3/expected.json new file mode 100644 index 0000000000..fb2f2f178f --- /dev/null +++ b/tests/kernel-cases/fillets/cov-fillet-section-round-box-edge-r3/expected.json @@ -0,0 +1,28 @@ +{ + "sources": [], + "what": "a box's top back edge rounded r3: the ball's circle, tangent to each face with the curvature jumping by 1/3", + "source": "analytic", + "method": "box 40x30x20, the top back edge (y = 30, z = 20, 40 long) between the planar end faces x = 0 and 40, set back s = 3 along both faces (square to each other): the quarter circle cuts (1 - pi/4) s^2 = 1.931417 off the corner: V = 24000 - 40 (1 - pi/4) 9 = 23922.7433. Faces 7; both seams G1, not G2 (curvature 1/3 against 0).", + "body_count": 1, + "volume_mm3": 23922.743338823086, + "faces": 7, + "bbox": { + "min": [ + 0, + 0, + 0 + ], + "max": [ + 40, + 30, + 20 + ] + }, + "continuity": { + "order": "g1", + "exact": true + }, + "tolerance": { + "rel": 1e-07 + } +} diff --git a/tests/kernel-cases/fillets/cov-fillet-section-round-box-edge-r3/recipe.json b/tests/kernel-cases/fillets/cov-fillet-section-round-box-edge-r3/recipe.json new file mode 100644 index 0000000000..8aee7ead81 --- /dev/null +++ b/tests/kernel-cases/fillets/cov-fillet-section-round-box-edge-r3/recipe.json @@ -0,0 +1,26 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 40, + "width": 30, + "height": 20, + "body_name": "Part" + } + }, + { + "command": "solid.fillet", + "params": { + "radius": 3, + "edges": [ + [ + 20, + 30, + 20 + ] + ] + } + } + ] +} diff --git a/tests/kernel-cases/fillets/cov-fillet-section-round-pipe-on-plate-r2/expected.json b/tests/kernel-cases/fillets/cov-fillet-section-round-pipe-on-plate-r2/expected.json new file mode 100644 index 0000000000..425f9216b2 --- /dev/null +++ b/tests/kernel-cases/fillets/cov-fillet-section-round-pipe-on-plate-r2/expected.json @@ -0,0 +1,15 @@ +{ + "sources": [], + "what": "the concave edge where a pipe dips into a plate rounded r2: the ball's circle (a cylinder along x), tangent to the plane and the pipe", + "source": "analytic", + "method": "plate 60x40x10 (z 0..10) joined to a pipe R10 along x (0..60) whose axis is at (y, z) = (20, 16): the pipe dips 4 into the plate and leaves it along y = 20 +- 8, z = 10, the edges ending on the planar faces x = 0 and 60. V0 = 24000 + 60 (100 pi - (100 acos 0.6 - 48)) = 40165.7846. The concave edge y = 28: in a plane x = const, the point at distance d from both faces is (20 + g, 10 + d), g = sqrt(64 + 32 d); its feet are F1 = (20 + g, 10) on the plate and F2 = (20 + 10 g / (10 + d), 26 - 160 / (10 + d)) on the pipe. The ball r = 2 is centred at (20 + sqrt 128, 12), touching the plate at F1(2) = (31.313708, 10) and the pipe at F2(2) = (29.428090, 12.666667); its arc between them adds 2.250358 (Green's theorem along the plate, the arc and the pipe): V = 40165.7846 + 60 * 2.250358 = 40300.8061. Both seams G1, not G2 (curvature 1/2 against 0 and 1/2 against 1/10).", + "body_count": 1, + "volume_mm3": 40300.8060669181, + "continuity": { + "order": "g1", + "exact": true + }, + "tolerance": { + "rel": 1e-07 + } +} diff --git a/tests/kernel-cases/fillets/cov-fillet-section-round-pipe-on-plate-r2/recipe.json b/tests/kernel-cases/fillets/cov-fillet-section-round-pipe-on-plate-r2/recipe.json new file mode 100644 index 0000000000..6a8cbcdc57 --- /dev/null +++ b/tests/kernel-cases/fillets/cov-fillet-section-round-pipe-on-plate-r2/recipe.json @@ -0,0 +1,47 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 60, + "width": 40, + "height": 10, + "body_name": "Plate" + } + }, + { + "command": "solid.cylinder", + "params": { + "radius": 10, + "height": 60, + "base": [ + 0, + 20, + 16 + ], + "axis": [ + 1, + 0, + 0 + ], + "operation": "join", + "targets": [ + "Plate" + ] + } + }, + { + "command": "solid.fillet", + "params": { + "radius": 2, + "edges": [ + [ + 30, + 28, + 10 + ] + ] + } + } + ] +} diff --git a/tests/kernel-cases/fillets/cov-fillet-variable-box-edge-1-to-5-on-its-cone/expected.json b/tests/kernel-cases/fillets/cov-fillet-variable-box-edge-1-to-5-on-its-cone/expected.json new file mode 100644 index 0000000000..6b42de8fab --- /dev/null +++ b/tests/kernel-cases/fillets/cov-fillet-variable-box-edge-1-to-5-on-its-cone/expected.json @@ -0,0 +1,28 @@ +{ + "sources": [], + "what": "a variable round from r1 to r5 along a box's top back edge: the balls' envelope, a circular cone, not their great circles", + "source": "analytic", + "method": "box 20x30x20, the top back edge (y = 30, z = 20) with r = 1 + x/5 from x = 0 to 20. The balls' centres (x, 30 - r, 20 - r) run on a line, r proportional to their distance from the apex (-5, 30, 20): their envelope is the circular cone about that line with sin(phi) = 1/sqrt(27). Each ball touches it along the circle square to the line of centres, offset -r r'/|c'| from the centre, not along the great circle (whose middle is 0.0101 off the cone at x = 10). In each plane x = const the cone's section cuts off the corner, between the contact lines, the area found by rays from the corner (each meets the cone at the root of a quadratic); integrated over x it is 43.777573: V = 12000 - 43.777573 = 11956.2224. Faces 7; both seams G1, not G2.", + "body_count": 1, + "volume_mm3": 11956.2224267359, + "faces": 7, + "bbox": { + "min": [ + 0, + 0, + 0 + ], + "max": [ + 20, + 30, + 20 + ] + }, + "continuity": { + "order": "g1", + "exact": true + }, + "tolerance": { + "rel": 1e-05 + } +} diff --git a/tests/kernel-cases/fillets/cov-fillet-variable-box-edge-1-to-5-on-its-cone/recipe.json b/tests/kernel-cases/fillets/cov-fillet-variable-box-edge-1-to-5-on-its-cone/recipe.json new file mode 100644 index 0000000000..fff3507464 --- /dev/null +++ b/tests/kernel-cases/fillets/cov-fillet-variable-box-edge-1-to-5-on-its-cone/recipe.json @@ -0,0 +1,33 @@ +{ + "commands": [ + { + "command": "solid.box", + "params": { + "length": 20, + "width": 30, + "height": 20, + "body_name": "Part" + } + }, + { + "command": "solid.fillet", + "params": { + "edges": [ + [ + 10, + 30, + 20 + ] + ], + "radius": 1, + "type": "variable", + "radius2": 5, + "start": [ + 0, + 30, + 20 + ] + } + } + ] +}