Why: every reference a user makes to a face or edge (fillet and chamfer edges, sketches on faces, shell/draft/offset faces, joints, appearances) is stored as a name and found again after any upstream edit. Those names were re-derived by sampling points of each face and voting, and pieces of a split face were numbered by where their centres lay. After an upstream edit that splits, merges, mirrors or shrinks a face, a fillet or sketch could silently re-attach to the wrong face, and nothing told the user. The kernel now reports exact history for its operations, so names follow it and fail loudly instead of guessing. - crates/doc/src/lineage.rs: a feature's kernel histories composed into one lineage over nameable operands (bodies before the feature, moved copies, shell cavities, tools named by role: sketch curve, cap, box side, imported face). Instrumented: extrude/revolve/sweep/loft tools, join/cut/intersect, lumps after a cut, fillet/chamfer, shell, draft, split face/body, pattern/mirror (bodies and features), combine, boundary fill, move/scale, offset/delete face, thread, import. - crates/doc/src/history_names.rs: names from lineage; split pieces told apart by the faces only they touch (F2:top#[F2:side:l4,F4:side:l4]), merged faces answer to every name (aliases), lump bodies ordered by their faces' names instead of shell order. - crates/doc/src/name_lookup.rs, piece_names.rs: references resolve by exact name, alias or bounding faces, else nearest piece with a warning; names worked out from geometry (operations without history) are reported when only geometry decided. - Format 14: names stored by older formats get a legacy mark and are found as the build that saved them found them (some geometric names name a face history names differently: a tube's outer wall was named after its inner circle). New corpus file saved by 9a979cf. - kernel: Body::lumps carries each piece's history over the whole. - Adversarial tests: split, merge, mirrored twins, shrink to a sliver, moving cut with body pieces, history-less bodies, certified sketch. - docs/book/src/dev/naming.md describes the real mechanism and why. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J53sR6gEaVt56soFDpTck8
373 lines
6.7 KiB
Plaintext
373 lines
6.7 KiB
Plaintext
{
|
|
"format": "solvecraft/13",
|
|
"name": "Untitled",
|
|
"units": "mm",
|
|
"params": [],
|
|
"features": [
|
|
{
|
|
"id": 1,
|
|
"name": "Base",
|
|
"suppressed": false,
|
|
"type": "sketch",
|
|
"plane": {
|
|
"type": "origin",
|
|
"name": "XY"
|
|
},
|
|
"sketch": {
|
|
"points": [
|
|
{
|
|
"id": "origin",
|
|
"pos": [
|
|
0.0,
|
|
0.0
|
|
],
|
|
"fixed": true
|
|
},
|
|
{
|
|
"id": "p1",
|
|
"pos": [
|
|
0.0,
|
|
0.0
|
|
],
|
|
"fixed": false
|
|
},
|
|
{
|
|
"id": "p2",
|
|
"pos": [
|
|
40.0,
|
|
0.0
|
|
],
|
|
"fixed": false
|
|
},
|
|
{
|
|
"id": "p3",
|
|
"pos": [
|
|
40.0,
|
|
30.0
|
|
],
|
|
"fixed": false
|
|
},
|
|
{
|
|
"id": "p4",
|
|
"pos": [
|
|
0.0,
|
|
30.0
|
|
],
|
|
"fixed": false
|
|
}
|
|
],
|
|
"curves": [
|
|
{
|
|
"id": "l1",
|
|
"type": "line",
|
|
"a": 1,
|
|
"b": 2,
|
|
"construction": false
|
|
},
|
|
{
|
|
"id": "l2",
|
|
"type": "line",
|
|
"a": 2,
|
|
"b": 3,
|
|
"construction": false
|
|
},
|
|
{
|
|
"id": "l3",
|
|
"type": "line",
|
|
"a": 3,
|
|
"b": 4,
|
|
"construction": false
|
|
},
|
|
{
|
|
"id": "l4",
|
|
"type": "line",
|
|
"a": 4,
|
|
"b": 1,
|
|
"construction": false
|
|
}
|
|
],
|
|
"constraints": [
|
|
{
|
|
"id": "k1",
|
|
"type": "horizontal",
|
|
"l": 0
|
|
},
|
|
{
|
|
"id": "k2",
|
|
"type": "horizontal",
|
|
"l": 2
|
|
},
|
|
{
|
|
"id": "k3",
|
|
"type": "vertical",
|
|
"l": 1
|
|
},
|
|
{
|
|
"id": "k4",
|
|
"type": "vertical",
|
|
"l": 3
|
|
},
|
|
{
|
|
"id": "k5",
|
|
"type": "coincident",
|
|
"p": 0,
|
|
"q": 1
|
|
}
|
|
],
|
|
"counters": {
|
|
"k": 5,
|
|
"l": 4,
|
|
"p": 4
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": 2,
|
|
"name": "Block",
|
|
"suppressed": false,
|
|
"param_names": [
|
|
"d1"
|
|
],
|
|
"type": "extrude",
|
|
"sketch": 1,
|
|
"profiles": {
|
|
"type": "all"
|
|
},
|
|
"extent": {
|
|
"distance": "10",
|
|
"direction": "positive"
|
|
},
|
|
"operation": "new_body"
|
|
},
|
|
{
|
|
"id": 3,
|
|
"name": "SlotSketch",
|
|
"suppressed": false,
|
|
"type": "sketch",
|
|
"plane": {
|
|
"type": "origin",
|
|
"name": "XY"
|
|
},
|
|
"sketch": {
|
|
"points": [
|
|
{
|
|
"id": "origin",
|
|
"pos": [
|
|
0.0,
|
|
0.0
|
|
],
|
|
"fixed": true
|
|
},
|
|
{
|
|
"id": "p1",
|
|
"pos": [
|
|
15.0,
|
|
-5.0
|
|
],
|
|
"fixed": false
|
|
},
|
|
{
|
|
"id": "p2",
|
|
"pos": [
|
|
25.0,
|
|
-5.0
|
|
],
|
|
"fixed": false
|
|
},
|
|
{
|
|
"id": "p3",
|
|
"pos": [
|
|
25.0,
|
|
35.0
|
|
],
|
|
"fixed": false
|
|
},
|
|
{
|
|
"id": "p4",
|
|
"pos": [
|
|
15.0,
|
|
35.0
|
|
],
|
|
"fixed": false
|
|
}
|
|
],
|
|
"curves": [
|
|
{
|
|
"id": "l1",
|
|
"type": "line",
|
|
"a": 1,
|
|
"b": 2,
|
|
"construction": false
|
|
},
|
|
{
|
|
"id": "l2",
|
|
"type": "line",
|
|
"a": 2,
|
|
"b": 3,
|
|
"construction": false
|
|
},
|
|
{
|
|
"id": "l3",
|
|
"type": "line",
|
|
"a": 3,
|
|
"b": 4,
|
|
"construction": false
|
|
},
|
|
{
|
|
"id": "l4",
|
|
"type": "line",
|
|
"a": 4,
|
|
"b": 1,
|
|
"construction": false
|
|
}
|
|
],
|
|
"constraints": [
|
|
{
|
|
"id": "k1",
|
|
"type": "horizontal",
|
|
"l": 0
|
|
},
|
|
{
|
|
"id": "k2",
|
|
"type": "horizontal",
|
|
"l": 2
|
|
},
|
|
{
|
|
"id": "k3",
|
|
"type": "vertical",
|
|
"l": 1
|
|
},
|
|
{
|
|
"id": "k4",
|
|
"type": "vertical",
|
|
"l": 3
|
|
}
|
|
],
|
|
"counters": {
|
|
"k": 4,
|
|
"l": 4,
|
|
"p": 4
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": 4,
|
|
"name": "Slot",
|
|
"suppressed": false,
|
|
"param_names": [
|
|
"d2",
|
|
"d3"
|
|
],
|
|
"type": "extrude",
|
|
"sketch": 3,
|
|
"profiles": {
|
|
"type": "all"
|
|
},
|
|
"extent": {
|
|
"distance": "10",
|
|
"direction": "positive",
|
|
"start_offset": "5"
|
|
},
|
|
"operation": "cut"
|
|
},
|
|
{
|
|
"id": 5,
|
|
"name": "Round",
|
|
"suppressed": false,
|
|
"param_names": [
|
|
"d4"
|
|
],
|
|
"edge_refs": [
|
|
{
|
|
"dir": [
|
|
0.0,
|
|
-1.0,
|
|
0.0
|
|
],
|
|
"min": [
|
|
0.0,
|
|
0.0,
|
|
0.0
|
|
],
|
|
"max": [
|
|
40.0,
|
|
30.0,
|
|
10.0
|
|
]
|
|
}
|
|
],
|
|
"edge_names": [
|
|
"F2:side:l2|F2:top#2"
|
|
],
|
|
"type": "fillet",
|
|
"edges": [
|
|
[
|
|
40.0,
|
|
15.0,
|
|
10.0
|
|
]
|
|
],
|
|
"radius": "2"
|
|
},
|
|
{
|
|
"id": 6,
|
|
"name": "Bevel",
|
|
"suppressed": false,
|
|
"param_names": [
|
|
"d5"
|
|
],
|
|
"edge_refs": [
|
|
{
|
|
"dir": [
|
|
0.0,
|
|
1.0,
|
|
0.0
|
|
],
|
|
"min": [
|
|
0.0,
|
|
0.0,
|
|
0.0
|
|
],
|
|
"max": [
|
|
40.0,
|
|
30.000000000000007,
|
|
10.0
|
|
]
|
|
}
|
|
],
|
|
"edge_names": [
|
|
"F2:side:l4|F2:top#1"
|
|
],
|
|
"type": "chamfer",
|
|
"edges": [
|
|
[
|
|
0.0,
|
|
15.0,
|
|
10.0
|
|
]
|
|
],
|
|
"distance": "1.5"
|
|
},
|
|
{
|
|
"id": 7,
|
|
"name": "Raise",
|
|
"suppressed": false,
|
|
"param_names": [
|
|
"d6"
|
|
],
|
|
"face_names": [
|
|
"F2:top#1"
|
|
],
|
|
"type": "offset_face",
|
|
"faces": [
|
|
[
|
|
7.0,
|
|
15.0,
|
|
10.0
|
|
]
|
|
],
|
|
"distance": "2"
|
|
}
|
|
],
|
|
"next_id": 8
|
|
} |