From b54ce0d468d0d842861f93f875c42d26cbc16f92 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Tue, 14 Jan 2020 14:24:38 +0100 Subject: [PATCH] Fixing GCode Skirt generator after refactoring. --- src/libslic3r/GCode.cpp | 36 +++++++++++++++++------------------- src/libslic3r/GCode.hpp | 2 +- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 6fa145bf63..c42c1c35a2 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1800,14 +1800,13 @@ namespace Skirt { const std::vector &layers, const LayerTools &layer_tools, std::vector extruder_ids, - // Heights at which the skirt has already been extruded. - std::vector &skirt_done) + // Heights (print_z) at which the skirt has already been extruded. + std::vector &skirt_done) { // Extrude skirt at the print_z of the raft layers and normal object layers // not at the print_z of the interlaced support material layers. std::map> skirt_loops_per_extruder_out; - assert(skirt_done.empty()); - if (print.has_skirt() && ! print.skirt().entities.empty()) { + if (skirt_done.empty() && print.has_skirt() && ! print.skirt().entities.empty()) { // Prime all the printing extruders over the skirt lines. // Reorder the extruders, so that the last used extruder is at the front. unsigned int first_extruder_id = layer_tools.extruders.front(); @@ -1835,7 +1834,7 @@ namespace Skirt { (i == 0) ? 0 : extruder_loops[i - 1], ((i == 0) ? 0 : extruder_loops[i - 1]) + extruder_loops[i]); } - skirt_done.emplace_back(layer_tools.print_z - (skirt_done.empty() ? 0. : skirt_done.back())); + skirt_done.emplace_back(layer_tools.print_z); } return skirt_loops_per_extruder_out; @@ -1845,8 +1844,8 @@ namespace Skirt { const Print &print, const std::vector &layers, const LayerTools &layer_tools, - // Heights at which the skirt has already been extruded. - std::vector &skirt_done) + // Heights (print_z) at which the skirt has already been extruded. + std::vector &skirt_done) { // Extrude skirt at the print_z of the raft layers and normal object layers // not at the print_z of the interlaced support material layers. @@ -1855,16 +1854,15 @@ namespace Skirt { // Not enough skirt layers printed yet. //FIXME infinite or high skirt does not make sense for sequential print! (skirt_done.size() < (size_t)print.config().skirt_height.value || print.has_infinite_skirt()) && - // This print_z has not been extruded yet + // This print_z has not been extruded yet (sequential print) skirt_done.back() < layer_tools.print_z - EPSILON && // and this layer is an object layer, or it is a raft layer. - //FIXME one uses the number of raft layers from the 1st object! (layer_tools.has_object || layers.front().support_layer->id() < (size_t)layers.front().support_layer->object()->config().raft_layers.value)) { // Extrude all skirts with the current extruder. unsigned int first_extruder_id = layer_tools.extruders.front(); skirt_loops_per_extruder_out[first_extruder_id] = std::pair(0, print.config().skirts.value); assert(!skirt_done.empty()); - skirt_done.emplace_back(layer_tools.print_z - skirt_done.back()); + skirt_done.emplace_back(layer_tools.print_z); } return skirt_loops_per_extruder_out; } @@ -1974,15 +1972,15 @@ void GCode::process_layer( // Map from extruder ID to index of skirt loops to be extruded with that extruder. std::map> skirt_loops_per_extruder; - if (single_object_instance_idx == size_t(-1) && object_layer != nullptr) { - // Normal (non-sequential) print. - gcode += ProcessLayer::emit_custom_gcode_per_print_z(layer_tools.custom_gcode, first_extruder_id, print.config().nozzle_diameter.size() == 1); - // Extrude skirt at the print_z of the raft layers and normal object layers - // not at the print_z of the interlaced support material layers. - skirt_loops_per_extruder = first_layer ? - Skirt::make_skirt_loops_per_extruder_1st_layer(print, layers, layer_tools, m_writer.extruder_ids(), m_skirt_done) : - Skirt::make_skirt_loops_per_extruder_other_layers(print, layers, layer_tools, m_skirt_done); + if (single_object_instance_idx == size_t(-1)) { + // Normal (non-sequential) print. + gcode += ProcessLayer::emit_custom_gcode_per_print_z(layer_tools.custom_gcode, first_extruder_id, print.config().nozzle_diameter.size() == 1); } + // Extrude skirt at the print_z of the raft layers and normal object layers + // not at the print_z of the interlaced support material layers. + skirt_loops_per_extruder = first_layer ? + Skirt::make_skirt_loops_per_extruder_1st_layer(print, layers, layer_tools, m_writer.extruder_ids(), m_skirt_done) : + Skirt::make_skirt_loops_per_extruder_other_layers(print, layers, layer_tools, m_skirt_done); // Group extrusions by an extruder, then by an object, an island and a region. std::map> by_extruder; @@ -2157,7 +2155,7 @@ void GCode::process_layer( this->set_origin(0., 0.); m_avoid_crossing_perimeters.use_external_mp = true; Flow layer_skirt_flow(print.skirt_flow()); - layer_skirt_flow.height = (float)(m_skirt_done.back() - ((m_skirt_done.size() == 1) ? 0. : m_skirt_done[m_skirt_done.size() - 2])); + layer_skirt_flow.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(); for (size_t i = loops.first; i < loops.second; ++i) { // Adjust flow according to this layer's layer height. diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index aee8ee2e25..0344924a13 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -366,7 +366,7 @@ private: #endif /* HAS_PRESSURE_EQUALIZER */ std::unique_ptr m_wipe_tower; - // Heights at which the skirt has already been extruded. + // Heights (print_z) at which the skirt has already been extruded. std::vector m_skirt_done; // Has the brim been extruded already? Brim is being extruded only for the first object of a multi-object print. bool m_brim_done;