Command ids are SolveCraft's own: 173 ids that were another product's internal command ids become dotted, lower-case ids (<area>.<thing>[.<variant>]: solid.extrude, sketch.rectangle.two_point, sheet.flange, joint.drive, ...), in the registry, toolbar, dialogs, shortcuts, palette, control channel, MCP, examples, scenarios and docs
The old ids live only in crates/engine/src/legacy_ids.rs (the legacy migration table): find_command maps them, so old scripts, recipes and control calls keep working, and saved shortcuts, recent and pinned commands are migrated on load (designs store no command ids). Parity maps the observed catalog ids to ours through xtask/data/fusion-ids.tsv. The agent rule now reads: our own dotted id, never another product's. Cargo.toml's repository points at github.com/bherbruck/solvecraft. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
740360d7c3
commit
d10312b7fd
158 files changed
+3611
-3205
No files matched your search
@@ -44,53 +44,53 @@ fn random_sketch_editing_never_breaks() {
|
||||
for seed in 1..=2u64 {
|
||||
let mut r = Rng(0x9E37_79B9_7F4A_7C15 ^ seed);
|
||||
let mut s = Session::default();
|
||||
let _ = s.execute("PrimitiveBox", &json!({"length": 30, "width": 20, "height": 10}));
|
||||
let _ = s.execute("SketchCreate", &json!({"plane": {"face": [15, 10, 10]}}));
|
||||
let _ = s.execute("solid.box", &json!({"length": 30, "width": 20, "height": 10}));
|
||||
let _ = s.execute("sketch.create", &json!({"plane": {"face": [15, 10, 10]}}));
|
||||
for step in 0..120 {
|
||||
let (curves, points, cons) = entities(&s);
|
||||
let c = |r: &mut Rng| r.pick(&curves).cloned().unwrap_or_default();
|
||||
let p = |r: &mut Rng| r.pick(&points).cloned().unwrap_or_default();
|
||||
let (cmd, params) = match r.next() % 34 {
|
||||
0 => ("DrawPolyline", json!({"points": [r.pt(), r.pt(), r.pt()], "infer": true})),
|
||||
1 => ("CircleCenterRadius", json!({"center": r.pt(), "radius": r.f(0.5, 20.0)})),
|
||||
2 => ("ArcCenterTwoPoint", json!({"center": r.pt(), "start": r.pt(), "end": r.pt()})),
|
||||
3 => ("ShapeRectangleTwoPoint", json!({"p0": r.pt(), "p1": r.pt()})),
|
||||
4 => ("DrawSpline", json!({"points": [r.pt(), r.pt(), r.pt(), r.pt()]})),
|
||||
5 => ("CircleElipse", json!({"center": r.pt(), "major": r.pt(), "minor_radius": r.f(0.5, 10.0)})),
|
||||
6 => ("ConicCurveCmd", json!({"start": r.pt(), "end": r.pt(), "apex": r.pt(), "rho": r.f(0.1, 0.9)})),
|
||||
7 => ("TrimSketchCmd", json!({"curve": c(&mut r), "at": r.pt()})),
|
||||
8 => ("ExtendSketchCmd", json!({"curve": c(&mut r), "at": r.pt()})),
|
||||
9 => ("BreakSketchCmd", json!({"curve": c(&mut r), "at": r.pt()})),
|
||||
10 => ("FilletSketchCmd", json!({"point": p(&mut r), "radius": r.f(0.1, 5.0)})),
|
||||
11 => ("ChamferSketchEqualDistance", json!({"point": p(&mut r), "distance": r.f(0.1, 5.0)})),
|
||||
12 => ("Offset", json!({"curves": [c(&mut r)], "distance": r.f(-5.0, 5.0), "side": r.pt()})),
|
||||
13 => ("MirrorSketchCommand", json!({"entities": [c(&mut r)], "line": c(&mut r)})),
|
||||
14 => ("CircularSketchPatternCommand", json!({"entities": [c(&mut r)], "center": r.pt(), "count": 3})),
|
||||
15 => ("ConstraintCoincident", json!({"a": p(&mut r), "b": p(&mut r)})),
|
||||
16 => ("ConstraintTangent", json!({"a": c(&mut r), "b": c(&mut r)})),
|
||||
17 => ("ConstraintParallel", json!({"a": c(&mut r), "b": c(&mut r)})),
|
||||
18 => ("ConstraintSmooth", json!({"a": c(&mut r), "b": c(&mut r)})),
|
||||
19 => ("SketchDimension", json!({"entities": [c(&mut r)]})),
|
||||
20 => ("SketchDimension", json!({"entities": [p(&mut r), p(&mut r)], "driven": r.next().is_multiple_of(2)})),
|
||||
0 => ("sketch.line", json!({"points": [r.pt(), r.pt(), r.pt()], "infer": true})),
|
||||
1 => ("sketch.circle.center", json!({"center": r.pt(), "radius": r.f(0.5, 20.0)})),
|
||||
2 => ("sketch.arc.center_point", json!({"center": r.pt(), "start": r.pt(), "end": r.pt()})),
|
||||
3 => ("sketch.rectangle.two_point", json!({"p0": r.pt(), "p1": r.pt()})),
|
||||
4 => ("sketch.spline.fit_point", json!({"points": [r.pt(), r.pt(), r.pt(), r.pt()]})),
|
||||
5 => ("sketch.ellipse", json!({"center": r.pt(), "major": r.pt(), "minor_radius": r.f(0.5, 10.0)})),
|
||||
6 => ("sketch.conic", json!({"start": r.pt(), "end": r.pt(), "apex": r.pt(), "rho": r.f(0.1, 0.9)})),
|
||||
7 => ("sketch.trim", json!({"curve": c(&mut r), "at": r.pt()})),
|
||||
8 => ("sketch.extend", json!({"curve": c(&mut r), "at": r.pt()})),
|
||||
9 => ("sketch.break", json!({"curve": c(&mut r), "at": r.pt()})),
|
||||
10 => ("sketch.fillet", json!({"point": p(&mut r), "radius": r.f(0.1, 5.0)})),
|
||||
11 => ("sketch.chamfer.equal_distance", json!({"point": p(&mut r), "distance": r.f(0.1, 5.0)})),
|
||||
12 => ("sketch.offset", json!({"curves": [c(&mut r)], "distance": r.f(-5.0, 5.0), "side": r.pt()})),
|
||||
13 => ("sketch.mirror", json!({"entities": [c(&mut r)], "line": c(&mut r)})),
|
||||
14 => ("sketch.pattern.circular", json!({"entities": [c(&mut r)], "center": r.pt(), "count": 3})),
|
||||
15 => ("sketch.constraint.coincident", json!({"a": p(&mut r), "b": p(&mut r)})),
|
||||
16 => ("sketch.constraint.tangent", json!({"a": c(&mut r), "b": c(&mut r)})),
|
||||
17 => ("sketch.constraint.parallel", json!({"a": c(&mut r), "b": c(&mut r)})),
|
||||
18 => ("sketch.constraint.curvature", json!({"a": c(&mut r), "b": c(&mut r)})),
|
||||
19 => ("sketch.dimension", json!({"entities": [c(&mut r)]})),
|
||||
20 => ("sketch.dimension", json!({"entities": [p(&mut r), p(&mut r)], "driven": r.next().is_multiple_of(2)})),
|
||||
21 => ("sketch.delete", json!({"entities": [r.pick(&cons).cloned().unwrap_or_else(|| c(&mut r))]})),
|
||||
22 => ("sketch.move_point", json!({"point": p(&mut r), "to": r.pt()})),
|
||||
23 => ("ProjectNewCmd", json!({"refs": [{"edge": [r.f(0.0, 30.0), 0.0, 10.0]}]})),
|
||||
23 => ("sketch.project", json!({"refs": [{"edge": [r.f(0.0, 30.0), 0.0, 10.0]}]})),
|
||||
24 => ("sketch.break_link", json!({"entities": [c(&mut r)]})),
|
||||
25 => ("SketchConstrainer", json!({"entities": [c(&mut r), c(&mut r)]})),
|
||||
26 => ("SketchAutoConstraintAndDimCmd", json!({})),
|
||||
27 => ("MTextCmd", json!({"text": "Ab", "at": r.pt(), "height": r.f(1.0, 8.0)})),
|
||||
25 => ("sketch.constrainer", json!({"entities": [c(&mut r), c(&mut r)]})),
|
||||
26 => ("sketch.auto_constrain", json!({})),
|
||||
27 => ("sketch.text", json!({"text": "Ab", "at": r.pt(), "height": r.f(1.0, 8.0)})),
|
||||
28 => ("sketch.toggle_driven", json!({"constraint": r.pick(&cons).cloned().unwrap_or_default()})),
|
||||
29 => ("ArcTangent", json!({"start": format!("{}.end", c(&mut r)), "end": r.pt()})),
|
||||
30 => ("SketchScaleCmd", json!({"entities": [c(&mut r)], "base": r.pt(), "factor": r.f(0.5, 2.0)})),
|
||||
31 => ("UndoCommand", json!({})),
|
||||
32 => ("ShapeArcSlotThreePoint", json!({"start": r.pt(), "through": r.pt(), "end": r.pt(), "width": r.f(0.5, 4.0)})),
|
||||
_ => ("RedoCommand", json!({})),
|
||||
29 => ("sketch.arc.tangent", json!({"start": format!("{}.end", c(&mut r)), "end": r.pt()})),
|
||||
30 => ("sketch.scale", json!({"entities": [c(&mut r)], "base": r.pt(), "factor": r.f(0.5, 2.0)})),
|
||||
31 => ("edit.undo", json!({})),
|
||||
32 => ("sketch.slot.arc_three_point", json!({"start": r.pt(), "through": r.pt(), "end": r.pt(), "width": r.f(0.5, 4.0)})),
|
||||
_ => ("edit.redo", json!({})),
|
||||
};
|
||||
if let Err(EngineError::Internal(id, msg)) = s.execute(cmd, ¶ms) {
|
||||
panic!("seed {seed} step {step}: {id} {params}: {msg}");
|
||||
}
|
||||
if s.active_sketch.is_none() {
|
||||
let _ = s.execute("SketchCreate", &json!({"plane": "XY"}));
|
||||
let _ = s.execute("sketch.create", &json!({"plane": "XY"}));
|
||||
}
|
||||
}
|
||||
// The design round-trips.
|
||||
|
||||
Reference in new issue
Block a user