diff --git a/crates/engine/src/cmd/annotate.rs b/crates/engine/src/cmd/annotate.rs index 7fa79537..b1c732c2 100644 --- a/crates/engine/src/cmd/annotate.rs +++ b/crates/engine/src/cmd/annotate.rs @@ -427,13 +427,13 @@ fn mleader_kind(s: &Session, pts: &[Vec2], text: &str, landing: bool) -> Option< let d = s.doc().ok()?; 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(); - // An annotative style's sizes are paper sizes: the annotation scale applies when drawn. - let k = if st.annotative { 1.0 } else { d.header.f64("DIMSCALE", 1.0) }; - let th = st.text_height * k; + // The style's sizes are the drawn sizes: a multileader style has no scale of its own and + // DIMSCALE (a dimension-style setting) does not apply, as in AutoCAD. + 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 attach = if dir > 0.0 { 4 } else { 6 }; - let dogleg = if landing { st.dogleg * k } else { 0.0 }; - let tpos = *landing_pt + Vec2::new((dogleg + st.landing_gap * k) * dir, 0.0); + let dogleg = if landing { st.dogleg } else { 0.0 }; + let tpos = *landing_pt + Vec2::new((dogleg + st.landing_gap) * dir, 0.0); Some(EntityKind::MLeader(MLeader { leaders: vec![arrow_pts.iter().map(|p| v3(*p)).collect()], landing: v3(*landing_pt), @@ -451,7 +451,7 @@ fn mleader_kind(s: &Session, pts: &[Vec2], text: &str, landing: bool) -> Option< columns: None, }), style: st.name.clone(), - arrow_size: st.arrow_size * k, + arrow_size: st.arrow_size, spline: false, block: None, })) diff --git a/crates/engine/tests/mleader_content.rs b/crates/engine/tests/mleader_content.rs index 6187504e..c8b9a699 100644 --- a/crates/engine/tests/mleader_content.rs +++ b/crates/engine/tests/mleader_content.rs @@ -121,3 +121,20 @@ fn json_form_takes_leader_type_and_block() { 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); +}