Skip to content

Commit

Permalink
Fix wrong retraction settings being
Browse files Browse the repository at this point in the history
CURA-12065
In the case where a mesh was printed with multiple extruders, the used retraction settings were always the one of the main extruder. Now we take the settings of the mesh only if using the main extruder. Mesh-specific settings will then be ignored for other extruders.
  • Loading branch information
wawanbreton committed Dec 18, 2024
1 parent d4853d4 commit 2bc7601
Showing 1 changed file with 29 additions and 12 deletions.
41 changes: 29 additions & 12 deletions src/LayerPlan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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_;
Expand Down Expand Up @@ -1322,7 +1323,7 @@ std::vector<LayerPlan::PathCoasting>

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();
}))
Expand Down Expand Up @@ -2512,8 +2513,24 @@ void LayerPlan::writeGCode(GCodeExport& gcode)
{
ExtruderPlan& extruder_plan = extruder_plans_[extruder_plan_idx];

const RetractionAndWipeConfig* retraction_config
= current_mesh ? &current_mesh->retraction_wipe_config : &storage_.retraction_wipe_config_per_extruder[extruder_plan.extruder_nr_];
auto get_retraction_config = [&extruder_nr, this](std::shared_ptr<const SliceMeshStorage>& mesh) -> std::optional<const RetractionAndWipeConfig*>
{
if (mesh)
{
if (extruder_nr == mesh->settings.get<size_t>("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_)
Expand Down Expand Up @@ -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)
{
Expand Down

0 comments on commit 2bc7601

Please sign in to comment.