Constraint glyphs: one per constrained entity, beside it, readable
Fixes #43 - Two-entity constraints (parallel, tangent, equal, ...) get a glyph on each entity. - Glyphs sit beside their entity (offset along its screen normal), step along it when crowded, with a faint leader when pushed away; 15 px boxes with the toolbar's constraint icons (H/V stay letters), coloured from the theme's glyph tokens in both themes. - Hovering a glyph lights both of its glyphs and its curves/points and names the constraint. - Removes the old duplicate glyph drawer in viewport.rs (it drew a second, green set). - Scenario expect key `glyphs` ({constraint id: count}, none overlapping) and the scenario constraint_glyphs_both_entities. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RjGw4gA5ZvKrU8MQP6sBgT
This commit is contained in:
1 parent
eac7306d59
commit
a5729f1f97
4 files changed
+170
-85
No files matched your search
@@ -518,7 +518,7 @@ fn approx(got: f64, want: &Value, what: &str) -> Result<(), String> {
|
||||
/// Checks: `bodies` (count), `volume` / `area` (total, number or [value, rel tol]), `faces`,
|
||||
/// `features` (count), `errors` (timeline features in error, default 0), `dialog` (null: none
|
||||
/// open, or a word its kind must contain), `tool` (null or command id), `sketching` (bool),
|
||||
/// `selection` (count), `param` ({name: value}), `sketch_status` (solved|…), `dof`, `query`
|
||||
/// `selection` (count), `glyphs` ({constraint id: count}, none overlapping), `param` ({name: value}), `sketch_status` (solved|…), `dof`, `query`
|
||||
/// ({command, params?, path, value}: a command's result).
|
||||
pub fn check(h: &mut Harness, e: &Value) -> Result<(), String> {
|
||||
let doc = h.call("document.inspect", json!({"measure": true}))["result"].clone();
|
||||
@@ -656,6 +656,21 @@ pub fn check(h: &mut Harness, e: &Value) -> Result<(), String> {
|
||||
return Err(format!("tool: got {}, want {v}", ui["tool"]));
|
||||
}
|
||||
}
|
||||
"glyphs" => {
|
||||
// {constraint id: glyphs drawn for it}; glyphs never overlap one another.
|
||||
let g = crate::sketch_tools::glyph_positions();
|
||||
for (id, n) in v.as_object().ok_or("glyphs takes {constraint id: count}")? {
|
||||
let got = g.iter().filter(|(x, _)| x == id).count();
|
||||
if n.as_u64() != Some(got as u64) {
|
||||
return Err(format!("glyphs of {id}: got {got}, want {n} (drawn: {g:?})"));
|
||||
}
|
||||
}
|
||||
for (i, (a, p)) in g.iter().enumerate() {
|
||||
if let Some((b, _)) = g.iter().skip(i + 1).find(|(_, q)| q.distance(*p) < 14.0) {
|
||||
return Err(format!("glyphs of {a} and {b} overlap at {p:?}"));
|
||||
}
|
||||
}
|
||||
}
|
||||
"sketching" => {
|
||||
if doc["active_sketch"].is_null() == v.as_bool().unwrap_or(false) {
|
||||
return Err(format!("sketching: want {v}, active sketch {}", doc["active_sketch"]));
|
||||
|
||||
Reference in new issue
Block a user