diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 68fb7854d1..b50abeda29 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -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 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 &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; } diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 0f1c359a4e..05e038e8bf 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -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 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 ); diff --git a/src/libslic3r/GCode/ExtrusionOrder.cpp b/src/libslic3r/GCode/ExtrusionOrder.cpp index 9f461d2635..b6524181e7 100644 --- a/src/libslic3r/GCode/ExtrusionOrder.cpp +++ b/src/libslic3r/GCode/ExtrusionOrder.cpp @@ -50,28 +50,6 @@ std::optional get_instance_point(const std::optional &poin return std::nullopt; } -std::optional get_last_position(const ExtrusionEntityReferences &extrusions, const Point &offset) { - if (!extrusions.empty()) { - const ExtrusionEntityReference &last_extrusion{extrusions.back()}; - auto last_loop{dynamic_cast(&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 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; ExtrusionEntitiesPtr extract_infill_extrusions( @@ -234,6 +212,7 @@ std::vector extract_island_extrusions( result.push_back(IslandExtrusions{®ion}); 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 get_support_extrusions( return {}; } -std::vector> get_overriden_extrusions( +std::vector get_overriden_extrusions( const Print &print, const GCode::ObjectsLayerToPrint &layers, const LayerTools &layer_tools, @@ -387,7 +366,7 @@ std::vector> get_overriden_extrusions( const PathSmoothingFunction &smooth_path, std::optional &previous_position ) { - std::vector> result; + std::vector 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> 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 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 &extrusions) { } bool is_empty(const ExtruderExtrusions &extruder_extrusions) { - for (const std::vector &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 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}; diff --git a/src/libslic3r/GCode/ExtrusionOrder.hpp b/src/libslic3r/GCode/ExtrusionOrder.hpp index eb3367b441..6bdf6f1c4a 100644 --- a/src/libslic3r/GCode/ExtrusionOrder.hpp +++ b/src/libslic3r/GCode/ExtrusionOrder.hpp @@ -67,6 +67,7 @@ struct IslandExtrusions { const PrintRegion *region; std::vector perimeters; std::vector infill_ranges; + bool infill_first{false}; }; struct SliceExtrusions { @@ -74,18 +75,21 @@ struct SliceExtrusions { std::vector ironing_extrusions; }; - struct SupportPath { SmoothPath path; bool is_interface; }; struct NormalExtrusions { + Point instance_offset; std::vector support_extrusions; std::vector slices_extrusions; }; -std::optional get_last_position(const ExtrusionEntitiesPtr &extrusions, const Point &offset); +struct OverridenExtrusions { + Point instance_offset; + std::vector slices_extrusions; +}; struct InstancePoint { Point value; @@ -104,7 +108,7 @@ struct ExtruderExtrusions { unsigned extruder_id; std::vector> skirt; std::vector brim; - std::vector> overriden_extrusions; + std::vector overriden_extrusions; std::vector normal_extrusions; }; @@ -125,7 +129,6 @@ std::vector get_extrusions( bool get_brim, std::optional previous_position ); - } #endif // slic3r_GCode_ExtrusionOrder_hpp_