This commit is contained in:
SoftFever
2026-01-31 01:04:27 +08:00
parent 8d22fad30b
commit 5935832143
6 changed files with 32 additions and 47 deletions

View File

@@ -3476,18 +3476,14 @@ void GUI_App::switch_printer_agent()
return; return;
} }
std::string agent_id; // Read printer_agent from config, falling back to default
const DynamicPrintConfig& config = preset_bundle->printers.get_edited_preset().config; const DynamicPrintConfig& config = preset_bundle->printers.get_edited_preset().config;
std::string effective_agent_id = ORCA_PRINTER_AGENT_ID;
if (config.has("printer_agent")) { if (config.has("printer_agent")) {
std::string value = config.option<ConfigOptionString>("printer_agent")->value; const std::string& value = config.option<ConfigOptionString>("printer_agent")->value;
if (!value.empty()) { if (!value.empty())
agent_id = value; effective_agent_id = value;
}
} }
// Use registry to validate and create agent
// If empty, use default
std::string effective_agent_id = agent_id.empty() ? ORCA_PRINTER_AGENT_ID : agent_id;
// Check if agent is registered // Check if agent is registered
if (!NetworkAgentFactory::is_printer_agent_registered(effective_agent_id)) { if (!NetworkAgentFactory::is_printer_agent_registered(effective_agent_id)) {
@@ -3498,10 +3494,10 @@ void GUI_App::switch_printer_agent()
} }
std::string current_agent_id; std::string current_agent_id;
if (m_agent && m_agent->get_printer_agent()) if (m_agent->get_printer_agent())
current_agent_id = m_agent->get_printer_agent()->get_agent_info().id; current_agent_id = m_agent->get_printer_agent()->get_agent_info().id;
if (current_agent_id.empty() || current_agent_id != effective_agent_id) { if (current_agent_id != effective_agent_id) {
std::string log_dir = data_dir(); std::string log_dir = data_dir();
std::shared_ptr<ICloudServiceAgent> cloud_agent = m_agent->get_cloud_agent(); std::shared_ptr<ICloudServiceAgent> cloud_agent = m_agent->get_cloud_agent();
// Create new printer agent via registry // Create new printer agent via registry

View File

@@ -172,24 +172,16 @@ void PhysicalPrinterDialog::build_printhost_settings(ConfigOptionsGroup* m_optgr
def.enum_labels.push_back(agent.display_name); def.enum_labels.push_back(agent.display_name);
} }
// Set initial selection based on current config value or default // Resolve selected agent: use config value if valid, otherwise fall back to default
const std::string current_agent = m_config->opt_string("printer_agent"); std::string selected_agent = m_config->opt_string("printer_agent");
std::string selected_agent = current_agent;
if (selected_agent.empty()) {
selected_agent = ORCA_PRINTER_AGENT_ID;
}
// Verify selected agent is valid
auto it = std::find_if(agents.begin(), agents.end(), [&selected_agent](const auto& a) { return a.id == selected_agent; }); auto it = std::find_if(agents.begin(), agents.end(), [&selected_agent](const auto& a) { return a.id == selected_agent; });
if (it == agents.end()) { if (it == agents.end()) {
selected_agent = ORCA_PRINTER_AGENT_ID; selected_agent = ORCA_PRINTER_AGENT_ID;
it = std::find_if(agents.begin(), agents.end(), [&selected_agent](const auto& a) { return a.id == selected_agent; });
} }
// Set default value for the enum (using the index) if (it != agents.end()) {
auto def_it = std::find_if(agents.begin(), agents.end(), [&selected_agent](const auto& a) { return a.id == selected_agent; }); size_t default_idx = std::distance(agents.begin(), it);
if (def_it != agents.end()) {
size_t default_idx = std::distance(agents.begin(), def_it);
def.set_default_value(new ConfigOptionInt(static_cast<int>(default_idx))); def.set_default_value(new ConfigOptionInt(static_cast<int>(default_idx)));
} }

View File

