mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-12 01:07:57 -06:00
Started to work on the 'wipe into dedicated object feature'
This commit is contained in:
parent
7c9d594ff6
commit
4830593cac
3 changed files with 55 additions and 8 deletions
|
@ -1246,6 +1246,17 @@ void GCode::process_layer(
|
||||||
if (islands[i].by_region.empty())
|
if (islands[i].by_region.empty())
|
||||||
islands[i].by_region.assign(print.regions.size(), ObjectByExtruder::Island::Region());
|
islands[i].by_region.assign(print.regions.size(), ObjectByExtruder::Island::Region());
|
||||||
islands[i].by_region[region_id].perimeters.append(perimeter_coll->entities);
|
islands[i].by_region[region_id].perimeters.append(perimeter_coll->entities);
|
||||||
|
|
||||||
|
// We just added perimeter_coll->entities.size() entities, if they are not to be printed before the main object (during infill wiping),
|
||||||
|
// we will note their indices (for each copy separately):
|
||||||
|
unsigned int last_added_entity_index = islands[i].by_region[region_id].perimeters.entities.size()-1;
|
||||||
|
for (unsigned copy_id = 0; copy_id < layer_to_print.object()->_shifted_copies.size(); ++copy_id) {
|
||||||
|
if (islands[i].by_region[region_id].perimeters_per_copy_ids.size() < copy_id + 1) // if this copy isn't in the list yet
|
||||||
|
islands[i].by_region[region_id].perimeters_per_copy_ids.push_back(std::vector<unsigned int>());
|
||||||
|
if (!perimeter_coll->is_extruder_overridden(copy_id))
|
||||||
|
for (int j=0; j<perimeter_coll->entities.size(); ++j)
|
||||||
|
islands[i].by_region[region_id].perimeters_per_copy_ids[copy_id].push_back(last_added_entity_index - j);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1362,14 +1373,29 @@ void GCode::process_layer(
|
||||||
overridden.push_back(new_region);
|
overridden.push_back(new_region);
|
||||||
for (ExtrusionEntity *ee : (*layer_to_print.object_layer).regions[region_id]->fills.entities) {
|
for (ExtrusionEntity *ee : (*layer_to_print.object_layer).regions[region_id]->fills.entities) {
|
||||||
auto *fill = dynamic_cast<ExtrusionEntityCollection*>(ee);
|
auto *fill = dynamic_cast<ExtrusionEntityCollection*>(ee);
|
||||||
if (fill->get_extruder_override(copy_id) == extruder_id)
|
if (fill->get_extruder_override(copy_id) == (unsigned int)extruder_id)
|
||||||
overridden.back().infills.append(*fill);
|
overridden.back().infills.append(*fill);
|
||||||
}
|
}
|
||||||
|
for (ExtrusionEntity *ee : (*layer_to_print.object_layer).regions[region_id]->perimeters.entities) {
|
||||||
|
auto *fill = dynamic_cast<ExtrusionEntityCollection*>(ee);
|
||||||
|
if (fill->get_extruder_override(copy_id) == (unsigned int)extruder_id)
|
||||||
|
overridden.back().perimeters.append((*fill).entities);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Point copy = (layer_to_print.object_layer)->object()->_shifted_copies[copy_id];
|
Point copy = (layer_to_print.object_layer)->object()->_shifted_copies[copy_id];
|
||||||
this->set_origin(unscale(copy.x), unscale(copy.y));
|
this->set_origin(unscale(copy.x), unscale(copy.y));
|
||||||
|
|
||||||
|
|
||||||
|
std::unique_ptr<EdgeGrid::Grid> u;
|
||||||
|
if (print.config.infill_first) {
|
||||||
gcode += this->extrude_infill(print, overridden);
|
gcode += this->extrude_infill(print, overridden);
|
||||||
|
gcode += this->extrude_perimeters(print, overridden, u);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
gcode += this->extrude_perimeters(print, overridden, u);
|
||||||
|
gcode += this->extrude_infill(print, overridden);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1417,9 +1443,9 @@ void GCode::process_layer(
|
||||||
for (const ObjectByExtruder::Island &island : object_by_extruder.islands) {
|
for (const ObjectByExtruder::Island &island : object_by_extruder.islands) {
|
||||||
if (print.config.infill_first) {
|
if (print.config.infill_first) {
|
||||||
gcode += this->extrude_infill(print, island.by_region_per_copy(copy_id));
|
gcode += this->extrude_infill(print, island.by_region_per_copy(copy_id));
|
||||||
gcode += this->extrude_perimeters(print, island.by_region, lower_layer_edge_grids[layer_id]);
|
gcode += this->extrude_perimeters(print, island.by_region_per_copy(copy_id), lower_layer_edge_grids[layer_id]);
|
||||||
} else {
|
} else {
|
||||||
gcode += this->extrude_perimeters(print, island.by_region, lower_layer_edge_grids[layer_id]);
|
gcode += this->extrude_perimeters(print, island.by_region_per_copy(copy_id), lower_layer_edge_grids[layer_id]);
|
||||||
gcode += this->extrude_infill(print, island.by_region_per_copy(copy_id));
|
gcode += this->extrude_infill(print, island.by_region_per_copy(copy_id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2492,11 +2518,13 @@ std::vector<GCode::ObjectByExtruder::Island::Region> GCode::ObjectByExtruder::Is
|
||||||
std::vector<ObjectByExtruder::Island::Region> out;
|
std::vector<ObjectByExtruder::Island::Region> out;
|
||||||
for (auto& reg : by_region) {
|
for (auto& reg : by_region) {
|
||||||
out.push_back(ObjectByExtruder::Island::Region());
|
out.push_back(ObjectByExtruder::Island::Region());
|
||||||
out.back().perimeters.append(reg.perimeters); // we will print all perimeters there are
|
//out.back().perimeters.append(reg.perimeters); // we will print all perimeters there are
|
||||||
|
|
||||||
if (!reg.infills_per_copy_ids.empty()) {
|
if (!reg.infills_per_copy_ids.empty()) {
|
||||||
for (unsigned int i=0; i<reg.infills_per_copy_ids[copy].size(); ++i)
|
for (unsigned int i=0; i<reg.infills_per_copy_ids[copy].size(); ++i)
|
||||||
out.back().infills.append(*(reg.infills.entities[reg.infills_per_copy_ids[copy][i]]));
|
out.back().infills.append(*(reg.infills.entities[reg.infills_per_copy_ids[copy][i]]));
|
||||||
|
for (unsigned int i=0; i<reg.perimeters_per_copy_ids[copy].size(); ++i)
|
||||||
|
out.back().perimeters.append(*(reg.perimeters.entities[reg.perimeters_per_copy_ids[copy][i]]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
|
|
|
@ -216,6 +216,7 @@ protected:
|
||||||
ExtrusionEntityCollection perimeters;
|
ExtrusionEntityCollection perimeters;
|
||||||
ExtrusionEntityCollection infills;
|
ExtrusionEntityCollection infills;
|
||||||
std::vector<std::vector<unsigned int>> infills_per_copy_ids; // indices of infill.entities that are not part of infill wiping (an element for each object copy)
|
std::vector<std::vector<unsigned int>> infills_per_copy_ids; // indices of infill.entities that are not part of infill wiping (an element for each object copy)
|
||||||
|
std::vector<std::vector<unsigned int>> perimeters_per_copy_ids; // indices of infill.entities that are not part of infill wiping (an element for each object copy)
|
||||||
};
|
};
|
||||||
std::vector<Region> by_region;
|
std::vector<Region> by_region;
|
||||||
std::vector<Region> by_region_per_copy(unsigned int copy) const; // returns only extrusions that are NOT printed during wiping into infill for this copy
|
std::vector<Region> by_region_per_copy(unsigned int copy) const; // returns only extrusions that are NOT printed during wiping into infill for this copy
|
||||||
|
|
|
@ -1209,11 +1209,29 @@ float Print::mark_wiping_infill(const ToolOrdering::LayerTools& layer_tools, uns
|
||||||
if (unused_yet)
|
if (unused_yet)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//if (object.wipe_into_perimeters)
|
||||||
|
{
|
||||||
|
ExtrusionEntityCollection& eec = this_layer->regions[region_id]->perimeters;
|
||||||
|
for (ExtrusionEntity* ee : eec.entities) { // iterate through all perimeter Collections
|
||||||
|
auto* fill = dynamic_cast<ExtrusionEntityCollection*>(ee);
|
||||||
|
if (volume_to_wipe <= 0.f)
|
||||||
|
break;
|
||||||
|
if (!fill->is_extruder_overridden(copy) && fill->total_volume() > min_infill_volume) {
|
||||||
|
fill->set_extruder_override(copy, new_extruder);
|
||||||
|
volume_to_wipe -= fill->total_volume();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ExtrusionEntityCollection& eec = this_layer->regions[region_id]->fills;
|
ExtrusionEntityCollection& eec = this_layer->regions[region_id]->fills;
|
||||||
for (ExtrusionEntity* ee : eec.entities) { // iterate through all infill Collections
|
for (ExtrusionEntity* ee : eec.entities) { // iterate through all infill Collections
|
||||||
auto* fill = dynamic_cast<ExtrusionEntityCollection*>(ee);
|
auto* fill = dynamic_cast<ExtrusionEntityCollection*>(ee);
|
||||||
if (fill->role() == erTopSolidInfill || fill->role() == erGapFill) continue; // these cannot be changed - it is / may be visible
|
if (fill->role() == erTopSolidInfill || fill->role() == erGapFill) continue; // these cannot be changed - it is / may be visible
|
||||||
if (volume_to_wipe > 0.f && !fill->is_extruder_overridden(copy) && fill->total_volume() > min_infill_volume) { // this infill will be used to wipe this extruder
|
if (volume_to_wipe <= 0.f)
|
||||||
|
break;
|
||||||
|
if (!fill->is_extruder_overridden(copy) && fill->total_volume() > min_infill_volume) { // this infill will be used to wipe this extruder
|
||||||
fill->set_extruder_override(copy, new_extruder);
|
fill->set_extruder_override(copy, new_extruder);
|
||||||
volume_to_wipe -= fill->total_volume();
|
volume_to_wipe -= fill->total_volume();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue