Refactor extrusion predicate naming and default lambda capture.

This commit is contained in:
Martin Šach 2024-07-01 13:31:36 +02:00 committed by Lukas Matena
parent 8403edc12c
commit 8c9b672c0d
3 changed files with 29 additions and 31 deletions

View File

@ -298,7 +298,6 @@ class ExtrusionLoop : public ExtrusionEntity
{ {
public: public:
ExtrusionPaths paths; ExtrusionPaths paths;
Point seam{Point::Zero()};
ExtrusionLoop() = default; ExtrusionLoop() = default;
ExtrusionLoop(ExtrusionLoopRole role) : m_loop_role(role) {} ExtrusionLoop(ExtrusionLoopRole role) : m_loop_role(role) {}

View File

@ -2324,7 +2324,6 @@ struct SmoothPathGenerator {
} else if (auto path = dynamic_cast<const ExtrusionPath *>(extrusion_entity)) { } else if (auto path = dynamic_cast<const ExtrusionPath *>(extrusion_entity)) {
result = GCode::SmoothPath{GCode::SmoothPathElement{path->attributes(), smooth_path_caches.layer_local().resolve_or_fit(*path, extrusion_reference.flipped(), scaled_resolution)}}; result = GCode::SmoothPath{GCode::SmoothPathElement{path->attributes(), smooth_path_caches.layer_local().resolve_or_fit(*path, extrusion_reference.flipped(), scaled_resolution)}};
} }
using GCode::SmoothPathElement;
for (auto it{result.rbegin()}; it != result.rend(); ++it) { for (auto it{result.rbegin()}; it != result.rend(); ++it) {
if (!it->path.empty()) { if (!it->path.empty()) {
previous_position = InstancePoint{it->path.back().point}; previous_position = InstancePoint{it->path.back().point};
@ -2565,7 +2564,7 @@ LayerResult GCodeGenerator::process_layer(
} }
const Vec3crd point{to_3d(first_point, scaled(print_z))}; const Vec3crd point{to_3d(first_point, scaled(print_z))};
gcode += this->travel_to_first_position(point, print_z, ExtrusionRole::Mixed, [&](){ gcode += this->travel_to_first_position(point, print_z, ExtrusionRole::Mixed, [this](){
return m_writer.multiple_extruders ? "" : m_label_objects.maybe_change_instance(m_writer); return m_writer.multiple_extruders ? "" : m_label_objects.maybe_change_instance(m_writer);
}); });
@ -3132,7 +3131,7 @@ std::string GCodeGenerator::_extrude(
comment += description; comment += description;
comment += description_bridge; comment += description_bridge;
comment += " point"; comment += " point";
const std::string travel_gcode{this->travel_to(*this->last_position, path.front().point, path_attr.role, comment, [&](){ const std::string travel_gcode{this->travel_to(*this->last_position, path.front().point, path_attr.role, comment, [this](){
return m_writer.multiple_extruders ? "" : m_label_objects.maybe_change_instance(m_writer); return m_writer.multiple_extruders ? "" : m_label_objects.maybe_change_instance(m_writer);
})}; })};
gcode += travel_gcode; gcode += travel_gcode;

View File

@ -57,7 +57,7 @@ ExtrusionEntitiesPtr extract_infill_extrusions(
const ExtrusionEntityCollection &fills, const ExtrusionEntityCollection &fills,
const LayerExtrusionRanges::const_iterator& begin, const LayerExtrusionRanges::const_iterator& begin,
const LayerExtrusionRanges::const_iterator& end, const LayerExtrusionRanges::const_iterator& end,
const ExtractEntityPredicate &predicate const ExtractEntityPredicate &should_pick_extrusion
) { ) {
ExtrusionEntitiesPtr result; ExtrusionEntitiesPtr result;
for (auto it = begin; it != end; ++ it) { for (auto it = begin; it != end; ++ it) {
@ -67,7 +67,7 @@ ExtrusionEntitiesPtr extract_infill_extrusions(
assert(dynamic_cast<ExtrusionEntityCollection*>(fills.entities[fill_id])); assert(dynamic_cast<ExtrusionEntityCollection*>(fills.entities[fill_id]));
auto *eec{static_cast<ExtrusionEntityCollection*>(fills.entities[fill_id])}; auto *eec{static_cast<ExtrusionEntityCollection*>(fills.entities[fill_id])};
if (eec == nullptr || eec->empty() || !predicate(*eec, region)) { if (eec == nullptr || eec->empty() || !should_pick_extrusion(*eec, region)) {
continue; continue;
} }
@ -88,7 +88,7 @@ std::vector<Perimeter> extract_perimeter_extrusions(
const Print &print, const Print &print,
const Layer &layer, const Layer &layer,
const LayerIsland &island, const LayerIsland &island,
const ExtractEntityPredicate &predicate, const ExtractEntityPredicate &should_pick_extrusion,
const unsigned extruder_id, const unsigned extruder_id,
const Point &offset, const Point &offset,
std::optional<Point> &previous_position, std::optional<Point> &previous_position,
@ -104,7 +104,7 @@ std::vector<Perimeter> extract_perimeter_extrusions(
// Don't reorder them. // Don't reorder them.
assert(dynamic_cast<ExtrusionEntityCollection*>(layerm.perimeters().entities[perimeter_id])); assert(dynamic_cast<ExtrusionEntityCollection*>(layerm.perimeters().entities[perimeter_id]));
auto *eec = static_cast<ExtrusionEntityCollection*>(layerm.perimeters().entities[perimeter_id]); auto *eec = static_cast<ExtrusionEntityCollection*>(layerm.perimeters().entities[perimeter_id]);
if (eec == nullptr || eec->empty() || !predicate(*eec, region)) { if (eec == nullptr || eec->empty() || !should_pick_extrusion(*eec, region)) {
continue; continue;
} }
@ -152,7 +152,7 @@ std::vector<InfillRange> extract_infill_ranges(
const LayerIsland &island, const LayerIsland &island,
const Point &offset, const Point &offset,
std::optional<Point> &previous_position, std::optional<Point> &previous_position,
const ExtractEntityPredicate &predicate, const ExtractEntityPredicate &should_pick_extrusion,
const PathSmoothingFunction &smooth_path, const PathSmoothingFunction &smooth_path,
const unsigned extruder_id const unsigned extruder_id
) { ) {
@ -171,7 +171,7 @@ std::vector<InfillRange> extract_infill_ranges(
layerm.fills(), layerm.fills(),
it, it,
it_end, it_end,
predicate should_pick_extrusion
)}; )};
const std::optional<InstancePoint> previous_instance_point{get_instance_point(previous_position, offset)}; const std::optional<InstancePoint> previous_instance_point{get_instance_point(previous_position, offset)};
@ -199,7 +199,7 @@ std::vector<IslandExtrusions> extract_island_extrusions(
const LayerSlice &lslice, const LayerSlice &lslice,
const Print &print, const Print &print,
const Layer &layer, const Layer &layer,
const ExtractEntityPredicate &predicate, const ExtractEntityPredicate &should_pick_extrusion,
const PathSmoothingFunction &smooth_path, const PathSmoothingFunction &smooth_path,
const Point &offset, const Point &offset,
const unsigned extruder_id, const unsigned extruder_id,
@ -213,8 +213,8 @@ std::vector<IslandExtrusions> extract_island_extrusions(
// accross the whole print uniquely. Translate to a Print specific PrintRegion. // accross the whole print uniquely. Translate to a Print specific PrintRegion.
const PrintRegion &region = print.get_print_region(layerm.region().print_region_id()); const PrintRegion &region = print.get_print_region(layerm.region().print_region_id());
const auto infill_predicate = [&](const ExtrusionEntityCollection &eec, const PrintRegion &region) { const auto should_pick_infill = [&should_pick_extrusion](const ExtrusionEntityCollection &eec, const PrintRegion &region) {
return predicate(eec, region) && eec.role() != ExtrusionRole::Ironing; return should_pick_extrusion(eec, region) && eec.role() != ExtrusionRole::Ironing;
}; };
result.push_back(IslandExtrusions{&region}); result.push_back(IslandExtrusions{&region});
@ -223,15 +223,15 @@ std::vector<IslandExtrusions> extract_island_extrusions(
if (print.config().infill_first) { if (print.config().infill_first) {
island_extrusions.infill_ranges = extract_infill_ranges( island_extrusions.infill_ranges = extract_infill_ranges(
print, layer, island, offset, previous_position, infill_predicate, smooth_path, extruder_id print, layer, island, offset, previous_position, should_pick_infill, smooth_path, extruder_id
); );
island_extrusions.perimeters = extract_perimeter_extrusions(print, layer, island, predicate, extruder_id, offset, previous_position, smooth_path); island_extrusions.perimeters = extract_perimeter_extrusions(print, layer, island, should_pick_extrusion, extruder_id, offset, previous_position, smooth_path);
} else { } else {
island_extrusions.perimeters = extract_perimeter_extrusions(print, layer, island, predicate, extruder_id, offset, previous_position, smooth_path); island_extrusions.perimeters = extract_perimeter_extrusions(print, layer, island, should_pick_extrusion, extruder_id, offset, previous_position, smooth_path);
island_extrusions.infill_ranges = {extract_infill_ranges( island_extrusions.infill_ranges = {extract_infill_ranges(
print, layer, island, offset, previous_position, infill_predicate, smooth_path, extruder_id print, layer, island, offset, previous_position, should_pick_infill, smooth_path, extruder_id
)}; )};
} }
} }
@ -242,7 +242,7 @@ std::vector<InfillRange> extract_ironing_extrusions(
const LayerSlice &lslice, const LayerSlice &lslice,
const Print &print, const Print &print,
const Layer &layer, const Layer &layer,
const ExtractEntityPredicate &predicate, const ExtractEntityPredicate &should_pick_extrusion,
const PathSmoothingFunction &smooth_path, const PathSmoothingFunction &smooth_path,
const Point &offset, const Point &offset,
const unsigned extruder_id, const unsigned extruder_id,
@ -251,12 +251,12 @@ std::vector<InfillRange> extract_ironing_extrusions(
std::vector<InfillRange> result; std::vector<InfillRange> result;
for (const LayerIsland &island : lslice.islands) { for (const LayerIsland &island : lslice.islands) {
const auto ironing_predicate = [&](const auto &eec, const auto &region) { const auto should_pick_ironing = [&should_pick_extrusion](const auto &eec, const auto &region) {
return predicate(eec, region) && eec.role() == ExtrusionRole::Ironing; return should_pick_extrusion(eec, region) && eec.role() == ExtrusionRole::Ironing;
}; };
const std::vector<InfillRange> ironing_ranges{extract_infill_ranges( const std::vector<InfillRange> ironing_ranges{extract_infill_ranges(
print, layer, island, offset, previous_position, ironing_predicate, smooth_path, extruder_id print, layer, island, offset, previous_position, should_pick_ironing, smooth_path, extruder_id
)}; )};
result.insert( result.insert(
result.end(), ironing_ranges.begin(), ironing_ranges.end() result.end(), ironing_ranges.begin(), ironing_ranges.end()
@ -268,7 +268,7 @@ std::vector<InfillRange> extract_ironing_extrusions(
std::vector<SliceExtrusions> get_slices_extrusions( std::vector<SliceExtrusions> get_slices_extrusions(
const Print &print, const Print &print,
const Layer &layer, const Layer &layer,
const ExtractEntityPredicate &predicate, const ExtractEntityPredicate &should_pick_extrusion,
const PathSmoothingFunction &smooth_path, const PathSmoothingFunction &smooth_path,
const Point &offset, const Point &offset,
const unsigned extruder_id, const unsigned extruder_id,
@ -285,10 +285,10 @@ std::vector<SliceExtrusions> get_slices_extrusions(
for (size_t idx : layer.lslice_indices_sorted_by_print_order) { for (size_t idx : layer.lslice_indices_sorted_by_print_order) {
const LayerSlice &lslice = layer.lslices_ex[idx]; const LayerSlice &lslice = layer.lslices_ex[idx];
std::vector<IslandExtrusions> island_extrusions{extract_island_extrusions( std::vector<IslandExtrusions> island_extrusions{extract_island_extrusions(
lslice, print, layer, predicate, smooth_path, offset, extruder_id, previous_position lslice, print, layer, should_pick_extrusion, smooth_path, offset, extruder_id, previous_position
)}; )};
std::vector<InfillRange> ironing_extrusions{extract_ironing_extrusions( std::vector<InfillRange> ironing_extrusions{extract_ironing_extrusions(
lslice, print, layer, predicate, smooth_path, offset, extruder_id, previous_position lslice, print, layer, should_pick_extrusion, smooth_path, offset, extruder_id, previous_position
)}; )};
if (!island_extrusions.empty() || !ironing_extrusions.empty()) { if (!island_extrusions.empty() || !ironing_extrusions.empty()) {
result.emplace_back( result.emplace_back(
@ -388,7 +388,7 @@ std::vector<OverridenExtrusions> get_overriden_extrusions(
for (const InstanceToPrint &instance : instances_to_print) { for (const InstanceToPrint &instance : instances_to_print) {
if (const Layer *layer = layers[instance.object_layer_to_print_id].object_layer; layer) { if (const Layer *layer = layers[instance.object_layer_to_print_id].object_layer; layer) {
const auto predicate = [&](const ExtrusionEntityCollection &entity_collection, const auto should_pick_extrusion = [&layer_tools, &instance, &extruder_id](const ExtrusionEntityCollection &entity_collection,
const PrintRegion &region) { const PrintRegion &region) {
if (!is_overriden(entity_collection, layer_tools, instance.instance_id)) { if (!is_overriden(entity_collection, layer_tools, instance.instance_id)) {
return false; return false;
@ -402,11 +402,11 @@ std::vector<OverridenExtrusions> get_overriden_extrusions(
return true; return true;
}; };
const PrintObject &print_object = instance.print_object; const PrintObject &print_object{instance.print_object};
const Point &offset = print_object.instances()[instance.instance_id].shift; const Point &offset{print_object.instances()[instance.instance_id].shift};
std::vector<SliceExtrusions> slices_extrusions{get_slices_extrusions( std::vector<SliceExtrusions> slices_extrusions{get_slices_extrusions(
print, *layer, predicate, smooth_path, offset, extruder_id, previous_position print, *layer, should_pick_extrusion, smooth_path, offset, extruder_id, previous_position
)}; )};
if (!slices_extrusions.empty()) { if (!slices_extrusions.empty()) {
result.push_back({offset, std::move(slices_extrusions)}); result.push_back({offset, std::move(slices_extrusions)});
@ -447,7 +447,7 @@ std::vector<NormalExtrusions> get_normal_extrusions(
} }
if (const Layer *layer = layers[instance.object_layer_to_print_id].object_layer; layer) { if (const Layer *layer = layers[instance.object_layer_to_print_id].object_layer; layer) {
const auto predicate = [&](const ExtrusionEntityCollection &entity_collection, const PrintRegion &region){ const auto should_pick_extrusion{[&layer_tools, &instance, &extruder_id](const ExtrusionEntityCollection &entity_collection, const PrintRegion &region){
if (is_overriden(entity_collection, layer_tools, instance.instance_id)) { if (is_overriden(entity_collection, layer_tools, instance.instance_id)) {
return false; return false;
} }
@ -456,12 +456,12 @@ std::vector<NormalExtrusions> get_normal_extrusions(
return false; return false;
} }
return true; return true;
}; }};
result.back().slices_extrusions = get_slices_extrusions( result.back().slices_extrusions = get_slices_extrusions(
print, print,
*layer, *layer,
predicate, should_pick_extrusion,
smooth_path, smooth_path,
offset, offset,
extruder_id, extruder_id,