@@ -2101,7 +2101,7 @@ void Tab::on_presets_changed()
// Check if printer agent needs switching // Check if printer agent needs switching
if (m_type == Preset::TYPE_PRINTER) { if (m_type == Preset::TYPE_PRINTER) {
update_printer_agent_if_needed(); wxGetApp().switch_printer_agent();
} }
bool is_bbl_vendor_preset = m_preset_bundle->is_bbl_vendor(); bool is_bbl_vendor_preset = m_preset_bundle->is_bbl_vendor();
@@ -2134,13 +2134,6 @@ void Tab::on_presets_changed()
wxGetApp().plater()->update_project_dirty_from_presets(); wxGetApp().plater()->update_project_dirty_from_presets();
} }
void Tab::update_printer_agent_if_needed()
{
// Switch agent in GUI_App
wxGetApp().switch_printer_agent(agent_id);
}
void Tab::build_preset_description_line(ConfigOptionsGroup* optgroup) void Tab::build_preset_description_line(ConfigOptionsGroup* optgroup)
{ {
auto description_line = [this](wxWindow* parent) { auto description_line = [this](wxWindow* parent) {

View File

@@ -437,7 +437,6 @@ protected:
// return true if cancelled // return true if cancelled
bool tree_sel_change_delayed(wxCommandEvent& event); bool tree_sel_change_delayed(wxCommandEvent& event);
void on_presets_changed(); void on_presets_changed();
void update_printer_agent_if_needed();
void build_preset_description_line(ConfigOptionsGroup* optgroup); void build_preset_description_line(ConfigOptionsGroup* optgroup);
void update_preset_description_line(); void update_preset_description_line();
void update_frequently_changed_parameters(); void update_frequently_changed_parameters();

View File

@@ -54,6 +54,14 @@ bool NetworkAgentFactory::is_printer_agent_registered(const std::string& id)
return agents.find(id) != agents.end(); return agents.find(id) != agents.end();
} }
const PrinterAgentInfo* NetworkAgentFactory::get_printer_agent_info(const std::string& id)
{
std::lock_guard<std::mutex> lock(s_registry_mutex);
auto& agents = get_printer_agents();
auto it = agents.find(id);
return (it != agents.end()) ? &it->second : nullptr;
}
std::vector<PrinterAgentInfo> NetworkAgentFactory::get_registered_printer_agents() std::vector<PrinterAgentInfo> NetworkAgentFactory::get_registered_printer_agents()
{ {
std::lock_guard<std::mutex> lock(s_registry_mutex); std::lock_guard<std::mutex> lock(s_registry_mutex);
@@ -106,18 +114,14 @@ void NetworkAgentFactory::register_all_agents()
std::unique_ptr<NetworkAgent> create_agent_from_config(const std::string& log_dir, AppConfig* app_config) std::unique_ptr<NetworkAgent> create_agent_from_config(const std::string& log_dir, AppConfig* app_config)
{ {
if (!app_config)
return std::make_unique<NetworkAgent>(nullptr, nullptr);
// Determine cloud provider from config // Determine cloud provider from config
bool use_orca_cloud = false; bool use_orca_cloud = app_config->get_bool("use_orca_cloud");
if (app_config) {
try {
use_orca_cloud = app_config->get("use_orca_cloud") == "true" || app_config->get_bool("use_orca_cloud");
} catch (...) {
use_orca_cloud = false;
}
}
// Create cloud agent // Create cloud agent
std::shared_ptr<ICloudServiceAgent> cloud_agent = nullptr; std::shared_ptr<ICloudServiceAgent> cloud_agent;
if (use_orca_cloud || app_config->get_bool("installed_networking")) { if (use_orca_cloud || app_config->get_bool("installed_networking")) {
CloudAgentProvider provider = use_orca_cloud ? CloudAgentProvider::Orca : CloudAgentProvider::BBL; CloudAgentProvider provider = use_orca_cloud ? CloudAgentProvider::Orca : CloudAgentProvider::BBL;
cloud_agent = NetworkAgentFactory::create_cloud_agent(provider, log_dir); cloud_agent = NetworkAgentFactory::create_cloud_agent(provider, log_dir);
@@ -129,7 +133,7 @@ std::unique_ptr<NetworkAgent> create_agent_from_config(const std::string& log_di
// Create NetworkAgent with cloud agent only (printer agent added later when printer is selected) // Create NetworkAgent with cloud agent only (printer agent added later when printer is selected)
auto agent = std::make_unique<NetworkAgent>(std::move(cloud_agent), nullptr); auto agent = std::make_unique<NetworkAgent>(std::move(cloud_agent), nullptr);
if (agent && app_config && use_orca_cloud) { if (agent && use_orca_cloud) {
auto* orca_cloud = dynamic_cast<OrcaCloudServiceAgent*>(agent->get_cloud_agent().get()); auto* orca_cloud = dynamic_cast<OrcaCloudServiceAgent*>(agent->get_cloud_agent().get());
if (orca_cloud) { if (orca_cloud) {
orca_cloud->configure_urls(app_config); orca_cloud->configure_urls(app_config);

View File

@@ -15,10 +15,6 @@
namespace Slic3r { namespace Slic3r {
// Forward declarations
class ICloudServiceAgent;
class IPrinterAgent;
/** /**
* CloudAgentProvider - Specifies which implementation to use for each agent type. * CloudAgentProvider - Specifies which implementation to use for each agent type.
* *
@@ -97,6 +93,11 @@ public:
*/ */
static bool is_printer_agent_registered(const std::string& id); static bool is_printer_agent_registered(const std::string& id);
/**
* Get info about a registered agent
*/
static const PrinterAgentInfo* get_printer_agent_info(const std::string& id);
/** /**
* Get all registered printer agents (for UI population) * Get all registered printer agents (for UI population)
*/ */