diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp index 2ebf0d26e..2abc35344 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp @@ -8,6 +8,7 @@ #include "slic3r/GUI/BitmapCache.hpp" #include "slic3r/GUI/format.hpp" #include "slic3r/GUI/GUI_ObjectList.hpp" +#include "slic3r/GUI/NotificationManager.hpp" #include "libslic3r/PresetBundle.hpp" #include "libslic3r/Model.hpp" @@ -16,6 +17,22 @@ namespace Slic3r::GUI { +static inline void show_notification_extruders_limit_exceeded() +{ + wxGetApp() + .plater() + ->get_notification_manager() + ->push_notification(NotificationType::MmSegmentationExceededExtrudersLimit, NotificationManager::NotificationLevel::RegularNotification, + GUI::format(_L("Your printer has more extruders than the multi-material painting gizmo supports. For this reason, only the " + "first %1% extruders will be able to be used for painting."), GLGizmoMmuSegmentation::EXTRUDERS_LIMIT)); +} + +void GLGizmoMmuSegmentation::on_opening() +{ + if (wxGetApp().extruders_edited_cnt() > int(GLGizmoMmuSegmentation::EXTRUDERS_LIMIT)) + show_notification_extruders_limit_exceeded(); +} + void GLGizmoMmuSegmentation::on_shutdown() { m_parent.use_slope(false); @@ -132,6 +149,9 @@ void GLGizmoMmuSegmentation::set_painter_gizmo_data(const Selection &selection) ModelObject *model_object = m_c->selection_info()->model_object(); int prev_extruders_count = int(m_original_extruders_colors.size()); if (prev_extruders_count != wxGetApp().extruders_edited_cnt() || get_extruders_colors() != m_original_extruders_colors) { + if (wxGetApp().extruders_edited_cnt() > int(GLGizmoMmuSegmentation::EXTRUDERS_LIMIT)) + show_notification_extruders_limit_exceeded(); + this->init_extruders_data(); // Reinitialize triangle selectors because of change of extruder count need also change the size of GLIndexedVertexArray if (prev_extruders_count != wxGetApp().extruders_edited_cnt()) @@ -158,7 +178,7 @@ static void render_extruders_combo(const std::string &labe ImGui::BeginGroup(); ImVec2 combo_pos = ImGui::GetCursorScreenPos(); if (ImGui::BeginCombo(label.c_str(), "")) { - for (size_t extruder_idx = 0; extruder_idx < extruders.size(); ++extruder_idx) { + for (size_t extruder_idx = 0; extruder_idx < std::min(extruders.size(), GLGizmoMmuSegmentation::EXTRUDERS_LIMIT); ++extruder_idx) { ImGui::PushID(int(extruder_idx)); ImVec2 start_position = ImGui::GetCursorScreenPos(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp index f5c97801b..5ece0ec2a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp @@ -36,6 +36,12 @@ public: void set_painter_gizmo_data(const Selection& selection) override; + // TriangleSelector::serialization/deserialization has a limit to store 19 different states. + // EXTRUDER_LIMIT + 1 states are used to storing the painting because also uncolored triangles are stored. + // When increasing EXTRUDER_LIMIT, it needs to ensure that TriangleSelector::serialization/deserialization + // will be also extended to support additional states, requiring at least one state to remain free out of 19 states. + static const constexpr size_t EXTRUDERS_LIMIT = 16; + protected: std::array get_cursor_sphere_left_button_color() const override; std::array get_cursor_sphere_right_button_color() const override; @@ -63,7 +69,7 @@ private: void update_model_object() const override; void update_from_model_object() override; - void on_opening() override {} + void on_opening() override; void on_shutdown() override; PainterGizmoType get_painter_type() const override; diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 1bcb93de0..17db606c0 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -87,7 +87,9 @@ enum class NotificationType DesktopIntegrationSuccess, DesktopIntegrationFail, UndoDesktopIntegrationSuccess, - UndoDesktopIntegrationFail + UndoDesktopIntegrationFail, + // Notification that a printer has more extruders than are supported by MM Gizmo/segmentation. + MmSegmentationExceededExtrudersLimit };