H2D X2D Multi Nozzle Size Printing Support (#14125)

This commit is contained in:
LixNix authored and GitHub committed 2026-10-08 20:28:32 +08:00
1 parent 776ca6a3e4
commit 7d44b60ae4
13 files changed
+63 -44

No files matched your search

+21 -21
View File
@@ -1862,27 +1862,22 @@ bool Sidebar::priv::switch_diameter(bool single)
auto diameter_left = left_extruder->combo_diameter->GetValue();
auto diameter_right = right_extruder->combo_diameter->GetValue();
if (diameter_left != diameter_right) {
std::string printer_type = wxGetApp().preset_bundle->printers.get_edited_preset().get_printer_type(wxGetApp().preset_bundle);
auto left_name = _L(DevPrinterConfigUtil::get_toolhead_display_name(printer_type, DEPUTY_EXTRUDER_ID, ToolHeadComponent::Nozzle, ToolHeadNameCase::SentenceCase));
auto right_name = _L(DevPrinterConfigUtil::get_toolhead_display_name(printer_type, MAIN_EXTRUDER_ID, ToolHeadComponent::Nozzle, ToolHeadNameCase::SentenceCase));
MessageDialog dlg(this->plater,
_L("The software does not support using different diameter of nozzles for one print. "
"If the left and right nozzles are inconsistent, we can only proceed with single-head printing. "
"Please confirm which nozzle you would like to use for this project."),
_L("Switch diameter"), wxYES_NO | wxNO_DEFAULT);
dlg.SetButtonLabel(wxID_YES, wxString::Format("%s: %smm", left_name, diameter_left));
dlg.SetButtonLabel(wxID_NO, wxString::Format("%s: %smm", right_name, diameter_right));
int result = dlg.ShowModal();
if (result == wxID_YES)
diameter = diameter_left;
else if (result == wxID_NO)
diameter = diameter_right;
else
double left_value = 0.0, right_value = 0.0;
if (!diameter_left.ToCDouble(&left_value) || !diameter_right.ToCDouble(&right_value))
return false;
Tab* printer_tab = wxGetApp().get_tab(Preset::TYPE_PRINTER);
DynamicPrintConfig new_conf = wxGetApp().preset_bundle->printers.get_edited_preset().config;
auto* nozzle_diameter_opt = new_conf.option<ConfigOptionFloats>("nozzle_diameter");
if (printer_tab == nullptr || nozzle_diameter_opt == nullptr || nozzle_diameter_opt->size() < 2)
return false;
nozzle_diameter_opt->values[0] = left_value;
nozzle_diameter_opt->values[1] = right_value;
printer_tab->load_config(new_conf);
return true;
}
else {
diameter = diameter_left;
}
diameter = diameter_left;
}
return switch_diameter_to(diameter);
@@ -1892,15 +1887,20 @@ bool Sidebar::priv::switch_diameter_to(const wxString &diameter)
{
// ORCA: Check if the selected diameter matches the current nozzle diameter in the config
Preset& printer_preset = wxGetApp().preset_bundle->printers.get_edited_preset();
auto* nozzle_diameter = dynamic_cast<const ConfigOptionFloats*>(printer_preset.config.option("nozzle_diameter"));
// ORCA: the left/right combos of a BBL multi-nozzle printer set the nozzles apart without leaving
// the preset (see switch_diameter), so there the preset is only kept while every nozzle matches.
const bool nozzles_apart = nozzle_diameter && nozzle_diameter->size() > 1 && wxGetApp().preset_bundle->is_bbl_vendor() &&
std::any_of(nozzle_diameter->values.begin(), nozzle_diameter->values.end(),
[&diameter](double value) { return get_diameter_string(value) != diameter.ToStdString(); });
// The combo lists printer variants, and the variant of a mixed-nozzle machine ("0.4+0.6") is no
// single extruder's diameter, so the preset's own variant answers first.
const std::string &printer_variant = printer_preset.config.opt_string("printer_variant");
if (printer_variant == diameter.ToStdString()) {
if (printer_variant == diameter.ToStdString() && !nozzles_apart) {
return true;
}
// A named variant ("0.4 High Flow") shares its diameter with the standard profile, which selecting
// the plain diameter switches back to, so only a preset naming no variant is kept by its diameter.
auto* nozzle_diameter = dynamic_cast<const ConfigOptionFloats*>(printer_preset.config.option("nozzle_diameter"));
if (printer_variant.empty() && nozzle_diameter && nozzle_diameter->size() > 0) {
auto current_nozzle_dia = get_diameter_string(nozzle_diameter->values[0]);
// If the selected diameter is the same as current nozzle, don't switch profiles