mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-01 13:52:01 +08:00
Separate 'extrude_infill_range'.
This commit is contained in:
parent
b30105d2ea
commit
5a9f9946ba
@ -2779,9 +2779,44 @@ std::string GCodeGenerator::extrude_perimeters(
|
|||||||
return gcode;
|
return gcode;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
std::vector<ExtrusionEntityReference> sort_fill_extrusions(const ExtrusionEntitiesPtr &fills, const Point* start_near) {
|
||||||
|
if (fills.empty()) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
std::vector<ExtrusionEntityReference> sorted_extrusions;
|
||||||
|
|
||||||
|
for (const ExtrusionEntityReference &fill : chain_extrusion_references(fills, start_near)) {
|
||||||
|
if (auto *eec = dynamic_cast<const ExtrusionEntityCollection*>(&fill.extrusion_entity()); eec) {
|
||||||
|
for (const ExtrusionEntityReference &ee : chain_extrusion_references(*eec, start_near, fill.flipped())) {
|
||||||
|
sorted_extrusions.push_back(ee);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sorted_extrusions.push_back(fill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sorted_extrusions;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string GCodeGenerator::extrude_infill_range(
|
||||||
|
const std::vector<ExtrusionEntityReference> &sorted_extrusions,
|
||||||
|
const PrintRegion ®ion,
|
||||||
|
const std::string &extrusion_name,
|
||||||
|
const GCode::SmoothPathCache &smooth_path_cache
|
||||||
|
) {
|
||||||
|
std::string gcode{};
|
||||||
|
if (!sorted_extrusions.empty()) {
|
||||||
|
this->m_config.apply(region.config());
|
||||||
|
|
||||||
|
for (const ExtrusionEntityReference &ee : sorted_extrusions) {
|
||||||
|
gcode += this->extrude_entity(ee, smooth_path_cache, extrusion_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return gcode;
|
||||||
|
};
|
||||||
|
|
||||||
void GCodeGenerator::process_layer_single_object(
|
void GCodeGenerator::process_layer_single_object(
|
||||||
// output
|
// output
|
||||||
std::string &gcode,
|
std::string &gcode,
|
||||||
// Index of the extruder currently active.
|
// Index of the extruder currently active.
|
||||||
const unsigned int extruder_id,
|
const unsigned int extruder_id,
|
||||||
// What object and instance is going to be printed.
|
// What object and instance is going to be printed.
|
||||||
@ -2876,47 +2911,6 @@ void GCodeGenerator::process_layer_single_object(
|
|||||||
if (const Layer *layer = layer_to_print.object_layer; layer)
|
if (const Layer *layer = layer_to_print.object_layer; layer)
|
||||||
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];
|
||||||
auto extrude_infill_range = [&](
|
|
||||||
const LayerRegion &layerm, const ExtrusionEntityCollection &fills,
|
|
||||||
LayerExtrusionRanges::const_iterator it_fill_ranges_begin, LayerExtrusionRanges::const_iterator it_fill_ranges_end, bool ironing) {
|
|
||||||
// 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());
|
|
||||||
ExtrusionEntitiesPtr temp_fill_extrusions{extract_fill_extrusions(
|
|
||||||
layer,
|
|
||||||
region,
|
|
||||||
fills,
|
|
||||||
it_fill_ranges_begin,
|
|
||||||
it_fill_ranges_end,
|
|
||||||
layer_tools,
|
|
||||||
print_instance.instance_id,
|
|
||||||
extruder_id,
|
|
||||||
print_wipe_extrusions,
|
|
||||||
ironing
|
|
||||||
)};
|
|
||||||
if (! temp_fill_extrusions.empty()) {
|
|
||||||
init_layer_delayed();
|
|
||||||
m_config.apply(region.config());
|
|
||||||
const auto extrusion_name = ironing ? "ironing"sv : "infill"sv;
|
|
||||||
const Point* start_near = this->last_position ? &(*(this->last_position)) : nullptr;
|
|
||||||
|
|
||||||
std::vector<ExtrusionEntityReference> sorted_extrusions;
|
|
||||||
|
|
||||||
for (const ExtrusionEntityReference &fill : chain_extrusion_references(temp_fill_extrusions, start_near)) {
|
|
||||||
if (auto *eec = dynamic_cast<const ExtrusionEntityCollection*>(&fill.extrusion_entity()); eec) {
|
|
||||||
for (const ExtrusionEntityReference &ee : chain_extrusion_references(*eec, start_near, fill.flipped())) {
|
|
||||||
sorted_extrusions.push_back(ee);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
sorted_extrusions.push_back(fill);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const ExtrusionEntityReference &ee : sorted_extrusions) {
|
|
||||||
gcode += this->extrude_entity(ee, smooth_path_cache, extrusion_name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//FIXME order islands?
|
//FIXME order islands?
|
||||||
// Sequential tool path ordering of multiple parts within the same object, aka. perimeter tracking (#5511)
|
// Sequential tool path ordering of multiple parts within the same object, aka. perimeter tracking (#5511)
|
||||||
@ -2927,7 +2921,32 @@ void GCodeGenerator::process_layer_single_object(
|
|||||||
auto it_end = it;
|
auto it_end = it;
|
||||||
for (++ it_end; it_end != island.fills.end() && it->region() == it_end->region(); ++ it_end) ;
|
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());
|
||||||
extrude_infill_range(layerm, layerm.fills(), it, it_end, false /* normal extrusions, not ironing */);
|
// 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 Point* start_near = this->last_position ? &(*(this->last_position)) : nullptr;
|
||||||
|
|
||||||
|
ExtrusionEntitiesPtr temp_fill_extrusions{extract_fill_extrusions(
|
||||||
|
layer,
|
||||||
|
region,
|
||||||
|
layerm.fills(),
|
||||||
|
it,
|
||||||
|
it_end,
|
||||||
|
layer_tools,
|
||||||
|
print_instance.instance_id,
|
||||||
|
extruder_id,
|
||||||
|
print_wipe_extrusions,
|
||||||
|
false
|
||||||
|
)};
|
||||||
|
|
||||||
|
const std::vector<ExtrusionEntityReference> sorted_extrusions{sort_fill_extrusions(temp_fill_extrusions, start_near)};
|
||||||
|
|
||||||
|
if (!sorted_extrusions.empty()) {
|
||||||
|
init_layer_delayed();
|
||||||
|
}
|
||||||
|
|
||||||
|
gcode += this->extrude_infill_range(sorted_extrusions, region, "infill", smooth_path_cache);
|
||||||
it = it_end;
|
it = it_end;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -2965,7 +2984,32 @@ void GCodeGenerator::process_layer_single_object(
|
|||||||
auto it_end = it;
|
auto it_end = it;
|
||||||
for (++ it_end; it_end != island.fills.end() && it->region() == it_end->region(); ++ it_end) ;
|
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());
|
||||||
extrude_infill_range(layerm, layerm.fills(), it, it_end, true /* ironing, not normal extrusions */);
|
// 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 Point* start_near = this->last_position ? &(*(this->last_position)) : nullptr;
|
||||||
|
|
||||||
|
ExtrusionEntitiesPtr temp_fill_extrusions{extract_fill_extrusions(
|
||||||
|
layer,
|
||||||
|
region,
|
||||||
|
layerm.fills(),
|
||||||
|
it,
|
||||||
|
it_end,
|
||||||
|
layer_tools,
|
||||||
|
print_instance.instance_id,
|
||||||
|
extruder_id,
|
||||||
|
print_wipe_extrusions,
|
||||||
|
true
|
||||||
|
)};
|
||||||
|
|
||||||
|
const std::vector<ExtrusionEntityReference> sorted_extrusions{sort_fill_extrusions(temp_fill_extrusions, start_near)};
|
||||||
|
|
||||||
|
if (! sorted_extrusions.empty()) {
|
||||||
|
init_layer_delayed();
|
||||||
|
}
|
||||||
|
|
||||||
|
gcode += this->extrude_infill_range(sorted_extrusions, region, "ironing", smooth_path_cache);
|
||||||
it = it_end;
|
it = it_end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -314,6 +314,13 @@ private:
|
|||||||
const GCode::SmoothPathCache &smooth_path_cache
|
const GCode::SmoothPathCache &smooth_path_cache
|
||||||
);
|
);
|
||||||
|
|
||||||
|
std::string extrude_infill_range(
|
||||||
|
const std::vector<ExtrusionEntityReference> &sorted_extrusions,
|
||||||
|
const PrintRegion ®ion,
|
||||||
|
const std::string &extrusion_name,
|
||||||
|
const GCode::SmoothPathCache &smooth_path_cache
|
||||||
|
);
|
||||||
|
|
||||||
// This function will be called for each printing extruder, possibly twice: First for wiping extrusions, second for normal extrusions.
|
// This function will be called for each printing extruder, possibly twice: First for wiping extrusions, second for normal extrusions.
|
||||||
void process_layer_single_object(
|
void process_layer_single_object(
|
||||||
// output
|
// output
|
||||||
|
Loading…
x
Reference in New Issue
Block a user