diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index f14f1eb0a1..bd2bd02a0c 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -3796,9 +3796,9 @@ void PresetBundle::update_filament_count() : filament_presets.back()); } -bool PresetBundle::support_different_extruders() +bool PresetBundle::support_different_extruders() const { - Preset& printer_preset = this->printers.get_edited_preset(); + const Preset& printer_preset = this->printers.get_edited_preset(); int extruder_count; bool supported = printer_preset.config.support_different_extruders(extruder_count); diff --git a/src/libslic3r/PresetBundle.hpp b/src/libslic3r/PresetBundle.hpp index 220de95b78..3ff0e1e8e3 100644 --- a/src/libslic3r/PresetBundle.hpp +++ b/src/libslic3r/PresetBundle.hpp @@ -370,7 +370,7 @@ public: //BBS: add some functions for multiple extruders int get_printer_extruder_count() const; - bool support_different_extruders(); + bool support_different_extruders() const; // Orca: Ensure filament_presets has at least one slot per nozzle on FFF printers. // Called from (load|update)_selections before the parallel project_config arrays diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index be73c9d349..e041d8a147 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -8742,7 +8742,7 @@ bool DynamicPrintConfig::is_using_different_extruders() return ret; } -bool DynamicPrintConfig::support_different_extruders(int& extruder_count) +bool DynamicPrintConfig::support_different_extruders(int& extruder_count) const { std::set variant_set; diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index f9e224449b..8ccc6d304a 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -669,7 +669,7 @@ public: //BBS bool is_using_different_extruders(); - bool support_different_extruders(int& extruder_count); + bool support_different_extruders(int& extruder_count) const; int get_index_for_extruder(int extruder_or_filament_id, std::string id_name, ExtruderType extruder_type, NozzleVolumeType nozzle_volume_type, std::string variant_name, unsigned int stride = 1) const; void update_values_to_printer_extruders(DynamicPrintConfig& printer_config, std::set& key_set, std::string id_name, std::string variant_name, unsigned int stride = 1, unsigned int extruder_id = 0); void update_values_to_printer_extruders_for_multiple_filaments(DynamicPrintConfig& printer_config, std::set& key_set, std::string id_name, std::string variant_name); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index a015c8624e..b407fdbc66 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -638,7 +638,7 @@ void Sidebar::priv::layout_printer(bool isBBL, bool isDual) // ORCA show plate type combo box only when its supported PresetBundle &preset_bundle = *wxGetApp().preset_bundle; - auto cfg = preset_bundle.printers.get_edited_preset().config; + const auto& cfg = preset_bundle.printers.get_edited_preset().config; // Orca: we use preset_bundle.is_bbl_vendor() instead of isBBL to determine if the plate type combo box should be shown // ref: https://github.com/OrcaSlicer/OrcaSlicer/pull/11610#discussion_r2607411847 panel_printer_bed->Show(preset_bundle.is_bbl_vendor() || cfg.opt_bool("support_multi_bed_types")); @@ -647,8 +647,17 @@ void Sidebar::priv::layout_printer(bool isBBL, bool isDual) // NEEDFIX requires AMS check or any type of ??? // Single nozzle & non ams - panel_nozzle_dia->Show(!isDual && preset_bundle.get_printer_extruder_count() < 2); - extruder_single_sizer->Show(false); + if (!isDual) { + // Orca: for printer without flow variant, we do not show flow combo + int extruder_count = 0; + const bool has_flow_variant = cfg.support_different_extruders(extruder_count); + + panel_nozzle_dia->Show(!has_flow_variant); + extruder_single_sizer->Show(has_flow_variant); + } else { + panel_nozzle_dia->Show(false); + extruder_single_sizer->Show(false); + } } void Sidebar::priv::flush_printer_sync(bool restart) @@ -1156,21 +1165,19 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title wxBoxSizer * hsizer_nozzle = new wxBoxSizer(wxHORIZONTAL); hsizer_nozzle->Add(label_flow, 0, wxALIGN_CENTER); hsizer_nozzle->Add(combo_flow, 1, wxEXPAND); - label_flow->Hide(); // TODO: Orca hack, hide flow selection - combo_flow->Hide(); if (index < 0) { label_ams->Hide(); ams_not_installed_msg->Hide(); wxStaticBoxSizer *hsizer = new wxStaticBoxSizer(this, wxHORIZONTAL); hsizer->Add(hsizer_diameter, 1, wxEXPAND | wxTOP| wxBOTTOM, FromDIP(8)); - //hsizer->Add(hsizer_nozzle, 1, wxEXPAND | wxALL, FromDIP(8)); + hsizer->Add(hsizer_nozzle, 1, wxEXPAND | wxALL, FromDIP(8)); hsizer->AddSpacer(FromDIP(2)); // Avoid badge this->sizer = hsizer; } else { wxStaticBoxSizer *vsizer = new wxStaticBoxSizer(this, wxVERTICAL); vsizer->Add(hsizer_ams, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(2)); vsizer->Add(hsizer_diameter, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT | wxBOTTOM, FromDIP(2)); - //vsizer->Add(hsizer_nozzle, 0, wxEXPAND | wxALL, FromDIP(2)); + vsizer->Add(hsizer_nozzle, 0, wxEXPAND | wxALL, FromDIP(2)); this->sizer = vsizer; } AMSCountPopupWindow::UpdateAMSCount(index < 0 ? 0 : index, this); @@ -1331,6 +1338,14 @@ bool Sidebar::priv::switch_diameter(bool single) return wxGetApp().get_tab(Preset::TYPE_PRINTER)->select_preset(preset->name); } +static bool is_skip_high_flow_printer(const std::string& printer) +{ + static const std::set invalidate_list = { + "Bambu Lab X1E" + }; + return invalidate_list.count(printer); +}; + bool Sidebar::priv::sync_extruder_list(bool &only_external_material) { MachineObject *obj = wxGetApp().getDeviceManager()->get_selected_machine(); @@ -2648,8 +2663,6 @@ void Sidebar::update_presets(Preset::Type preset_type) Preset& printer_preset = wxGetApp().preset_bundle->printers.get_edited_preset(); - bool isBBL = preset_bundle.is_bbl_vendor(); - if (auto printer_structure_opt = printer_preset.config.option>("printer_structure")) { wxGetApp().plater()->get_current_canvas3D()->get_arrange_settings().align_to_y_axis = (printer_structure_opt->value == PrinterStructure::psI3); } @@ -2658,11 +2671,50 @@ void Sidebar::update_presets(Preset::Type preset_type) // Update dual extrudes auto* nozzle_diameter = dynamic_cast(printer_preset.config.option("nozzle_diameter")); + auto extruder_variants = printer_preset.config.option("extruder_variant_list"); + std::string printer_model = printer_preset.config.option("printer_model")->value; - bool is_dual_extruder = nozzle_diameter->size() == 2; + bool isBBL = preset_bundle.is_bbl_vendor(); + bool is_dual_extruder = extruder_variants->size() == 2; p->layout_printer(preset_bundle.use_bbl_network(), isBBL && is_dual_extruder); + + // Update nozzle titles from printer config (e.g. "Main Nozzle" / "Auxiliary Nozzle" for N6) + // UI left = DEPUTY_EXTRUDER_ID(1), UI right = MAIN_EXTRUDER_ID(0) + if (is_dual_extruder) { + std::string printer_type = printer_preset.get_printer_type(wxGetApp().preset_bundle); + auto left_title = DevPrinterConfigUtil::get_toolhead_display_name(printer_type, DEPUTY_EXTRUDER_ID, ToolHeadComponent::Nozzle, ToolHeadNameCase::TitleCase); + auto right_title = DevPrinterConfigUtil::get_toolhead_display_name(printer_type, MAIN_EXTRUDER_ID, ToolHeadComponent::Nozzle, ToolHeadNameCase::TitleCase); + p->left_extruder->SetTitle(_L(left_title)); + p->right_extruder->SetTitle(_L(right_title)); + } + + auto extruders_def = printer_preset.config.def()->get("extruder_type"); + auto extruders = printer_preset.config.option("extruder_type"); + auto nozzle_volumes_def = wxGetApp().preset_bundle->project_config.def()->get("nozzle_volume_type"); + auto nozzle_volumes = wxGetApp().preset_bundle->project_config.option("nozzle_volume_type"); auto diameters = wxGetApp().preset_bundle->printers.diameters_of_selected_printer(); auto diameter = printer_preset.config.opt_string("printer_variant"); + auto extruder_max_nozzle_count = printer_preset.config.option("extruder_max_nozzle_count"); + auto update_extruder_variant = [printer_model, extruders_def, extruders, nozzle_volumes_def, nozzle_volumes, extruder_variants,diameter,extruder_max_nozzle_count](ExtruderGroup & extruder, int index) { + extruder.combo_flow->Clear(); + auto type = extruders_def->enum_labels[extruders->values[index]]; + int select = -1; + for (size_t i = 0; i < nozzle_volumes_def->enum_labels.size(); ++i) { + if (boost::algorithm::contains(extruder_variants->values[index], type + " " + nozzle_volumes_def->enum_labels[i]) /*|| + extruder_max_nozzle_count->values[index] > 1 && nozzle_volumes_def->enum_keys_map->at(nozzle_volumes_def->enum_values[i]) == nvtHybrid*/) { // TODO: Orca: Support hybrid + if (nozzle_volumes_def->enum_keys_map->at(nozzle_volumes_def->enum_values[i]) == NozzleVolumeType::nvtHighFlow &&(diameter == "0.2" || + is_skip_high_flow_printer(printer_model))) + continue; + if (nozzle_volumes->values[index] == i) + select = extruder.combo_flow->GetCount(); + extruder.combo_flow->Append(_L(nozzle_volumes_def->enum_labels[i]), {}, (void*)i); + } + } + if (select == -1) + select = extruder.combo_flow->GetCount() - 1; + extruder.combo_flow->SetSelection(select); + }; + auto update_extruder_diameter = [&diameters, &diameter, &nozzle_diameter](int extruder_index,ExtruderGroup & extruder) { extruder.combo_diameter->Clear(); int select = -1; @@ -2691,6 +2743,8 @@ void Sidebar::update_presets(Preset::Type preset_type) p->right_extruder->SetTitle(_L(DevPrinterConfigUtil::get_toolhead_display_name(printer_type, MAIN_EXTRUDER_ID, ToolHeadComponent::Nozzle, ToolHeadNameCase::TitleCase))); AMSCountPopupWindow::UpdateAMSCount(0, p->left_extruder); AMSCountPopupWindow::UpdateAMSCount(1, p->right_extruder); + update_extruder_variant(*p->left_extruder, 0); + update_extruder_variant(*p->right_extruder, 1); //if (!p->is_switching_diameter) { update_extruder_diameter(0, *p->left_extruder); update_extruder_diameter(1, *p->right_extruder); @@ -2698,6 +2752,7 @@ void Sidebar::update_presets(Preset::Type preset_type) p->image_printer_bed->SetBitmap(create_scaled_bitmap(image_path, this, PRINTER_THUMBNAIL_SIZE.GetHeight())); } else { AMSCountPopupWindow::UpdateAMSCount(0, p->single_extruder); + update_extruder_variant(*p->single_extruder, 0); //if (!p->is_switching_diameter) update_extruder_diameter(0, *p->single_extruder);