Add offset to extrusions an make sure to reset origin

This commit is contained in:
Martin Šach 2024-06-21 11:17:23 +02:00 committed by Lukas Matena
parent dca7318896
commit 131f05c3c4
4 changed files with 30 additions and 50 deletions

View File

@ -2576,7 +2576,6 @@ LayerResult GCodeGenerator::process_layer(
}
this->m_label_objects.update(nullptr);
this->set_origin(0., 0.);
m_avoid_crossing_perimeters.use_external_mp();
Flow layer_skirt_flow = print.skirt_flow().with_height(float(m_skirt_done.back() - (m_skirt_done.size() == 1 ? 0. : m_skirt_done[m_skirt_done.size() - 2])));
double mm3_per_mm = layer_skirt_flow.mm3_per_mm();
@ -2585,8 +2584,8 @@ LayerResult GCodeGenerator::process_layer(
//FIXME using the support_material_speed of the 1st object printed.
gcode += this->extrude_skirt(smooth_path,
// Override of skirt extrusion parameters. extrude_skirt() will fill in the extrusion width.
ExtrusionFlow{ mm3_per_mm, 0., layer_skirt_flow.height() },
"skirt"sv, m_config.support_material_speed.value);
ExtrusionFlow{ mm3_per_mm, 0., layer_skirt_flow.height() }
);
}
m_avoid_crossing_perimeters.use_external_mp(false);
// Allow a straight travel move to the first object point if this is the first layer (but don't in next layers).
@ -2601,7 +2600,6 @@ LayerResult GCodeGenerator::process_layer(
}
this->m_label_objects.update(nullptr);
this->set_origin(0., 0.);
m_avoid_crossing_perimeters.use_external_mp();
for (const GCode::ExtrusionOrder::BrimPath &brim_path : extruder_extrusions.brim) {
@ -2618,14 +2616,15 @@ LayerResult GCodeGenerator::process_layer(
size_t gcode_size_old = gcode.size();
for (std::size_t i{0}; i < instances_to_print.size(); ++i) {
const InstanceToPrint &instance{instances_to_print[i]};
const std::vector<SliceExtrusions> overriden_extrusions{extruder_extrusions.overriden_extrusions[i]};
if (is_empty(overriden_extrusions)) {
using GCode::ExtrusionOrder::OverridenExtrusions;
const OverridenExtrusions &overriden_extrusions{extruder_extrusions.overriden_extrusions[i]};
if (is_empty(overriden_extrusions.slices_extrusions)) {
continue;
}
this->initialize_layer(instance, layers[instance.object_layer_to_print_id]);
this->initialize_instance(instance, layers[instance.object_layer_to_print_id]);
gcode += this->extrude_slices(
instance, layers[instance.object_layer_to_print_id],
overriden_extrusions
overriden_extrusions.slices_extrusions
);
}
if (gcode_size_old < gcode.size()) {
@ -2645,7 +2644,7 @@ LayerResult GCodeGenerator::process_layer(
continue;
}
this->initialize_layer(instance, layers[instance.object_layer_to_print_id]);
this->initialize_instance(instance, layers[instance.object_layer_to_print_id]);
if (!support_extrusions.empty()) {
m_layer = layer_to_print.support_layer;
@ -2657,6 +2656,7 @@ LayerResult GCodeGenerator::process_layer(
instance, layer_to_print, slices_extrusions
);
}
this->set_origin(0.0, 0.0);
}
// During layer change the starting position of next layer is now known.
@ -2737,7 +2737,7 @@ LayerResult GCodeGenerator::process_layer(
static const auto comment_perimeter = "perimeter"sv;
void GCodeGenerator::initialize_layer(
void GCodeGenerator::initialize_instance(
const InstanceToPrint &print_instance,
const ObjectLayerToPrint &layer_to_print
) {
@ -2765,7 +2765,6 @@ std::string GCodeGenerator::extrude_slices(
const std::vector<SliceExtrusions> &slices_extrusions
) {
const PrintObject &print_object = print_instance.print_object;
const Print &print = *print_object.print();
m_layer = layer_to_print.layer();
// To control print speed of the 1st object layer printed over raft interface.
@ -2775,7 +2774,7 @@ std::string GCodeGenerator::extrude_slices(
std::string gcode;
for (const SliceExtrusions &slice_extrusions : slices_extrusions) {
for (const IslandExtrusions &island_extrusions : slice_extrusions.common_extrusions) {
if (print.config().infill_first) {
if (island_extrusions.infill_first) {
gcode += this->extrude_infill_ranges(island_extrusions.infill_ranges, "infill");
gcode += this->extrude_perimeters(*island_extrusions.region, island_extrusions.perimeters, print_instance);
} else {
@ -2938,8 +2937,7 @@ std::string GCodeGenerator::extrude_smooth_path(
}
std::string GCodeGenerator::extrude_skirt(
GCode::SmoothPath smooth_path, const ExtrusionFlow &extrusion_flow_override,
const std::string_view description, double speed)
GCode::SmoothPath smooth_path, const ExtrusionFlow &extrusion_flow_override)
{
// Extrude along the smooth path.
std::string gcode;
@ -2949,7 +2947,7 @@ std::string GCodeGenerator::extrude_skirt(
el.path_attributes.height = extrusion_flow_override.height;
}
gcode += this->extrude_smooth_path(smooth_path, true, description, m_config.support_material_speed.value);
gcode += this->extrude_smooth_path(smooth_path, true, "skirt"sv, m_config.support_material_speed.value);
return gcode;
}

View File

@ -284,7 +284,7 @@ private:
std::string extrude_smooth_path(
const GCode::SmoothPath &smooth_path, const bool is_loop, const std::string_view description, const double speed
);
std::string extrude_skirt(GCode::SmoothPath smooth_path, const ExtrusionFlow &extrusion_flow_override, const std::string_view description, double speed);
std::string extrude_skirt(GCode::SmoothPath smooth_path, const ExtrusionFlow &extrusion_flow_override);
std::vector<InstanceToPrint> sort_print_object_instances(
// Object and Support layers for the current print_z, collected for a single object, or for possibly multiple objects with multiple instances.
@ -305,7 +305,7 @@ private:
const std::string &commment
);
void initialize_layer(
void initialize_instance(
const InstanceToPrint &print_instance,
const ObjectLayerToPrint &layer_to_print
);

View File

@ -50,28 +50,6 @@ std::optional<InstancePoint> get_instance_point(const std::optional<Point> &poin
return std::nullopt;
}
std::optional<Point> get_last_position(const ExtrusionEntityReferences &extrusions, const Point &offset) {
if (!extrusions.empty()) {
const ExtrusionEntityReference &last_extrusion{extrusions.back()};
auto last_loop{dynamic_cast<const ExtrusionLoop *>(&last_extrusion.extrusion_entity())};
if (last_loop != nullptr) {
return get_gcode_point(InstancePoint{last_loop->seam}, offset);
}
const InstancePoint last_point{
last_extrusion.flipped() ? last_extrusion.extrusion_entity().first_point() :
last_extrusion.extrusion_entity().last_point()};
return get_gcode_point(last_point, offset);
}
return std::nullopt;
}
std::optional<Point> get_last_position(const ExtrusionEntitiesPtr &extrusions, const Point &offset){
if (!extrusions.empty()) {
return get_last_position({{*extrusions.back(), false}}, offset);
}
return std::nullopt;
}
using ExtractEntityPredicate = std::function<bool(const ExtrusionEntityCollection&, const PrintRegion&)>;
ExtrusionEntitiesPtr extract_infill_extrusions(
@ -234,6 +212,7 @@ std::vector<IslandExtrusions> extract_island_extrusions(
result.push_back(IslandExtrusions{&region});
IslandExtrusions &island_extrusions{result.back()};
island_extrusions.infill_first = print.config().infill_first;
if (print.config().infill_first) {
island_extrusions.infill_ranges = extract_infill_ranges(
@ -378,7 +357,7 @@ std::vector<SupportPath> get_support_extrusions(
return {};
}
std::vector<std::vector<SliceExtrusions>> get_overriden_extrusions(
std::vector<OverridenExtrusions> get_overriden_extrusions(
const Print &print,
const GCode::ObjectsLayerToPrint &layers,
const LayerTools &layer_tools,
@ -387,7 +366,7 @@ std::vector<std::vector<SliceExtrusions>> get_overriden_extrusions(
const PathSmoothingFunction &smooth_path,
std::optional<Point> &previous_position
) {
std::vector<std::vector<SliceExtrusions>> result;
std::vector<OverridenExtrusions> result;
for (const InstanceToPrint &instance : instances_to_print) {
if (const Layer *layer = layers[instance.object_layer_to_print_id].object_layer; layer) {
@ -408,9 +387,9 @@ std::vector<std::vector<SliceExtrusions>> get_overriden_extrusions(
const PrintObject &print_object = instance.print_object;
const Point &offset = print_object.instances()[instance.instance_id].shift;
result.emplace_back(get_slices_extrusions(
result.push_back({offset, get_slices_extrusions(
print, *layer, predicate, smooth_path, offset, extruder_id, previous_position
));
)});
}
}
return result;
@ -433,6 +412,7 @@ std::vector<NormalExtrusions> get_normal_extrusions(
const Point &offset = print_object.instances()[instance.instance_id].shift;
result.emplace_back();
result.back().instance_offset = offset;
if (layers[instance.object_layer_to_print_id].support_layer != nullptr) {
result.back().support_extrusions = get_support_extrusions(
@ -486,8 +466,8 @@ bool is_empty(const std::vector<SliceExtrusions> &extrusions) {
}
bool is_empty(const ExtruderExtrusions &extruder_extrusions) {
for (const std::vector<SliceExtrusions> &slices_extrusions : extruder_extrusions.overriden_extrusions) {
if (!is_empty(slices_extrusions)) {
for (const OverridenExtrusions &overriden_extrusions : extruder_extrusions.overriden_extrusions) {
if (!is_empty(overriden_extrusions.slices_extrusions)) {
return false;
}
}
@ -543,7 +523,6 @@ std::vector<ExtruderExtrusions> get_extrusions(
}
// Extrude brim with the extruder of the 1st region.
using GCode::ExtrusionOrder::get_last_position;
if (get_brim) {
for (const ExtrusionEntity *entity : print.brim().entities) {
const ExtrusionEntityReference entity_reference{*entity, false};

View File

@ -67,6 +67,7 @@ struct IslandExtrusions {
const PrintRegion *region;
std::vector<Perimeter> perimeters;
std::vector<InfillRange> infill_ranges;
bool infill_first{false};
};
struct SliceExtrusions {
@ -74,18 +75,21 @@ struct SliceExtrusions {
std::vector<InfillRange> ironing_extrusions;
};
struct SupportPath {
SmoothPath path;
bool is_interface;
};
struct NormalExtrusions {
Point instance_offset;
std::vector<SupportPath> support_extrusions;
std::vector<SliceExtrusions> slices_extrusions;
};
std::optional<Point> get_last_position(const ExtrusionEntitiesPtr &extrusions, const Point &offset);
struct OverridenExtrusions {
Point instance_offset;
std::vector<SliceExtrusions> slices_extrusions;
};
struct InstancePoint {
Point value;
@ -104,7 +108,7 @@ struct ExtruderExtrusions {
unsigned extruder_id;
std::vector<std::pair<std::size_t, GCode::SmoothPath>> skirt;
std::vector<BrimPath> brim;
std::vector<std::vector<SliceExtrusions>> overriden_extrusions;
std::vector<OverridenExtrusions> overriden_extrusions;
std::vector<NormalExtrusions> normal_extrusions;
};
@ -125,7 +129,6 @@ std::vector<ExtruderExtrusions> get_extrusions(
bool get_brim,
std::optional<Point> previous_position
);
}
#endif // slic3r_GCode_ExtrusionOrder_hpp_