mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-05-14 00:52:04 +00:00
💥Fix crash - inconsistent draft shield layer height (#12937)
* 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.
This commit is contained in:
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user