Files
cadcraft/crates/engine/tests/dim_explode_text.rs
T
Valentin KleinandClaude Opus 5.5 8db51c2766 Exploded dimension text and DXF dimension blocks match the drawn text (fixes #367) (#369)
EXPLODE and the DXF *D block took the text height from the bare style's
DIMTXT × DIMSCALE, ignoring the dimension's overrides (SETVAR DIM*, DIMOVERRIDE),
a fixed-height text style and the DIMSCALE 0 fallback (text ~1e-10 high), and
EXPLODE always wrote rotation 0, so aligned text turned horizontal. Both now
use the geometry the renderer draws (dimension_in): its text height, angle and
the overridden text style; EXPLODE adds no MTEXT for suppressed text.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 18:09:15 -04:00

46 lines
2.3 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! EXPLODE turns a dimension's text into MTEXT that looks like the text that was drawn: the
//! dimension's overrides and DIMSCALE (0 = the drawing's) set its height, and aligned text keeps
//! its angle (issue #367).
use cadcraft_engine::Session;
use cadcraft_engine::doc::{EntityKind, Handle, MText};
use serde_json::{Value, json};
/// Draw a vertical dimension after `setup`, explode it, and return (drawn text height, drawn
/// text angle, the exploded MTEXT).
fn explode_vertical(setup: &[(&str, Value)]) -> (f64, f64, MText) {
let mut s = Session::new();
for (cmd, p) in setup {
s.execute(cmd, p).unwrap();
}
let r = s.execute("dimlinear", &json!({"p1": [0, 0], "p2": [0, 30], "at": [5, 15]})).unwrap();
let h = Handle::parse_hex(r["handle"].as_str().unwrap()).unwrap();
let drawn = match &s.doc().unwrap().entity(h).unwrap().kind {
EntityKind::Dimension(dm) => cadcraft_engine::render::dimension_in(s.doc().unwrap(), dm),
k => panic!("not a dimension: {k:?}"),
};
s.execute("explode", &json!({"handles": [h.hex()]})).unwrap();
let mut texts = s.doc().unwrap().model.iter().filter_map(|e| match &e.kind {
EntityKind::MText(m) => Some(m.clone()),
_ => None,
});
let m = texts.next().expect("the exploded dimension has its text");
assert!(texts.next().is_none());
(drawn.text_height, drawn.text_angle, m)
}
#[test]
fn exploded_dimension_text_matches_the_drawn_text() {
let near = |a: f64, b: f64| (a - b).abs() < 1e-9;
// SETVAR DIMSCALE is an override on the dimension: 10 × DIMTXT 0.18.
let (h, _, m) = explode_vertical(&[("setvar", json!({"name": "DIMSCALE", "value": 10}))]);
assert!(near(h, 1.8) && near(m.height, h), "drawn {h}, exploded {}", m.height);
// A style DIMSCALE of 0 draws at scale 1 in model space; the text must not shrink to ~0.
let (h, _, m) = explode_vertical(&[("dimstyle", json!({"name": "Standard", "DIMSCALE": 0}))]);
assert!(near(h, 0.18) && near(m.height, h), "drawn {h}, exploded {}", m.height);
// Aligned text (DIMTIH off) on a vertical dimension is drawn at 90° and stays there.
let (_, a, m) = explode_vertical(&[("dimstyle", json!({"name": "Standard", "DIMTIH": 0}))]);
assert!(near(a, std::f64::consts::FRAC_PI_2) && near(m.rotation, a), "drawn {a}, exploded {}", m.rotation);
assert_eq!(m.contents, "30.0000");
}