Artboards: Convert to Artboards gives each new artboard its id without reading every artboard

Convert to Artboards found the highest artboard id twice for each object it
converted: once for the new artboard's name and once in
Document::next_artboard_id. Converting N objects read about N^2 artboards.

The command now keeps the highest id as it adds artboards, and
Document::next_artboard_id_above gives the next id from it. When an artboard
has id u32::MAX, it falls back to next_artboard_id, which takes the smallest
free id. The ids and names it gives are unchanged.
This commit is contained in:
dotCooCoo
2026-11-11 20:56:36 -08:00
parent fd6b8f6c97
commit 605a74f19f
3 changed files with 50 additions and 2 deletions
+5 -2
View File
@@ -1306,13 +1306,16 @@ fn convert_to_artboards(s: &mut Session, _: &Value) -> Result<Value> {
let symbols = d.symbol_boxes();
let boxes: Vec<(NodeId, Rect)> = roots.iter().filter_map(|id| Some((*id, d.node(*id)?.geometric_bounds_with(&symbols)?))).collect();
let mut converted = vec![];
// The highest artboard id the document has, kept up to date as artboards are added.
let mut top = d.artboards.iter().map(|a| a.id).max();
for (id, b) in boxes {
if b.width() <= 0.0 || b.height() <= 0.0 {
continue;
}
// Named one past the highest artboard id the document has, whatever id it is given.
let number = d.artboards.iter().map(|a| a.id).max().map_or(1, |m| m.saturating_add(1));
let aid = d.next_artboard_id();
let number = top.map_or(1, |m| m.saturating_add(1));
let aid = d.next_artboard_id_above(top);
top = top.max(Some(aid));
d.artboards.push(vectorcraft_doc::Artboard {
id: aid,
name: format!("Artboard {number}"),