Plot: refuse several layouts for PNG and SVG output (review on #2585)

An image holds one sheet, so layouts with more than one entry now report a clear error instead of pages:N with one render.
This commit is contained in:
SBaksa
2026-11-01 15:27:09 +11:00
parent 26c24c5bb0
commit c22700d3af
2 changed files with 12 additions and 0 deletions
+5
View File
@@ -827,6 +827,11 @@ fn run_plot(s: &mut Session, p: &Value, cmd: &str) -> Result<Value> {
None => o.remove("plotTransparency"),
};
}
// A PNG or SVG holds one render: several sheets would report `pages: N` but write only one.
let image = opts.get("output").and_then(Value::as_str).is_some_and(|o| o.eq_ignore_ascii_case("png") || o.eq_ignore_ascii_case("svg"));
if image && sheets.as_ref().is_some_and(|names| names.len() > 1) {
return Err(bad(cmd, "`layouts` with several sheets needs PDF output; PNG and SVG hold one sheet, so plot each layout separately"));
}
let bytes = hook(s.doc()?, &space, &opts).map_err(|e| bad(cmd, e))?;
let layout = match &sheets {
Some(names) => names.first().cloned().unwrap_or_default(),
+7
View File
@@ -230,6 +230,13 @@ fn plot_goes_through_the_hook() {
assert!(s.execute("plot", &json!({"layout": "Model", "plotArea": "window"})).is_err(), "window needs corners");
assert!(s.execute("plot", &json!({"layout": "Layout1", "plotArea": "display"})).is_err(), "layouts plot their sheet");
assert!(s.execute("plot", &json!({"layout": "Model", "scale": -1})).is_err());
// Image output holds one sheet: several `layouts` would report pages:N but write one render.
for out in ["x.png", "x.svg"] {
let e = s.execute("plot", &json!({"path": out, "layouts": ["Layout1", "Layout2"]})).unwrap_err();
assert!(e.to_string().contains("layouts"), "{e}");
}
assert!(s.execute("plot", &json!({"output": "png", "layouts": ["Layout1", "Layout2"]})).is_err());
assert!(s.execute("plot", &json!({"output": "png", "layouts": ["Layout1"]})).is_ok(), "one sheet still fine as an image");
#[cfg(not(target_arch = "wasm32"))]
{
let path = std::env::temp_dir().join(format!("cadcraft-plot-test-{}.pdf", std::process::id()));