From dbe9355672a4f46e01dc855cd1ebda1483b1bcdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20=C5=A0ach?= Date: Wed, 12 Jun 2024 13:59:29 +0200 Subject: [PATCH] Use dynamic cast for perimeter extrusion entity as it might not always be an ExtrusionLoop --- src/libslic3r/GCode/ExtrusionOrder.cpp | 46 ++++++++++++-------------- src/libslic3r/GCode/ExtrusionOrder.hpp | 6 ++-- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/libslic3r/GCode/ExtrusionOrder.cpp b/src/libslic3r/GCode/ExtrusionOrder.cpp index af92cb6b2d..8e8063b219 100644 --- a/src/libslic3r/GCode/ExtrusionOrder.cpp +++ b/src/libslic3r/GCode/ExtrusionOrder.cpp @@ -27,11 +27,10 @@ int get_extruder_id( } ExtrusionEntitiesPtr extract_infill_extrusions( - const Layer *layer, const PrintRegion ®ion, const ExtrusionEntityCollection &fills, - LayerExtrusionRanges::const_iterator begin, - LayerExtrusionRanges::const_iterator end, + const LayerExtrusionRanges::const_iterator& begin, + const LayerExtrusionRanges::const_iterator& end, const ExtractEntityPredicate &predicate ) { ExtrusionEntitiesPtr result; @@ -61,13 +60,13 @@ ExtrusionEntitiesPtr extract_infill_extrusions( std::vector extract_perimeter_extrusions( const Print &print, - const Layer *layer, + const Layer &layer, const LayerIsland &island, const ExtractEntityPredicate &predicate ) { std::vector result; - const LayerRegion &layerm = *layer->get_region(island.perimeters.region()); + const LayerRegion &layerm = *layer.get_region(island.perimeters.region()); const PrintRegion ®ion = print.get_print_region(layerm.region().print_region_id()); for (uint32_t perimeter_id : island.perimeters) { @@ -107,8 +106,8 @@ std::vector sort_fill_extrusions(const ExtrusionEntiti std::vector extract_infill_ranges( const Print &print, - const Layer *layer, - const LayerIsland island, + const Layer &layer, + const LayerIsland &island, std::optional previous_position, const ExtractEntityPredicate &predicate ) { @@ -117,7 +116,7 @@ std::vector extract_infill_ranges( // Gather range of fill ranges with the same region. auto it_end = it; for (++ it_end; it_end != island.fills.end() && it->region() == it_end->region(); ++ it_end) ; - const LayerRegion &layerm = *layer->get_region(it->region()); + const LayerRegion &layerm = *layer.get_region(it->region()); // PrintObjects own the PrintRegions, thus the pointer to PrintRegion would be unique to a PrintObject, they would not // identify the content of PrintRegion accross the whole print uniquely. Translate to a Print specific PrintRegion. const PrintRegion ®ion = print.get_print_region(layerm.region().print_region_id()); @@ -125,7 +124,6 @@ std::vector extract_infill_ranges( const Point* start_near = previous_position ? &(*(previous_position)) : nullptr; ExtrusionEntitiesPtr extrusions{extract_infill_extrusions( - layer, region, layerm.fills(), it, @@ -147,18 +145,18 @@ std::vector extract_infill_ranges( } void place_seams( - const Layer *layer, const Seams::Placer &seam_placer, const std::vector &perimeters, std::optional previous_position, const bool spiral_vase + const Layer &layer, const Seams::Placer &seam_placer, const std::vector &perimeters, std::optional previous_position, const bool spiral_vase ) { std::vector result; result.reserve(perimeters.size()); for (ExtrusionEntity* perimeter : perimeters) { - auto loop{static_cast(perimeter)}; + auto loop{dynamic_cast(perimeter)}; Point seam_point{previous_position ? *previous_position : Point::Zero()}; if (!spiral_vase && loop != nullptr) { assert(m_layer != nullptr); - seam_point = seam_placer.place_seam(layer, *loop, seam_point); + seam_point = seam_placer.place_seam(&layer, *loop, seam_point); loop->seam = seam_point; } previous_position = seam_point; @@ -185,7 +183,7 @@ std::optional get_last_position(const ExtrusionEntityReferences &extrusio std::optional get_last_position(const std::vector &perimeters){ if (!perimeters.empty()) { - auto last_perimeter{static_cast(perimeters.back())}; + auto last_perimeter{dynamic_cast(perimeters.back())}; if (last_perimeter != nullptr) { return last_perimeter->seam; } @@ -221,7 +219,7 @@ std::optional get_last_position(const std::vector &slice std::vector extract_island_extrusions( const LayerSlice &lslice, const Print &print, - const Layer *layer, + const Layer &layer, const Seams::Placer &seam_placer, const bool spiral_vase, const ExtractEntityPredicate &predicate, @@ -229,13 +227,13 @@ std::vector extract_island_extrusions( ) { std::vector result; for (const LayerIsland &island : lslice.islands) { - const LayerRegion &layerm = *layer->get_region(island.perimeters.region()); + const LayerRegion &layerm = *layer.get_region(island.perimeters.region()); // PrintObjects own the PrintRegions, thus the pointer to PrintRegion would be // unique to a PrintObject, they would not identify the content of PrintRegion // accross the whole print uniquely. Translate to a Print specific PrintRegion. const PrintRegion ®ion = print.get_print_region(layerm.region().print_region_id()); - const auto infill_predicate = [&](const auto &eec, const auto ®ion) { + const auto infill_predicate = [&](const ExtrusionEntityCollection &eec, const PrintRegion ®ion) { return predicate(eec, region) && eec.role() != ExtrusionRole::Ironing; }; @@ -277,7 +275,7 @@ std::vector extract_island_extrusions( std::vector extract_ironing_extrusions( const LayerSlice &lslice, const Print &print, - const Layer *layer, + const Layer &layer, const ExtractEntityPredicate &predicate, std::optional &previous_position ) { @@ -304,7 +302,7 @@ std::vector extract_ironing_extrusions( std::vector get_slices_extrusions( const Print &print, - const Layer *layer, + const Layer &layer, const Seams::Placer &seam_placer, std::optional previous_position, const bool spiral_vase, @@ -318,8 +316,8 @@ std::vector get_slices_extrusions( std::vector result; - for (size_t idx : layer->lslice_indices_sorted_by_print_order) { - const LayerSlice &lslice = layer->lslices_ex[idx]; + for (size_t idx : layer.lslice_indices_sorted_by_print_order) { + const LayerSlice &lslice = layer.lslices_ex[idx]; result.emplace_back(SliceExtrusions{ extract_island_extrusions( lslice, print, layer, seam_placer, spiral_vase, predicate, previous_position @@ -404,14 +402,14 @@ std::vector> get_overriden_extrusions( if (get_extruder_id( entity_collection, layer_tools, region, instance.instance_id - ) != extruder_id) { + ) != static_cast(extruder_id)) { return false; } return true; }; result.emplace_back(get_slices_extrusions( - print, layer, seam_placer, previous_position, spiral_vase, predicate + print, *layer, seam_placer, previous_position, spiral_vase, predicate )); previous_position = get_last_position(result.back(), print.config().infill_first); } @@ -451,7 +449,7 @@ std::vector get_normal_extrusions( return false; } - if (get_extruder_id(entity_collection, layer_tools, region, instance.instance_id) != extruder_id) { + if (get_extruder_id(entity_collection, layer_tools, region, instance.instance_id) != static_cast(extruder_id)) { return false; } return true; @@ -459,7 +457,7 @@ std::vector get_normal_extrusions( result.back().slices_extrusions = get_slices_extrusions( print, - layer, + *layer, seam_placer, previous_position, spiral_vase, diff --git a/src/libslic3r/GCode/ExtrusionOrder.hpp b/src/libslic3r/GCode/ExtrusionOrder.hpp index 7578f40495..d8c9d32f3a 100644 --- a/src/libslic3r/GCode/ExtrusionOrder.hpp +++ b/src/libslic3r/GCode/ExtrusionOrder.hpp @@ -123,7 +123,7 @@ std::optional get_last_position(const std::vector &slice std::vector extract_island_extrusions( const LayerSlice &lslice, const Print &print, - const Layer *layer, + const Layer &layer, const Seams::Placer &seam_placer, const bool spiral_vase, const ExtractEntityPredicate &predicate, @@ -133,14 +133,14 @@ std::vector extract_island_extrusions( std::vector extract_ironing_extrusions( const LayerSlice &lslice, const Print &print, - const Layer *layer, + const Layer &layer, const ExtractEntityPredicate &predicate, std::optional &previous_position ); std::vector get_slices_extrusions( const Print &print, - const Layer *layer, + const Layer &layer, const Seams::Placer &seam_placer, std::optional previous_position, const bool spiral_vase,