diff --git a/src/LayerPlan.cpp b/src/LayerPlan.cpp index 39f3e1b510..f57cba07a4 100644 --- a/src/LayerPlan.cpp +++ b/src/LayerPlan.cpp @@ -57,14 +57,15 @@ GCodePath* LayerPlan::getLatestPathWithConfig( { return &paths.back(); } - paths.emplace_back(GCodePath{ .z_offset = z_offset, - .config = config, - .mesh = current_mesh_, - .space_fill_type = space_fill_type, - .flow = flow, - .width_factor = width_factor, - .spiralize = spiralize, - .speed_factor = speed_factor }); + paths.emplace_back( + GCodePath{ .z_offset = z_offset, + .config = config, + .mesh = current_mesh_, + .space_fill_type = space_fill_type, + .flow = flow, + .width_factor = width_factor, + .spiralize = spiralize, + .speed_factor = speed_factor }); GCodePath* ret = &paths.back(); ret->skip_agressive_merge_hint = mode_skip_agressive_merge_; @@ -1322,7 +1323,7 @@ std::vector for (const auto& reversed_chunk : paths | ranges::views::enumerate | ranges::views::reverse | ranges::views::chunk_by( - [](const auto&path_a, const auto&path_b) + [](const auto& path_a, const auto& path_b) { return (! std::get<1>(path_a).isTravelPath()) || std::get<1>(path_b).isTravelPath(); })) @@ -2512,8 +2513,24 @@ void LayerPlan::writeGCode(GCodeExport& gcode) { ExtruderPlan& extruder_plan = extruder_plans_[extruder_plan_idx]; - const RetractionAndWipeConfig* retraction_config - = current_mesh ? ¤t_mesh->retraction_wipe_config : &storage_.retraction_wipe_config_per_extruder[extruder_plan.extruder_nr_]; + auto get_retraction_config = [&extruder_nr, this](std::shared_ptr& mesh) -> std::optional + { + if (mesh) + { + if (extruder_nr == mesh->settings.get("extruder_nr")) [[likely]] + { + return &mesh->retraction_wipe_config; + } + + // We are printing a part of a mesh with a different extruder, use this extruder settings instead (mesh-specific settings will be ignored) + return &storage_.retraction_wipe_config_per_extruder[extruder_nr]; + } + + // We have no mesh yet, a more global config should be used + return std::nullopt; + }; + + const RetractionAndWipeConfig* retraction_config = get_retraction_config(current_mesh).value_or(&storage_.retraction_wipe_config_per_extruder[extruder_plan.extruder_nr_]); coord_t z_hop_height = retraction_config->retraction_config.zHop; if (extruder_nr != extruder_plan.extruder_nr_) @@ -2697,7 +2714,7 @@ void LayerPlan::writeGCode(GCodeExport& gcode) if (path.retract) { - retraction_config = path.mesh ? &path.mesh->retraction_wipe_config : retraction_config; + retraction_config = get_retraction_config(path.mesh).value_or(retraction_config); gcode.writeRetraction(retraction_config->retraction_config); if (path.retract_for_nozzle_switch) {