diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index e42bc599df..c0dae74de6 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -447,40 +447,45 @@ void Preview::update_layers_slider_mode() // multi-extruder printer profile , but whole model is printed by only one extruder // false -> multi-extruder printer profile , and model is printed by several extruders bool one_extruder_printed_model = true; - + bool can_change_color = true; // extruder used for whole model for multi-extruder printer profile int only_extruder = -1; // BBS if (wxGetApp().filaments_cnt() > 1) { - const ModelObjectPtrs &objects = wxGetApp().plater()->model().objects; - + //const ModelObjectPtrs& objects = wxGetApp().plater()->model().objects; + auto plate_extruders = wxGetApp().plater()->get_partplate_list().get_curr_plate()->get_extruders(); + for (auto extruder : plate_extruders) { + if (extruder != plate_extruders[0]) + can_change_color = false; + } // check if whole model uses just only one extruder - if (!objects.empty()) { - const int extruder = objects[0]->config.has("extruder") ? objects[0]->config.option("extruder")->getInt() : 0; + if (!plate_extruders.empty()) { + //const int extruder = objects[0]->config.has("extruder") ? objects[0]->config.option("extruder")->getInt() : 0; + const int extruder = plate_extruders[0]; + only_extruder = extruder; + // 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; } } IMSlider *m_layers_slider = m_canvas->get_gcode_viewer().get_layers_slider(); - m_layers_slider->SetModeAndOnlyExtruder(one_extruder_printed_model, only_extruder); + m_layers_slider->SetModeAndOnlyExtruder(one_extruder_printed_model, only_extruder, can_change_color); } void Preview::update_layers_slider_from_canvas(wxKeyEvent &event) diff --git a/src/slic3r/GUI/IMSlider.cpp b/src/slic3r/GUI/IMSlider.cpp index ac3c0da2b1..7bda99eb88 100644 --- a/src/slic3r/GUI/IMSlider.cpp +++ b/src/slic3r/GUI/IMSlider.cpp @@ -521,6 +521,11 @@ Info IMSlider::GetTicksValues() const void IMSlider::SetTicksValues(const Info &custom_gcode_per_print_z) { + if (!m_can_change_color) { + m_ticks.erase_all_ticks_with_code(ToolChange); + return; + } + if (m_values.empty()) { m_ticks.mode = m_mode; return; @@ -584,7 +589,7 @@ void IMSlider::SetDrawMode(bool is_sequential_print) dmRegular; } -void IMSlider::SetModeAndOnlyExtruder(const bool is_one_extruder_printed_model, const int only_extruder) +void IMSlider::SetModeAndOnlyExtruder(const bool is_one_extruder_printed_model, const int only_extruder, bool can_change_color) { m_mode = !is_one_extruder_printed_model ? MultiExtruder : only_extruder < 0 ? SingleExtruder : MultiAsSingle; if (!m_ticks.mode || (m_ticks.empty() && m_ticks.mode != m_mode)) m_ticks.mode = m_mode; @@ -593,6 +598,8 @@ void IMSlider::SetModeAndOnlyExtruder(const bool is_one_extruder_printed_model, UseDefaultColors(m_mode == SingleExtruder); m_is_wipe_tower = m_mode != SingleExtruder; + + m_can_change_color = can_change_color; } void IMSlider::SetExtruderColors( const std::vector& extruder_colors) @@ -1252,7 +1259,10 @@ void IMSlider::render_menu() //BBS render this menu item only when extruder_num > 1 if (extruder_num > 1) { - if (begin_menu(_u8L("Change Filament").c_str())) { + if (!m_can_change_color) { + begin_menu(_u8L("Change Filament").c_str(), false); + } + else if (begin_menu(_u8L("Change Filament").c_str())) { for (int i = 0; i < extruder_num; i++) { std::array rgba = decode_color_to_float_array(colors[i]); ImU32 icon_clr = IM_COL32(rgba[0] * 255.0f, rgba[1] * 255.0f, rgba[2] * 255.0f, rgba[3] * 255.0f); diff --git a/src/slic3r/GUI/IMSlider.hpp b/src/slic3r/GUI/IMSlider.hpp index 5967bcd875..c30c7451cf 100644 --- a/src/slic3r/GUI/IMSlider.hpp +++ b/src/slic3r/GUI/IMSlider.hpp @@ -245,7 +245,7 @@ public: void SetExtraStyle(long style) { m_extra_style = style; } void SetManipulationMode(Mode mode) { m_mode = mode; } Mode GetManipulationMode() const { return m_mode; } - void SetModeAndOnlyExtruder(const bool is_one_extruder_printed_model, const int only_extruder); + void SetModeAndOnlyExtruder(const bool is_one_extruder_printed_model, const int only_extruder, bool can_change_color); void SetExtruderColors(const std::vector &extruder_colors); bool IsNewPrint(); @@ -360,6 +360,7 @@ private: std::vector m_layers_times; std::vector m_layers_values; std::vector m_extruder_colors; + bool m_can_change_color; std::string m_print_obj_idxs; bool m_is_need_post_tick_changed_event { false }; Type m_tick_change_event_type;