Added a limitation on the number of usable extruders in the multi-material gizmo. If a printer has more extruders than this limit, a notification about it is shown.
This commit is contained in:
parent
23b26cb3f3
commit
48789e5ae1
3 changed files with 31 additions and 3 deletions
|
@ -8,6 +8,7 @@
|
||||||
#include "slic3r/GUI/BitmapCache.hpp"
|
#include "slic3r/GUI/BitmapCache.hpp"
|
||||||
#include "slic3r/GUI/format.hpp"
|
#include "slic3r/GUI/format.hpp"
|
||||||
#include "slic3r/GUI/GUI_ObjectList.hpp"
|
#include "slic3r/GUI/GUI_ObjectList.hpp"
|
||||||
|
#include "slic3r/GUI/NotificationManager.hpp"
|
||||||
#include "libslic3r/PresetBundle.hpp"
|
#include "libslic3r/PresetBundle.hpp"
|
||||||
#include "libslic3r/Model.hpp"
|
#include "libslic3r/Model.hpp"
|
||||||
|
|
||||||
|
@ -16,6 +17,22 @@
|
||||||
|
|
||||||
namespace Slic3r::GUI {
|
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()
|
void GLGizmoMmuSegmentation::on_shutdown()
|
||||||
{
|
{
|
||||||
m_parent.use_slope(false);
|
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();
|
ModelObject *model_object = m_c->selection_info()->model_object();
|
||||||
int prev_extruders_count = int(m_original_extruders_colors.size());
|
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 (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();
|
this->init_extruders_data();
|
||||||
// Reinitialize triangle selectors because of change of extruder count need also change the size of GLIndexedVertexArray
|
// Reinitialize triangle selectors because of change of extruder count need also change the size of GLIndexedVertexArray
|
||||||
if (prev_extruders_count != wxGetApp().extruders_edited_cnt())
|
if (prev_extruders_count != wxGetApp().extruders_edited_cnt())
|
||||||
|
@ -158,7 +178,7 @@ static void render_extruders_combo(const std::string &labe
|
||||||
ImGui::BeginGroup();
|
ImGui::BeginGroup();
|
||||||
ImVec2 combo_pos = ImGui::GetCursorScreenPos();
|
ImVec2 combo_pos = ImGui::GetCursorScreenPos();
|
||||||
if (ImGui::BeginCombo(label.c_str(), "")) {
|
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));
|
ImGui::PushID(int(extruder_idx));
|
||||||
ImVec2 start_position = ImGui::GetCursorScreenPos();
|
ImVec2 start_position = ImGui::GetCursorScreenPos();
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,12 @@ public:
|
||||||
|
|
||||||
void set_painter_gizmo_data(const Selection& selection) override;
|
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:
|
protected:
|
||||||
std::array<float, 4> get_cursor_sphere_left_button_color() const override;
|
std::array<float, 4> get_cursor_sphere_left_button_color() const override;
|
||||||
std::array<float, 4> get_cursor_sphere_right_button_color() const override;
|
std::array<float, 4> get_cursor_sphere_right_button_color() const override;
|
||||||
|
@ -63,7 +69,7 @@ private:
|
||||||
void update_model_object() const override;
|
void update_model_object() const override;
|
||||||
void update_from_model_object() override;
|
void update_from_model_object() override;
|
||||||
|
|
||||||
void on_opening() override {}
|
void on_opening() override;
|
||||||
void on_shutdown() override;
|
void on_shutdown() override;
|
||||||
PainterGizmoType get_painter_type() const override;
|
PainterGizmoType get_painter_type() const override;
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,9 @@ enum class NotificationType
|
||||||
DesktopIntegrationSuccess,
|
DesktopIntegrationSuccess,
|
||||||
DesktopIntegrationFail,
|
DesktopIntegrationFail,
|
||||||
UndoDesktopIntegrationSuccess,
|
UndoDesktopIntegrationSuccess,
|
||||||
UndoDesktopIntegrationFail
|
UndoDesktopIntegrationFail,
|
||||||
|
// Notification that a printer has more extruders than are supported by MM Gizmo/segmentation.
|
||||||
|
MmSegmentationExceededExtrudersLimit
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue