From 213add1b2bc5c8f580204f134daf39f2c0a9eac5 Mon Sep 17 00:00:00 2001 From: David Kocik Date: Thu, 30 Sep 2021 14:28:06 +0200 Subject: [PATCH 1/4] Revert Object warning notification to SimplifySuggestion followup of commit 0d0c09288058ee0b3e5565f3087321cd530038d6. --- src/slic3r/GUI/NotificationManager.cpp | 22 +++++++++++----------- src/slic3r/GUI/NotificationManager.hpp | 24 +++++++++++++----------- src/slic3r/GUI/Plater.cpp | 11 +++++++---- 3 files changed, 31 insertions(+), 26 deletions(-) diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index 98abb4863c..112144b298 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -1518,7 +1518,7 @@ void NotificationManager::push_slicing_warning_notification(const std::string& t { NotificationData data { NotificationType::SlicingWarning, NotificationLevel::WarningNotificationLevel, 0, _u8L("WARNING:") + "\n" + text }; - auto notification = std::make_unique(data, m_id_provider, m_evt_handler); + auto notification = std::make_unique(data, m_id_provider, m_evt_handler); notification->object_id = oid; notification->warning_step = warning_step; if (push_notification_data(std::move(notification), 0)) { @@ -1609,12 +1609,11 @@ void NotificationManager::close_slicing_error_notification(const std::string& te } } } -void NotificationManager::push_object_warning_notification(const std::string& text, ObjectID object_id, const std::string& hypertext/* = ""*/, std::function callback/* = std::function()*/) +void NotificationManager::push_simplify_suggestion_notification(const std::string& text, ObjectID object_id, const std::string& hypertext/* = ""*/, std::function callback/* = std::function()*/) { - NotificationData data{ NotificationType::ObjectWarning, NotificationLevel::WarningNotificationLevel, 0, text, hypertext, callback }; - auto notification = std::make_unique(data, m_id_provider, m_evt_handler); + NotificationData data{ NotificationType::SimplifySuggestion, NotificationLevel::RegularNotificationLevel, 10, text, hypertext, callback }; + auto notification = std::make_unique(data, m_id_provider, m_evt_handler); notification->object_id = object_id; - notification->warning_step = 0; push_notification_data(std::move(notification), 0); } void NotificationManager::close_notification_of_type(const NotificationType type) @@ -1630,19 +1629,20 @@ void NotificationManager::remove_slicing_warnings_of_released_objects(const std: for (std::unique_ptr ¬ification : m_pop_notifications) if (notification->get_type() == NotificationType::SlicingWarning) { if (! std::binary_search(living_oids.begin(), living_oids.end(), - static_cast(notification.get())->object_id)) + static_cast(notification.get())->object_id)) notification->close(); } } -void NotificationManager::remove_object_warnings_of_released_objects(const std::vector& living_oids) +void NotificationManager::remove_simplify_suggestion_of_released_objects(const std::vector& living_oids) { for (std::unique_ptr& notification : m_pop_notifications) - if (notification->get_type() == NotificationType::ObjectWarning) { + if (notification->get_type() == NotificationType::SimplifySuggestion) { if (!std::binary_search(living_oids.begin(), living_oids.end(), - static_cast(notification.get())->object_id)) + static_cast(notification.get())->object_id)) notification->close(); } } + void NotificationManager::push_exporting_finished_notification(const std::string& path, const std::string& dir_path, bool on_removable) { close_notification_of_type(NotificationType::ExportFinished); @@ -2084,8 +2084,8 @@ bool NotificationManager::activate_existing(const NotificationManager::PopNotifi continue; } } else if (new_type == NotificationType::SlicingWarning) { - auto w1 = dynamic_cast(notification); - auto w2 = dynamic_cast(it->get()); + auto w1 = dynamic_cast(notification); + auto w2 = dynamic_cast(it->get()); if (w1 != nullptr && w2 != nullptr) { if (!(*it)->compare_text(new_text) || w1->object_id != w2->object_id) { continue; diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 4481ed7018..096fe162e2 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -71,9 +71,6 @@ enum class NotificationType PlaterError, // Object fully outside the print volume, or extrusion outside the print volume. Slicing is not disabled. PlaterWarning, - // Warning connected to single object id, appears at loading object, disapears at deletition. - // Example: advice to simplify object with big amount of triangles. - ObjectWarning, // Progress bar instead of text. ProgressBar, // Progress bar with info from Print Host Upload Queue dialog. @@ -105,7 +102,10 @@ enum class NotificationType // Might contain logo taken from gizmos UpdatedItemsInfo, // Progress bar notification with methods to replace ProgressIndicator class. - ProgressIndicator + ProgressIndicator, + // Give user advice to simplify object with big amount of triangles + // Contains ObjectID for closing when object is deleted + SimplifySuggestion }; class NotificationManager @@ -167,11 +167,11 @@ public: void close_plater_error_notification(const std::string& text); void close_plater_warning_notification(const std::string& text); // Object warning with ObjectID, closes when object is deleted. ID used is of object not print like in slicing warning. - void push_object_warning_notification(const std::string& text, ObjectID object_id, const std::string& hypertext = "", + void push_simplify_suggestion_notification(const std::string& text, ObjectID object_id, const std::string& hypertext = "", std::function callback = std::function()); // Close object warnings, whose ObjectID is not in the list. // living_oids is expected to be sorted. - void remove_object_warnings_of_released_objects(const std::vector& living_oids); + void remove_simplify_suggestion_of_released_objects(const std::vector& living_oids); // Called when the side bar changes its visibility, as the "slicing complete" notification supplements // the "slicing info" normally shown at the side bar. void set_sidebar_collapsed(bool collapsed); @@ -394,12 +394,14 @@ private: - class SlicingWarningNotification : public PopNotification + class ObjectIDNotification : public PopNotification { public: - SlicingWarningNotification(const NotificationData& n, NotificationIDProvider& id_provider, wxEvtHandler* evt_handler) : PopNotification(n, id_provider, evt_handler) {} + ObjectIDNotification(const NotificationData& n, NotificationIDProvider& id_provider, wxEvtHandler* evt_handler) + : PopNotification(n, id_provider, evt_handler) + {} ObjectID object_id; - int warning_step; + int warning_step { 0 }; }; class PlaterWarningNotification : public PopNotification @@ -691,7 +693,7 @@ private: void sort_notifications(); // If there is some error notification active, then the "Export G-code" notification after the slicing is finished is suppressed. bool has_slicing_error_notification(); - + // set by init(), until false notifications are only added not updated and frame is not requested after push bool m_initialized{ false }; // Target for wxWidgets events sent by clicking on the hyperlink available at some notifications. @@ -715,7 +717,7 @@ private: NotificationType::PlaterWarning, NotificationType::ProgressBar, NotificationType::PrintHostUpload, - NotificationType::ObjectWarning + NotificationType::SimplifySuggestion }; //prepared (basic) notifications static const NotificationData basic_notifications[]; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 7669bc89e6..0d74ae524d 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3711,8 +3711,8 @@ void Plater::priv::create_simplify_notification(const std::vector& obj_i "amount of triangles."); t.replace(t.find("@object_name"), sizeof("@object_name") - 1, model.objects[object_id]->name); - std::stringstream text; - text << _u8L("WARNING:") << "\n" << t << "\n"; + //std::stringstream text; + //text << t << "\n"; std::string hypertext = _u8L("Simplify model"); std::function open_simplify = [object_id](wxEvtHandler *) { @@ -3727,7 +3727,10 @@ void Plater::priv::create_simplify_notification(const std::vector& obj_i manager.open_gizmo(GLGizmosManager::EType::Simplify); return true; }; - notification_manager->push_object_warning_notification(text.str(), model.objects[object_id]->id(), hypertext, open_simplify); + notification_manager->push_simplify_suggestion_notification(t, + model.objects[object_id]->id(), + hypertext, + open_simplify); } } @@ -4000,7 +4003,7 @@ void Plater::priv::actualize_object_warnings(const PrintBase& print) ids.push_back(object->id()); } std::sort(ids.begin(), ids.end()); - notification_manager->remove_object_warnings_of_released_objects(ids); + notification_manager->remove_simplify_suggestion_of_released_objects(ids); } void Plater::priv::clear_warnings() { From 117c4a432eb7f0057febb50ea2f03cd66f65744d Mon Sep 17 00:00:00 2001 From: David Kocik Date: Thu, 30 Sep 2021 14:58:22 +0200 Subject: [PATCH 2/4] Object info notification level --- src/slic3r/GUI/NotificationManager.cpp | 20 +++++--------------- src/slic3r/GUI/NotificationManager.hpp | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index 112144b298..6e0427c78c 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -43,10 +43,10 @@ const NotificationManager::NotificationData NotificationManager::basic_notificat }, {NotificationType::NewAppAvailable, NotificationLevel::ImportantNotificationLevel, 20, _u8L("New version is available."), _u8L("See Releases page."), [](wxEvtHandler* evnthndlr) { wxGetApp().open_browser_with_warning_dialog("https://github.com/prusa3d/PrusaSlicer/releases"); return true; }}, - {NotificationType::EmptyColorChangeCode, NotificationLevel::RegularNotificationLevel, 10, + {NotificationType::EmptyColorChangeCode, NotificationLevel::ObjectInfoNotificationLevel, 10, _u8L("You have just added a G-code for color change, but its value is empty.\n" "To export the G-code correctly, check the \"Color Change G-code\" in \"Printer Settings > Custom G-code\"") }, - {NotificationType::EmptyAutoColorChange, NotificationLevel::RegularNotificationLevel, 10, + {NotificationType::EmptyAutoColorChange, NotificationLevel::ObjectInfoNotificationLevel, 10, _u8L("No color change event was added to the print. The print does not look like a sign.") }, {NotificationType::DesktopIntegrationSuccess, NotificationLevel::RegularNotificationLevel, 10, _u8L("Desktop integration was successful.") }, @@ -1489,17 +1489,7 @@ void NotificationManager::push_notification(NotificationType type, std::function callback, int timestamp) { - int duration = 0; - switch (level) { - case NotificationLevel::RegularNotificationLevel: duration = 10; break; - case NotificationLevel::ErrorNotificationLevel: break; - case NotificationLevel::WarningNotificationLevel: break; - case NotificationLevel::ImportantNotificationLevel: break; - case NotificationLevel::ProgressBarNotificationLevel: break; - default: - assert(false); - return; - } + int duration = get_standart_duration(level); push_notification_data({ type, level, duration, text, hypertext, callback }, timestamp); } void NotificationManager::push_validate_error_notification(const std::string& text) @@ -1611,7 +1601,7 @@ void NotificationManager::close_slicing_error_notification(const std::string& te } void NotificationManager::push_simplify_suggestion_notification(const std::string& text, ObjectID object_id, const std::string& hypertext/* = ""*/, std::function callback/* = std::function()*/) { - NotificationData data{ NotificationType::SimplifySuggestion, NotificationLevel::RegularNotificationLevel, 10, text, hypertext, callback }; + NotificationData data{ NotificationType::SimplifySuggestion, NotificationLevel::ObjectInfoNotificationLevel, 10, text, hypertext, callback }; auto notification = std::make_unique(data, m_id_provider, m_evt_handler); notification->object_id = object_id; push_notification_data(std::move(notification), 0); @@ -1921,7 +1911,7 @@ void NotificationManager::push_updated_item_info_notification(InfoItemType type) } } - NotificationData data{ NotificationType::UpdatedItemsInfo, NotificationLevel::RegularNotificationLevel, 5, "" }; + NotificationData data{ NotificationType::UpdatedItemsInfo, NotificationLevel::ObjectInfoNotificationLevel, 10, "" }; auto notification = std::make_unique(data, m_id_provider, m_evt_handler, type); if (push_notification_data(std::move(notification), 0)) { (dynamic_cast(m_pop_notifications.back().get()))->add_type(type); diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 096fe162e2..1649a1308e 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -121,6 +121,8 @@ public: HintNotificationLevel, // "Good to know" notification, usually but not always with a quick fade-out. RegularNotificationLevel, + // Regular level notifiaction containing info about objects or print. Has Icon. + ObjectInfoNotificationLevel, // Information notification without a fade-out or with a longer fade-out. ImportantNotificationLevel, // Warning, no fade-out. @@ -693,6 +695,19 @@ private: void sort_notifications(); // If there is some error notification active, then the "Export G-code" notification after the slicing is finished is suppressed. bool has_slicing_error_notification(); + size_t get_standart_duration(NotificationLevel level) + { + switch (level) { + case NotificationLevel::RegularNotificationLevel: return 20; + case NotificationLevel::ErrorNotificationLevel: return 0; + case NotificationLevel::WarningNotificationLevel: return 0; + case NotificationLevel::ImportantNotificationLevel: return 0; + case NotificationLevel::ProgressBarNotificationLevel: return 2; + case NotificationLevel::HintNotificationLevel: return 300; + case NotificationLevel::ObjectInfoNotificationLevel: return 20; + default: return 10; + } + } // set by init(), until false notifications are only added not updated and frame is not requested after push bool m_initialized{ false }; From 5a45c94ccd0853a00f81ec9f1d2ba4ac3838110d Mon Sep 17 00:00:00 2001 From: David Kocik Date: Thu, 30 Sep 2021 15:45:30 +0200 Subject: [PATCH 3/4] Remove duplicit warning about not enabled support enforcers --- src/libslic3r/PrintObject.cpp | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 74ef27bd74..f49eddf3e4 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -397,22 +397,6 @@ void PrintObject::generate_support_material() if (layer->empty()) throw Slic3r::SlicingError("Levitating objects cannot be printed without supports."); #endif - - // Do we have custom support data that would not be used? - // Notify the user in that case. - if (! this->has_support()) { - for (const ModelVolume* mv : this->model_object()->volumes) { - bool has_enforcers = mv->is_support_enforcer() || - (mv->is_model_part() && mv->supported_facets.has_facets(*mv, EnforcerBlockerType::ENFORCER)); - if (has_enforcers) { - this->active_step_add_warning(PrintStateBase::WarningLevel::CRITICAL, - L("An object has custom support enforcers which will not be used " - "because supports are off. Consider turning them on.") + "\n" + - (L("Object name")) + ": " + this->model_object()->name); - break; - } - } - } } this->set_done(posSupportMaterial); } From b1c105596328d5b947e403683f31d1715b7449cb Mon Sep 17 00:00:00 2001 From: David Kocik Date: Thu, 30 Sep 2021 17:29:34 +0200 Subject: [PATCH 4/4] Close updated item info notification at new item loading --- src/slic3r/GUI/NotificationManager.cpp | 5 ++++- src/slic3r/GUI/NotificationManager.hpp | 6 ++++++ src/slic3r/GUI/Plater.cpp | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index 6e0427c78c..a2a0b29654 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -373,7 +373,7 @@ void NotificationManager::PopNotification::init() void NotificationManager::PopNotification::set_next_window_size(ImGuiWrapper& imgui) { m_window_height = m_multiline ? - m_lines_count * m_line_height : + std::max(m_lines_count, (size_t)2) * m_line_height : 2 * m_line_height; m_window_height += 1 * m_line_height; // top and bottom } @@ -1055,6 +1055,8 @@ void NotificationManager::UpdatedItemsInfoNotification::add_type(InfoItemType ty std::string text; for (it = m_types_and_counts.begin(); it != m_types_and_counts.end(); ++it) { + if ((*it).second == 0) + continue; text += std::to_string((*it).second); text += _L_PLURAL(" Object was loaded with "," Objects were loaded with ", (*it).second).ToUTF8().data(); switch ((*it).first) { @@ -1066,6 +1068,7 @@ void NotificationManager::UpdatedItemsInfoNotification::add_type(InfoItemType ty default: BOOST_LOG_TRIVIAL(error) << "Unknown InfoItemType: " << (*it).second; break; } } + m_state = EState::Unknown; NotificationData data { get_data().type, get_data().level , get_data().duration, text }; update(data); } diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 1649a1308e..4a92e1c42c 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -214,6 +214,7 @@ public: bool is_hint_notification_open(); // Forces Hints to reload its content when next hint should be showed void deactivate_loaded_hints(); + // Adds counter to existing UpdatedItemsInfo notification or opens new one void push_updated_item_info_notification(InfoItemType type); // Close old notification ExportFinished. void new_export_began(bool on_removable); @@ -653,6 +654,11 @@ private: } void count_spaces() override; void add_type(InfoItemType type); + void close() override{ + for (auto& tac : m_types_and_counts) + tac.second = 0; + PopNotification::close(); + } protected: void render_left_sign(ImGuiWrapper& imgui) override; std::vector> m_types_and_counts; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 0d74ae524d..8c578a2d68 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2600,6 +2600,7 @@ std::vector Plater::priv::load_model_objects(const ModelObjectPtrs& mode // so 3D-scene should be updated before object additing to the ObjectList this->view3D->reload_scene(false, (unsigned int)UpdateParams::FORCE_FULL_SCREEN_REFRESH); + notification_manager->close_notification_of_type(NotificationType::UpdatedItemsInfo); for (const size_t idx : obj_idxs) { wxGetApp().obj_list()->add_object_to_list(idx); }