kernel-cases: sheet-metal fold cases from #262, #264, #638, #639, #685

Folds of tabs and plates, graded by closed form: a fold keeps the blank's
flat length, so V = flat area * t + theta * w * t^2 * (1/2 - K). Tabs
on one line (#264, #638), a tab on an L's inside edge (#639), a fold just
inside a tab root and a refusal at the root (#262), a fixed point on the
top face of a large plate (#685).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Brennen Herbruck
2026-10-21 05:49:22 -04:00
committed by jyviko
parent 611567c63c
commit 3c465e6801
14 changed files with 809 additions and 0 deletions
@@ -0,0 +1,11 @@
{
"sources": [
"tangency-labs/solidcraft#262",
"tangency-labs/solidcraft#277"
],
"what": "a 20 x 20 tab folded 90 degrees on a line 1 mm inside its root, where the bend zone stays clear of the blank's outline",
"source": "analytic",
"method": "blank area 100*50 + 20*20 = 5400 mm2 at t = 0.8; the fold has width 20: a fold keeps the flat length of the blank, so a fold of angle th, inner radius R, thickness t and K-factor K over a width w takes a flat strip of BA = th(R+Kt) and puts a bend of volume th((R+t)^2-R^2)w/2 in its place: V = V_flat + th w t^2 (1/2 - K) (the bend's mid-surface lies at R+t/2, the neutral axis at R+Kt). V = 5400*0.8 + (pi/2)*20*0.64*0.06",
"body_count": 1,
"volume_mm3": 4321.206371578978
}
@@ -0,0 +1,98 @@
{
"commands": [
{
"command": "sheet.manage_rules",
"params": {
"name": "Steel 0.8",
"thickness": "0.8 mm",
"active": true,
"bend_radius": "0.8 mm",
"k_factor": 0.44
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"name": "Blank"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
0
],
[
100,
0
],
[
100,
50
],
[
60,
50
],
[
60,
70
],
[
40,
70
],
[
40,
50
],
[
0,
50
]
],
"closed": true
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "sheet.flange",
"params": {
"type": "base",
"sketch": "Blank"
}
},
{
"command": "sheet.fold",
"params": {
"points": [
[
40,
51,
0.8
],
[
60,
51,
0.8
]
],
"fixed": [
50,
25,
0.8
]
}
},
{
"command": "inspect.measure",
"params": {}
}
]
}
@@ -0,0 +1,10 @@
{
"sources": [
"tangency-labs/solidcraft#262",
"tangency-labs/solidcraft#277"
],
"what": "a fold exactly at a tab's root, where the bend zone (+-BA/2) would reach the blank's outline beside the tab, needs a bend relief",
"source": "invariants",
"method": "the fold line y = 50 is the tab's root: its bend zone reaches the corners (40,50) and (60,50) of the outline, so a clean bend is impossible without a relief that fold does not cut; the right behaviour is a refusal that names the cause, not a panic, a hang or a malformed body (BA/2 = (pi/2)(0.8+0.352)/2 = 0.905 mm)",
"outcome": "refused"
}
@@ -0,0 +1,94 @@
{
"commands": [
{
"command": "sheet.manage_rules",
"params": {
"name": "Steel 0.8",
"thickness": "0.8 mm",
"active": true,
"bend_radius": "0.8 mm",
"k_factor": 0.44
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"name": "Blank"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
0
],
[
100,
0
],
[
100,
50
],
[
60,
50
],
[
60,
70
],
[
40,
70
],
[
40,
50
],
[
0,
50
]
],
"closed": true
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "sheet.flange",
"params": {
"type": "base",
"sketch": "Blank"
}
},
{
"command": "sheet.fold",
"params": {
"points": [
[
40,
50,
0.8
],
[
60,
50,
0.8
]
],
"fixed": [
50,
25,
0.8
]
}
}
]
}
@@ -0,0 +1,11 @@
{
"sources": [
"tangency-labs/solidcraft#264",
"tangency-labs/solidcraft#279"
],
"what": "a 100 x 40 blank with two 15 x 7 tabs on one line, one tab folded 90 degrees on a line that the other tab also lies on",
"source": "analytic",
"method": "blank area 100*40 + 2*15*7 = 4210 mm2 at t = 0.8; the one fold (width 7, R = t = 0.8, K = 0.44): a fold keeps the flat length of the blank, so a fold of angle th, inner radius R, thickness t and K-factor K over a width w takes a flat strip of BA = th(R+Kt) and puts a bend of volume th((R+t)^2-R^2)w/2 in its place: V = V_flat + th w t^2 (1/2 - K) (the bend's mid-surface lies at R+t/2, the neutral axis at R+Kt). V = 4210*0.8 + (pi/2)*7*0.64*0.06",
"body_count": 1,
"volume_mm3": 3368.4222300526426
}
@@ -0,0 +1,114 @@
{
"commands": [
{
"command": "sheet.manage_rules",
"params": {
"name": "Steel 0.8",
"thickness": "0.8 mm",
"active": true,
"bend_radius": "0.8 mm",
"k_factor": 0.44
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"name": "Blank"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
0
],
[
100,
0
],
[
100,
5
],
[
115,
5
],
[
115,
12
],
[
100,
12
],
[
100,
28
],
[
115,
28
],
[
115,
35
],
[
100,
35
],
[
100,
40
],
[
0,
40
]
],
"closed": true
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "sheet.flange",
"params": {
"type": "base",
"sketch": "Blank"
}
},
{
"command": "sheet.fold",
"params": {
"points": [
[
107,
5,
0.8
],
[
107,
12,
0.8
]
],
"fixed": [
50,
20,
0.8
]
}
},
{
"command": "inspect.measure",
"params": {}
}
]
}
@@ -0,0 +1,10 @@
{
"sources": [
"tangency-labs/solidcraft#264"
],
"what": "one fold line spanning both of two collinear tabs folds both",
"source": "analytic",
"method": "blank area 4210 mm2 at t = 0.8; one fold line over both tabs bends both (width 7 each): a fold keeps the flat length of the blank, so a fold of angle th, inner radius R, thickness t and K-factor K over a width w takes a flat strip of BA = th(R+Kt) and puts a bend of volume th((R+t)^2-R^2)w/2 in its place: V = V_flat + th w t^2 (1/2 - K) (the bend's mid-surface lies at R+t/2, the neutral axis at R+Kt). V = 4210*0.8 + 2*(pi/2)*7*0.64*0.06",
"body_count": 1,
"volume_mm3": 3368.8444601052847
}
@@ -0,0 +1,114 @@
{
"commands": [
{
"command": "sheet.manage_rules",
"params": {
"name": "Steel 0.8",
"thickness": "0.8 mm",
"active": true,
"bend_radius": "0.8 mm",
"k_factor": 0.44
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"name": "Blank"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
0
],
[
100,
0
],
[
100,
5
],
[
115,
5
],
[
115,
12
],
[
100,
12
],
[
100,
28
],
[
115,
28
],
[
115,
35
],
[
100,
35
],
[
100,
40
],
[
0,
40
]
],
"closed": true
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "sheet.flange",
"params": {
"type": "base",
"sketch": "Blank"
}
},
{
"command": "sheet.fold",
"params": {
"points": [
[
107,
5,
0.8
],
[
107,
35,
0.8
]
],
"fixed": [
50,
20,
0.8
]
}
},
{
"command": "inspect.measure",
"params": {}
}
]
}
@@ -0,0 +1,12 @@
{
"sources": [
"tangency-labs/solidcraft#638",
"tangency-labs/solidcraft#652",
"tangency-labs/solidcraft#963"
],
"what": "two collinear tabs folded in two features on the same line; the second fold used to be refused as crossing a slanted edge",
"source": "analytic",
"method": "blank area 4210 mm2 at t = 0.8, two folds of width 7: a fold keeps the flat length of the blank, so a fold of angle th, inner radius R, thickness t and K-factor K over a width w takes a flat strip of BA = th(R+Kt) and puts a bend of volume th((R+t)^2-R^2)w/2 in its place: V = V_flat + th w t^2 (1/2 - K) (the bend's mid-surface lies at R+t/2, the neutral axis at R+Kt). V = 4210*0.8 + 2*(pi/2)*7*0.64*0.06",
"body_count": 1,
"volume_mm3": 3368.8444601052847
}
@@ -0,0 +1,136 @@
{
"commands": [
{
"command": "sheet.manage_rules",
"params": {
"name": "Steel 0.8",
"thickness": "0.8 mm",
"active": true,
"bend_radius": "0.8 mm",
"k_factor": 0.44
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"name": "Blank"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
0
],
[
100,
0
],
[
100,
5
],
[
115,
5
],
[
115,
12
],
[
100,
12
],
[
100,
28
],
[
115,
28
],
[
115,
35
],
[
100,
35
],
[
100,
40
],
[
0,
40
]
],
"closed": true
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "sheet.flange",
"params": {
"type": "base",
"sketch": "Blank"
}
},
{
"command": "sheet.fold",
"params": {
"points": [
[
107,
5,
0.8
],
[
107,
12,
0.8
]
],
"fixed": [
50,
20,
0.8
]
}
},
{
"command": "sheet.fold",
"params": {
"points": [
[
107,
28,
0.8
],
[
107,
35,
0.8
]
],
"fixed": [
50,
20,
0.8
]
}
},
{
"command": "inspect.measure",
"params": {}
}
]
}
@@ -0,0 +1,12 @@
{
"sources": [
"tangency-labs/solidcraft#639",
"tangency-labs/solidcraft#653",
"tangency-labs/solidcraft#963"
],
"what": "a tab (x 45..60, y 60..90) on an inside edge of an L-shaped blank folded 90 degrees at x = 59 with the fixed point on the other leg; refused as folding tabs that join again",
"source": "analytic",
"method": "blank area by the shoelace formula 7450.0 mm2 at t = 0.8; the fold has width 30 (the tab's height along the line): a fold keeps the flat length of the blank, so a fold of angle th, inner radius R, thickness t and K-factor K over a width w takes a flat strip of BA = th(R+Kt) and puts a bend of volume th((R+t)^2-R^2)w/2 in its place: V = V_flat + th w t^2 (1/2 - K) (the bend's mid-surface lies at R+t/2, the neutral axis at R+Kt). V = 7450.0*0.8 + (pi/2)*30*0.64*0.06",
"body_count": 1,
"volume_mm3": 5961.809557368468
}
@@ -0,0 +1,106 @@
{
"commands": [
{
"command": "sheet.manage_rules",
"params": {
"name": "Steel 0.8",
"thickness": "0.8 mm",
"active": true,
"bend_radius": "0.8 mm",
"k_factor": 0.44
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"name": "Blank"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
0,
0
],
[
100,
0
],
[
100,
100
],
[
60,
100
],
[
60,
90
],
[
45,
90
],
[
45,
60
],
[
60,
60
],
[
60,
50
],
[
0,
50
]
],
"closed": true
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "sheet.flange",
"params": {
"type": "base",
"sketch": "Blank"
}
},
{
"command": "sheet.fold",
"params": {
"points": [
[
59,
60,
0.8
],
[
59,
90,
0.8
]
],
"fixed": [
40,
30,
0.8
]
}
},
{
"command": "inspect.measure",
"params": {}
}
]
}
@@ -0,0 +1,10 @@
{
"sources": [
"tangency-labs/solidcraft#958"
],
"what": "a large thin blank folded across its whole width with the fixed point exactly on the sheet's top face",
"source": "analytic",
"method": "465 x 200 x 0.8 plate: V_flat = 74400 mm3; one fold of width 200 across it: a fold keeps the flat length of the blank, so a fold of angle th, inner radius R, thickness t and K-factor K over a width w takes a flat strip of BA = th(R+Kt) and puts a bend of volume th((R+t)^2-R^2)w/2 in its place: V = V_flat + th w t^2 (1/2 - K) (the bend's mid-surface lies at R+t/2, the neutral axis at R+Kt). V = 74400 + (pi/2)*200*0.64*0.06",
"body_count": 1,
"volume_mm3": 74412.06371578979
}
@@ -0,0 +1,71 @@
{
"commands": [
{
"command": "sheet.manage_rules",
"params": {
"name": "Steel 0.8",
"thickness": "0.8 mm",
"active": true,
"bend_radius": "0.8 mm",
"k_factor": 0.44
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"name": "Base"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
0,
0
],
"p1": [
465,
200
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "sheet.flange",
"params": {
"type": "base",
"sketch": "Base"
}
},
{
"command": "sheet.fold",
"params": {
"points": [
[
300,
0,
0.8
],
[
300,
200,
0.8
]
],
"fixed": [
100,
100,
0.8
]
}
},
{
"command": "inspect.measure",
"params": {}
}
]
}