kernel-cases: sweeps revolve cases from #2183-#4008 (refusals, flush ends, dome seam, primitives)

Refusals for a profile across the axis and an axis outside the sketch plane, a construction axis picked by name, a cone left by a revolve cut, revolve joins and cuts whose end faces lie in a face of the target, a dome cut by a ball on its seam, a horn-torus turn, and half-disc revolves with a refused hostile sweep scale.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Brennen Herbruck
2026-10-21 06:20:39 -04:00
committed by jyviko
parent b60debec11
commit 5e71db6628
22 changed files with 1056 additions and 0 deletions
@@ -0,0 +1,10 @@
{
"sources": [
"tangency-labs/solidcraft#2453",
"tangency-labs/solidcraft#2183"
],
"what": "a rectangle that straddles the revolve axis (x from -5 to 15 about the sketch y axis)",
"source": "invariants",
"method": "a profile on both sides of the axis would sweep over itself, so no solid exists: the right behaviour is a clean refusal (invalid input), with no body made.",
"outcome": "refused"
}
@@ -0,0 +1,52 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
1,
0
]
},
"name": "P"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
-5,
0
],
"p1": [
15,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "y",
"angle": "360 deg",
"operation": "new"
}
}
]
}
@@ -0,0 +1,14 @@
{
"sources": [
"tangency-labs/solidcraft#3796",
"tangency-labs/solidcraft#3619",
"tangency-labs/solidcraft#2516"
],
"what": "a rectangle revolved about a construction axis picked by name (\"unknown sketch line `Axis1`\")",
"source": "analytic",
"method": "axis through (5,0,0) parallel to Z; the 10 x 15 rectangle at x 10..20 is 5..15 from it: a tube, V = pi (15^2 - 5^2) 15 = 9424.8; faces: outer wall, bore, two annular ends.",
"body_count": 1,
"volume_mm3": 9424.77796076938,
"area_mm2": 3141.5926535897934,
"faces": 4
}
@@ -0,0 +1,72 @@
{
"commands": [
{
"command": "construct.axis.two_points",
"params": {
"a": {
"point": [
5,
0,
0
]
},
"b": {
"point": [
5,
0,
10
]
},
"name": "Axis1"
}
},
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
0,
1
]
},
"name": "P"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
10,
0
],
"p1": [
20,
15
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "Axis1",
"angle": "360 deg",
"operation": "new"
}
}
]
}
@@ -0,0 +1,10 @@
{
"sources": [
"tangency-labs/solidcraft#3736",
"tangency-labs/solidcraft#2607"
],
"what": "a profile on the XZ plane revolved about the world Y axis, which does not lie in the sketch plane",
"source": "invariants",
"method": "the revolve axis must lie in the profile plane (the Y axis is perpendicular to the XZ plane): the right behaviour is a clean refusal, with no body made.",
"outcome": "refused"
}
@@ -0,0 +1,52 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
0,
1
]
},
"name": "P"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
10,
0
],
"p1": [
15,
5
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "Y",
"angle": "45 deg",
"operation": "new"
}
}
]
}
@@ -0,0 +1,24 @@
{
"sources": [
"tangency-labs/solidcraft#2667"
],
"what": "a half disc of radius 6 on the axis revolved a full turn (mutation survivor: half_disc area factor)",
"source": "analytic",
"method": "a ball: V = 4/3 pi 6^3 = 904.78, A = 4 pi 36 = 452.39; one spherical face.",
"body_count": 1,
"volume_mm3": 904.7786842338603,
"area_mm2": 452.3893421169302,
"faces": 1,
"bbox": {
"min": [
-6,
-6,
-6
],
"max": [
6,
6,
6
]
}
}
@@ -0,0 +1,72 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
0,
1
]
},
"name": "P"
}
},
{
"command": "sketch.arc.three_point",
"params": {
"start": [
0,
-6
],
"through": [
6,
0
],
"end": [
0,
6
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
6
],
[
0,
-6
]
],
"infer": false
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "y",
"angle": "360 deg",
"operation": "new"
}
}
]
}
@@ -0,0 +1,12 @@
{
"sources": [
"tangency-labs/solidcraft#2667"
],
"what": "the same half disc revolved 270 degrees (mutation survivor: full_circle test of the sweep angle)",
"source": "analytic",
"method": "three quarters of the ball: V = 3/4 * 4/3 pi 6^3 = 678.58. Area: 3/4 of the sphere, 3/4 * 4 pi 36 = 339.29, plus two half-disc end faces (the planes at 0 and 270 degrees are perpendicular, so two faces) of pi 36 / 2 each, 113.10 together: A = 452.39. Faces: the spherical part and the two flat ends = 3.",
"body_count": 1,
"volume_mm3": 678.5840131753953,
"area_mm2": 452.3893421169302,
"faces": 3
}
@@ -0,0 +1,72 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
0,
1
]
},
"name": "P"
}
},
{
"command": "sketch.arc.three_point",
"params": {
"start": [
0,
-6
],
"through": [
6,
0
],
"end": [
0,
6
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
6
],
[
0,
-6
]
],
"infer": false
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "y",
"angle": "270 deg",
"operation": "new"
}
}
]
}
@@ -0,0 +1,9 @@
{
"sources": [
"tangency-labs/solidcraft#2667"
],
"what": "a sweep with an end scale of 500 (the engine allows 0.01 to 100): the option check (SweepControl::check) must refuse it",
"source": "invariants",
"method": "a scale outside 0.01..100 is a hostile value for the sweep options: the right behaviour is a clean refusal with no body made.",
"outcome": "refused"
}
@@ -0,0 +1,99 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
0,
1
]
},
"name": "Path"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
0
],
[
0,
20
]
],
"infer": false,
"ids": [
"p1"
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
1,
0
]
},
"name": "Sec"
}
},
{
"command": "sketch.circle.center",
"params": {
"center": [
0,
0
],
"radius": 5
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.sweep",
"params": {
"sketch": "Sec",
"path_sketch": "Path",
"path": [
"p1"
],
"scale": 500,
"operation": "new"
}
}
]
}
@@ -0,0 +1,11 @@
{
"sources": [
"tangency-labs/solidcraft#3156",
"tangency-labs/solidcraft#3224"
],
"what": "a rectangle revolved plus and minus 90 degrees about an axis in a plate top face: both planar end faces lie in that face and the join needed a tool nudge",
"source": "analytic",
"method": "plate 10 x 100 x 6 (z 41..47). The 4 mm wide ring (radii 30..37 about the axis y = 0, z = 47) spans -90..+90 degrees below the axis; its end faces lie in z = 47. Overlap with the plate: z >= 41 means r cos(phi) <= 6, i.e. phi from acos(6/r) to 90 degrees on each side: 4 * 2 * integral over r in [30,37] of r asin(6/r) dr, with antiderivative r^2/2 asin(6/r) + 3 sqrt(r^2 - 36). V = 6000 + 4 pi (37^2 - 30^2)/2 - overlap.",
"body_count": 1,
"volume_mm3": 8608.970248730224
}
@@ -0,0 +1,107 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 10,
"width": 100,
"height": 6,
"corner": [
-50,
-50,
41
],
"body_name": "Plate"
}
},
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
0,
1
]
},
"name": "Prof"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
-47,
10
],
[
-43,
10
],
[
-43,
17
],
[
-47,
17
]
],
"infer": false,
"closed": true
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
-60,
47
],
[
-30,
47
]
],
"infer": false,
"construction": true,
"ids": [
"ax"
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "ax",
"angle": "90 deg",
"angle2": "90 deg",
"operation": "join",
"profiles": [
{
"point": [
-45,
13.5
]
}
]
}
}
]
}
@@ -0,0 +1,25 @@
{
"sources": [
"tangency-labs/solidcraft#3911",
"tangency-labs/solidcraft#3191"
],
"what": "a triangle sharing the cylinder side and top rim revolved as a cut to leave a cone (the cut never completed)",
"source": "analytic",
"method": "the triangle (20,0) (20,30) (0,30) revolved about the cylinder axis removes everything outside the cone from the apex (0,0,30) to the base rim r 20 at z = 0: V = pi 20^2 30 / 3, A = base pi 20^2 + lateral pi 20 sqrt(20^2 + 30^2); faces: cone and base disc.",
"body_count": 1,
"volume_mm3": 12566.370614359172,
"area_mm2": 3522.0717412637123,
"faces": 2,
"bbox": {
"min": [
-20,
-20,
0
],
"max": [
20,
20,
30
]
}
}
@@ -0,0 +1,74 @@
{
"commands": [
{
"command": "solid.cylinder",
"params": {
"radius": 20,
"height": 30,
"base": [
0,
0,
0
],
"axis": "Z",
"body_name": "Blank"
}
},
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
0,
1
]
},
"name": "Cut"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
20,
0
],
[
20,
30
],
[
0,
30
]
],
"infer": false,
"closed": true
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "y",
"angle": "360 deg",
"operation": "cut"
}
}
]
}
@@ -0,0 +1,10 @@
{
"sources": [
"tangency-labs/solidcraft#3528"
],
"what": "a ball of radius 4 centred on the dome of a revolved mushroom cap (azimuth 15 degrees, across an internal seam of the revolved faces), cut from it: removed nearly the whole ball",
"source": "analytic",
"method": "the cap is the revolution of the profile (0,0) (7,0) (7,20) (26,39), arc about (0,32.1) r 26.9 to (0,59), back: V = pi [49*20 + (26^3 - 7^3)/3 + 26.9^2 * 20 - (26.9^3 - 6.9^3)/3] = 46551.0. The ball centre is on the dome sphere (r 26.9), so the cut removes the lens of two spheres, radii 4 and 26.9 at distance 26.9: V = pi (R + r - d)^2 (d^2 + 2 d r - 3 r^2 + 2 d R + 6 r R - 3 R^2) / (12 d) = 126.5. The tool is consumed (keep_tools false): one body.",
"body_count": 1,
"volume_mm3": 46424.50587797245
}
@@ -0,0 +1,144 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
0,
1
]
},
"name": "Mushroom"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
0
],
[
7,
0
]
],
"infer": false
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
7,
0
],
[
7,
20
]
],
"infer": false
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
7,
20
],
[
26,
39
]
],
"infer": false
}
},
{
"command": "sketch.arc.center_point",
"params": {
"center": [
0,
32.1
],
"start": [
26,
39
],
"end": [
0,
59
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
59
],
[
0,
0
]
],
"infer": false
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "y",
"angle": "360 deg",
"operation": "new",
"body_name": "Cap"
}
},
{
"command": "solid.sphere",
"params": {
"diameter": 8,
"center": [
17.38629136,
4.658642729,
52.090595805
],
"operation": "new",
"body_name": "Ball"
}
},
{
"command": "solid.combine",
"params": {
"target": "Cap",
"tools": [
"Ball"
],
"operation": "cut"
}
}
]
}
@@ -0,0 +1,10 @@
{
"sources": [
"tangency-labs/solidcraft#4007"
],
"what": "the half disc of radius 14 on the far side of a diameter 14 mm from the axis (the full circle would touch the axis: a horn torus) revolved 270 degrees",
"source": "analytic",
"method": "Pappus: the half disc (the side away from the axis) has area pi 14^2 / 2 and centroid at 14 + 4 * 14 / (3 pi) from the axis: V = (270/360) 2 pi (14 + 4*14/(3 pi)) pi 14^2 / 2 = 28932.2 (the design measures 28930.7).",
"body_count": 1,
"volume_mm3": 28932.17609889229
}
@@ -0,0 +1,72 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
0,
1
]
},
"name": "P"
}
},
{
"command": "sketch.arc.center_point",
"params": {
"center": [
14,
0
],
"start": [
14,
-14
],
"end": [
14,
14
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
14,
14
],
[
14,
-14
]
],
"infer": false
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "Z",
"angle": "270 deg",
"operation": "new"
}
}
]
}
@@ -0,0 +1,10 @@
{
"sources": [
"tangency-labs/solidcraft#4008"
],
"what": "a 7 x 21 rectangle 2.6 mm from a block vertical edge revolved as a symmetric 180 degree cut about that edge: both end faces of the tool lie in the block left face (refused as \"could not be computed reliably\")",
"source": "analytic",
"method": "block 60 x 20 x 25 (x 0..60, y 0..20); the ring (radii 2.6..9.6, height 21 inside the 25) turns +-90 degrees about the edge x = 0, y = 20; only the quarter with y < 20 lies in the block: V = 30000 - pi (9.6^2 - 2.6^2) 21 / 4 = 28591.467.",
"body_count": 1,
"volume_mm3": 28591.466933763015
}
@@ -0,0 +1,95 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 60,
"width": 20,
"height": 25,
"corner": [
0,
0,
0
],
"body_name": "Block"
}
},
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
20.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
0,
1
]
},
"name": "Tool"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
2.6,
2
],
"p1": [
9.6,
23
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
0
],
[
0,
25
]
],
"infer": false,
"construction": true,
"ids": [
"ax"
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "ax",
"angle": "180 deg",
"direction": "symmetric",
"operation": "cut",
"profiles": [
{
"point": [
6,
10
]
}
]
}
}
]
}