From 3f1a2a71bda5baf551858623f0b1cc033685c887 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Wed, 3 Jun 2026 20:14:29 +0800 Subject: [PATCH] feat(automation): implement WxUiBackend::open_files via Plater::load_files --- src/slic3r/GUI/Automation/WxUiBackend.cpp | 22 ++++++++++++++++++++++ src/slic3r/GUI/Automation/WxUiBackend.hpp | 1 + 2 files changed, 23 insertions(+) diff --git a/src/slic3r/GUI/Automation/WxUiBackend.cpp b/src/slic3r/GUI/Automation/WxUiBackend.cpp index 68ff154b88..a8d4e81b55 100644 --- a/src/slic3r/GUI/Automation/WxUiBackend.cpp +++ b/src/slic3r/GUI/Automation/WxUiBackend.cpp @@ -303,4 +303,26 @@ PngImage WxUiBackend::screenshot_window(const UiNode* target) { }); } +int WxUiBackend::open_files(const std::vector& paths) { + return run_on_gui(m_gui_timeout_ms, [&]() -> int { + Plater* plater = wxGetApp().plater(); + if (plater == nullptr) + throw AutomationError(kErrLoadFailed, "no plater to load into"); + // Default strategy matches drag-drop / Plater::load_files's own default: it + // routes .3mf as a project and meshes as models based on file content, so no + // as_project flag is needed in v1. ask_multi=false: never prompt. + const LoadStrategy strategy = LoadStrategy::LoadModel | LoadStrategy::LoadConfig; + std::vector loaded; + try { + loaded = plater->load_files(paths, strategy, /*ask_multi=*/false); + } catch (const std::exception& e) { + throw AutomationError(kErrLoadFailed, + std::string("load_files failed: ") + e.what()); + } + if (loaded.empty()) + throw AutomationError(kErrLoadFailed, "load_files loaded nothing"); + return static_cast(loaded.size()); + }); +} + }}} // namespace Slic3r::GUI::Automation diff --git a/src/slic3r/GUI/Automation/WxUiBackend.hpp b/src/slic3r/GUI/Automation/WxUiBackend.hpp index 6239cfbfae..39f90af6eb 100644 --- a/src/slic3r/GUI/Automation/WxUiBackend.hpp +++ b/src/slic3r/GUI/Automation/WxUiBackend.hpp @@ -19,6 +19,7 @@ public: bool type_text(const std::string& text) override; bool send_keys(const std::vector& chords) override; PngImage screenshot_window(const UiNode* target) override; + int open_files(const std::vector& paths) override; private: int m_gui_timeout_ms;