Scrub the WipeTower2 toolchange entry with the BBL flat-ironing spiral

The entry scrub now matches the BBL tower's toolchange_wipe_new sequence:
after the ironing drag the retracted nozzle runs a dry expanding-square
spiral centred on the wall-gap entry point before resuming the purge row.
The spiral runs whenever the gap wall is on (disable per filament via
filament_tower_ironing_area = 0); WipeTower2 no longer reads
prime_tower_flat_ironing.
This commit is contained in:
SoftFever
2026-07-29 18:48:10 +08:00
parent 36bd453ac8
commit 67e1ce03a6
2 changed files with 10 additions and 16 deletions

View File

@@ -24,7 +24,6 @@
namespace Slic3r namespace Slic3r
{ {
static constexpr float flat_iron_area = 4.f;
constexpr float flat_iron_speed = 10.f * 60.f; constexpr float flat_iron_speed = 10.f * 60.f;
static const double wipe_tower_wall_infill_overlap = 0.0; static const double wipe_tower_wall_infill_overlap = 0.0;
static constexpr double WIPE_TOWER_RESOLUTION = 0.1; static constexpr double WIPE_TOWER_RESOLUTION = 0.1;
@@ -1364,7 +1363,6 @@ WipeTower2::WipeTower2(const PrintConfig& config, const PrintRegionConfig& defau
m_wall_type((int)config.wipe_tower_wall_type), m_wall_type((int)config.wipe_tower_wall_type),
// The cone wall has its own fully separate generator with no gap machinery. // The cone wall has its own fully separate generator with no gap machinery.
m_use_gap_wall(config.prime_tower_skip_points.value && config.wipe_tower_wall_type.value != wtwCone), m_use_gap_wall(config.prime_tower_skip_points.value && config.wipe_tower_wall_type.value != wtwCone),
m_flat_ironing(config.prime_tower_flat_ironing.value),
m_enable_tower_interface_features(config.enable_tower_interface_features.value), m_enable_tower_interface_features(config.enable_tower_interface_features.value),
m_enable_tower_interface_cooldown_during_tower(config.enable_tower_interface_cooldown_during_tower.value) m_enable_tower_interface_cooldown_during_tower(config.enable_tower_interface_cooldown_during_tower.value)
{ {
@@ -2060,9 +2058,6 @@ void WipeTower2::toolchange_Wipe(
m_left_to_right = !m_left_to_right; m_left_to_right = !m_left_to_right;
} }
const bool do_ironing = m_flat_ironing && (!interface_layer || !m_enable_tower_interface_features);
const float ironing_area = m_filpar[m_current_tool].tower_ironing_area;
// now the wiping itself: // now the wiping itself:
for (int i = 0; true; ++i) { for (int i = 0; true; ++i) {
if (i!=0) { if (i!=0) {
@@ -2075,10 +2070,12 @@ void WipeTower2::toolchange_Wipe(
float traversed_x = writer.x(); float traversed_x = writer.x();
// BBS gap wall: iron the first few mm of the purge, then drag the retracted nozzle // BBS gap wall: iron the first few mm of the purge, then drag the retracted nozzle
// back out through the wall gap so the toolchange start blob is not left on the wall. // back out through the wall gap and scrub it with a dry spiral centred on the entry
// WT2's entry gap always sits at the left-edge entry point, so only iron when the // point so the toolchange start blob is not left on the wall (same sequence as the
// purge actually starts there heading right (in-place toolchangers do; SEMM // BBL tower's toolchange_wipe_new; the spiral self-disables when the filament's
// ram/cooling moves leave the nozzle mid-box, far from any gap). // tower ironing area is 0). WT2's entry gap always sits at the left-edge entry
// point, so only iron when the purge actually starts there heading right (in-place
// toolchangers do; SEMM ram/cooling moves leave the nozzle mid-box, far from any gap).
if (i == 0 && m_use_gap_wall && !interface_layer && !priming && m_left_to_right && if (i == 0 && m_use_gap_wall && !interface_layer && !priming && m_left_to_right &&
writer.x() - xl < 2.5f * line_width) { writer.x() - xl < 2.5f * line_width) {
float ironing_length = 3.f; float ironing_length = 3.f;
@@ -2089,7 +2086,10 @@ void WipeTower2::toolchange_Wipe(
writer.extrude(writer.x() + ironing_length, writer.y(), wipe_speed); writer.extrude(writer.x() + ironing_length, writer.y(), wipe_speed);
writer.retract(retract_length, retract_speed); writer.retract(retract_length, retract_speed);
writer.travel(writer.x() - 1.5f * ironing_length, writer.y(), 600.f); writer.travel(writer.x() - 1.5f * ironing_length, writer.y(), 600.f);
writer.travel(writer.x() + 1.5f * ironing_length, writer.y(), 240.f); writer.travel(writer.x() + 0.5f * ironing_length, writer.y(), 240.f);
const Vec2f iron_end(writer.x() + ironing_length, writer.y());
writer.spiral_flat_ironing(writer.pos(), m_filpar[m_current_tool].tower_ironing_area, m_perimeter_width, flat_iron_speed);
writer.travel(iron_end, wipe_speed);
writer.retract(-retract_length, retract_speed); writer.retract(-retract_length, retract_speed);
} }
@@ -2098,11 +2098,6 @@ void WipeTower2::toolchange_Wipe(
else else
writer.extrude(xl + (i % 4 == 1 ? 0 : 1.5f*line_width), writer.y(), wipe_speed); writer.extrude(xl + (i % 4 == 1 ? 0 : 1.5f*line_width), writer.y(), wipe_speed);
if (i == 0 && do_ironing && ironing_area > 0.f) {
writer.travel(writer.x(), writer.y(), 600.f);
writer.spiral_flat_ironing(writer.pos(), ironing_area, m_perimeter_width, 10.f * 60.f);
}
if (writer.y()+float(EPSILON) > cleaning_box.lu.y()-0.5f*line_width) if (writer.y()+float(EPSILON) > cleaning_box.lu.y()-0.5f*line_width)
break; // in case next line would not fit break; // in case next line would not fit

View File

@@ -221,7 +221,6 @@ private:
float m_perimeter_speed = 0.f; float m_perimeter_speed = 0.f;
float m_first_layer_speed = 0.f; float m_first_layer_speed = 0.f;
size_t m_first_layer_idx = size_t(-1); size_t m_first_layer_idx = size_t(-1);
bool m_flat_ironing = false;
bool m_enable_tower_interface_features = false; bool m_enable_tower_interface_features = false;
bool m_enable_tower_interface_cooldown_during_tower = false; bool m_enable_tower_interface_cooldown_during_tower = false;
bool m_prev_layer_had_interface = false; bool m_prev_layer_had_interface = false;