Ellipse dimensions: major radius (type major: centre to axis end) and minor radius (a radius dimension on the ellipse)
Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01AS5Tn3xieewUSg3uxrMVdL
This commit is contained in:
1 parent
59685a9180
commit
94a0cdef77
4 files changed
+36
-2
No files matched your search
@@ -1060,6 +1060,18 @@ fn dimension(s: &mut Session, p: &Value) -> Result<Value> {
|
||||
let len = arc_len(sk, c).ok_or_else(|| bad(cmd, "arc length needs an arc"))?;
|
||||
(ConstraintKind::ArcLength { c, value: len }, len)
|
||||
}
|
||||
((None, Some(c)), None) if matches!(sk.curves.get(c).map(|x| &x.kind), Some(CurveKind::Ellipse { .. })) => {
|
||||
// Ellipse: the major radius is the centre–axis-end distance, the minor its own.
|
||||
let Some(CurveKind::Ellipse { c: cp, m, r }) = sk.curves.get(c).map(|x| x.kind.clone()) else {
|
||||
return Err(bad(cmd, "ellipse"));
|
||||
};
|
||||
if ty == "major" {
|
||||
let d = sk.point(cp).zip(sk.point(m)).map(|(a, b)| a.dist(b)).unwrap_or(0.0);
|
||||
(ConstraintKind::Distance { p: cp, q: m, value: d }, d)
|
||||
} else {
|
||||
(ConstraintKind::Radius { c, value: r }, r)
|
||||
}
|
||||
}
|
||||
((None, Some(c)), None) => {
|
||||
let r = sk.radius(c).ok_or_else(|| bad(cmd, "cannot dimension that curve"))?;
|
||||
let diameter = ty == "diameter" || (ty != "radius" && is_circle(c));
|
||||
|
||||
@@ -382,3 +382,13 @@ fn trim_and_break_free_form_curves_exactly() {
|
||||
assert!(d < 0.05, "{q:?} {d}");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ellipse_radii_dimensions() {
|
||||
let mut s = new_sketch();
|
||||
let e = ids(&run(&mut s, "CircleElipse", json!({"center": [0, 0], "major": [10, 0], "minor_radius": 4}))["curves"])[0].clone();
|
||||
run(&mut s, "SketchDimension", json!({"entities": [e], "type": "major", "value": 12}));
|
||||
run(&mut s, "SketchDimension", json!({"entities": [e], "value": 5}));
|
||||
let a = profiles(&s)[0];
|
||||
assert!((a - std::f64::consts::PI * 60.0).abs() < 1e-6, "{a}");
|
||||
}
|
||||
Reference in new issue
Block a user