mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-05-19 03:13:39 +00:00
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:
@@ -142,6 +142,12 @@ std::string& get_nozzle_filament_incompatible_text() {
|
|||||||
return 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)
|
static std::string format_number(float value)
|
||||||
{
|
{
|
||||||
std::ostringstream oss;
|
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());
|
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);
|
_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;
|
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));
|
post_event(Event<bool>(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, model_fits));
|
||||||
ppl.get_curr_plate()->update_slice_ready_status(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::MultiExtruderPrintableError,false);
|
||||||
_set_warning_notification(EWarning::MultiExtruderHeightOutside,false);
|
_set_warning_notification(EWarning::MultiExtruderHeightOutside,false);
|
||||||
_set_warning_notification(EWarning::NozzleFilamentIncompatible,false);
|
_set_warning_notification(EWarning::NozzleFilamentIncompatible,false);
|
||||||
|
_set_warning_notification(EWarning::MixtureFilamentIncompatible,false);
|
||||||
|
|
||||||
post_event(Event<bool>(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, 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());
|
text = _u8L(get_nozzle_filament_incompatible_text());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case EWarning::MixtureFilamentIncompatible: {
|
||||||
|
text = _u8L(get_filament_mixture_warning_text());
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//BBS: this may happened when exit the app, plater is null
|
//BBS: this may happened when exit the app, plater is null
|
||||||
if (!wxGetApp().plater())
|
if (!wxGetApp().plater())
|
||||||
|
|||||||
@@ -394,6 +394,7 @@ class GLCanvas3D
|
|||||||
MixUsePLAAndPETG,
|
MixUsePLAAndPETG,
|
||||||
PrimeTowerOutside,
|
PrimeTowerOutside,
|
||||||
NozzleFilamentIncompatible,
|
NozzleFilamentIncompatible,
|
||||||
|
MixtureFilamentIncompatible,
|
||||||
};
|
};
|
||||||
|
|
||||||
class RenderStats
|
class RenderStats
|
||||||
|
|||||||
@@ -1822,6 +1822,48 @@ bool PartPlate::check_mixture_of_pla_and_petg(const DynamicPrintConfig &config)
|
|||||||
return true;
|
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)
|
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];
|
float nozzle_diameter = config.option<ConfigOptionFloatsNullable>("nozzle_diameter")->values[0];
|
||||||
|
|||||||
@@ -341,6 +341,7 @@ public:
|
|||||||
bool check_filament_printable(const DynamicPrintConfig & config, wxString& error_message);
|
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_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_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);
|
bool check_compatible_of_nozzle_and_filament(const DynamicPrintConfig & config, const std::vector<std::string>& filament_presets, std::string& error_msg);
|
||||||
|
|
||||||
/* instance related operations*/
|
/* instance related operations*/
|
||||||
|
|||||||
Reference in New Issue
Block a user