diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 29c636efbb..956d3e65fb 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -477,7 +477,7 @@ void Preview::update_layers_slider_mode() // BBS if (wxGetApp().filaments_cnt() > 1) { //const ModelObjectPtrs& objects = wxGetApp().plater()->model().objects; - auto plate_extruders = wxGetApp().plater()->get_partplate_list().get_curr_plate()->get_extruders(); + auto plate_extruders = wxGetApp().plater()->get_partplate_list().get_curr_plate()->get_extruders_without_support(); for (auto extruder : plate_extruders) { if (extruder != plate_extruders[0]) can_change_color = false; @@ -486,23 +486,23 @@ void Preview::update_layers_slider_mode() if (!plate_extruders.empty()) { //const int extruder = objects[0]->config.has("extruder") ? objects[0]->config.option("extruder")->getInt() : 0; only_extruder = plate_extruders[0]; - // auto is_one_extruder_printed_model = [objects, extruder]() { - // for (ModelObject *object : objects) { - // if (object->config.has("extruder") && object->config.option("extruder")->getInt() != extruder) /*return false*/; + // auto is_one_extruder_printed_model = [objects, extruder]() { + // for (ModelObject *object : objects) { + // if (object->config.has("extruder") && object->config.option("extruder")->getInt() != extruder) /*return false*/; - // for (ModelVolume *volume : object->volumes) - // if ((volume->config.has("extruder") && volume->config.option("extruder")->getInt() != extruder) || !volume->mmu_segmentation_facets.empty()) return false; + // for (ModelVolume *volume : object->volumes) + // if ((volume->config.has("extruder") && volume->config.option("extruder")->getInt() != extruder) || !volume->mmu_segmentation_facets.empty()) return false; - // for (const auto &range : object->layer_config_ranges) - // if (range.second.has("extruder") && range.second.option("extruder")->getInt() != extruder) return false; - // } - // return true; - // }; + // for (const auto &range : object->layer_config_ranges) + // if (range.second.has("extruder") && range.second.option("extruder")->getInt() != extruder) return false; + // } + // return true; + // }; - // if (is_one_extruder_printed_model()) - // only_extruder = extruder; - // else - // one_extruder_printed_model = false; + // if (is_one_extruder_printed_model()) + // only_extruder = extruder; + // else + // one_extruder_printed_model = false; } } diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index 52b86918ae..2f9014ed9c 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -1335,6 +1335,51 @@ std::vector PartPlate::get_extruders(bool conside_custom_gcode) const return plate_extruders; } +std::vector PartPlate::get_extruders_without_support(bool conside_custom_gcode) const +{ + std::vector plate_extruders; + // if gcode.3mf file + if (m_model->objects.empty()) { + for (int i = 0; i < slice_filaments_info.size(); i++) { + plate_extruders.push_back(slice_filaments_info[i].id + 1); + } + return plate_extruders; + } + + // if 3mf file + const DynamicPrintConfig& glb_config = wxGetApp().preset_bundle->prints.get_edited_preset().config; + + for (int obj_idx = 0; obj_idx < m_model->objects.size(); obj_idx++) { + if (!contain_instance_totally(obj_idx, 0)) + continue; + + ModelObject* mo = m_model->objects[obj_idx]; + for (ModelVolume* mv : mo->volumes) { + std::vector volume_extruders = mv->get_extruders(); + plate_extruders.insert(plate_extruders.end(), volume_extruders.begin(), volume_extruders.end()); + } + } + + if (conside_custom_gcode) { + //BBS + int nums_extruders = 0; + if (const ConfigOptionStrings* color_option = dynamic_cast(wxGetApp().preset_bundle->project_config.option("filament_colour"))) { + nums_extruders = color_option->values.size(); + if (m_model->plates_custom_gcodes.find(m_plate_index) != m_model->plates_custom_gcodes.end()) { + for (auto item : m_model->plates_custom_gcodes.at(m_plate_index).gcodes) { + if (item.type == CustomGCode::Type::ToolChange && item.extruder <= nums_extruders) + plate_extruders.push_back(item.extruder); + } + } + } + } + + std::sort(plate_extruders.begin(), plate_extruders.end()); + auto it_end = std::unique(plate_extruders.begin(), plate_extruders.end()); + plate_extruders.resize(std::distance(plate_extruders.begin(), it_end)); + return plate_extruders; +} + std::vector PartPlate::get_used_extruders() { std::vector used_extruders; diff --git a/src/slic3r/GUI/PartPlate.hpp b/src/slic3r/GUI/PartPlate.hpp index 46de2b62e9..9ca59de713 100644 --- a/src/slic3r/GUI/PartPlate.hpp +++ b/src/slic3r/GUI/PartPlate.hpp @@ -285,6 +285,7 @@ public: Vec3d get_origin() { return m_origin; } Vec3d estimate_wipe_tower_size(const double w, const double wipe_volume) const; std::vector get_extruders(bool conside_custom_gcode = false) const; + std::vector get_extruders_without_support(bool conside_custom_gcode = false) const; std::vector get_used_extruders(); /* instance related operations*/