From 6975b5d84cd2000365237e1cbb384ab40b8f47ba Mon Sep 17 00:00:00 2001 From: Rodrigo Faselli <162915171+RF47@users.noreply.github.com> Date: Tue, 7 Apr 2026 11:25:28 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=A5Fix=20crash=20-=20inconsistent=20dr?= =?UTF-8?q?aft=20shield=20layer=20height=20(#12937)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix crash-inconsistent draft shield * Skip empty skirt G-code and fix skirt_done handling Track whether a skirt was actually generated for the current print Z and avoid appending empty skirt G-code. Only pop m_skirt_done when a skirt was emitted to prevent corrupting skirt state across multiple instances per layer. Also use a temporary string (moved into the main gcode) to detect emptiness before updating state. Preserves existing first-layer clearing behavior. --- src/libslic3r/GCode.cpp | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index ba47fac081..ed7f153ab3 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5137,19 +5137,37 @@ LayerResult GCode::process_layer( if (is_anything_overridden && print_wipe_extrusions == 0) gcode+="; PURGING FINISHED\n"; + bool skirt_generated_for_current_print_z = false; + for (InstanceToPrint &instance_to_print : instances_to_print) { if (print.config().skirt_type == stPerObject && !instance_to_print.print_object.object_skirt().empty() && - print.config().print_sequence == PrintSequence::ByLayer - && - (layer.id() < print.config().skirt_height || print.config().draft_shield == DraftShield::dsEnabled)) + print.config().print_sequence == PrintSequence::ByLayer) { - if (first_layer) - m_skirt_done.clear(); - const Point& offset = instance_to_print.print_object.instances()[instance_to_print.instance_id].shift; - gcode += generate_skirt(print, instance_to_print.print_object.object_skirt(), offset, instance_to_print.print_object.config().skirt_start_angle, layer_tools, layer, extruder_id); - if (instances_to_print.size() > 1 && &instance_to_print != &*(instances_to_print.end() - 1)) - m_skirt_done.pop_back(); + const LayerToPrint& layer_to_print = layers[instance_to_print.layer_id]; + const Layer* skirt_layer = layer_to_print.object_layer; + if (skirt_layer == nullptr && layer_to_print.support_layer != nullptr && + layer_to_print.support_layer->id() < layer_to_print.support_layer->object()->slicing_parameters().raft_layers()) { + skirt_layer = layer_to_print.support_layer; + } + + if (skirt_layer != nullptr && + (skirt_layer->id() < print.config().skirt_height || print.config().draft_shield == DraftShield::dsEnabled)) { + const bool skirt_first_layer = (skirt_layer->id() == 0 && std::abs(skirt_layer->bottom_z()) < EPSILON); + if (skirt_first_layer) + m_skirt_done.clear(); + + if (skirt_generated_for_current_print_z && !m_skirt_done.empty()) + m_skirt_done.pop_back(); + + const Point& offset = instance_to_print.print_object.instances()[instance_to_print.instance_id].shift; + std::string skirt_gcode = generate_skirt(print, instance_to_print.print_object.object_skirt(), offset, + instance_to_print.print_object.config().skirt_start_angle, layer_tools, + *skirt_layer, extruder_id); + if (!skirt_gcode.empty()) + skirt_generated_for_current_print_z = true; + gcode += std::move(skirt_gcode); + } } const auto& inst = instance_to_print.print_object.instances()[instance_to_print.instance_id];