diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index fa97b848ce..490df98068 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -516,7 +516,7 @@ WipeTower::ToolChangeResult WipeTower::construct_tcr(WipeTowerWriter& writer, -WipeTower::WipeTower(const PrintConfig& config, const std::vector>& wiping_matrix, size_t initial_tool) : +WipeTower::WipeTower(const PrintConfig& config, const PrintRegionConfig& default_region_config, const std::vector>& wiping_matrix, size_t initial_tool) : m_semm(config.single_extruder_multi_material.value), m_wipe_tower_pos(config.wipe_tower_x, config.wipe_tower_y), m_wipe_tower_width(float(config.wipe_tower_width)), @@ -530,6 +530,8 @@ WipeTower::WipeTower(const PrintConfig& config, const std::vectordepth - m_layer_info->toolchanges_depth(); box_coordinates fill_box(Vec2f(m_perimeter_width, m_layer_info->depth-(current_depth-m_perimeter_width)), m_wipe_tower_width - 2 * m_perimeter_width, current_depth-m_perimeter_width); @@ -1203,7 +1212,7 @@ WipeTower::ToolChangeResult WipeTower::finish_layer() // First generate vector of annotated point which form the boundary. std::vector> pts = {{wt_box.ru, Corner}}; if (double alpha_start = std::asin((0.5*w)/r); ! std::isnan(alpha_start) && r > 0.5*w+0.01) { - for (double alpha = alpha_start; alpha < M_PI-alpha_start+0.001; alpha+=(M_PI-2*alpha_start) / 20.) + for (double alpha = alpha_start; alpha < M_PI-alpha_start+0.001; alpha+=(M_PI-2*alpha_start) / 40.) pts.emplace_back(Vec2f(center.x() + r*std::cos(alpha)/support_scale, center.y() + r*std::sin(alpha)), alpha == alpha_start ? ArcStart : Arc); pts.back().second = ArcEnd; } @@ -1285,6 +1294,8 @@ WipeTower::ToolChangeResult WipeTower::finish_layer() return poly; }; + feedrate = first_layer ? m_first_layer_speed * 60.f : m_perimeter_speed * 60.f; + // outer contour (always) bool infill_cone = first_layer && m_wipe_tower_width > 2*spacing && m_wipe_tower_depth > 2*spacing; Polygon poly = supported_rectangle(wt_box, feedrate, infill_cone); diff --git a/src/libslic3r/GCode/WipeTower.hpp b/src/libslic3r/GCode/WipeTower.hpp index 969da848d0..301cd3bec0 100644 --- a/src/libslic3r/GCode/WipeTower.hpp +++ b/src/libslic3r/GCode/WipeTower.hpp @@ -14,6 +14,7 @@ namespace Slic3r class WipeTowerWriter; class PrintConfig; +class PrintRegionConfig; enum GCodeFlavor : unsigned char; @@ -129,7 +130,10 @@ public: // y -- y coordinates of wipe tower in mm ( left bottom corner ) // width -- width of wipe tower in mm ( default 60 mm - leave as it is ) // wipe_area -- space available for one toolchange in mm - WipeTower(const PrintConfig& config, const std::vector>& wiping_matrix, size_t initial_tool); + WipeTower(const PrintConfig& config, + const PrintRegionConfig& default_region_config, + const std::vector>& wiping_matrix, + size_t initial_tool); // Set the extruder properties. @@ -269,6 +273,8 @@ private: size_t m_max_color_changes = 0; // Maximum number of color changes per layer. int m_old_temperature = -1; // To keep track of what was the last temp that we set (so we don't issue the command when not neccessary) float m_travel_speed = 0.f; + float m_infill_speed = 0.f; + float m_perimeter_speed = 0.f; float m_first_layer_speed = 0.f; size_t m_first_layer_idx = size_t(-1); diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 8d53dbb5a8..94b08b8857 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1453,7 +1453,7 @@ void Print::_make_wipe_tower() this->throw_if_canceled(); // Initialize the wipe tower. - WipeTower wipe_tower(m_config, wipe_volumes, m_wipe_tower_data.tool_ordering.first_extruder()); + WipeTower wipe_tower(m_config, m_default_region_config, wipe_volumes, m_wipe_tower_data.tool_ordering.first_extruder()); //wipe_tower.set_retract(); //wipe_tower.set_zhop(); diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index ff7906da07..0b135f0b94 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -814,15 +814,15 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "overhang_speed_2" || opt_key == "overhang_speed_3" || opt_key == "external_perimeter_speed" - || opt_key == "infill_speed" - || opt_key == "perimeter_speed" || opt_key == "small_perimeter_speed" || opt_key == "solid_infill_speed" || opt_key == "top_solid_infill_speed") { invalidated |= m_print->invalidate_step(psGCodeExport); } else if ( opt_key == "wipe_into_infill" - || opt_key == "wipe_into_objects") { + || opt_key == "wipe_into_objects" + || opt_key == "infill_speed" + || opt_key == "perimeter_speed") { invalidated |= m_print->invalidate_step(psWipeTower); invalidated |= m_print->invalidate_step(psGCodeExport); } else {