684{
685 const float min_infill_volume = 0.f;
686
688
689 print.config().filament_soluble.get_at(old_extruder) ||
690
691 print.config().filament_soluble.get_at(new_extruder))
692
693 return std::max(0.f, volume_to_wipe);
694
695
697 std::sort(object_list.begin(), object_list.end(), [](const PrintObject* a, const PrintObject* b) { return a->config().wipe_into_objects && ! b->config().wipe_into_objects; });
698
699
700
701
702
703
704 bool perimeters_done = false;
705
706 for (int i=0 ; i<(int)object_list.size() + (perimeters_done ? 0 : 1); ++i) {
707 if (!perimeters_done && (i==(int)object_list.size() || !object_list[i]->config().wipe_into_objects)) {
708 perimeters_done = true;
709 i=-1;
710 continue;
711 }
712
713 const PrintObject* object = object_list[i];
714
715
716 const Layer* this_layer =
object->get_layer_at_printz(lt.print_z,
EPSILON);
717 if (this_layer == nullptr)
718 continue;
719 size_t num_of_copies = object->instances().size();
720
721
722 for (unsigned int copy = 0; copy < num_of_copies; ++copy) {
723 for (const LayerRegion *layerm : this_layer->regions()) {
724 const auto ®ion = layerm->region();
725 if (!region.config().wipe_into_infill && !object->config().wipe_into_objects)
726 continue;
727
728 bool wipe_into_infill_only = ! object->config().wipe_into_objects && region.config().wipe_into_infill;
729 if (print.config().infill_first != perimeters_done || wipe_into_infill_only) {
730 for (const ExtrusionEntity* ee : layerm->fills()) {
731 auto* fill = dynamic_cast<const ExtrusionEntityCollection*>(ee);
732
734 continue;
735
736 if (wipe_into_infill_only && ! print.config().infill_first)
737
738
739 if (!lt.is_extruder_order(lt.perimeter_extruder(region), new_extruder))
740 continue;
741
744 if ((volume_to_wipe -= float(fill->total_volume())) <= 0.f)
745
746 return 0.f;
747 }
748 }
749 }
750
751
752 if (object->config().wipe_into_objects && print.config().infill_first == perimeters_done)
753 {
754 for (const ExtrusionEntity* ee : layerm->perimeters()) {
755 auto* fill = dynamic_cast<const ExtrusionEntityCollection*>(ee);
758 if ((volume_to_wipe -= float(fill->total_volume())) <= 0.f)
759
760 return 0.f;
761 }
762 }
763 }
764 }
765 }
766 }
767
768 assert(volume_to_wipe > 0.);
769 return volume_to_wipe;
770}
std::vector< const PrintObject * > ConstPrintObjectPtrs
Definition Print.hpp:534