From 23dce61f0affe704249dc8dcea76e382adc3f1e0 Mon Sep 17 00:00:00 2001 From: xiaoyeliu Date: Thu, 5 Feb 2026 23:14:58 +0800 Subject: [PATCH] Fix: chamfer off --- .gitignore | 3 ++- src/libslic3r/GCode/WipeTower2.cpp | 34 ++++++++++++++++++++---------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 4b71ec177a..c05638770b 100644 --- a/.gitignore +++ b/.gitignore @@ -40,4 +40,5 @@ resources/profiles/user/default *.code-workspace deps_src/build/ .claude/ -.omc \ No newline at end of file +.omc +nul \ No newline at end of file diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index 2e7c12f6ea..e3ea8bc306 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -2081,25 +2081,37 @@ WipeTower::ToolChangeResult WipeTower2::finish_layer() // brim with chamfer (gradual layer-by-layer reduction) int loops_num = (m_wipe_tower_brim_width + spacing / 2.f) / spacing; - // Apply chamfer reduction if feature is enabled and brim width is configured - if (m_wipe_tower_brim_width > 0 && m_prime_tower_brim_chamfer) { - if (!first_layer) { + // Apply brim logic based on chamfer setting + if (m_wipe_tower_brim_width > 0) { + if (first_layer) { + // First layer: always print full brim (loops_num unchanged) + } else if (m_prime_tower_brim_chamfer) { + // Non-first layer + chamfer enabled: apply gradual reduction // Calculate distance from first layer with tool changes size_t current_idx = m_layer_info - m_plan.begin(); int dist_to_1st = (int) current_idx - (int) m_first_layer_idx; - // Stop print chamfer if depth changes - bool depth_changed = (m_layer_info->depth != m_plan[m_first_layer_idx].depth); - if (depth_changed) { + // Validate m_first_layer_idx to prevent invalid index access + if (m_first_layer_idx == size_t(-1) || m_first_layer_idx >= m_plan.size()) { + // Invalid first layer index, don't print brim loops_num = 0; } else { - // Limit max chamfer width to configured value - int chamfer_loops_num = (int) (m_prime_tower_brim_chamfer_max_width / spacing); - loops_num = std::min(loops_num, chamfer_loops_num) - dist_to_1st; - // Ensure loops_num doesn't go negative - if (loops_num < 0) + // Stop print chamfer if depth changes + bool depth_changed = (m_layer_info->depth != m_plan[m_first_layer_idx].depth); + if (depth_changed) { loops_num = 0; + } else { + // Limit max chamfer width to configured value + int chamfer_loops_num = (int) (m_prime_tower_brim_chamfer_max_width / spacing); + loops_num = std::min(loops_num, chamfer_loops_num) - dist_to_1st; + // Ensure loops_num doesn't go negative + if (loops_num < 0) + loops_num = 0; + } } + } else { + // Non-first layer + chamfer disabled: don't print brim (revert to original behavior) + loops_num = 0; } }