kernel-cases: booleans from #2564-#2896 (11 cases)

Hand-derived cases for tapered and collinear extrudes, pattern and mirror
copies keeping their targets, a cut up to a face, a prism joined to a
round-cornered slab, a clip round a small hole, and near-contact joins.

2564, 2583, 2601, 2754, 2755 (pattern, mirror), 2801, 2810, 2826, 2580,
2896 (overlap)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
bherbruck
2026-10-21 05:50:11 -04:00
committed by jyviko
parent 48db4fa2cf
commit 6cf966bd50
22 changed files with 1079 additions and 0 deletions
@@ -0,0 +1,15 @@
{
"sources": [
"tangency-labs/solidcraft#2564",
"tangency-labs/solidcraft#1949"
],
"what": "an extrude of an outline whose bottom side is drawn as two collinear pieces that wrap past the loop's first segment ((10,0)->(20,0) ... (0,0)->(10,0)): the bottom is one face",
"source": "analytic",
"method": "outline (10,0),(20,0),(20,10),(0,10),(0,0) is the rectangle 20x10 extruded 5: V = 200*5 = 1000, area = 2*200 + 60*5 = 700. Faces: 4 sides (the bottom one joined from its two pieces) + top + bottom = 6, edges 12, vertices 8",
"body_count": 1,
"volume_mm3": 1000.0,
"area_mm2": 700.0,
"faces": 6,
"edges": 12,
"vertices": 8
}
@@ -0,0 +1,96 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": "XY"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
10,
0
],
[
20,
0
]
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
20,
0
],
[
20,
10
]
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
20,
10
],
[
0,
10
]
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
10
],
[
0,
0
]
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
0
],
[
10,
0
]
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"distance": 5,
"operation": "new"
}
}
]
}
@@ -0,0 +1,12 @@
{
"sources": [
"tangency-labs/solidcraft#2580",
"tangency-labs/solidcraft#2579"
],
"what": "a 16 mm box cut out round a small (r 1.8) hole of a 3 m long, 2 mm plate keeps the hole in both faces",
"source": "analytic",
"method": "plate 3000x300x2 with ten through holes r1.8, intersected with the 16x16 box centred on the first hole: a 16x16x2 piece with one through hole, V = 16*16*2 - pi*1.8^2*2. Faces: top and bottom (each with the hole), 4 sides, hole wall = 7",
"body_count": 1,
"volume_mm3": 491.6424796047381,
"faces": 7
}
@@ -0,0 +1,190 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 3000,
"width": 300,
"height": 2,
"body_name": "Plate"
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 1.8,
"height": 6,
"base": [
150,
150,
-2
],
"operation": "cut",
"targets": [
"Plate"
]
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 1.8,
"height": 6,
"base": [
450,
150,
-2
],
"operation": "cut",
"targets": [
"Plate"
]
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 1.8,
"height": 6,
"base": [
750,
150,
-2
],
"operation": "cut",
"targets": [
"Plate"
]
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 1.8,
"height": 6,
"base": [
1050,
150,
-2
],
"operation": "cut",
"targets": [
"Plate"
]
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 1.8,
"height": 6,
"base": [
1350,
150,
-2
],
"operation": "cut",
"targets": [
"Plate"
]
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 1.8,
"height": 6,
"base": [
1650,
150,
-2
],
"operation": "cut",
"targets": [
"Plate"
]
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 1.8,
"height": 6,
"base": [
1950,
150,
-2
],
"operation": "cut",
"targets": [
"Plate"
]
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 1.8,
"height": 6,
"base": [
2250,
150,
-2
],
"operation": "cut",
"targets": [
"Plate"
]
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 1.8,
"height": 6,
"base": [
2550,
150,
-2
],
"operation": "cut",
"targets": [
"Plate"
]
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 1.8,
"height": 6,
"base": [
2850,
150,
-2
],
"operation": "cut",
"targets": [
"Plate"
]
}
},
{
"command": "solid.box",
"params": {
"length": 16,
"width": 16,
"height": 10,
"center": [
150,
150,
1
],
"operation": "intersect",
"targets": [
"Plate"
]
}
}
]
}
@@ -0,0 +1,11 @@
{
"sources": [
"tangency-labs/solidcraft#2583"
],
"what": "a tapered extrude of a 20x10 rectangle whose bottom side is drawn as two collinear pieces: the sloped side is one face",
"source": "analytic",
"method": "sections are (20+2d)x(10+2d) with d = z*tan5deg (positive taper grows outward); V = Int (200 + 60d + 4d^2) dz over z in 0..10 = 200*10 + 30*tan5*100 + 4*tan5^2*1000/3 = 2272.672. Four side faces, top and bottom = 6 (not 7)",
"body_count": 1,
"volume_mm3": 2272.671678905175,
"faces": 6
}
@@ -0,0 +1,97 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": "XY"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
0
],
[
10,
0
]
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
10,
0
],
[
20,
0
]
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
20,
0
],
[
20,
10
]
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
20,
10
],
[
0,
10
]
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
10
],
[
0,
0
]
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"distance": 10,
"taper": "5 deg",
"operation": "new"
}
}
]
}
@@ -0,0 +1,11 @@
{
"sources": [
"tangency-labs/solidcraft#2601"
],
"what": "a tapered extrude whose start is offset along the sketch normal (the app says: not supported yet: taper with two-sided, symmetric or offset extents)",
"source": "analytic",
"method": "the profile 20x10 is moved to z=-8 and extruded 8 along +z, so the solid spans z -8..0, tapered from the offset plane; positive taper grows outward: sections (20+2d)x(10+2d), d = t*tan5deg, t = 0..8 from the offset plane; V = Int (200 + 60d + 4d^2) dt = 200*8 + 30*tan5*64 + 4*tan5^2*512/3 = 1773.204. Faces 6. Sign of the offset and taper reading is from the command docs",
"body_count": 1,
"volume_mm3": 1773.2035463934044,
"faces": 6
}
@@ -0,0 +1,36 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": "XY"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
0,
0
],
"p1": [
20,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"distance": 8,
"start_offset": -8,
"taper": "5 deg",
"operation": "new"
}
}
]
}
@@ -0,0 +1,11 @@
{
"sources": [
"tangency-labs/solidcraft#2754"
],
"what": "a tapered extrude of a profile in which an arc meets a line at a corner (a half disc)",
"source": "analytic",
"method": "positive taper grows the profile outward (as tests/oracle/05): at height z, d = z*tan3deg, the half disc R20 becomes the arc R'=20+d and the line moves to y=-d; area(z) = Int from y=-d to R' of 2*sqrt(R'^2-y^2) dy = R'^2*(pi/2+asin(d/R')) + d*sqrt(R'^2-d^2). V = Int area dz over z in 0..10 (Simpson) = 6555.91. Faces: top, bottom, flat wall, conical wall",
"body_count": 1,
"volume_mm3": 6555.908038909024,
"faces": 4
}
@@ -0,0 +1,54 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": "XY"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
-20,
0
],
[
20,
0
]
]
}
},
{
"command": "sketch.arc.center_point",
"params": {
"center": [
0,
0
],
"start": [
20,
0
],
"end": [
-20,
0
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"distance": 10,
"taper": "3 deg",
"operation": "new"
}
}
]
}
@@ -0,0 +1,10 @@
{
"sources": [
"tangency-labs/solidcraft#2755"
],
"what": "the mirror copy of a primitive cut changes only the seed's targets, not a body the seed was told to leave alone",
"source": "analytic",
"method": "Plaque loses two through holes r3 (seed at x=10, its mirror in x=50 at x=90, both inside the plate). Voisin (60000) and Loin (1000) are not targets and stay whole. Total = 121000 - 2*pi*3^2*10",
"body_count": 3,
"volume_mm3": 120434.51332235384
}
@@ -0,0 +1,80 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 100,
"width": 60,
"height": 10,
"body_name": "Plaque"
}
},
{
"command": "solid.box",
"params": {
"length": 100,
"width": 60,
"height": 10,
"corner": [
0,
0,
5
],
"operation": "new",
"body_name": "Voisin"
}
},
{
"command": "solid.box",
"params": {
"length": 10,
"width": 10,
"height": 10,
"corner": [
200,
0,
0
],
"operation": "new",
"body_name": "Loin"
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 3,
"height": 30,
"base": [
10,
10,
-5
],
"operation": "cut",
"targets": [
"Plaque"
],
"name": "Trou"
}
},
{
"command": "solid.mirror",
"params": {
"features": [
"Trou"
],
"plane": {
"origin": [
50,
0,
0
],
"normal": [
1,
0,
0
]
}
}
}
]
}
@@ -0,0 +1,10 @@
{
"sources": [
"tangency-labs/solidcraft#2755"
],
"what": "copies of a primitive cut made with a rectangular pattern change only the seed's targets, not a body the seed was told to leave alone",
"source": "analytic",
"method": "Plaque 100x60x10 loses three through holes r3 (seed at x=10, copies at 40 and 70, all inside the plate): 60000 - 3*pi*3^2*10. Voisin (z 5..15, overlapping the plate) and Loin are not targets, so they stay whole: 60000 and 1000. Total = 121000 - 3*pi*90",
"body_count": 3,
"volume_mm3": 120151.76998353076
}
@@ -0,0 +1,75 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 100,
"width": 60,
"height": 10,
"body_name": "Plaque"
}
},
{
"command": "solid.box",
"params": {
"length": 100,
"width": 60,
"height": 10,
"corner": [
0,
0,
5
],
"operation": "new",
"body_name": "Voisin"
}
},
{
"command": "solid.box",
"params": {
"length": 10,
"width": 10,
"height": 10,
"corner": [
200,
0,
0
],
"operation": "new",
"body_name": "Loin"
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 3,
"height": 30,
"base": [
10,
10,
-5
],
"operation": "cut",
"targets": [
"Plaque"
],
"name": "Trou"
}
},
{
"command": "solid.pattern.rectangular",
"params": {
"features": [
"Trou"
],
"dir1": [
1,
0,
0
],
"count1": 3,
"spacing1": 30
}
}
]
}
@@ -0,0 +1,10 @@
{
"sources": [
"tangency-labs/solidcraft#2801"
],
"what": "a join of a triangular prism and a thin slab with rounded corners (r 4.9) that share their bottom plane, the prism's edge in that plane lying in the slab's end face",
"source": "analytic",
"method": "prism: triangle (y,z) = (-63,0), (-3,0), (-63,60) extruded 1.2 along x (x 4.4..5.6): 1.2*0.5*60*60 = 2160. slab: rounded rectangle 10x64 (y -67..-3), r 4.9, 0.4 thick: 0.4*(640-(4-pi)*4.9^2). The prism's sloped face is z = -3-y, so at height z it reaches y = -3-z; overlap = Int over z in 0..0.4 of the area of {x in 4.4..5.6, -63 <= y <= -3-z} inside the slab (the corner arcs, centres (4.9,-7.9) and (5.1,-7.9), narrow it for y > -7.9), integrated numerically with Simpson = 28.704. Union = prism + slab - overlap",
"body_count": 1,
"volume_mm3": 2379.051921236255
}
@@ -0,0 +1,110 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": "YZ"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
-63,
0
],
[
-3,
0
]
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
-3,
0
],
[
-63,
60
]
]
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
-63,
60
],
[
-63,
0
]
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"distance": 1.2,
"start_offset": 4.4,
"operation": "new",
"body_name": "Prism"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY"
}
},
{
"command": "sketch.rectangle.rounded",
"params": {
"p0": [
0,
-67
],
"p1": [
10,
-3
],
"radius": 4.9
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"distance": 0.4,
"operation": "new",
"body_name": "Slab"
}
},
{
"command": "solid.combine",
"params": {
"target": "Prism",
"tools": [
"Slab"
],
"operation": "join"
}
}
]
}
@@ -0,0 +1,12 @@
{
"sources": [
"tangency-labs/solidcraft#2810",
"tangency-labs/solidcraft#2813"
],
"what": "a tapered extrude of a loop of arcs on three circles meeting at sharp corners (a circle with a lobe on each side); the walls must meet at the corners",
"source": "analytic",
"method": "the section at depth z is the profile offset inward by z*tan45 = z: the union of the circle R 49.2 -> 49.2-z (centre 0) and two lobes r 16.2 -> 16.2-z (centres +-41). Area(z) = pi*R'^2 + 2*(pi*r'^2 - lens(R', r', d=41)) with the circle-circle lens in closed form; V = Int Area(z) dz over z in 0..2.5 (Simpson) = 18907.67. Faces: top, bottom, 4 walls",
"body_count": 1,
"volume_mm3": 18907.67402576133,
"faces": 6
}
@@ -0,0 +1,93 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": "XY",
"name": "Pocket"
}
},
{
"command": "sketch.arc.center_point",
"params": {
"center": [
0,
0
],
"start": [
46.819512,
15.11864
],
"end": [
-46.819512,
15.11864
]
}
},
{
"command": "sketch.arc.center_point",
"params": {
"center": [
-41.0,
0
],
"start": [
-46.819512,
15.11864
],
"end": [
-46.819512,
-15.11864
]
}
},
{
"command": "sketch.arc.center_point",
"params": {
"center": [
0,
0
],
"start": [
-46.819512,
-15.11864
],
"end": [
46.819512,
-15.11864
]
}
},
{
"command": "sketch.arc.center_point",
"params": {
"center": [
41.0,
0
],
"start": [
46.819512,
-15.11864
],
"end": [
46.819512,
15.11864
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "Pocket",
"distance": 2.5,
"direction": "negative",
"taper": "-45 deg",
"operation": "new"
}
}
]
}
@@ -0,0 +1,12 @@
{
"sources": [
"tangency-labs/solidcraft#2826",
"tangency-labs/solidcraft#2827"
],
"what": "a cut that ends exactly in a face of its target (the plate's top face) must open the hole, not leave a zero-thickness skin over it",
"source": "analytic",
"method": "plate 40x40x2.8 minus the barrel r6 x 1.6 from below minus the hole r3.04 x 1.2 from the barrel floor (z 1.6) to the top face (z 2.8): V = 4480 - pi*36*1.6 - pi*3.04^2*1.2. Faces: bottom (with the barrel opening), top (with the hole), 4 sides, barrel wall, barrel floor (annulus), hole wall = 9; a skin would add a 10th",
"body_count": 1,
"volume_mm3": 4264.204251952329,
"faces": 9
}
@@ -0,0 +1,50 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 40,
"height": 2.8,
"corner": [
-20,
-20,
0
],
"body_name": "Plate"
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 6,
"height": 1.6,
"base": [
0,
0,
0
],
"operation": "cut",
"targets": [
"Plate"
]
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 3.04,
"height": 1.2,
"base": [
0,
0,
1.6
],
"operation": "cut",
"targets": [
"Plate"
]
}
}
]
}
@@ -0,0 +1,10 @@
{
"sources": [
"tangency-labs/solidcraft#2896"
],
"what": "a join of a ring (R30/R24, 6 tall) and an arm with a convex R5 end whose tip runs 0.1 mm into the ring's outer wall (curved faces that nearly graze)",
"source": "analytic",
"method": "ring pi*(30^2-24^2)*6; arm = box 35x10x6 plus the half disc r5 at its end, 6*(350+12.5*pi); the arm's end circle (centre x=34.9, r5) meets the ring's outer circle R30 in a lens of area 0.1232 (closed-form circle-circle lens), so the overlap is 0.739 mm^3 and V = ring + arm - overlap = 8442.14. The overlap is real material, so one fused body",
"body_count": 1,
"volume_mm3": 8442.136556424508
}
@@ -0,0 +1,74 @@
{
"commands": [
{
"command": "solid.cylinder",
"params": {
"radius": 30,
"height": 6,
"base": [
0,
0,
0
],
"body_name": "Ring"
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 24,
"height": 6,
"base": [
0,
0,
0
],
"operation": "cut",
"targets": [
"Ring"
]
}
},
{
"command": "solid.box",
"params": {
"length": 35,
"width": 10,
"height": 6,
"corner": [
34.9,
-5,
0
],
"operation": "new",
"body_name": "Arm"
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 5,
"height": 6,
"base": [
34.9,
0,
0
],
"operation": "join",
"targets": [
"Arm"
]
}
},
{
"command": "solid.combine",
"params": {
"target": "Ring",
"tools": [
"Arm"
],
"operation": "join"
}
}
]
}