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
145 lines
2.7 KiB
JSON
145 lines
2.7 KiB
JSON
{
|
|
"bodies": [
|
|
{
|
|
"area_mm2": 4078.7680390666596,
|
|
"bbox": {
|
|
"max": [
|
|
40.0,
|
|
30.000000000000014,
|
|
12.000000000000002
|
|
],
|
|
"min": [
|
|
0.0,
|
|
0.0,
|
|
0.0
|
|
]
|
|
},
|
|
"center_of_mass": [
|
|
19.25890231218174,
|
|
15.000000010054242,
|
|
5.04117761026949
|
|
],
|
|
"density_g_cm3": 1.29,
|
|
"edges": 30,
|
|
"face_types": {
|
|
"cylinder": 1,
|
|
"plane": 11
|
|
},
|
|
"faces": 12,
|
|
"kernel": {
|
|
"edges": 30,
|
|
"faces": 12,
|
|
"shells": 1,
|
|
"vertices": 20
|
|
},
|
|
"mass_g": 14.435720327850033,
|
|
"material": "Default",
|
|
"name": "Body1",
|
|
"vertices": 20,
|
|
"volume_mm3": 11190.480874302351
|
|
}
|
|
],
|
|
"body_count": 1,
|
|
"params": [],
|
|
"sketches": [
|
|
{
|
|
"curves": 4,
|
|
"dof": 2,
|
|
"id": 1,
|
|
"name": "Base",
|
|
"profiles": 1,
|
|
"status": "solved",
|
|
"visible": false
|
|
},
|
|
{
|
|
"curves": 4,
|
|
"dof": 4,
|
|
"id": 3,
|
|
"name": "SlotSketch",
|
|
"profiles": 1,
|
|
"status": "solved",
|
|
"visible": false
|
|
}
|
|
],
|
|
"timeline": [
|
|
{
|
|
"error": null,
|
|
"id": 1,
|
|
"ms": 0.09895799999999999,
|
|
"name": "Base",
|
|
"rolled_back": false,
|
|
"suppressed": false,
|
|
"type": "Sketch",
|
|
"warning": null
|
|
},
|
|
{
|
|
"error": null,
|
|
"id": 2,
|
|
"ms": 20.768292000000002,
|
|
"name": "Block",
|
|
"rolled_back": false,
|
|
"suppressed": false,
|
|
"type": "ExtrudeFeature",
|
|
"warning": null
|
|
},
|
|
{
|
|
"error": null,
|
|
"id": 3,
|
|
"ms": 0.057,
|
|
"name": "SlotSketch",
|
|
"rolled_back": false,
|
|
"suppressed": false,
|
|
"type": "Sketch",
|
|
"warning": null
|
|
},
|
|
{
|
|
"error": null,
|
|
"id": 4,
|
|
"ms": 136.28875,
|
|
"name": "Slot",
|
|
"rolled_back": false,
|
|
"suppressed": false,
|
|
"type": "ExtrudeFeature",
|
|
"warning": null
|
|
},
|
|
{
|
|
"error": null,
|
|
"id": 5,
|
|
"ms": 153.58625,
|
|
"name": "Round",
|
|
"rolled_back": false,
|
|
"suppressed": false,
|
|
"type": "FilletFeature",
|
|
"warning": null
|
|
},
|
|
{
|
|
"error": null,
|
|
"id": 6,
|
|
"ms": 169.174375,
|
|
"name": "Bevel",
|
|
"rolled_back": false,
|
|
"suppressed": false,
|
|
"type": "ChamferFeature",
|
|
"warning": null
|
|
},
|
|
{
|
|
"error": null,
|
|
"id": 7,
|
|
"ms": 47.772166,
|
|
"name": "Raise",
|
|
"rolled_back": false,
|
|
"suppressed": false,
|
|
"type": "OffsetFacesFeature",
|
|
"warning": null
|
|
}
|
|
],
|
|
"total": {
|
|
"area_mm2": 4078.7680390666596,
|
|
"edges": 30,
|
|
"faces": 12,
|
|
"mass_g": 14.435720327850033,
|
|
"vertices": 20,
|
|
"volume_mm3": 11190.480874302351
|
|
}
|
|
}
|