diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 5b23dc260..4c5d7b851 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -469,11 +469,13 @@ std::string Print::validate(std::string* warning) const return _u8L("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 _u8L("Some objects are too close; your extruder will collide with them."); - if (! sequential_print_vertical_clearance_valid(*this)) - return _u8L("Some objects are too tall and cannot be printed without extruder collisions."); + if (!sequential_print_vertical_clearance_valid(*this)) + return _u8L("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 _u8L("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 30f6bb41a..ba0a448c7 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -609,6 +609,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: @@ -658,6 +659,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; // To allow GCodeProcessor to emit warnings. diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 35308c058..70296e137 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3306,11 +3306,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); } }