69 lines
2.7 KiB
Rust
69 lines
2.7 KiB
Rust
|
|
// Regression for #385: text and dimension text must reach the PDF / print
|
||
|
|
// export. From v0.8.2 text renders on-screen only as GPU SDF glyph quads
|
||
|
|
// (`WireModel::text_verts`); the CPU PDF exporter used to draw only wire
|
||
|
|
// stroke `points`, so all text — standalone TEXT/MTEXT and dimension text —
|
||
|
|
// vanished from exported PDFs (present in v0.7.6). This drives the real
|
||
|
|
// entity -> scene.entity_wires() -> export_pdf path and asserts text is
|
||
|
|
// carried to the exporter and lands in the file.
|
||
|
|
use acadrust::entities::{Dimension, DimensionLinear, Text};
|
||
|
|
use acadrust::types::Vector3;
|
||
|
|
use acadrust::EntityType;
|
||
|
|
use OpenCADStudio::io::pdf_export::export_pdf;
|
||
|
|
use OpenCADStudio::scene::Scene;
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn text_and_dim_reach_pdf_export() {
|
||
|
|
let mut scene = Scene::new();
|
||
|
|
|
||
|
|
// A standalone TEXT entity.
|
||
|
|
let t = Text::with_value("HELLO", Vector3::new(10.0, 10.0, 0.0)).with_height(5.0);
|
||
|
|
scene.add_entity(EntityType::Text(t));
|
||
|
|
|
||
|
|
// A linear dimension — its measurement value is synthesized as SDF text
|
||
|
|
// too, so it exercises the dimension-text path the reporters called out.
|
||
|
|
let dim = DimensionLinear::new(
|
||
|
|
Vector3::new(0.0, 0.0, 0.0),
|
||
|
|
Vector3::new(40.0, 0.0, 0.0),
|
||
|
|
);
|
||
|
|
scene.add_entity(EntityType::Dimension(Dimension::Linear(dim)));
|
||
|
|
|
||
|
|
let wires = scene.entity_wires();
|
||
|
|
|
||
|
|
// The regression symptom was that text produced no exportable geometry.
|
||
|
|
// It must now ride the export wire set as SDF glyph quads.
|
||
|
|
let text_wires = wires.iter().filter(|w| !w.text_verts.is_empty()).count();
|
||
|
|
assert!(
|
||
|
|
text_wires > 0,
|
||
|
|
"no text_verts on the export wire set — text/dim text would be missing from the PDF"
|
||
|
|
);
|
||
|
|
|
||
|
|
// End-to-end: exporting with the text present must produce a valid PDF that
|
||
|
|
// is larger than the same wire set with the text stripped — i.e. the glyph
|
||
|
|
// geometry actually reaches the file.
|
||
|
|
let dir = std::env::temp_dir();
|
||
|
|
let p_text = dir.join("ocs_385_with_text.pdf");
|
||
|
|
export_pdf(&wires, &[], &[], 210.0, 297.0, 0.0, 0.0, 0, 1.0, None, &p_text, None)
|
||
|
|
.expect("export with text");
|
||
|
|
let with_text = std::fs::read(&p_text).expect("read pdf");
|
||
|
|
assert!(with_text.starts_with(b"%PDF"), "not a PDF");
|
||
|
|
|
||
|
|
let stripped: Vec<_> = wires
|
||
|
|
.iter()
|
||
|
|
.cloned()
|
||
|
|
.map(|mut w| {
|
||
|
|
w.text_verts.clear();
|
||
|
|
w
|
||
|
|
})
|
||
|
|
.collect();
|
||
|
|
let p_bare = dir.join("ocs_385_no_text.pdf");
|
||
|
|
export_pdf(&stripped, &[], &[], 210.0, 297.0, 0.0, 0.0, 0, 1.0, None, &p_bare, None)
|
||
|
|
.expect("export without text");
|
||
|
|
let no_text = std::fs::read(&p_bare).expect("read pdf");
|
||
|
|
|
||
|
|
assert!(
|
||
|
|
with_text.len() > no_text.len(),
|
||
|
|
"text added no content to the PDF: {} !> {}",
|
||
|
|
with_text.len(),
|
||
|
|
no_text.len()
|
||
|
|
);
|
||
|
|
}
|