@@ -124,10 +124,29 @@ std::vector<Perimeter> extract_perimeter_extrusions(
124124 for (ExtrusionEntity *ee : *eec) {
125125 if (ee != nullptr ) {
126126 std::optional<InstancePoint> last_position{get_instance_point (previous_position, offset)};
127+ ExtrusionRole role = ee->role ();
127128 bool reverse_loop{false };
128129 if (auto loop = dynamic_cast <const ExtrusionLoop *>(ee)) {
129130 const bool is_hole = loop->is_clockwise ();
130- reverse_loop = print.config ().prefer_clockwise_movements ? !is_hole : is_hole;
131+
132+ const bool is_odd_layer = layer.id () % 2 == 1 ;
133+ const bool should_reverse_internal_perimeter = role.is_internal_perimeter () &&
134+ region.config ().internal_perimeters_reverse ;
135+ bool should_reverse_overhang_perimeters{false };
136+
137+ if (region.config ().overhangs_reverse && is_odd_layer) {
138+ for (const ExtrusionPath &el : loop->paths ) {
139+ if (el.role ().is_overhang_perimeter ()) {
140+ should_reverse_overhang_perimeters = true ;
141+ break ;
142+ }
143+ }
144+ }
145+
146+ const bool reverse_on_odd = is_odd_layer &&
147+ (should_reverse_internal_perimeter || should_reverse_overhang_perimeters);
148+ reverse_loop = (print.config ().prefer_clockwise_movements ? !is_hole : is_hole) ^
149+ reverse_on_odd;
131150 }
132151 auto [path, wipe_offset]{smooth_path (&layer, ®ion, ExtrusionEntityReference{*ee, reverse_loop}, extruder_id, last_position)};
133152 previous_position = get_gcode_point (last_position, offset);
@@ -190,11 +209,16 @@ std::vector<InfillRange> extract_infill_ranges(
190209 const std::optional<InstancePoint> previous_instance_point{get_instance_point (previous_position, offset)};
191210 const Point* start_near{previous_instance_point ? &(previous_instance_point->local_point ) : nullptr };
192211 const ExtrusionEntityReferences sorted_extrusions{sort_fill_extrusions (extrusions, start_near)};
212+ const bool reverse_infill = region.config ().infill_reverse && layer.id () % 2 == 1 ;
193213
194214 std::vector<SmoothPath> paths;
195215 for (const ExtrusionEntityReference &extrusion_reference : sorted_extrusions) {
196216 std::optional<InstancePoint> last_position{get_instance_point (previous_position, offset)};
197- auto [path, _]{smooth_path (&layer, ®ion, extrusion_reference, extruder_id, last_position)};
217+ auto [path, _]{smooth_path (
218+ &layer, ®ion,
219+ ExtrusionEntityReference{extrusion_reference.extrusion_entity (), reverse_infill},
220+ extruder_id, last_position
221+ )};
198222 if (!path.empty ()) {
199223 paths.push_back (std::move (path));
200224 }
0 commit comments