3421{
3423 const float min_infill_volume = 0.f;
3424
3425 if (! this->
something_overridable || volume_to_wipe <= 0. || print.config().filament_soluble.get_at(old_extruder) || print.config().filament_soluble.get_at(new_extruder))
3426 return std::max(0.f, volume_to_wipe);
3427
3428
3429 if (print.config().filament_is_support.get_at(old_extruder) || print.config().filament_is_support.get_at(new_extruder))
3430 return std::max(0.f, volume_to_wipe);
3431
3432
3434
3435 std::sort(object_list.begin(), object_list.end(), [object_list](const PrintObject* a, const PrintObject* b) {
3436 if (a->config().flush_into_objects != b->config().flush_into_objects) {
3437 return a->config().flush_into_objects.getBool();
3438 }
3439 else {
3440 return a->id() < b->id();
3441 }
3442 });
3443
3444
3445
3446
3447
3448
3449 bool perimeters_done = false;
3450
3451 for (int i=0 ; i<(int)object_list.size() + (perimeters_done ? 0 : 1); ++i) {
3452 if (!perimeters_done && (i==(int)object_list.size() || !object_list[i]->config().flush_into_objects)) {
3453 perimeters_done = true;
3454 i=-1;
3455 continue;
3456 }
3457
3458 const PrintObject* object = object_list[i];
3459
3460
3461 const Layer* this_layer =
object->get_layer_at_printz(lt.print_z,
EPSILON);
3462 if (this_layer == nullptr)
3463 continue;
3464
3465 size_t num_of_copies = object->instances().size();
3466
3467
3468 for (unsigned int copy = 0; copy < num_of_copies; ++copy) {
3469 for (const LayerRegion *layerm : this_layer->regions()) {
3470 const auto ®ion = layerm->region();
3471
3472 if (!object->config().flush_into_infill && !object->config().flush_into_objects && !object->config().flush_into_support)
3473 continue;
3474 bool wipe_into_infill_only = !object->config().flush_into_objects && object->config().flush_into_infill;
3477 for (const ExtrusionEntity* ee : layerm->fills.entities) {
3478 auto* fill = dynamic_cast<const ExtrusionEntityCollection*>(ee);
3479
3481 continue;
3482
3484
3485
3486 if (!lt.is_extruder_order(lt.wall_extruder_id(region), new_extruder))
3487 continue;
3488
3490 {
3492 if ((volume_to_wipe -= float(fill->total_volume())) <= 0.f)
3493
3494 return 0.f;
3495 }
3496 }
3497 }
3498
3499
3500 if (object->config().flush_into_objects &&
is_infill_first == perimeters_done)
3501 {
3502 for (const ExtrusionEntity* ee : layerm->perimeters.entities) {
3503 auto* fill = dynamic_cast<const ExtrusionEntityCollection*>(ee);
3506 if ((volume_to_wipe -= float(fill->total_volume())) <= 0.f)
3507
3508 return 0.f;
3509 }
3510 }
3511 }
3512 }
3513
3514
3515 if (object->config().flush_into_support) {
3516 auto& object_config = object->config();
3517 const SupportLayer* this_support_layer =
object->get_support_layer_at_printz(lt.print_z,
EPSILON);
3518
3519 do {
3520 if (this_support_layer == nullptr)
3521 break;
3522
3523 bool support_overriddable = object_config.support_filament == 0;
3524 bool support_intf_overriddable = object_config.support_interface_filament == 0;
3525 if (!support_overriddable && !support_intf_overriddable)
3526 break;
3527
3528 auto &entities = this_support_layer->support_fills.entities;
3529 if (support_overriddable && !
is_support_overridden(
object) && !(object_config.support_interface_not_for_body.value && !support_intf_overriddable &&(new_extruder==object_config.support_interface_filament-1||old_extruder==object_config.support_interface_filament-1))) {
3531 for (const ExtrusionEntity* ee : entities) {
3533 volume_to_wipe -= ee->total_volume();
3534
3535 if (volume_to_wipe <= 0.f)
3536 return 0.f;
3537 }
3538 }
3539
3542 for (const ExtrusionEntity* ee : entities) {
3544 volume_to_wipe -= ee->total_volume();
3545
3546 if (volume_to_wipe <= 0.f)
3547 return 0.f;
3548 }
3549 }
3550 } while (0);
3551 }
3552 }
3553 }
3554
3555 assert(volume_to_wipe > 0.);
3556 return volume_to_wipe;
3557}
void set_support_extruder_override(const PrintObject *object, size_t copy_id, int extruder, size_t num_of_copies)
Definition ToolOrdering.cpp:3350
bool is_support_overridden(const PrintObject *object) const
Definition ToolOrdering.hpp:77
void set_support_interface_extruder_override(const PrintObject *object, size_t copy_id, int extruder, size_t num_of_copies)
Definition ToolOrdering.cpp:3356
bool is_support_interface_overridden(const PrintObject *object) const
Definition ToolOrdering.hpp:81
std::vector< const PrintObject * > ConstPrintObjectPtrs
Definition Print.hpp:1009