Kernel rig: history area, timeline cases with each part's exact answer

Suppress a hole and the block is whole again; a round moved before the notch
runs the whole edge and is cut by it; deleting a sketch takes its cut and
deleting the block leaves the round and cut failing; roll to the middle gives
the part at that step; edits, compute all and folders, each with a refusal.
The new history area has its KNOWN_FAILING (every case passes) and PATHS.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
jyviko
2026-10-29 17:10:09 -04:00
committed by Irakli Kourtis
parent 5c80ef4ad8
commit 74eeda4914
55 changed files with 1963 additions and 0 deletions
+1
View File
@@ -43,6 +43,7 @@ One directory per area, one per case: `tests/kernel-cases/<area>/<id>/`.
| `surfaces` (every `surface.*` tool: offset, ruled, untrim, unstitch, reverse normal, boundary, blend, match, fair, and a normal and an edge case of each of the others) | surfaces rig |
| `construction` (construction planes, axes and points: `construct.*`) | tool coverage rig |
| `inspect` (the inspect commands that return numbers) | tool coverage rig |
| `history` (the timeline's suppress, reorder, delete, roll back, edit and folders; configuration rows, columns and rules; parameters that drive geometry) | tool coverage rig |
Each area also has its gate files: `KNOWN_FAILING` and `PATHS` (see [the gate](#the-kernel-rig-gate)).
+4
View File
@@ -0,0 +1,4 @@
# The history cases that fail today, one a line: `<case> <why it fails today>`. Sorted. A gate on
# this area fails on a case that fails and is not listed here, and on a listed case that passes:
# a fix removes its line in the same pull request.
# Baseline: rig-cases-timeline-configurations 45f69c0e5 with SMLib 60b1c6a, aarch64 Linux.
+17
View File
@@ -0,0 +1,17 @@
# The sources whose change must rerun the history cases (git pathspec globs, one a line).
# The timeline, configuration and parameter commands.
crates/engine/src/cmd/edit.rs
crates/engine/src/cmd/config.rs
crates/engine/src/cmd/parameters.rs
# The design's timeline (delete, folders, marker), its configuration table and rules, and its
# parameters and expressions.
crates/doc/src/document.rs
crates/doc/src/config.rs
crates/doc/src/config_rules.rs
crates/doc/src/params.rs
crates/doc/src/expr.rs
# Rebuilding the timeline, and the results it keeps between rebuilds.
crates/doc/src/eval.rs
crates/doc/src/model_cache.rs
# The cases themselves.
tests/kernel-cases/history/**
@@ -0,0 +1,16 @@
{
"sources": [],
"what": "timeline.compute_all after the block is deleted: the round and the cut fail",
"source": "invariants",
"method": "3 features left (Round, the sketch, Notch); Round and Notch have no body: 2 errors; no body",
"body_count": 0,
"results": [
{
"step": 8,
"json": {
"features": 3,
"errors": 2
}
}
]
}
@@ -0,0 +1,73 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Block",
"edges": [
[
5,
0,
10
]
],
"radius": 2,
"name": "Round"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "timeline.delete",
"params": {
"feature": "Block"
}
},
{
"command": "timeline.compute_all",
"params": {}
}
]
}
@@ -0,0 +1,18 @@
{
"sources": [],
"what": "timeline.compute_all rebuilds every feature from nothing to the same part",
"method": "the notch first splits the front top edge; the round R2 on the piece at (5,0,10), x 0..15: V = 12000 - 500 - (1-pi/4) 4 15; faces 6 + 4 + 1 round = 11; 4 features, none failing",
"body_count": 1,
"volume_mm3": 11487.123889803846,
"faces": 11,
"results": [
{
"step": 7,
"json": {
"features": 4,
"errors": 0
}
}
],
"source": "analytic"
}
@@ -0,0 +1,67 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Block",
"edges": [
[
5,
0,
10
]
],
"radius": 2,
"name": "Round"
}
},
{
"command": "timeline.compute_all",
"params": {}
}
]
}
@@ -0,0 +1,9 @@
{
"sources": [],
"what": "timeline.delete of a sketch deletes the cut made from it",
"method": "the notch goes with its sketch: 40x30x10 block with its front top edge rounded R2 along 40 mm: V = 12000 - (1-pi/4) 4 40; faces 6 + 1 = 7",
"body_count": 1,
"volume_mm3": 11965.663706143592,
"faces": 7,
"source": "analytic"
}
@@ -0,0 +1,69 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Block",
"edges": [
[
5,
0,
10
]
],
"radius": 2,
"name": "Round"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "timeline.delete",
"params": {
"feature": "NotchSketch"
}
}
]
}
@@ -0,0 +1,22 @@
{
"sources": [],
"what": "timeline.delete of the block the round and the notch are made on",
"source": "invariants",
"method": "the delete is made (only a sketch takes features with it); the round and the cut have no body now and are reported failing, in timeline order; no body is left",
"body_count": 0,
"results": [
{
"step": 7,
"json": {
"failing": [
{
"feature": "Round"
},
{
"feature": "Notch"
}
]
}
}
]
}
@@ -0,0 +1,69 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Block",
"edges": [
[
5,
0,
10
]
],
"radius": 2,
"name": "Round"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "timeline.delete",
"params": {
"feature": "Block"
}
}
]
}
@@ -0,0 +1,9 @@
{
"sources": [],
"what": "timeline.edit of a cut's depth from 5 to 8",
"method": "the 10x10 notch 8 deep: V = 12000 - 800; faces 6 + 4 = 10",
"body_count": 1,
"volume_mm3": 11200.0,
"faces": 10,
"source": "analytic"
}
@@ -0,0 +1,57 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "timeline.edit",
"params": {
"feature": "Notch",
"set": {
"extent.distance": "-8"
}
}
}
]
}
@@ -0,0 +1,9 @@
{
"sources": [],
"what": "timeline.edit of a round's radius from 2 to 4",
"method": "R4 along 40 mm: V = 12000 - (1-pi/4) 16 40; faces 7",
"body_count": 1,
"volume_mm3": 11862.654824574367,
"faces": 7,
"source": "analytic"
}
@@ -0,0 +1,38 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Block",
"edges": [
[
5,
0,
10
]
],
"radius": 2,
"name": "Round"
}
},
{
"command": "timeline.edit",
"params": {
"feature": "Round",
"set": {
"radius": "4"
}
}
}
]
}
@@ -0,0 +1,8 @@
{
"sources": [],
"what": "timeline.edit with a misspelt field",
"source": "invariants",
"method": "a field the round does not have would change nothing: refused, naming it",
"outcome": "refused",
"refusal": "unknown field `radus`"
}
@@ -0,0 +1,38 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Block",
"edges": [
[
5,
0,
10
]
],
"radius": 2,
"name": "Round"
}
},
{
"command": "timeline.edit",
"params": {
"feature": "Round",
"set": {
"radus": "4"
}
}
}
]
}
@@ -0,0 +1,19 @@
{
"sources": [],
"what": "timeline.group of a sketch and its cut into a folder changes no geometry",
"method": "a folder is only the timeline's: round R2 on the whole 40 mm front top edge, then the 10x10x5 notch through it: V = 12000 - 500 - (1-pi/4) 4 (40-10) (the notch already holds the round's 10 mm in it); faces: 6 block + 4 notch (bottom, two sides, back) + the round in two pieces = 12",
"body_count": 1,
"volume_mm3": 11474.247779607695,
"faces": 12,
"results": [
{
"step": 7,
"json": {
"group": 5,
"name": "Notch folder",
"parent": null
}
}
],
"source": "analytic"
}
@@ -0,0 +1,73 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Block",
"edges": [
[
5,
0,
10
]
],
"radius": 2,
"name": "Round"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "timeline.group",
"params": {
"name": "Notch folder",
"features": [
"NotchSketch",
"Notch"
]
}
}
]
}
@@ -0,0 +1,8 @@
{
"sources": [],
"what": "timeline.group of two features with others between them",
"source": "invariants",
"method": "a folder holds one contiguous run of features: Block and Notch have Round and the sketch between them",
"outcome": "refused",
"refusal": "timeline folder `Split` must contain one contiguous run of features"
}
@@ -0,0 +1,73 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Block",
"edges": [
[
5,
0,
10
]
],
"radius": 2,
"name": "Round"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "timeline.group",
"params": {
"name": "Split",
"features": [
"Block",
"Notch"
]
}
}
]
}
@@ -0,0 +1,9 @@
{
"sources": [],
"what": "timeline.move_many of a folder (a sketch and its notch) to behind the round made after it",
"method": "the order becomes Block, Round, sketch, Notch: round R2 on the whole 40 mm front top edge, then the 10x10x5 notch through it: V = 12000 - 500 - (1-pi/4) 4 (40-10) (the notch already holds the round's 10 mm in it); faces: 6 block + 4 notch (bottom, two sides, back) + the round in two pieces = 12",
"body_count": 1,
"volume_mm3": 11474.247779607695,
"faces": 12,
"source": "analytic"
}
@@ -0,0 +1,82 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Block",
"edges": [
[
5,
0,
10
]
],
"radius": 2,
"name": "Round"
}
},
{
"command": "timeline.group",
"params": {
"name": "Notch folder",
"features": [
"NotchSketch",
"Notch"
]
}
},
{
"command": "timeline.move_many",
"params": {
"groups": [
5
],
"position": 4
}
}
]
}
@@ -0,0 +1,8 @@
{
"sources": [],
"what": "timeline.move_many of a folder into itself",
"source": "invariants",
"method": "a folder cannot hold itself",
"outcome": "refused",
"refusal": "a folder cannot be moved into itself or one of its descendants"
}
@@ -0,0 +1,68 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "timeline.group",
"params": {
"name": "Notch folder",
"features": [
"NotchSketch",
"Notch"
]
}
},
{
"command": "timeline.move_many",
"params": {
"groups": [
4
],
"group": 4,
"position": 0
}
}
]
}
@@ -0,0 +1,20 @@
{
"sources": [],
"what": "timeline.move_to_group of the round into the folder right after it",
"method": "Round, the sketch and Notch are one contiguous run; no geometry changes: round R2 on the whole 40 mm front top edge, then the 10x10x5 notch through it: V = 12000 - 500 - (1-pi/4) 4 (40-10) (the notch already holds the round's 10 mm in it); faces: 6 block + 4 notch (bottom, two sides, back) + the round in two pieces = 12",
"body_count": 1,
"volume_mm3": 11474.247779607695,
"faces": 12,
"results": [
{
"step": 8,
"json": {
"features": [
2
],
"group": 5
}
}
],
"source": "analytic"
}
@@ -0,0 +1,82 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Block",
"edges": [
[
5,
0,
10
]
],
"radius": 2,
"name": "Round"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "timeline.group",
"params": {
"name": "Notch folder",
"features": [
"NotchSketch",
"Notch"
]
}
},
{
"command": "timeline.move_to_group",
"params": {
"features": [
"Round"
],
"group": 5
}
}
]
}
@@ -0,0 +1,8 @@
{
"sources": [],
"what": "timeline.move_to_group of a cut into a folder its sketch is outside of",
"source": "invariants",
"method": "folder R would hold Round and Notch with the sketch between them: not one contiguous run",
"outcome": "refused",
"refusal": "timeline folder `R` must contain one contiguous run of features"
}
@@ -0,0 +1,81 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Block",
"edges": [
[
5,
0,
10
]
],
"radius": 2,
"name": "Round"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "timeline.group",
"params": {
"name": "R",
"features": [
"Round"
]
}
},
{
"command": "timeline.move_to_group",
"params": {
"features": [
"Notch"
],
"group": 5
}
}
]
}
@@ -0,0 +1,8 @@
{
"sources": [],
"what": "timeline.reorder of a cut to before its own sketch",
"source": "invariants",
"method": "the cut cannot find its sketch there: the move breaks a feature that worked and is refused",
"outcome": "refused",
"refusal": "moving Notch there breaks Notch"
}
@@ -0,0 +1,55 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "timeline.reorder",
"params": {
"feature": "Notch",
"position": 0
}
}
]
}
@@ -0,0 +1,21 @@
{
"sources": [],
"what": "timeline.reorder of a round made after a notch to before it: the round now runs the whole edge and the notch cuts it",
"method": "round R2 on the whole 40 mm front top edge, then the 10x10x5 notch through it: V = 12000 - 500 - (1-pi/4) 4 (40-10) (the notch already holds the round's 10 mm in it); faces: 6 block + 4 notch (bottom, two sides, back) + the round in two pieces = 12",
"body_count": 1,
"volume_mm3": 11474.247779607695,
"faces": 12,
"bbox": {
"min": [
0,
0,
0
],
"max": [
40,
30,
10
]
},
"source": "analytic"
}
@@ -0,0 +1,70 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Block",
"edges": [
[
5,
0,
10
]
],
"radius": 2,
"name": "Round"
}
},
{
"command": "timeline.reorder",
"params": {
"feature": "Round",
"position": 1
}
}
]
}
@@ -0,0 +1,9 @@
{
"sources": [],
"what": "timeline.reorder_many moves a notch's sketch and cut together behind the round",
"method": "round R2 on the whole 40 mm front top edge, then the 10x10x5 notch through it: V = 12000 - 500 - (1-pi/4) 4 (40-10) (the notch already holds the round's 10 mm in it); faces: 6 block + 4 notch (bottom, two sides, back) + the round in two pieces = 12",
"body_count": 1,
"volume_mm3": 11474.247779607695,
"faces": 12,
"source": "analytic"
}
@@ -0,0 +1,73 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Block",
"edges": [
[
5,
0,
10
]
],
"radius": 2,
"name": "Round"
}
},
{
"command": "timeline.reorder_many",
"params": {
"features": [
"NotchSketch",
"Notch"
],
"position": 4
}
}
]
}
@@ -0,0 +1,8 @@
{
"sources": [],
"what": "timeline.reorder_many of a sketch to behind the cut that uses it",
"source": "invariants",
"method": "the cut comes before its sketch: it breaks, so the move is refused",
"outcome": "refused",
"refusal": "moving the selected features there breaks Notch"
}
@@ -0,0 +1,72 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Block",
"edges": [
[
5,
0,
10
]
],
"radius": 2,
"name": "Round"
}
},
{
"command": "timeline.reorder_many",
"params": {
"features": [
"NotchSketch"
],
"position": 4
}
}
]
}
@@ -0,0 +1,23 @@
{
"sources": [],
"what": "timeline.roll_to the block alone, then to the end: every feature again",
"method": "round R2 on the whole 40 mm front top edge, then the 10x10x5 notch through it: V = 12000 - 500 - (1-pi/4) 4 (40-10) (the notch already holds the round's 10 mm in it); faces: 6 block + 4 notch (bottom, two sides, back) + the round in two pieces = 12",
"body_count": 1,
"volume_mm3": 11474.247779607695,
"faces": 12,
"results": [
{
"step": 7,
"json": {
"marker": 1
}
},
{
"step": 8,
"json": {
"marker": 4
}
}
],
"source": "analytic"
}
@@ -0,0 +1,73 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Block",
"edges": [
[
5,
0,
10
]
],
"radius": 2,
"name": "Round"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "timeline.roll_to",
"params": {
"position": 1
}
},
{
"command": "timeline.roll_to",
"params": {}
}
]
}
@@ -0,0 +1,8 @@
{
"sources": [],
"what": "timeline.roll_to a negative position",
"source": "invariants",
"method": "a position counts the features to keep active (0 to 2): -1 is refused, not read as 0",
"outcome": "refused",
"refusal": "`position` -1 is negative"
}
@@ -0,0 +1,35 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Block",
"edges": [
[
5,
0,
10
]
],
"radius": 2,
"name": "Round"
}
},
{
"command": "timeline.roll_to",
"params": {
"position": -1
}
}
]
}
@@ -0,0 +1,18 @@
{
"sources": [],
"what": "timeline.roll_to a feature in the middle: the part is the one at that step",
"method": "marker after Round (2 of 4 features active): 40x30x10 block with its front top edge rounded R2 along 40 mm: V = 12000 - (1-pi/4) 4 40; faces 6 + 1 = 7",
"body_count": 1,
"volume_mm3": 11965.663706143592,
"faces": 7,
"results": [
{
"step": 7,
"json": {
"marker": 2,
"features": 4
}
}
],
"source": "analytic"
}
@@ -0,0 +1,69 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Block",
"edges": [
[
5,
0,
10
]
],
"radius": 2,
"name": "Round"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "timeline.roll_to",
"params": {
"feature": "Round"
}
}
]
}
@@ -0,0 +1,30 @@
{
"sources": [],
"what": "timeline.suppress on a through hole: the block is whole again",
"method": "40x30x10 block, the hole suppressed: V = 12000; 6 faces",
"body_count": 1,
"volume_mm3": 12000.0,
"faces": 6,
"bbox": {
"min": [
0,
0,
0
],
"max": [
40,
30,
10
]
},
"results": [
{
"step": 3,
"json": {
"feature": 2,
"suppressed": true
}
}
],
"source": "analytic"
}
@@ -0,0 +1,33 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "solid.hole",
"params": {
"position": [
20,
15,
10
],
"diameter": 10,
"name": "Hole"
}
},
{
"command": "timeline.suppress",
"params": {
"feature": "Hole",
"suppressed": true
}
}
]
}
@@ -0,0 +1,17 @@
{
"sources": [],
"what": "timeline.suppress of a hole and a cut together",
"method": "both suppressed: the plain 40x30x10 block, V = 12000, 6 faces",
"body_count": 1,
"volume_mm3": 12000.0,
"faces": 6,
"results": [
{
"step": 7,
"json": {
"suppressed": true
}
}
],
"source": "analytic"
}
@@ -0,0 +1,70 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "solid.hole",
"params": {
"position": [
32,
20,
10
],
"diameter": 10,
"name": "Hole"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "timeline.suppress",
"params": {
"features": [
"Hole",
"Notch"
],
"suppressed": true
}
}
]
}
@@ -0,0 +1,23 @@
{
"sources": [],
"what": "timeline.suppress with no `suppressed` flips the hole off and back on",
"method": "two toggles leave the hole: V = 12000 - pi 5^2 10; faces 6 + 1 cylinder = 7",
"body_count": 1,
"volume_mm3": 11214.601836602551,
"faces": 7,
"results": [
{
"step": 3,
"json": {
"suppressed": true
}
},
{
"step": 4,
"json": {
"suppressed": false
}
}
],
"source": "analytic"
}
@@ -0,0 +1,38 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "solid.hole",
"params": {
"position": [
20,
15,
10
],
"diameter": 10,
"name": "Hole"
}
},
{
"command": "timeline.suppress",
"params": {
"feature": "Hole"
}
},
{
"command": "timeline.suppress",
"params": {
"feature": "Hole"
}
}
]
}
@@ -0,0 +1,8 @@
{
"sources": [],
"what": "timeline.suppress of a feature the design does not have",
"source": "invariants",
"method": "no feature named Nope: a clean refusal naming it",
"outcome": "refused",
"refusal": "no feature `Nope`"
}
@@ -0,0 +1,21 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "timeline.suppress",
"params": {
"feature": "Nope",
"suppressed": true
}
}
]
}
@@ -0,0 +1,19 @@
{
"sources": [],
"what": "timeline.ungroup of a folder leaves its features and the part",
"method": "folders are only the timeline's: round R2 on the whole 40 mm front top edge, then the 10x10x5 notch through it: V = 12000 - 500 - (1-pi/4) 4 (40-10) (the notch already holds the round's 10 mm in it); faces: 6 block + 4 notch (bottom, two sides, back) + the round in two pieces = 12",
"body_count": 1,
"volume_mm3": 11474.247779607695,
"faces": 12,
"results": [
{
"step": 8,
"json": {
"groups": [
5
]
}
}
],
"source": "analytic"
}
@@ -0,0 +1,79 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Block",
"edges": [
[
5,
0,
10
]
],
"radius": 2,
"name": "Round"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY",
"offset": 10,
"name": "NotchSketch"
}
},
{
"command": "sketch.rectangle.two_point",
"params": {
"p0": [
15,
0
],
"p1": [
25,
10
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "solid.extrude",
"params": {
"sketch": "NotchSketch",
"distance": -5,
"operation": "cut",
"name": "Notch"
}
},
{
"command": "timeline.group",
"params": {
"name": "Notch folder",
"features": [
"NotchSketch",
"Notch"
]
}
},
{
"command": "timeline.ungroup",
"params": {
"group": 5
}
}
]
}
@@ -0,0 +1,8 @@
{
"sources": [],
"what": "timeline.ungroup of a folder that does not exist",
"source": "invariants",
"method": "no folder 99: a clean refusal",
"outcome": "refused",
"refusal": "no timeline folder 99"
}
@@ -0,0 +1,20 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 10,
"body_name": "Block",
"name": "Block"
}
},
{
"command": "timeline.ungroup",
"params": {
"group": 99
}
}
]
}