From 056d7035737265e04ea2848d967fad32b5cf24f5 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Thu, 16 Feb 2023 10:18:40 +0100 Subject: [PATCH] Added cache for sequential printing clearance contours into class Print to avoid calculate them twice when needed. --- src/libslic3r/Print.cpp | 8 +++++--- src/libslic3r/Print.hpp | 4 ++++ src/slic3r/GUI/Plater.cpp | 8 +++----- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 3c810b178..0570853ff 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -471,11 +471,13 @@ std::string Print::validate(std::string* warning) const return L("The supplied settings will cause an empty print."); if (m_config.complete_objects) { - if (! sequential_print_horizontal_clearance_valid(*this)) + if (!sequential_print_horizontal_clearance_valid(*this, const_cast(&m_sequential_print_clearance_polygons))) return L("Some objects are too close; your extruder will collide with them."); - if (! sequential_print_vertical_clearance_valid(*this)) - return L("Some objects are too tall and cannot be printed without extruder collisions."); + if (!sequential_print_vertical_clearance_valid(*this)) + return L("Some objects are too tall and cannot be printed without extruder collisions."); } + else + const_cast(&m_sequential_print_clearance_polygons)->clear(); if (m_config.avoid_crossing_perimeters && m_config.avoid_crossing_curled_overhangs) { return L("Avoid crossing perimeters option and avoid crossing curled overhangs option cannot be both enabled together."); diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 3795c2449..580980cfc 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -597,6 +597,7 @@ public: const PrintRegion& get_print_region(size_t idx) const { return *m_print_regions[idx]; } const ToolOrdering& get_tool_ordering() const { return m_wipe_tower_data.tool_ordering; } + const Polygons& get_sequential_print_clearance_polygons() const { return m_sequential_print_clearance_polygons; } static bool sequential_print_horizontal_clearance_valid(const Print& print, Polygons* polygons = nullptr); protected: @@ -646,6 +647,9 @@ private: // Estimated print time, filament consumed. PrintStatistics m_print_statistics; + // Cache to store sequential print clearance polygons + Polygons m_sequential_print_clearance_polygons; + // To allow GCode to set the Print's GCodeExport step status. friend class GCode; // Allow PrintObject to access m_mutex and m_cancel_callback. diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 4fc59db62..c69908713 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3320,11 +3320,9 @@ unsigned int Plater::priv::update_background_process(bool force_validation, bool return_state |= UPDATE_BACKGROUND_PROCESS_INVALID; if (printer_technology == ptFFF) { const Print* print = background_process.fff_print(); - Polygons polygons; - if (print->config().complete_objects) - Print::sequential_print_horizontal_clearance_valid(*print, &polygons); - view3D->get_canvas3d()->set_sequential_print_clearance_visible(true); - view3D->get_canvas3d()->set_sequential_print_clearance_render_fill(true); + const Polygons polygons = print->get_sequential_print_clearance_polygons(); + view3D->get_canvas3d()->set_sequential_print_clearance_visible(!polygons.empty()); + view3D->get_canvas3d()->set_sequential_print_clearance_render_fill(!polygons.empty()); view3D->get_canvas3d()->set_sequential_print_clearance_polygons(polygons); } }