diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 370fb2669..a0733ed92 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -271,6 +271,10 @@ void AppConfig::set_defaults() set_bool("auto_calculate", true); } + if (get("enable_high_low_temp_mixed_printing").empty()){ + set_bool("enable_high_low_temp_mixed_printing", false); + } + if (get("auto_calculate_when_filament_change").empty()){ set_bool("auto_calculate_when_filament_change", true); } diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 25e33adaa..2fc8d64e9 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1022,6 +1022,9 @@ int Print::get_compatible_filament_type(const std::set& filament_types) //BBS: this function is used to check whether multi filament can be printed StringObjectException Print::check_multi_filament_valid(const Print& print) { + if (!print.need_check_multi_filaments_compatibility()) + return {std::string()}; + auto print_config = print.config(); std::vector extruders = print.extruders(); std::vector filament_types; diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 8ddbef97c..4585bfc74 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -965,6 +965,9 @@ public: BoundingBoxf get_wipe_tower_bbx() const { return m_wipe_tower_data.bbx; } Vec2f get_rib_offset() const { return m_wipe_tower_data.rib_offset; } + void set_check_multi_filaments_compatibility(bool check) { m_need_check_multi_filaments_compatibility = check; } + bool need_check_multi_filaments_compatibility() const { return m_need_check_multi_filaments_compatibility; } + // scaled point Vec2d translate_to_print_space(const Point& point) const; static FilamentTempType get_filament_temp_type(const std::string& filament_type); @@ -1047,6 +1050,8 @@ private: // OrcaSlicer: calibration Calib_Params m_calib_params; + bool m_need_check_multi_filaments_compatibility{true}; + // To allow GCode to set the Print's GCodeExport step status. friend class GCode; // Allow PrintObject to access m_mutex and m_cancel_callback. diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp index ec3d4186e..3615a05a4 100644 --- a/src/slic3r/GUI/MsgDialog.cpp +++ b/src/slic3r/GUI/MsgDialog.cpp @@ -241,7 +241,13 @@ void MsgDialog::finalize() // Text shown as HTML, so that mouse selection and Ctrl-V to copy will work. -static void add_msg_content(wxWindow* parent, wxBoxSizer* content_sizer, wxString msg, bool monospaced_font = false, bool is_marked_msg = false) +static void add_msg_content(wxWindow *parent, + wxBoxSizer *content_sizer, + wxString msg, + bool monospaced_font = false, + bool is_marked_msg = false, + const wxString &link_text = "", + std::function link_callback = nullptr) { wxHtmlWindow* html = new wxHtmlWindow(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO); html->SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE)); @@ -325,9 +331,19 @@ static void add_msg_content(wxWindow* parent, wxBoxSizer* content_sizer, wxStrin if (monospaced_font) // Code formatting will be preserved. This is useful for reporting errors from the placeholder parser. msg_escaped = std::string("
") + msg_escaped + "
"; + + if (!link_text.IsEmpty() && link_callback) { + msg_escaped += "" + std::string(link_text.ToUTF8().data()) + ""; + } + html->SetPage("" + wxString::FromUTF8(msg_escaped.data()) + ""); content_sizer->Add(html, 1, wxEXPAND|wxRIGHT, 8); wxGetApp().UpdateDarkUIWin(html); + + html->Bind(wxEVT_HTML_LINK_CLICKED, [=](wxHtmlLinkEvent& event) { + if (link_callback) + link_callback(event.GetLinkInfo().GetHref()); + }); } // ErrorDialog @@ -367,10 +383,12 @@ MessageDialog::MessageDialog(wxWindow* parent, const wxString& message, const wxString& caption/* = wxEmptyString*/, long style /* = wxOK*/, - const wxString &forward_str /* = wxEmptyString*/) + const wxString &forward_str /* = wxEmptyString*/, + const wxString &link_text /* = wxEmptyString*/, + std::function link_callback /* = nullptr*/) : MsgDialog(parent, caption.IsEmpty() ? wxString::Format(_L("%s info"), SLIC3R_APP_FULL_NAME) : caption, wxEmptyString, style, wxBitmap(),forward_str) { - add_msg_content(this, content_sizer, message); + add_msg_content(this, content_sizer, message, false, false, link_text, link_callback); SetMaxSize(MSG_DLG_MAX_SIZE); finalize(); } diff --git a/src/slic3r/GUI/MsgDialog.hpp b/src/slic3r/GUI/MsgDialog.hpp index 66c9268a7..f1e39decb 100644 --- a/src/slic3r/GUI/MsgDialog.hpp +++ b/src/slic3r/GUI/MsgDialog.hpp @@ -152,7 +152,13 @@ class MessageDialog : public MsgDialog { public: // NOTE! Don't change a signature of contsrucor. It have to be tha same as for wxMessageDialog - MessageDialog(wxWindow *parent,const wxString& message, const wxString &caption = wxEmptyString, long style = wxOK,const wxString& forward_str = ""); + MessageDialog(wxWindow *parent, + const wxString &message, + const wxString &caption = wxEmptyString, + long style = wxOK, + const wxString &forward_str = "", + const wxString &link_text = "", + std::function link_callback = nullptr); MessageDialog(MessageDialog&&) = delete; MessageDialog(const MessageDialog&) = delete; MessageDialog &operator=(MessageDialog&&) = delete; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 5131454a1..2e7645055 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -6666,6 +6666,8 @@ unsigned int Plater::priv::update_background_process(bool force_validation, bool this->preview->update_gcode_result(partplate_list.get_current_slice_result()); } + background_process.fff_print()->set_check_multi_filaments_compatibility(wxGetApp().app_config->get("enable_high_low_temp_mixed_printing") == "false"); + Print::ApplyStatus invalidated; const auto& preset_bundle = wxGetApp().preset_bundle; if (preset_bundle->get_printer_extruder_count() > 1) { @@ -15979,6 +15981,7 @@ void Plater::validate_current_plate(bool& model_fits, bool& validate_error) StringObjectException warning; Polygons polygons; std::vector> height_polygons; + p->background_process.fff_print()->set_check_multi_filaments_compatibility(wxGetApp().app_config->get("enable_high_low_temp_mixed_printing") == "false"); StringObjectException err = p->background_process.validate(&warning, &polygons, &height_polygons); // update string by type post_process_string_object_exception(err); diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index 05df1f721..0d495f484 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -846,6 +846,25 @@ wxBoxSizer *PreferencesDialog::create_item_checkbox(wxString title, wxWindow *pa } } + if (param == "enable_high_low_temp_mixed_printing") { + if (checkbox->GetValue()) { + MessageDialog msg_wingow(nullptr, _L("Printing with multiple filaments that have a large temperature difference can cause the extruder and nozzle to be blocked or dameged during printing.\nPlease enable with caution."), + _L("Warning"), wxICON_WARNING | wxYES | wxYES_DEFAULT | wxCANCEL | wxCENTRE, wxEmptyString, + _L("Click Wiki for help."), [](const wxString){ + std::string language = wxGetApp().app_config->get("language"); + wxString region = L"en"; + if (language.find("zh") == 0) region = L"zh"; + const wxString wiki_link = wxString::Format(L"https://wiki.bambulab.com/%s/filament-acc/filament/h2d-filament-config-limit", region); + wxGetApp().open_browser_with_warning_dialog(wiki_link); + }); + if (msg_wingow.ShowModal() != wxID_YES) { + checkbox->SetValue(false); + app_config->set_bool(param, false); + app_config->save(); + } + } + } + #ifdef __WIN32__ if (param == "prefer_to_use_dgpu") { app_config->set_bool(param, checkbox->GetValue()); @@ -1153,6 +1172,7 @@ wxWindow* PreferencesDialog::create_general_page() auto item_multi_machine = create_item_checkbox(_L("Multi-device Management(Take effect after restarting Studio)."), page, _L("With this option enabled, you can send a task to multiple devices at the same time and manage multiple devices."), 50, "enable_multi_machine"); auto item_step_mesh_setting = create_item_checkbox(_L("Show the step mesh parameter setting dialog."), page, _L("If enabled,a parameter settings dialog will appear during STEP file import."), 50, "enable_step_mesh_setting"); auto item_beta_version_update = create_item_checkbox(_L("Support beta version update."), page, _L("With this option enabled, you can receive beta version updates."), 50, "enable_beta_version_update"); + auto item_mix_print_high_low_temperature = create_item_checkbox(_L("Remove the restriction on high and low temperature mixed printing."), page, _L("With this option enabled, you can print materials with different chamber temperatures together."), 50, "enable_high_low_temp_mixed_printing"); auto _3d_settings = create_item_title(_L("3D Settings"), page, _L("3D Settings")); auto item_mouse_zoom_settings = create_item_checkbox(_L("Zoom to mouse position"), page, _L("Zoom in towards the mouse pointer's position in the 3D view, rather than the 2D window center."), 50, @@ -1264,6 +1284,7 @@ wxWindow* PreferencesDialog::create_general_page() sizer_page->Add(item_step_mesh_setting, 0, wxTOP, FromDIP(3)); sizer_page->Add(item_beta_version_update, 0, wxTOP, FromDIP(3)); sizer_page->Add(item_auto_transfer_when_switch_preset, 0, wxTOP, FromDIP(3)); + sizer_page->Add(item_mix_print_high_low_temperature, 0, wxTOP, FromDIP(3)); sizer_page->Add(_3d_settings, 0, wxTOP | wxEXPAND, FromDIP(20)); sizer_page->Add(item_mouse_zoom_settings, 0, wxTOP, FromDIP(3)); sizer_page->Add(item_show_shells_in_preview_settings, 0, wxTOP, FromDIP(3));