From aba743de41e639c69ef8b452c964960d825498de Mon Sep 17 00:00:00 2001 From: Thomas Moore Date: Mon, 6 May 2019 23:33:09 -0400 Subject: [PATCH] Include wipe tower in skirt --- src/libslic3r/GCode/PrintExtents.cpp | 39 +++++++++++++++++++++++++++- src/libslic3r/GCode/PrintExtents.hpp | 4 +++ src/libslic3r/Print.cpp | 35 +++++++++++++++---------- 3 files changed, 64 insertions(+), 14 deletions(-) diff --git a/src/libslic3r/GCode/PrintExtents.cpp b/src/libslic3r/GCode/PrintExtents.cpp index 07a71a0ea..aaa615c34 100644 --- a/src/libslic3r/GCode/PrintExtents.cpp +++ b/src/libslic3r/GCode/PrintExtents.cpp @@ -138,7 +138,7 @@ BoundingBoxf get_wipe_tower_extrusions_extents(const Print &print, const coordf_ // We need to get position and angle of the wipe tower to transform them to actual position. Transform2d trafo = Eigen::Translation2d(print.config().wipe_tower_x.value, print.config().wipe_tower_y.value) * - Eigen::Rotation2Dd(print.config().wipe_tower_rotation_angle.value); + Eigen::Rotation2Dd(Geometry::deg2rad(print.config().wipe_tower_rotation_angle.value)); BoundingBoxf bbox; for (const std::vector &tool_changes : print.wipe_tower_data().tool_changes) { @@ -160,6 +160,43 @@ BoundingBoxf get_wipe_tower_extrusions_extents(const Print &print, const coordf_ return bbox; } +// Returns a vector of points of a projection of the wipe tower for the layers <= max_print_z. +// The projection does not contain the priming regions. +std::vector get_wipe_tower_extrusions_points(const Print &print, const coordf_t max_print_z) +{ + // Wipe tower extrusions are saved as if the tower was at the origin with no rotation + // We need to get position and angle of the wipe tower to transform them to actual position. + Transform2d trafo = + Eigen::Translation2d(print.config().wipe_tower_x.value, print.config().wipe_tower_y.value) * + Eigen::Rotation2Dd(Geometry::deg2rad(print.config().wipe_tower_rotation_angle.value)); + + BoundingBoxf bbox; + for (const std::vector &tool_changes : print.wipe_tower_data().tool_changes) { + if (!tool_changes.empty() && tool_changes.front().print_z > max_print_z) + break; + for (const WipeTower::ToolChangeResult &tcr : tool_changes) { + for (size_t i = 1; i < tcr.extrusions.size(); ++i) { + const WipeTower::Extrusion &e = tcr.extrusions[i]; + if (e.width > 0) { + Vec2d delta = 0.5 * Vec2d(e.width, e.width); + Vec2d p1 = Vec2d((&e - 1)->pos.x, (&e - 1)->pos.y); + Vec2d p2 = Vec2d(e.pos.x, e.pos.y); + bbox.merge(p1.cwiseMin(p2) - delta); + bbox.merge(p1.cwiseMax(p2) + delta); + } + } + } + } + + std::vector points; + points.push_back(trafo * Vec2d(bbox.min.x(), bbox.max.y())); + points.push_back(trafo * Vec2d(bbox.max.x(), bbox.max.y())); + points.push_back(trafo * Vec2d(bbox.max.x(), bbox.min.y())); + points.push_back(trafo * Vec2d(bbox.min.x(), bbox.min.y())); + + return points; +} + // Returns a bounding box of the wipe tower priming extrusions. BoundingBoxf get_wipe_tower_priming_extrusions_extents(const Print &print) { diff --git a/src/libslic3r/GCode/PrintExtents.hpp b/src/libslic3r/GCode/PrintExtents.hpp index db507689d..cb60c939b 100644 --- a/src/libslic3r/GCode/PrintExtents.hpp +++ b/src/libslic3r/GCode/PrintExtents.hpp @@ -22,6 +22,10 @@ BoundingBoxf get_print_object_extrusions_extents(const PrintObject &print_object // The projection does not contain the priming regions. BoundingBoxf get_wipe_tower_extrusions_extents(const Print &print, const coordf_t max_print_z); +// Returns a vector of points of a projection of the wipe tower for the layers <= max_print_z. +// The projection does not contain the priming regions. +std::vector get_wipe_tower_extrusions_points(const Print &print, const coordf_t max_print_z); + // Returns a bounding box of the wipe tower priming extrusions. BoundingBoxf get_wipe_tower_priming_extrusions_extents(const Print &print); diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 245b79e80..4403c7b26 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -11,6 +11,7 @@ #include "SupportMaterial.hpp" #include "GCode.hpp" #include "GCode/WipeTower.hpp" +#include "GCode/PrintExtents.hpp" #include "Utils.hpp" //#include "PrintExport.hpp" @@ -143,10 +144,7 @@ bool Print::invalidate_state_by_config_options(const std::vector steps_ignore; @@ -167,7 +165,10 @@ bool Print::invalidate_state_by_config_options(const std::vector 1) { bool has_custom_layering = false; @@ -1502,6 +1506,14 @@ void Print::process() obj->infill(); for (PrintObject *obj : m_objects) obj->generate_support_material(); + if (this->set_started(psWipeTower)) { + m_wipe_tower_data.clear(); + if (this->has_wipe_tower()) { + //this->set_status(95, L("Generating wipe tower")); + this->_make_wipe_tower(); + } + this->set_done(psWipeTower); + } if (this->set_started(psSkirt)) { m_skirt.clear(); if (this->has_skirt()) { @@ -1518,14 +1530,6 @@ void Print::process() } this->set_done(psBrim); } - if (this->set_started(psWipeTower)) { - m_wipe_tower_data.clear(); - if (this->has_wipe_tower()) { - //this->set_status(95, L("Generating wipe tower")); - this->_make_wipe_tower(); - } - this->set_done(psWipeTower); - } BOOST_LOG_TRIVIAL(info) << "Slicing process finished." << log_memory_info(); } @@ -1602,6 +1606,11 @@ void Print::_make_skirt() } } + // Include the wipe tower. + if (has_wipe_tower()) + for (const Vec2d& point : get_wipe_tower_extrusions_points(*this, skirt_height_z)) + points.push_back(Point(scale_(point.x()), scale_(point.y()))); + if (points.size() < 3) // At least three points required for a convex hull. return;