From 28853cd32ea3a64ed42296f5b7a8b437b3c13860 Mon Sep 17 00:00:00 2001 From: ramox81 <184937705+ramox81@users.noreply.github.com> Date: Thu, 24 Sep 2026 19:02:47 +0300 Subject: [PATCH] PDF import keeps drawing order when joining strokes; automation: layer toggle and page selection Co-Authored-By: Claude Opus 5.5 --- src/app/control/actions.rs | 18 ++++++++++++++++++ src/modules/insert/pdf_import.rs | 8 +++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/app/control/actions.rs b/src/app/control/actions.rs index bd77e38e2..f461d1094 100644 --- a/src/app/control/actions.rs +++ b/src/app/control/actions.rs @@ -48,6 +48,8 @@ fn color_value(color: acadrust::types::Color) -> Value { pub(super) const NAMES: &[&str] = &[ "close_modal", "pdf_dialog_ok", + "pdf_layer_toggle", + "pdf_page_select", "close_document", "toggle_properties", "toggle_layers", @@ -665,6 +667,22 @@ impl OpenCADStudio { let msg = match name { "close_modal" => Message::CloseModal, // The open PDF dialog's OK button. + // Underlay Layers: switch a layer of the shown underlay. + "pdf_layer_toggle" => Message::PdfDialog( + crate::ui::window::pdf_dialogs::PdfDialogMsg::LayersToggle(string(req, "value")?.into()), + ), + // Attach dialog: choose pages by index ("0,2"). + "pdf_page_select" => { + let pages: Vec = string(req, "value")? + .split(',') + .filter_map(|p| p.trim().parse().ok()) + .collect(); + let Some(state) = self.pdf_attach.as_mut() else { + return Err(failure("no_dialog", "The Attach dialog is not open")); + }; + state.selected = pages; + return Ok(Task::none()); + } "pdf_dialog_ok" => { use crate::ui::window::pdf_dialogs::PdfDialogMsg; Message::PdfDialog(match self.active_modal { diff --git a/src/modules/insert/pdf_import.rs b/src/modules/insert/pdf_import.rs index 4d7e3c0d2..138579f0a 100644 --- a/src/modules/insert/pdf_import.rs +++ b/src/modules/insert/pdf_import.rs @@ -584,7 +584,9 @@ fn join_strokes(strokes: Vec) -> Vec { open.push(s); } } - while let Some(mut chain) = open.pop() { + // Drawing order is kept: dashes read as a run only in the order drawn. + while !open.is_empty() { + let mut chain = open.remove(0); loop { let end = *chain.points.last().expect("strokes have points"); let start = chain.points[0]; @@ -594,7 +596,7 @@ fn join_strokes(strokes: Vec) -> Vec { if let Some(i) = open.iter().position(|o| { fits(o) && (same_point(o.points[0], end) || same_point(*o.points.last().unwrap(), end)) }) { - let mut next = open.swap_remove(i); + let mut next = open.remove(i); if !same_point(next.points[0], end) { next.points.reverse(); } @@ -603,7 +605,7 @@ fn join_strokes(strokes: Vec) -> Vec { fits(o) && (same_point(*o.points.last().unwrap(), start) || same_point(o.points[0], start)) }) { - let mut prev = open.swap_remove(i); + let mut prev = open.remove(i); if !same_point(*prev.points.last().unwrap(), start) { prev.points.reverse(); }