mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-05 17:10:45 +08:00
Select filament from connect.
This commit is contained in:
parent
7b9d9a33a4
commit
8ee04288fb
@ -3652,8 +3652,8 @@ void GUI_App::open_wifi_config_dialog(bool forced, const wxString& drive_path/*
|
||||
}
|
||||
m_wifi_config_dialog_shown = false;
|
||||
}
|
||||
|
||||
bool GUI_App::select_printer_from_connect(const Preset* preset)
|
||||
// Returns true if preset had to be installed.
|
||||
bool GUI_App::select_printer_preset(const Preset* preset)
|
||||
{
|
||||
assert(preset);
|
||||
|
||||
@ -3677,11 +3677,8 @@ bool GUI_App::select_printer_from_connect(const Preset* preset)
|
||||
return is_installed;
|
||||
}
|
||||
|
||||
void GUI_App::handle_connect_request_printer_pick(std::string msg)
|
||||
bool GUI_App::select_printer_from_connect(const std::string& msg)
|
||||
{
|
||||
BOOST_LOG_TRIVIAL(error) << "Handling web request: " << msg;
|
||||
// return to plater
|
||||
this->mainframe->select_tab(size_t(0));
|
||||
// parse message
|
||||
std::vector<std::string> compatible_printers;
|
||||
plater()->get_user_account()->fill_compatible_printers_from_json(msg, compatible_printers);
|
||||
@ -3689,24 +3686,116 @@ void GUI_App::handle_connect_request_printer_pick(std::string msg)
|
||||
if (compatible_printers.empty()) {
|
||||
// TODO: This should go away when compatible printers gives right information.
|
||||
model_name = plater()->get_user_account()->get_model_from_json(msg);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
model_name = compatible_printers.front();
|
||||
}
|
||||
std::string nozzle = plater()->get_user_account()->get_nozzle_from_json(msg);
|
||||
assert(!model_name.empty());
|
||||
if (model_name.empty())
|
||||
return;
|
||||
return false;
|
||||
|
||||
// select printer
|
||||
const Preset* preset = preset_bundle->printers.find_system_preset_by_model_and_variant(model_name, nozzle);
|
||||
bool is_installed = preset && select_printer_from_connect(preset);
|
||||
const Preset* printer_preset = preset_bundle->printers.find_system_preset_by_model_and_variant(model_name, nozzle);
|
||||
bool is_installed = printer_preset && select_printer_preset(printer_preset);
|
||||
// notification
|
||||
std::string out = preset ?
|
||||
(is_installed ? GUI::format(_L("Installed and Select Printer:\n%1%"), preset->name) :
|
||||
GUI::format(_L("Select Printer:\n%1%"), preset->name) ):
|
||||
GUI::format(_L("Printer not found:\n%1%"), model_name);
|
||||
this->plater()->get_notification_manager()->close_notification_of_type(NotificationType::UserAccountID);
|
||||
this->plater()->get_notification_manager()->push_notification(NotificationType::UserAccountID, NotificationManager::NotificationLevel::ImportantNotificationLevel, out);
|
||||
std::string out = printer_preset ?
|
||||
(is_installed ? GUI::format(_L("Installed and Selected Printer:\n%1%"), printer_preset->name) :
|
||||
GUI::format(_L("Selected Printer:\n%1%"), printer_preset->name)) :
|
||||
GUI::format(_L("Printer not found:\n%1%"), model_name);
|
||||
this->plater()->get_notification_manager()->close_notification_of_type(NotificationType::SelectPrinterFromConnect);
|
||||
this->plater()->get_notification_manager()->push_notification(NotificationType::SelectPrinterFromConnect, NotificationManager::NotificationLevel::ImportantNotificationLevel, out);
|
||||
return printer_preset;
|
||||
}
|
||||
|
||||
bool GUI_App::select_filament_preset(const Preset* preset)
|
||||
{
|
||||
assert(preset && preset->is_compatible);
|
||||
|
||||
if (!preset->is_visible) {
|
||||
size_t preset_id = preset_bundle->filaments.get_preset_idx_by_name(preset->name);
|
||||
assert(preset_id != size_t(-1));
|
||||
preset_bundle->filaments.select_preset(preset_id);
|
||||
}
|
||||
|
||||
return get_tab(Preset::Type::TYPE_FILAMENT)->select_preset(preset->name);
|
||||
}
|
||||
void GUI_App::select_filament_from_connect(const std::string& msg)
|
||||
{
|
||||
|
||||
// parse message
|
||||
std::string desired_type;
|
||||
desired_type = plater()->get_user_account()->get_keyword_from_json(msg, "material");
|
||||
if (desired_type.empty()) {
|
||||
return;
|
||||
}
|
||||
// test if currently selected is same type
|
||||
std::string selected_type = preset_bundle->filaments.get_selected_preset().config.option("filament_type")->serialize();
|
||||
if (selected_type == desired_type) {
|
||||
return;
|
||||
}
|
||||
// find first filament with suitable type
|
||||
for (const auto& filament_preset : preset_bundle->filaments) {
|
||||
if (filament_preset.is_visible
|
||||
&& !filament_preset.vendor->templates_profile
|
||||
&& filament_preset.is_compatible
|
||||
&& filament_preset.config.option("filament_type")->serialize() == desired_type
|
||||
&& select_filament_preset(&filament_preset))
|
||||
{
|
||||
std::string out = GUI::format(_L("Selected Filament:\n%1%"), filament_preset.name);
|
||||
plater()->get_notification_manager()->close_notification_of_type(NotificationType::SelectFilamentFromConnect);
|
||||
plater()->get_notification_manager()->push_notification(NotificationType::SelectFilamentFromConnect, NotificationManager::NotificationLevel::ImportantNotificationLevel, out);
|
||||
return;
|
||||
}
|
||||
}
|
||||
// find profile to install
|
||||
// first try finding Prusament
|
||||
for (const auto& filament_preset : preset_bundle->filaments) {
|
||||
if (!filament_preset.vendor->templates_profile
|
||||
&& filament_preset.is_compatible
|
||||
&& filament_preset.config.option("filament_type")->serialize() == desired_type
|
||||
&& filament_preset.name.compare(0, 9, "Prusament") == 0
|
||||
&& select_filament_preset(&filament_preset))
|
||||
{
|
||||
std::string out = GUI::format(_L("Installed and Selected Filament:\n%1%"), filament_preset.name);
|
||||
plater()->get_notification_manager()->close_notification_of_type(NotificationType::SelectFilamentFromConnect);
|
||||
plater()->get_notification_manager()->push_notification(NotificationType::SelectFilamentFromConnect, NotificationManager::NotificationLevel::ImportantNotificationLevel, out);
|
||||
return;
|
||||
}
|
||||
}
|
||||
// then just any compatible
|
||||
for (const auto& filament_preset : preset_bundle->filaments) {
|
||||
if (!filament_preset.vendor->templates_profile
|
||||
&& filament_preset.is_compatible
|
||||
&& filament_preset.config.option("filament_type")->serialize() == desired_type
|
||||
&& select_filament_preset(&filament_preset))
|
||||
{
|
||||
std::string out = GUI::format(_L("Installed and Selected Filament:\n%1%"), filament_preset.name);
|
||||
plater()->get_notification_manager()->close_notification_of_type(NotificationType::SelectFilamentFromConnect);
|
||||
plater()->get_notification_manager()->push_notification(NotificationType::SelectFilamentFromConnect, NotificationManager::NotificationLevel::ImportantNotificationLevel, out);
|
||||
return;
|
||||
}
|
||||
}
|
||||
// no filamet found
|
||||
std::string out = GUI::format(_L("Failed to find and select filament type:\n%1%"), desired_type);
|
||||
plater()->get_notification_manager()->close_notification_of_type(NotificationType::SelectFilamentFromConnect);
|
||||
plater()->get_notification_manager()->push_notification(NotificationType::SelectFilamentFromConnect, NotificationManager::NotificationLevel::ImportantNotificationLevel, out);
|
||||
}
|
||||
|
||||
void GUI_App::handle_connect_request_printer_pick(const std::string& msg)
|
||||
{
|
||||
BOOST_LOG_TRIVIAL(debug) << "Handling web request: " << msg;
|
||||
// return to plater
|
||||
this->mainframe->select_tab(size_t(0));
|
||||
|
||||
if (!select_printer_from_connect(msg)) {
|
||||
// If printer was not selected, do not select filament.
|
||||
return;
|
||||
}
|
||||
if (Preset::printer_technology(preset_bundle->printers.get_selected_preset().config) != ptFFF) {
|
||||
return;
|
||||
}
|
||||
select_filament_from_connect(msg);
|
||||
}
|
||||
|
||||
void GUI_App::show_printer_webview_tab()
|
||||
|
@ -411,10 +411,13 @@ public:
|
||||
void request_user_login(int online_login) {}
|
||||
void request_user_logout() {}
|
||||
int request_user_unbind(std::string dev_id) { return 0; }
|
||||
void handle_connect_request_printer_pick(std::string cmd);
|
||||
bool select_printer_from_connect(const std::string& cmd);
|
||||
void select_filament_from_connect(const std::string& cmd);
|
||||
void handle_connect_request_printer_pick(const std::string& cmd);
|
||||
void show_printer_webview_tab();
|
||||
// return true if preset vas invisible and we have to installed it to make it selectable
|
||||
bool select_printer_from_connect(const Preset* printer_preset);
|
||||
bool select_printer_preset(const Preset* printer_preset);
|
||||
bool select_filament_preset(const Preset* filament_preset);
|
||||
void handle_script_message(std::string msg) {}
|
||||
void request_model_download(std::string import_json) {}
|
||||
void download_project(std::string project_id) {}
|
||||
|
@ -131,6 +131,9 @@ enum class NotificationType
|
||||
WifiConfigFileDetected,
|
||||
// Info abouty successful login or logout
|
||||
UserAccountID,
|
||||
// When in Connect tab "set as current" is selected and selected presets in plater changes
|
||||
SelectPrinterFromConnect,
|
||||
SelectFilamentFromConnect,
|
||||
// Debug notification for connect communication
|
||||
PrusaConnectPrinters,
|
||||
};
|
||||
|
@ -5863,7 +5863,7 @@ void Plater::connect_gcode()
|
||||
std::vector<std::string> compatible_printers;
|
||||
p->user_account->fill_compatible_printers_from_json(dialog_msg, compatible_printers);
|
||||
std::string connect_nozzle = p->user_account->get_nozzle_from_json(dialog_msg);
|
||||
std::string connect_filament = p->user_account->get_keyword_from_json(dialog_msg, "filament_type");
|
||||
std::string connect_filament_type = p->user_account->get_keyword_from_json(dialog_msg, "material");
|
||||
std::vector<const Preset*> compatible_printer_presets;
|
||||
for (const std::string& cp : compatible_printers) {
|
||||
compatible_printer_presets.emplace_back(preset_bundle->printers.find_system_preset_by_model_and_variant(cp, connect_nozzle));
|
||||
@ -5872,7 +5872,7 @@ void Plater::connect_gcode()
|
||||
const Preset* selected_printer_preset = &preset_bundle->printers.get_selected_preset();
|
||||
const Preset* selected_filament_preset = &preset_bundle->filaments.get_selected_preset();
|
||||
const std::string selected_nozzle_serialized = dynamic_cast<const ConfigOptionFloats*>(selected_printer_preset->config.option("nozzle_diameter"))->serialize();
|
||||
const std::string selected_filament_serialized = selected_filament_preset->config.option("filament_type")->serialize();
|
||||
const std::string selected_filament_type_serialized = selected_filament_preset->config.option("filament_type")->serialize();
|
||||
const std::string selected_printer_model_serialized = selected_printer_preset->config.option("printer_model")->serialize();
|
||||
|
||||
bool is_first = compatible_printer_presets.front()->name == selected_printer_preset->name;
|
||||
@ -5886,9 +5886,9 @@ void Plater::connect_gcode()
|
||||
break;
|
||||
}
|
||||
}
|
||||
//
|
||||
// Dialog to select action
|
||||
if (!found) {
|
||||
wxString line1 = _L("The printer profile you've selected for upload is not compatible with profiles selected for slicing.");
|
||||
wxString line1 = _L("The printer you've selected for upload is not compatible with profiles selected for slicing.");
|
||||
wxString line2 = GUI::format_wxstr(_L("PrusaSlicer Profile:\n%1%"), selected_printer_preset->name);
|
||||
wxString line3 = _L("Known profiles compatible with printer selected for upload:");
|
||||
wxString printers_line;
|
||||
@ -5906,7 +5906,7 @@ void Plater::connect_gcode()
|
||||
return;
|
||||
}
|
||||
} else if (!is_first) {
|
||||
wxString line1 = _L("The printer profile you've selected for upload might not be compatible with profiles selected for slicing.");
|
||||
wxString line1 = _L("The printer you've selected for upload might not be compatible with profiles selected for slicing.");
|
||||
wxString line2 = GUI::format_wxstr(_L("PrusaSlicer Profile:\n%1%"), selected_printer_preset->name);
|
||||
wxString line3 = _L("Known profiles compatible with printer selected for upload:");
|
||||
wxString printers_line;
|
||||
@ -5924,6 +5924,19 @@ void Plater::connect_gcode()
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (selected_filament_type_serialized != connect_filament_type) {
|
||||
wxString line1 = _L("The printer you've selected has different filament type than filament profile selected for slicing.");
|
||||
wxString line2 = GUI::format_wxstr(_L("PrusaConnect Filament Type: %1%"), connect_filament_type);
|
||||
wxString line3 = GUI::format_wxstr(_L("PrusaSlicer Filament Type: %1%"), selected_filament_type_serialized);
|
||||
wxString line4 = _L("Do you still wish to upload?");
|
||||
wxString message = GUI::format_wxstr("%1%\n\n%2%\n%3%\n\n%4%", line1, line2, line3, line4);
|
||||
MessageDialog msg_dialog(this, message, _L("Do you wish to upload?"), wxYES_NO);
|
||||
auto modal_res = msg_dialog.ShowModal();
|
||||
if (modal_res != wxID_YES) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Commented code with selecting printers in plater
|
||||
/*
|
||||
// if selected (in connect) preset is not visible, make it visible and selected
|
||||
|
@ -157,11 +157,10 @@ namespace {
|
||||
for (const auto& section : tree) {
|
||||
if (section.first == param) {
|
||||
return section.second.data();
|
||||
} else {
|
||||
if (std::string res = parse_tree_for_param(section.second, param); !res.empty())
|
||||
return res;
|
||||
}
|
||||
|
||||
if (std::string res = parse_tree_for_param(section.second, param); !res.empty()) {
|
||||
return res;
|
||||
}
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user