kernel-cases: sweeps sweep and pipe cases from #96-#3505 (end scale, rails, corners, closed paths)

End scale, parallel orientation and guide rails on straight paths (frustums and a sheared cylinder), a rectangle swept round a mitred corner, a profile mid-line on a closed rounded rectangle, second sweeps from a plane along a closed circle, hollow and cutting pipes, and a flat wall of a swept corner extruded.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Brennen Herbruck
2026-10-21 06:20:48 -04:00
committed by jyviko
parent 5e71db6628
commit a9002968f0
22 changed files with 1630 additions and 0 deletions
@@ -0,0 +1,24 @@
{
"sources": [
"tangency-labs/solidcraft#1269"
],
"what": "a circle of radius 5 on XY swept with orientation parallel along a path rising 20 mm while leaning 20 mm in x (the profile does not turn: a sheared cylinder)",
"source": "analytic",
"method": "with the profile keeping its attitude the body is an oblique circular cylinder: Cavalieri, V = base area * vertical height = pi 25 * 20 = 1570.8. Area = two discs 2 pi 25 + lateral = perimeter of the right section (ellipse a 5, b 5 cos45) * slant 20 sqrt2 = 921.119 total; bbox x -5..25, y +-5, z 0..20; faces: oblique cylinder and two discs.",
"body_count": 1,
"volume_mm3": 1570.7963267948967,
"area_mm2": 921.1191904850396,
"faces": 3,
"bbox": {
"min": [
-5,
-5,
0
],
"max": [
25,
5,
20
]
}
}
@@ -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
],
[
20,
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"
],
"orientation": "parallel",
"operation": "new"
}
}
]
}
@@ -0,0 +1,22 @@
{
"sources": [
"tangency-labs/solidcraft#1269"
],
"what": "a 10 x 10 square swept 40 mm along a straight path while turning 90 degrees about the path",
"source": "analytic",
"method": "twisting about the section centre does not change the section area, and the centre moves straight along the path: V = A L = 100 * 40 = 4000. Mid-path the square is turned 45 degrees, so the bbox reaches the corners at 5 sqrt(2) = 7.0711 in x and y.",
"body_count": 1,
"volume_mm3": 4000.0,
"bbox": {
"min": [
-7.0710678,
-7.0710678,
0
],
"max": [
7.0710678,
7.0710678,
40
]
}
}
@@ -0,0 +1,102 @@
{
"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,
40
]
],
"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.rectangle.center",
"params": {
"center": [
0,
0
],
"corner": [
5,
5
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.sweep",
"params": {
"sketch": "Sec",
"path_sketch": "Path",
"path": [
"p1"
],
"twist": "90 deg",
"operation": "new"
}
}
]
}
@@ -0,0 +1,11 @@
{
"sources": [
"tangency-labs/solidcraft#2820"
],
"what": "a pipe of diameter 6 cut through a 40 x 40 x 20 block along a line leaning 30 degrees from the vertical",
"source": "analytic",
"method": "the cylinder between two parallel planes 20 apart, leaning 30 degrees from their normal, has volume pi r^2 h / cos(30) = pi 9 20 / 0.8660 = 653.0 (it crosses both faces well inside the block); V = 32000 - 653.0. Faces: 4 sides, top and bottom with an elliptical hole each, and the hole wall = 7.",
"body_count": 1,
"volume_mm3": 31347.032228875683,
"faces": 7
}
@@ -0,0 +1,75 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 40,
"height": 20,
"corner": [
-20,
-20,
0
],
"body_name": "Block"
}
},
{
"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": [
[
-9.999999999999998,
-7.320508075688775
],
[
9.999999999999998,
27.320508075688775
]
],
"infer": false,
"ids": [
"p1"
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.pipe",
"params": {
"path_sketch": "Path",
"path": [
"p1"
],
"diameter": 6,
"operation": "cut"
}
}
]
}
@@ -0,0 +1,11 @@
{
"sources": [
"tangency-labs/solidcraft#2820"
],
"what": "a hollow pipe (outer diameter 10, wall 2) along a path of two lines joined by a tangent R20 quarter arc",
"source": "analytic",
"method": "a tube of constant ring section along a path of length 30 + (pi/2) 20 + 30 = 91.416: V = pi (5^2 - 3^2) L (Pappus: the section centre follows the path; R 20 > 5). Faces: outer cylinder, torus, cylinder; inner cylinder, torus, cylinder; two annular ends = 8.",
"body_count": 1,
"volume_mm3": 4595.065651620499,
"faces": 8
}
@@ -0,0 +1,101 @@
{
"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,
30
]
],
"infer": false,
"ids": [
"p1"
]
}
},
{
"command": "sketch.arc.three_point",
"params": {
"start": [
0,
30
],
"through": [
5.857864376269049,
44.14213562373095
],
"end": [
20,
50
],
"id": "p2"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
20,
50
],
[
50,
50
]
],
"infer": false,
"ids": [
"p3"
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.pipe",
"params": {
"path_sketch": "Path",
"path": [
"p1",
"p2",
"p3"
],
"diameter": 10,
"wall": 2,
"operation": "new"
}
}
]
}
@@ -0,0 +1,10 @@
{
"sources": [
"tangency-labs/solidcraft#3006"
],
"what": "a circle of radius 3 on a plane at 0.5 of a closed circular path (R 30) swept round it, then a 5 x 5 square on a plane at 0.75 swept round the same path and joined (it did not follow the path)",
"source": "analytic",
"method": "both sections are centred on the path and square to it, so the union is a ring whose section is the union of the disc (r 3) and the square (half side 2.5): A = 25 + 9 pi - A(disc and square), A(disc and square) = integral over x in [-2.5, 2.5] of 2 min(2.5, sqrt(9 - x^2)) = 23.7719; V = A * 2 pi 30 (the same however the square is turned about the path).",
"body_count": 1,
"volume_mm3": 5561.078930711061
}
@@ -0,0 +1,134 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
1,
0
]
},
"name": "Path"
}
},
{
"command": "sketch.circle.center",
"params": {
"center": [
0,
0
],
"radius": 30
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "construct.plane.along_path",
"params": {
"path": {
"sketch": "Path",
"curve": "c1"
},
"t": 0.5,
"name": "P50"
}
},
{
"command": "construct.plane.along_path",
"params": {
"path": {
"sketch": "Path",
"curve": "c1"
},
"t": 0.75,
"name": "P75"
}
},
{
"command": "sketch.create",
"params": {
"plane": "P50",
"name": "Round"
}
},
{
"command": "sketch.circle.center",
"params": {
"center": [
0,
0
],
"radius": 3.0
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "sketch.create",
"params": {
"plane": "P75",
"name": "Square"
}
},
{
"command": "sketch.rectangle.center",
"params": {
"center": [
0,
0
],
"corner": [
2.5,
2.5
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.sweep",
"params": {
"sketch": "Round",
"path_sketch": "Path",
"path": [
"c1"
],
"operation": "new",
"body_name": "RoundBar"
}
},
{
"command": "solid.sweep",
"params": {
"sketch": "Square",
"path_sketch": "Path",
"path": [
"c1"
],
"operation": "join",
"targets": [
"RoundBar"
]
}
}
]
}
@@ -0,0 +1,22 @@
{
"sources": [
"tangency-labs/solidcraft#3345"
],
"what": "a 4 x 3 profile drawn at the middle of the bottom line of a closed 60 x 40 rounded-rectangle path (corner radius 8) and swept round the whole path (walls offset, fillets turned the wrong way)",
"source": "analytic",
"method": "the profile is centred on the path and square to it, so every part of the path keeps it centred: V = A L with A = 12 and L = 2 * 44 + 2 * 24 + 4 (pi/2) 8 = 186.27 (Pappus on the arcs), V = 2235.2. The tube stays within 2 mm of the path sideways and 1.5 mm up: bbox x +-32, y +-22, z +-1.5.",
"body_count": 1,
"volume_mm3": 2235.18578948924,
"bbox": {
"min": [
-32,
-22,
-1.5
],
"max": [
32,
22,
1.5
]
}
}
@@ -0,0 +1,233 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
1,
0
]
},
"name": "Path"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
-22,
-20
],
[
22,
-20
]
],
"infer": false,
"ids": [
"l1"
]
}
},
{
"command": "sketch.arc.center_point",
"params": {
"center": [
22,
-12
],
"start": [
22,
-20
],
"end": [
30,
-12
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
30,
-12
],
[
30,
12
]
],
"infer": false,
"ids": [
"l2"
]
}
},
{
"command": "sketch.arc.center_point",
"params": {
"center": [
22,
12
],
"start": [
30,
12
],
"end": [
22,
20
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
22,
20
],
[
-22,
20
]
],
"infer": false,
"ids": [
"l3"
]
}
},
{
"command": "sketch.arc.center_point",
"params": {
"center": [
-22,
12
],
"start": [
-22,
20
],
"end": [
-30,
12
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
-30,
12
],
[
-30,
-12
]
],
"infer": false,
"ids": [
"l4"
]
}
},
{
"command": "sketch.arc.center_point",
"params": {
"center": [
-22,
-12
],
"start": [
-30,
-12
],
"end": [
-22,
-20
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
-20.0,
0.0
],
"x_dir": [
0,
1,
0
],
"y_dir": [
0,
0,
1
]
},
"name": "Prof"
}
},
{
"command": "sketch.rectangle.center",
"params": {
"center": [
0,
0
],
"corner": [
2,
1.5
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.sweep",
"params": {
"sketch": "Prof",
"path_sketch": "Path",
"path": [
"l1",
"a1",
"l2",
"a2",
"l3",
"a3",
"l4",
"a4"
],
"operation": "new"
}
}
]
}
@@ -0,0 +1,10 @@
{
"sources": [
"tangency-labs/solidcraft#3505"
],
"what": "the inner side wall of the vertical leg of a mitred swept bar extruded outward by 3 mm (the wall is a B-spline net in a plane, \"the selected planar face no longer exists\")",
"source": "analytic",
"method": "bar: 8 x 5 section, path 30 up then 40 across (mitred): V = 40 * 70 = 2800. The inner wall of the vertical leg is the plane x = 4, 5 wide and 26 high (it ends where the mitre meets the horizontal leg underside at z = 26): extruding it 3 mm outward adds 5 * 26 * 3 = 390, a block touching the horizontal leg along z = 26: V = 3190.",
"body_count": 1,
"volume_mm3": 3190
}
@@ -0,0 +1,134 @@
{
"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,
30
]
],
"infer": false,
"ids": [
"p1"
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
30
],
[
40,
30
]
],
"infer": false,
"ids": [
"p2"
]
}
},
{
"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.rectangle.center",
"params": {
"center": [
0,
0
],
"corner": [
4,
2.5
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.sweep",
"params": {
"sketch": "Sec",
"path_sketch": "Path",
"path": [
"p1",
"p2"
],
"operation": "new",
"body_name": "Bar"
}
},
{
"command": "solid.extrude",
"params": {
"face": [
4,
0,
15
],
"distance": 3,
"operation": "join"
}
}
]
}
@@ -0,0 +1,24 @@
{
"sources": [
"tangency-labs/solidcraft#771",
"tangency-labs/solidcraft#1269"
],
"what": "a circle of radius 5 swept 30 mm along a straight path with end scale 2",
"source": "analytic",
"method": "the section scales linearly with the path, so the solid is a cone frustum from r 5 to r 10 over 30 mm: V = h/3 (A1 + A2 + sqrt(A1 A2)) = 10 pi (25 + 100 + 50) = 5497.8; faces: cone and two disc caps.",
"body_count": 1,
"volume_mm3": 5497.787143782138,
"faces": 3,
"bbox": {
"min": [
-10,
-10,
0
],
"max": [
10,
10,
30
]
}
}
@@ -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,
30
]
],
"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": 2,
"operation": "new"
}
}
]
}
@@ -0,0 +1,23 @@
{
"sources": [
"tangency-labs/solidcraft#771",
"tangency-labs/solidcraft#1806"
],
"what": "a circle of radius 5 swept 20 mm up a straight path with one guide rail from its point (5,0,0) to (10,0,20)",
"source": "analytic",
"method": "the profile is scaled by the rail distance from the path, 5 at the start and 10 at the end, linearly: a cone frustum, V = h/3 (A1 + A2 + sqrt(A1 A2)) = 20/3 pi (25 + 100 + 50) = 3665.2.",
"body_count": 1,
"volume_mm3": 3665.191429188092,
"bbox": {
"min": [
-10,
-10,
0
],
"max": [
10,
10,
20
]
}
}
@@ -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,
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": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
0,
1
]
},
"name": "Rail"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
5,
0
],
[
10,
20
]
],
"infer": false,
"ids": [
"r1"
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.sweep",
"params": {
"sketch": "Sec",
"path_sketch": "Path",
"path": [
"p1"
],
"rails": [
{
"sketch": "Rail",
"curves": [
"r1"
]
}
],
"operation": "new"
}
}
]
}
@@ -0,0 +1,23 @@
{
"sources": [
"tangency-labs/solidcraft#771",
"tangency-labs/solidcraft#1806"
],
"what": "a circle of radius 5 swept 20 mm up a straight path between two guide rails from (5,0,0) to (10,0,20) and from (-5,0,0) to (-10,0,20)",
"source": "analytic",
"method": "the profile follows the rails (its points where they start stay on both) and is sized by their distance, 10 at the start and 20 at the end: the same cone frustum, V = 20/3 pi (25 + 100 + 50) = 3665.2.",
"body_count": 1,
"volume_mm3": 3665.191429188092,
"bbox": {
"min": [
-10,
-10,
0
],
"max": [
10,
10,
20
]
}
}
@@ -0,0 +1,177 @@
{
"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": "sketch.create",
"params": {
"plane": {
"origin": [
0.0,
0.0,
0.0
],
"x_dir": [
1,
0,
0
],
"y_dir": [
0,
0,
1
]
},
"name": "Rail"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
5,
0
],
[
10,
20
]
],
"infer": false,
"ids": [
"r1"
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
-5,
0
],
[
-10,
20
]
],
"infer": false,
"ids": [
"r2"
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.sweep",
"params": {
"sketch": "Sec",
"path_sketch": "Path",
"path": [
"p1"
],
"rails": [
{
"sketch": "Rail",
"curves": [
"r1"
]
},
{
"sketch": "Rail",
"curves": [
"r2"
]
}
],
"operation": "new"
}
}
]
}
@@ -0,0 +1,22 @@
{
"sources": [
"tangency-labs/solidcraft#96"
],
"what": "an 8 x 5 rectangle swept along a path of a 30 mm vertical line and a 40 mm horizontal line meeting at a sharp corner (walls mitred)",
"source": "analytic",
"method": "in the bend plane the mitred joint keeps the area w (l1 + l2): the outer side gains exactly what the inner side loses, so V = A (l1 + l2) = 40 * 70 = 2800. bbox: x -4..40, y +-2.5, z 0..34 (the mitred outer corner reaches 30 + 4).",
"body_count": 1,
"volume_mm3": 2800.0,
"bbox": {
"min": [
-4,
-2.5,
0
],
"max": [
40,
2.5,
34
]
}
}
@@ -0,0 +1,122 @@
{
"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,
30
]
],
"infer": false,
"ids": [
"p1"
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
30
],
[
40,
30
]
],
"infer": false,
"ids": [
"p2"
]
}
},
{
"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.rectangle.center",
"params": {
"center": [
0,
0
],
"corner": [
4,
2.5
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.sweep",
"params": {
"sketch": "Sec",
"path_sketch": "Path",
"path": [
"p1",
"p2"
],
"operation": "new",
"body_name": "Bar"
}
}
]
}