538 {
539 auto& writer = gcodegen.writer();
540 auto& config = gcodegen.config();
541 auto extruder = writer.filament();
542 auto last_pos = gcodegen.last_pos();
543
544
545 double retraction_length_remaining = 0,
546 retraction_length_before_wipe = 0,
547 retraction_length_during_wipe = 0,
548 retraction_length_after_wipe = 0;
549
550
551 retraction_length_remaining = toolchange ?
552 extruder->retract_length_toolchange() : extruder->retraction_length();
553
554
555 if (retraction_length_remaining <=
EPSILON)
556 return { 0.f, 0.f, 0.f };
557
558
559
560
561 retraction_length_before_wipe = retraction_length_remaining * extruder->retract_before_wipe();
562 retraction_length_after_wipe = retraction_length_remaining * extruder->retract_after_wipe();
563
564
565 retraction_length_remaining -= retraction_length_before_wipe + retraction_length_after_wipe;
566
567
568 if (retraction_length_remaining <=
EPSILON)
569 return { retraction_length_before_wipe, 0., retraction_length_after_wipe };
570
571
572
573
574 double wipe_speed = config.role_based_wipe_speed ? writer.get_current_speed() / 60.0 : config.get_abs_value("wipe_speed", gcodegen.config().travel_speed.get_at(gcodegen.get_nozzle_config_index(gcodegen.writer().filament()->id())));
575 wipe_speed = std::max(wipe_speed, 10.0);
576
577
578 double wipe_dist =
scale_(config.wipe_distance.get_at(extruder->config_index()));
579 Polyline wipe_path = {last_pos};
580 wipe_path.append(this->
path.points.begin() + 1, this->path.points.end());
581 double wipe_path_length = std::min(wipe_path.length(), wipe_dist);
582
583
584 retraction_length_during_wipe = config.retraction_speed.get_at(extruder->config_index()) *
585 unscale_(wipe_path_length) / wipe_speed;
586
587
588
589
590 if (retraction_length_during_wipe <=
EPSILON)
591 return { retraction_length_before_wipe, 0., retraction_length_after_wipe };
592
593
594
595 if (retraction_length_during_wipe - retraction_length_remaining >
EPSILON)
596 return { retraction_length_before_wipe, retraction_length_remaining, retraction_length_after_wipe };
597
598
599
600 retraction_length_before_wipe += retraction_length_remaining - retraction_length_during_wipe;
601
602 return { retraction_length_before_wipe, retraction_length_during_wipe, retraction_length_after_wipe };
603 }
#define EPSILON
Definition ColorUtils.cpp:64
Polyline path
Definition GCode.hpp:83
#define unscale_(val)
Definition libslic3r.h:107
#define scale_(val)
Definition libslic3r.h:106