diff options
author | Thomas Moore <tcm0116@gmail.com> | 2019-05-07 06:33:09 +0300 |
---|---|---|
committer | Lukas Matena <lukasmatena@seznam.cz> | 2019-10-08 12:06:55 +0300 |
commit | aba743de41e639c69ef8b452c964960d825498de (patch) | |
tree | 844c8a5210ead36198cd44bfcc86c27cbdb168a3 /src | |
parent | 9a9c3bac39d56673907ee995b878d51e651804f2 (diff) |
Include wipe tower in skirt
Diffstat (limited to 'src')
-rw-r--r-- | src/libslic3r/GCode/PrintExtents.cpp | 39 | ||||
-rw-r--r-- | src/libslic3r/GCode/PrintExtents.hpp | 4 | ||||
-rw-r--r-- | 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<WipeTower::ToolChangeResult> &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<Vec2d> 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<WipeTower::ToolChangeResult> &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<Vec2d> 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<Vec2d> 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<t_config_option "use_relative_e_distances", "use_volumetric_e", "variable_layer_height", - "wipe", - "wipe_tower_x", - "wipe_tower_y", - "wipe_tower_rotation_angle" + "wipe" }; static std::unordered_set<std::string> steps_ignore; @@ -167,7 +165,10 @@ bool Print::invalidate_state_by_config_options(const std::vector<t_config_option || opt_key == "skirt_height" || opt_key == "skirt_distance" || opt_key == "min_skirt_length" - || opt_key == "ooze_prevention") { + || opt_key == "ooze_prevention" + || opt_key == "wipe_tower_x" + || opt_key == "wipe_tower_y" + || opt_key == "wipe_tower_rotation_angle") { steps.emplace_back(psSkirt); } else if (opt_key == "brim_width") { steps.emplace_back(psBrim); @@ -208,6 +209,7 @@ bool Print::invalidate_state_by_config_options(const std::vector<t_config_option || opt_key == "extra_loading_move" || opt_key == "z_offset") { steps.emplace_back(psWipeTower); + steps.emplace_back(psSkirt); } else if ( opt_key == "first_layer_extrusion_width" || opt_key == "min_layer_height" @@ -1186,6 +1188,8 @@ std::string Print::validate() const return L("The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1)."); if (m_config.ooze_prevention) return L("Ooze prevention is currently not supported with the wipe tower enabled."); + if (m_config.use_volumetric_e) + return L("The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)."); if (m_objects.size() > 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; |