mirror of
https://github.com/storytold/cadcraft.git
synced 2026-10-24 10:56:51 -06:00
Multileader sizes no longer multiplied by DIMSCALE (#1648)
This commit is contained in:
@@ -427,13 +427,13 @@ fn mleader_kind(s: &Session, pts: &[Vec2], text: &str, landing: bool) -> Option<
|
|||||||
let d = s.doc().ok()?;
|
let d = s.doc().ok()?;
|
||||||
let cur = d.header.str("CMLEADERSTYLE", "Standard");
|
let cur = d.header.str("CMLEADERSTYLE", "Standard");
|
||||||
let st = d.mleader_styles.iter().find(|m| m.name.eq_ignore_ascii_case(&cur)).or(d.mleader_styles.first()).cloned().unwrap_or_default();
|
let st = d.mleader_styles.iter().find(|m| m.name.eq_ignore_ascii_case(&cur)).or(d.mleader_styles.first()).cloned().unwrap_or_default();
|
||||||
// An annotative style's sizes are paper sizes: the annotation scale applies when drawn.
|
// The style's sizes are the drawn sizes: a multileader style has no scale of its own and
|
||||||
let k = if st.annotative { 1.0 } else { d.header.f64("DIMSCALE", 1.0) };
|
// DIMSCALE (a dimension-style setting) does not apply, as in AutoCAD.
|
||||||
let th = st.text_height * k;
|
let th = st.text_height;
|
||||||
let dir = if arrow_pts.first().is_some_and(|a| a.x > landing_pt.x) { -1.0 } else { 1.0 };
|
let dir = if arrow_pts.first().is_some_and(|a| a.x > landing_pt.x) { -1.0 } else { 1.0 };
|
||||||
let attach = if dir > 0.0 { 4 } else { 6 };
|
let attach = if dir > 0.0 { 4 } else { 6 };
|
||||||
let dogleg = if landing { st.dogleg * k } else { 0.0 };
|
let dogleg = if landing { st.dogleg } else { 0.0 };
|
||||||
let tpos = *landing_pt + Vec2::new((dogleg + st.landing_gap * k) * dir, 0.0);
|
let tpos = *landing_pt + Vec2::new((dogleg + st.landing_gap) * dir, 0.0);
|
||||||
Some(EntityKind::MLeader(MLeader {
|
Some(EntityKind::MLeader(MLeader {
|
||||||
leaders: vec![arrow_pts.iter().map(|p| v3(*p)).collect()],
|
leaders: vec![arrow_pts.iter().map(|p| v3(*p)).collect()],
|
||||||
landing: v3(*landing_pt),
|
landing: v3(*landing_pt),
|
||||||
@@ -451,7 +451,7 @@ fn mleader_kind(s: &Session, pts: &[Vec2], text: &str, landing: bool) -> Option<
|
|||||||
columns: None,
|
columns: None,
|
||||||
}),
|
}),
|
||||||
style: st.name.clone(),
|
style: st.name.clone(),
|
||||||
arrow_size: st.arrow_size * k,
|
arrow_size: st.arrow_size,
|
||||||
spline: false,
|
spline: false,
|
||||||
block: None,
|
block: None,
|
||||||
}))
|
}))
|
||||||
|
|||||||
@@ -121,3 +121,20 @@ fn json_form_takes_leader_type_and_block() {
|
|||||||
assert!(s.execute("mleader", &bad).is_err(), "{bad}");
|
assert!(s.execute("mleader", &bad).is_err(), "{bad}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// DIMSCALE belongs to dimension styles: a multileader keeps its style's text height, arrowhead
|
||||||
|
/// and dogleg whatever DIMSCALE is (#1648).
|
||||||
|
#[test]
|
||||||
|
fn mleader_sizes_ignore_dimscale() {
|
||||||
|
let mut s = Session::new();
|
||||||
|
s.execute("mleaderstyle", &json!({"name": "M5", "textHeight": 5, "arrowSize": 5, "current": true})).unwrap();
|
||||||
|
s.execute("setvar", &json!({"name": "DIMSCALE", "value": 20})).unwrap();
|
||||||
|
s.execute("mleader", &json!({"points": [[0, 0], [30, 20]], "text": "CADCRAFT"})).unwrap();
|
||||||
|
let m = last_mleader(&s);
|
||||||
|
assert_eq!(m.arrow_size, 5.0);
|
||||||
|
let st = s.doc().unwrap().mleader_styles.iter().find(|x| x.name == "M5").unwrap().clone();
|
||||||
|
assert_eq!(m.dogleg, st.dogleg);
|
||||||
|
let t = m.text.unwrap();
|
||||||
|
assert_eq!(t.height, 5.0);
|
||||||
|
assert!((t.insert.x - (30.0 + st.dogleg + st.landing_gap)).abs() < 1e-9, "{}", t.insert.x);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user