kernel-cases: sweeps revolve cases from #450-#2947 (faces, axis, cuts, seams)

Spherical shell sketched off the origin, adjacent profiles on the axis, whole planar faces of full and partial turns and a face pick on a fresh revolve, a half slot turned about its centreline (alone and as a cut), a torus cut by an overlapping ring, and a 300 degree revolve crossed by a plate.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Brennen Herbruck
2026-10-21 06:20:37 -04:00
committed by jyviko
parent ec154f5421
commit b60debec11
22 changed files with 1216 additions and 0 deletions
@@ -0,0 +1,12 @@
{
"sources": [
"tangency-labs/solidcraft#1853",
"tangency-labs/solidcraft#1866"
],
"what": "half a slot (r 3, centres 14 apart) revolved a full turn about its own centreline, which lies in the top face of a plate, as a cut (no result after about 10 s of retries)",
"source": "analytic",
"method": "the half slot revolved 360 degrees is a capsule: cylinder r 3, length 14 plus two hemispheres: V = pi 9 14 + 4/3 pi 27 = 508.94. Its axis lies in the plate top face z = 10, so exactly half of it is inside the 40 x 20 x 10 plate: V = 8000 - 508.94 / 2 = 7745.53. Faces: 5 plate faces + top face with the slot outline + half cylinder + 2 quarter spheres = 9.",
"body_count": 1,
"volume_mm3": 7745.530995059226,
"faces": 9
}
@@ -0,0 +1,119 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 20,
"height": 10,
"corner": [
-20,
-10,
0
],
"body_name": "Plate"
}
},
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
10.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
1,
0
]
},
"name": "Slot"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
-7,
3
],
[
7,
3
]
],
"infer": false
}
},
{
"command": "sketch.arc.center_point",
"params": {
"center": [
7,
0
],
"start": [
10,
0
],
"end": [
7,
3
]
}
},
{
"command": "sketch.arc.center_point",
"params": {
"center": [
-7,
0
],
"start": [
-7,
3
],
"end": [
-10,
0
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
-10,
0
],
[
10,
0
]
],
"infer": false
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "x",
"angle": "360 deg",
"operation": "cut"
}
}
]
}
@@ -0,0 +1,11 @@
{
"sources": [
"tangency-labs/solidcraft#1866"
],
"what": "half a slot (r 3, centres 14 apart; the segment before the axis edge comes back to the axis along an arc) revolved 180 deg about its centreline",
"source": "analytic",
"method": "the profile lies on one side of the axis, so a turn of theta gives theta / 2 pi of the capsule (cylinder r 3, length 14 plus two hemispheres, 508.94): V = 1/2 of it; faces: the cylinder part, two spherical parts and one flat face = 4 (the two end faces of a half turn lie in the one plane through the axis and form a single stadium-shaped face).",
"body_count": 1,
"volume_mm3": 254.46900494077323,
"faces": 4
}
@@ -0,0 +1,105 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
1,
0
]
},
"name": "Slot"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
-7,
3
],
[
7,
3
]
],
"infer": false
}
},
{
"command": "sketch.arc.center_point",
"params": {
"center": [
7,
0
],
"start": [
10,
0
],
"end": [
7,
3
]
}
},
{
"command": "sketch.arc.center_point",
"params": {
"center": [
-7,
0
],
"start": [
-7,
3
],
"end": [
-10,
0
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
-10,
0
],
[
10,
0
]
],
"infer": false
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "x",
"angle": "180 deg",
"operation": "new"
}
}
]
}
@@ -0,0 +1,11 @@
{
"sources": [
"tangency-labs/solidcraft#1866"
],
"what": "half a slot (r 3, centres 14 apart; the segment before the axis edge comes back to the axis along an arc) revolved 90 deg about its centreline",
"source": "analytic",
"method": "the profile lies on one side of the axis, so a turn of theta gives theta / 2 pi of the capsule (cylinder r 3, length 14 plus two hemispheres, 508.94): V = 1/4 of it; faces: the cylinder part, two spherical parts and the two planar end faces = 5.",
"body_count": 1,
"volume_mm3": 127.23450247038662,
"faces": 5
}
@@ -0,0 +1,105 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
1,
0
]
},
"name": "Slot"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
-7,
3
],
[
7,
3
]
],
"infer": false
}
},
{
"command": "sketch.arc.center_point",
"params": {
"center": [
7,
0
],
"start": [
10,
0
],
"end": [
7,
3
]
}
},
{
"command": "sketch.arc.center_point",
"params": {
"center": [
-7,
0
],
"start": [
-7,
3
],
"end": [
-10,
0
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
-10,
0
],
[
10,
0
]
],
"infer": false
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "x",
"angle": "90 deg",
"operation": "new"
}
}
]
}
@@ -0,0 +1,12 @@
{
"sources": [
"tangency-labs/solidcraft#2295"
],
"what": "a torus (R 10, r 5) cut by a disc of radius 5 centred at (15,0) in the XZ plane revolved about Z (the disc overlaps the torus tube)",
"source": "analytic",
"method": "both are coaxial rings, so the cut removes the revolution of the lens where the two circles (centres 10 and 15, r 5) overlap. Lens area = 2 r^2 acos(d/2r) - d/2 sqrt(4r^2 - d^2) = 30.709, centroid x = 12.5 by symmetry. V = 2 pi^2 10 25 - 2 pi 12.5 A_lens = 2522.9. Area (Pappus for curves): arc of the tube circle outside the disc (240 degrees, centroid x 10 - 5 sin(120)/(2 pi/3)) and arc of the disc circle inside the tube (120 degrees, centroid x 15 - 5 sin(60)/(pi/3)), each turned 2 pi about Z. Two toroidal faces.",
"body_count": 1,
"volume_mm3": 2522.903937393692,
"area_mm2": 1758.767884317251,
"faces": 2
}
@@ -0,0 +1,57 @@
{
"commands": [
{
"command": "solid.torus",
"params": {
"major": 10,
"minor": 5,
"body_name": "Torus"
}
},
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
0,
1
]
},
"name": "Tool"
}
},
{
"command": "sketch.circle.center",
"params": {
"center": [
15,
0
],
"radius": 5
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "Z",
"angle": "360 deg",
"operation": "cut"
}
}
]
}
@@ -0,0 +1,11 @@
{
"sources": [
"tangency-labs/solidcraft#2947",
"tangency-labs/solidcraft#2948"
],
"what": "a rectangle section revolved 300 degrees about Z, then intersected with a plate (slab |y| <= 5) crossing the ring at the start/end gap side and the far side (boolean gave up: \"loop not inside any face piece\")",
"source": "analytic",
"method": "the ring section r 20..30, z 0..10 turns from +x counter-clockwise through 300 degrees (the gap is -60..0 degrees). The slab |y| <= 5 meets +x (only y >= 0 is covered) and -x (fully covered). Area of annulus part with |y| <= 5, x > 0: F(R) = a sqrt(R^2 - a^2) + R^2 asin(a/R); V = 10 [ (F(30) - F(20)) / 2 + (F(30) - F(20)) ]. The two crossings are disjoint, so two bodies.",
"body_count": 2,
"volume_mm3": 1510.6287024479082
}
@@ -0,0 +1,77 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
0,
1
]
},
"name": "Sec"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
20,
0
],
"p1": [
30,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "Z",
"angle": "300 deg",
"operation": "new",
"body_name": "Ring"
}
},
{
"command": "solid.box",
"params": {
"length": 100,
"width": 10,
"height": 12,
"corner": [
-50,
-5,
-1
],
"body_name": "Plate"
}
},
{
"command": "solid.combine",
"params": {
"target": "Ring",
"tools": [
"Plate"
],
"operation": "intersect"
}
}
]
}
@@ -0,0 +1,25 @@
{
"sources": [
"tangency-labs/solidcraft#450",
"tangency-labs/solidcraft#452"
],
"what": "a half ring between two arcs (both radial lines on the axis) revolved a full turn from a sketch plane 10 mm above the origin (volume +34 %)",
"source": "analytic",
"method": "the revolve is a hollow ball of radii 40 and 18.5 centred at (0,0,10): V = 4/3 pi (40^3 - 18.5^3), A = 4 pi (40^2 + 18.5^2); two spherical faces, one body with an inner shell.",
"body_count": 1,
"volume_mm3": 241560.72432594837,
"area_mm2": 24407.033325739103,
"faces": 2,
"bbox": {
"min": [
-40,
-40,
-30
],
"max": [
40,
40,
50
]
}
}
@@ -0,0 +1,105 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
10.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
1,
0
]
},
"name": "Shell"
}
},
{
"command": "sketch.arc.three_point",
"params": {
"start": [
0,
-40
],
"through": [
40,
0
],
"end": [
0,
40
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
40
],
[
0,
18.5
]
],
"infer": false
}
},
{
"command": "sketch.arc.three_point",
"params": {
"start": [
0,
18.5
],
"through": [
18.5,
0
],
"end": [
0,
-18.5
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
-18.5
],
[
0,
-40
]
],
"infer": false
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "y",
"angle": "360 deg",
"operation": "new"
}
}
]
}
@@ -0,0 +1,11 @@
{
"sources": [
"tangency-labs/solidcraft#487",
"tangency-labs/solidcraft#490"
],
"what": "a disc cut by the body made from two adjacent profiles revolved on the axis, around the disc flat end",
"source": "analytic",
"method": "Hand = cylinder r 20 from x = 0 to 60; Holder = disc r 40 from x = -1 to 1; keep_tools keeps Hand. Cut removes r < 20, x in [0,1] from the disc: V(Holder) = pi 40^2 2 - pi 20^2 1. Both bodies exist at the end: Holder 8796.46 and Hand 75398.22; the totals below add them.",
"body_count": 2,
"volume_mm3": 84194.68311620646
}
@@ -0,0 +1,152 @@
{
"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.line",
"params": {
"points": [
[
0,
0
],
[
60,
0
]
],
"infer": false
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
0
],
[
0,
20
]
],
"infer": false
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
20
],
[
60,
20
]
],
"infer": false
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
30,
20
],
[
30,
0
]
],
"infer": false
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
60,
20
],
[
60,
0
]
],
"infer": false
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"sketch": "P",
"profiles": [
0,
1
],
"axis": "X",
"body_name": "Hand"
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 40,
"height": 2,
"base": [
-1,
0,
0
],
"axis": [
1,
0,
0
],
"body_name": "Holder"
}
},
{
"command": "solid.combine",
"params": {
"target": "Holder",
"tools": [
"Hand"
],
"operation": "cut",
"keep_tools": true
}
}
]
}
@@ -0,0 +1,13 @@
{
"sources": [
"tangency-labs/solidcraft#487",
"tangency-labs/solidcraft#490"
],
"what": "two rectangles sharing an edge, both resting on the axis, revolved together (zero-area faces along the axis)",
"source": "analytic",
"method": "the two 30 x 20 rectangles merge into one 60 x 20 region on the axis: a cylinder r = 20, length 60: V = pi 20^2 60, A = 2 pi 20 60 + 2 pi 20^2; 3 faces (side and two disks), none of zero area.",
"body_count": 1,
"volume_mm3": 75398.22368615503,
"area_mm2": 10053.096491487338,
"faces": 3
}
@@ -0,0 +1,123 @@
{
"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.line",
"params": {
"points": [
[
0,
0
],
[
60,
0
]
],
"infer": false
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
0
],
[
0,
20
]
],
"infer": false
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
20
],
[
60,
20
]
],
"infer": false
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
30,
20
],
[
30,
0
]
],
"infer": false
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
60,
20
],
[
60,
0
]
],
"infer": false
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"sketch": "P",
"profiles": [
0,
1
],
"axis": "X",
"body_name": "Hand"
}
}
]
}
@@ -0,0 +1,12 @@
{
"sources": [
"tangency-labs/solidcraft#726",
"tangency-labs/solidcraft#494",
"tangency-labs/solidcraft#2114"
],
"what": "the flange top annulus of a freshly revolved hub (z = 6, r 18..30) picked by a point and extruded 5 mm (the pick found a third of the face: \"the selected planar face no longer exists\")",
"source": "analytic",
"method": "hub = revolve of (8,0) (30,0) (30,6) (18,6) (18,22) (8,22) about Z: V = pi [(30^2 - 8^2) 6 + (18^2 - 8^2) 16] = 28826.6. Extruding the whole annulus z = 6, r 18..30 outward (upward) 5 mm adds pi (30^2 - 18^2) 5 = 9047.8 (the new ring sits on the flange and touches the hub wall r = 18).",
"body_count": 1,
"volume_mm3": 37875.04103167855
}
@@ -0,0 +1,85 @@
{
"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.line",
"params": {
"points": [
[
8,
0
],
[
30,
0
],
[
30,
6
],
[
18,
6
],
[
18,
22
],
[
8,
22
]
],
"infer": false,
"closed": true
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "Z",
"angle": "360 deg",
"operation": "new",
"body_name": "Hub"
}
},
{
"command": "solid.extrude",
"params": {
"face": [
12,
20.784609690826528,
6
],
"distance": 5,
"operation": "join"
}
}
]
}
@@ -0,0 +1,13 @@
{
"sources": [
"tangency-labs/solidcraft#726",
"tangency-labs/solidcraft#1687"
],
"what": "a flanged hub profile (six edges, none on the axis) revolved a full turn: the planar faces must come out whole, not as three patches",
"source": "analytic",
"method": "profile (8,0) (30,0) (30,6) (18,6) (18,22) (8,22) about the Z axis: V = pi [(30^2 - 8^2) 6 + (18^2 - 8^2) 16] = 28826.6; area = side walls 2 pi (30 6 + 18 16 + 8 22) + annuli pi [(30^2-8^2) + (30^2-18^2) + (18^2-8^2)]. Six whole faces: three annuli and three cylinders.",
"body_count": 1,
"volume_mm3": 28827.254189339943,
"area_mm2": 9299.114254625787,
"faces": 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.line",
"params": {
"points": [
[
8,
0
],
[
30,
0
],
[
30,
6
],
[
18,
6
],
[
18,
22
],
[
8,
22
]
],
"infer": false,
"closed": true
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "Z",
"angle": "360 deg",
"operation": "new"
}
}
]
}
@@ -0,0 +1,13 @@
{
"sources": [
"tangency-labs/solidcraft#726",
"tangency-labs/solidcraft#1718"
],
"what": "the same flanged hub profile revolved 240 degrees: its planar faces (three annular sectors and two end faces) must come out whole",
"source": "analytic",
"method": "a 240 degree turn is 2/3 of the full body: V = 2/3 * pi [(30^2 - 8^2) 6 + (18^2 - 8^2) 16]; area = 2/3 of the full-turn walls and annuli plus two end faces, each the profile (22 x 6 + 10 x 16 = 292 mm2). Eight faces: three annular sectors, three cylinder sectors, two end faces.",
"body_count": 1,
"volume_mm3": 19218.169459559962,
"area_mm2": 6783.409503083858,
"faces": 8
}
@@ -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.line",
"params": {
"points": [
[
8,
0
],
[
30,
0
],
[
30,
6
],
[
18,
6
],
[
18,
22
],
[
8,
22
]
],
"infer": false,
"closed": true
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.revolve",
"params": {
"axis": "Z",
"angle": "240 deg",
"operation": "new"
}
}
]
}