Adds oracle case 81 (a box edge rounded at a clamped cubic B-spline radius) with analytic expected values, and passes spline fillets through recipes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
205 lines
3.2 KiB
JSON
205 lines
3.2 KiB
JSON
{
|
|
"id": "81-fillet-spline-radius",
|
|
"name": "Fillet with a B-spline radius",
|
|
"description": "40x30x20 box, the top front edge rounded with a radius following a clamped cubic B-spline along it: control radii 2, 5, 1.5, 4, 1, 3 mm from x = 0, knots 0, 0, 0, 0, 0.25, 0.6, 1, 1, 1, 1.",
|
|
"exercises": [
|
|
"extrude",
|
|
"fillet",
|
|
"spline radius"
|
|
],
|
|
"units": {
|
|
"length": "mm",
|
|
"angle": "deg",
|
|
"area": "mm2",
|
|
"volume": "mm3"
|
|
},
|
|
"conventions": {
|
|
"world": "right-handed; Z up. XY/XZ/YZ are the origin planes.",
|
|
"sketch_frame": "sketch-local 2D coords; world = plane.origin + x*plane.x_dir + y*plane.y_dir (origin in mm). Profile 'loops' list sketch entity ids.",
|
|
"point_refs": "'<id>.start' / '<id>.end' / '<id>.center' reuse (share) that existing sketch point; 'at' is its position when referenced.",
|
|
"extrude_direction": "positive = along sketch plane normal unless stated",
|
|
"selections": "selected faces/edges carry 'point': a world-space point on the face / the edge's parametric midpoint; pick the nearest face/edge to it."
|
|
},
|
|
"parameters": [],
|
|
"features": [
|
|
{
|
|
"op": "sketch",
|
|
"name": "Extrude1_sketch",
|
|
"plane": {
|
|
"ref": "XY",
|
|
"origin": [
|
|
0.0,
|
|
0.0,
|
|
0.0
|
|
],
|
|
"x_dir": [
|
|
1.0,
|
|
0.0,
|
|
0.0
|
|
],
|
|
"y_dir": [
|
|
0.0,
|
|
1.0,
|
|
0.0
|
|
],
|
|
"normal": [
|
|
0.0,
|
|
0.0,
|
|
1.0
|
|
]
|
|
},
|
|
"entities": [
|
|
{
|
|
"type": "line",
|
|
"start": {
|
|
"at": [
|
|
0,
|
|
0
|
|
]
|
|
},
|
|
"end": {
|
|
"at": [
|
|
40,
|
|
0
|
|
]
|
|
},
|
|
"id": "l1"
|
|
},
|
|
{
|
|
"type": "line",
|
|
"start": {
|
|
"ref": "l1.end",
|
|
"at": [
|
|
40.0,
|
|
0.0
|
|
]
|
|
},
|
|
"end": {
|
|
"at": [
|
|
40,
|
|
30
|
|
]
|
|
},
|
|
"id": "l2"
|
|
},
|
|
{
|
|
"type": "line",
|
|
"start": {
|
|
"ref": "l2.end",
|
|
"at": [
|
|
40.0,
|
|
30.0
|
|
]
|
|
},
|
|
"end": {
|
|
"at": [
|
|
0,
|
|
30
|
|
]
|
|
},
|
|
"id": "l3"
|
|
},
|
|
{
|
|
"type": "line",
|
|
"start": {
|
|
"ref": "l3.end",
|
|
"at": [
|
|
0.0,
|
|
30.0
|
|
]
|
|
},
|
|
"end": {
|
|
"ref": "l1.start",
|
|
"at": [
|
|
0.0,
|
|
0.0
|
|
]
|
|
},
|
|
"id": "l4"
|
|
}
|
|
],
|
|
"constraints": [],
|
|
"dimensions": []
|
|
},
|
|
{
|
|
"op": "extrude",
|
|
"name": "Extrude1",
|
|
"operation": "new",
|
|
"profiles": [
|
|
{
|
|
"sketch": "Extrude1_sketch",
|
|
"loops": [
|
|
{
|
|
"outer": true,
|
|
"curves": [
|
|
"l1",
|
|
"l2",
|
|
"l3",
|
|
"l4"
|
|
]
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"extent": {
|
|
"type": "distance",
|
|
"distance": 20,
|
|
"direction": "positive"
|
|
},
|
|
"result_bodies": [
|
|
"Part"
|
|
]
|
|
},
|
|
{
|
|
"op": "fillet",
|
|
"name": "Fillet1",
|
|
"type": "spline_radius",
|
|
"radius": 2.0,
|
|
"radii": [
|
|
5.0,
|
|
1.5,
|
|
4.0,
|
|
1.0,
|
|
3.0
|
|
],
|
|
"knots": [
|
|
0.0,
|
|
0.0,
|
|
0.0,
|
|
0.0,
|
|
0.25,
|
|
0.6,
|
|
1.0,
|
|
1.0,
|
|
1.0,
|
|
1.0
|
|
],
|
|
"start": [
|
|
0.0,
|
|
0.0,
|
|
20.0
|
|
],
|
|
"edges": [
|
|
{
|
|
"type": "line",
|
|
"start": [
|
|
0.0,
|
|
0.0,
|
|
20.0
|
|
],
|
|
"end": [
|
|
40.0,
|
|
0.0,
|
|
20.0
|
|
],
|
|
"point": [
|
|
20.0,
|
|
0.0,
|
|
20.0
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|