ENH: update prompt for filament mix printing

jira: NONE

Signed-off-by: xun.zhang <xun.zhang@bambulab.com>
Change-Id: I92c86edadd6720b0e566057bd2593605ee4a3f77
(cherry picked from commit a93f6a54a2be94807702e3c75bdb4c79d508f260)
This commit is contained in:
xun.zhang 2025-07-15 15:19:09 +08:00 committed by Noisyfox
parent a543a55e01
commit f7643eb3be
4 changed files with 58 additions and 0 deletions

View file

@ -142,6 +142,12 @@ std::string& get_nozzle_filament_incompatible_text() {
return nozzle_filament_incompatible_text;
}
std::string& get_filament_mixture_warning_text(){
static std::string filament_mixture_warning_text;
return filament_mixture_warning_text;
}
static std::string format_number(float value)
{
std::ostringstream oss;
@ -3052,6 +3058,9 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
bool filament_nozzle_compatible = cur_plate->check_compatible_of_nozzle_and_filament(full_config_temp, wxGetApp().preset_bundle->filament_presets, get_nozzle_filament_incompatible_text());
_set_warning_notification(EWarning::NozzleFilamentIncompatible, !filament_nozzle_compatible);
bool filament_mixture_compatible = cur_plate->check_mixture_filament_compatible(full_config_temp, get_filament_mixture_warning_text());
_set_warning_notification(EWarning::MixtureFilamentIncompatible, !filament_mixture_compatible);
bool model_fits = contained_min_one && !m_model->objects.empty() && !partlyOut && object_results.filaments.empty() && tpu_valid && filament_printable;
post_event(Event<bool>(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, model_fits));
ppl.get_curr_plate()->update_slice_ready_status(model_fits);
@ -3070,6 +3079,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
_set_warning_notification(EWarning::MultiExtruderPrintableError,false);
_set_warning_notification(EWarning::MultiExtruderHeightOutside,false);
_set_warning_notification(EWarning::NozzleFilamentIncompatible,false);
_set_warning_notification(EWarning::MixtureFilamentIncompatible,false);
post_event(Event<bool>(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, false));
}
@ -10124,6 +10134,10 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state)
text = _u8L(get_nozzle_filament_incompatible_text());
break;
}
case EWarning::MixtureFilamentIncompatible: {
text = _u8L(get_filament_mixture_warning_text());
break;
}
}
//BBS: this may happened when exit the app, plater is null
if (!wxGetApp().plater())

View file

@ -394,6 +394,7 @@ class GLCanvas3D
MixUsePLAAndPETG,
PrimeTowerOutside,
NozzleFilamentIncompatible,
MixtureFilamentIncompatible,
};
class RenderStats

View file

@ -1822,6 +1822,48 @@ bool PartPlate::check_mixture_of_pla_and_petg(const DynamicPrintConfig &config)
return true;
}
bool PartPlate::check_mixture_filament_compatible(const DynamicPrintConfig &config, std::string &error_msg)
{
static std::unordered_map<std::string, std::unordered_set<std::string>> incompatible_filament_pairs;
auto add_incompatibility = [&](std::string filament_type1, std::string filament_type2) {
incompatible_filament_pairs[filament_type1].insert(filament_type2);
incompatible_filament_pairs[filament_type2].insert(filament_type1);
};
if (incompatible_filament_pairs.empty()) { add_incompatibility("PVA", "PETG"); }
std::vector<int> used_filaments = get_extruders(true); // 1 based idx
std::vector<std::string> filament_types;
auto filament_type_opt = config.option<ConfigOptionStrings>("filament_type");
for (auto filament : used_filaments) {
int filament_idx = filament - 1;
filament_types.push_back(filament_type_opt->values[filament_idx]);
};
{
std::unordered_set<std::string> seen;
filament_types.erase(std::remove_if(filament_types.begin(), filament_types.end(), [&](const std::string &s) { return !seen.insert(s).second; }), filament_types.end());
}
std::vector<std::pair<std::string, std::string>> conflicts;
for (size_t i = 0; i < filament_types.size(); i++) {
auto it = incompatible_filament_pairs.find(filament_types[i]);
if (it == incompatible_filament_pairs.end()) continue;
for (size_t j = i + 1; j < filament_types.size(); ++j) {
if (it->second.count(filament_types[j])) { conflicts.emplace_back(filament_types[i], filament_types[j]); }
}
}
if (!conflicts.empty()) {
// TODO: add the full text if has multi conflict
auto conflict = conflicts.front();
error_msg = GUI::format(_L("Mixing %1% with %2% in printing is not recommended.\n"), conflict.first, conflict.second);
}
return conflicts.empty();
}
bool PartPlate::check_compatible_of_nozzle_and_filament(const DynamicPrintConfig &config, const std::vector<std::string> &filament_presets, std::string &error_msg)
{
float nozzle_diameter = config.option<ConfigOptionFloatsNullable>("nozzle_diameter")->values[0];

View file

@ -341,6 +341,7 @@ public:
bool check_filament_printable(const DynamicPrintConfig & config, wxString& error_message);
bool check_tpu_printable_status(const DynamicPrintConfig & config, const std::vector<int> &tpu_filaments);
bool check_mixture_of_pla_and_petg(const DynamicPrintConfig & config);
bool check_mixture_filament_compatible(const DynamicPrintConfig& config, std::string &error_msg);
bool check_compatible_of_nozzle_and_filament(const DynamicPrintConfig & config, const std::vector<std::string>& filament_presets, std::string& error_msg);
/* instance related operations*/