mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-08-02 15:52:14 +00:00
Fix overhang fan speed bugs (#14788)
This commit is contained in:
@@ -5681,10 +5681,17 @@ LayerResult GCode::process_layer(
|
|||||||
for (const auto &layer_to_print : layers) {
|
for (const auto &layer_to_print : layers) {
|
||||||
if (layer_to_print.object_layer) {
|
if (layer_to_print.object_layer) {
|
||||||
const auto& regions = layer_to_print.object_layer->regions();
|
const auto& regions = layer_to_print.object_layer->regions();
|
||||||
const bool enable_overhang_speed = std::any_of(regions.begin(), regions.end(), [this](const LayerRegion* r) {
|
const bool has_extrusions = std::any_of(regions.begin(), regions.end(), [](const LayerRegion* r) {
|
||||||
|
return r->has_extrusions();
|
||||||
|
});
|
||||||
|
const bool enable_overhang_speed = std::any_of(regions.begin(), regions.end(), [this](const LayerRegion* r) {
|
||||||
return r->has_extrusions() && r->region().config().enable_overhang_speed.get_at(get_nozzle_config_index(m_writer.filament()->id()));
|
return r->has_extrusions() && r->region().config().enable_overhang_speed.get_at(get_nozzle_config_index(m_writer.filament()->id()));
|
||||||
});
|
});
|
||||||
if (enable_overhang_speed) {
|
const bool enable_overhang_fan = m_enable_cooling_markers && has_extrusions &&
|
||||||
|
std::any_of(m_config.enable_overhang_bridge_fan.values.begin(),
|
||||||
|
m_config.enable_overhang_bridge_fan.values.end(),
|
||||||
|
[](unsigned char value) { return value != 0; });
|
||||||
|
if (enable_overhang_speed || enable_overhang_fan) {
|
||||||
m_extrusion_quality_estimator.prepare_for_new_layer(layer_to_print.original_object,
|
m_extrusion_quality_estimator.prepare_for_new_layer(layer_to_print.original_object,
|
||||||
layer_to_print.object_layer);
|
layer_to_print.object_layer);
|
||||||
}
|
}
|
||||||
@@ -7523,7 +7530,10 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
|
|||||||
bool variable_speed = false;
|
bool variable_speed = false;
|
||||||
std::vector<ProcessedPoint> new_points {};
|
std::vector<ProcessedPoint> new_points {};
|
||||||
|
|
||||||
if (NOZZLE_CONFIG(enable_overhang_speed) && !this->on_first_layer() && !object_layer_over_raft() &&
|
const bool need_overhang_detection = NOZZLE_CONFIG(enable_overhang_speed) ||
|
||||||
|
(FILAMENT_CONFIG(enable_overhang_bridge_fan) && m_enable_cooling_markers);
|
||||||
|
|
||||||
|
if (need_overhang_detection && !this->on_first_layer() && !object_layer_over_raft() &&
|
||||||
(is_bridge(path.role()) || is_perimeter(path.role()))) {
|
(is_bridge(path.role()) || is_perimeter(path.role()))) {
|
||||||
bool is_external = is_external_perimeter(path.role());
|
bool is_external = is_external_perimeter(path.role());
|
||||||
double ref_speed = is_external ? NOZZLE_CONFIG(outer_wall_speed) : NOZZLE_CONFIG(inner_wall_speed);
|
double ref_speed = is_external ? NOZZLE_CONFIG(outer_wall_speed) : NOZZLE_CONFIG(inner_wall_speed);
|
||||||
@@ -7582,6 +7592,11 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
|
|||||||
}
|
}
|
||||||
variable_speed = std::any_of(new_points.begin(), new_points.end(),
|
variable_speed = std::any_of(new_points.begin(), new_points.end(),
|
||||||
[speed](const ProcessedPoint &p) { return fabs(double(p.speed) - speed) > 1; }); // Ignore small speed variations (under 1mm/sec)
|
[speed](const ProcessedPoint &p) { return fabs(double(p.speed) - speed) > 1; }); // Ignore small speed variations (under 1mm/sec)
|
||||||
|
if (!NOZZLE_CONFIG(enable_overhang_speed) && FILAMENT_CONFIG(enable_overhang_bridge_fan) && m_enable_cooling_markers) {
|
||||||
|
for (ProcessedPoint &point : new_points)
|
||||||
|
point.speed = speed;
|
||||||
|
variable_speed = new_points.size() > 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
double F = speed * 60; // convert mm/sec to mm/min
|
double F = speed * 60; // convert mm/sec to mm/min
|
||||||
|
|||||||
@@ -844,7 +844,10 @@ std::string CoolingBuffer::apply_layer_cooldown(
|
|||||||
ironing_fan_control = false; // ORCA: Add support for ironing fan speed control
|
ironing_fan_control = false; // ORCA: Add support for ironing fan speed control
|
||||||
ironing_fan_speed = 0; // ORCA: Add support for ironing fan speed control
|
ironing_fan_speed = 0; // ORCA: Add support for ironing fan speed control
|
||||||
}
|
}
|
||||||
if (fan_speed_new != m_fan_speed) {
|
// A tool change may keep the same configured base fan speed while the physical fan is
|
||||||
|
// still running at the previous filament's overhang speed. Restore the base speed before
|
||||||
|
// emitting G-code for the new tool in that case.
|
||||||
|
if (fan_speed_new != m_fan_speed || (immediately_apply && m_current_fan_speed != fan_speed_new)) {
|
||||||
m_fan_speed = fan_speed_new;
|
m_fan_speed = fan_speed_new;
|
||||||
m_current_fan_speed = fan_speed_new;
|
m_current_fan_speed = fan_speed_new;
|
||||||
if (immediately_apply)
|
if (immediately_apply)
|
||||||
@@ -1040,8 +1043,10 @@ std::string CoolingBuffer::apply_layer_cooldown(
|
|||||||
new_gcode += GCodeWriter::set_fan(m_config.gcode_flavor, m_current_fan_speed, part_cooling_fan_min_pwm);
|
new_gcode += GCodeWriter::set_fan(m_config.gcode_flavor, m_current_fan_speed, part_cooling_fan_min_pwm);
|
||||||
fan_speed_change_requests[CoolingLine::TYPE_FORCE_RESUME_FAN] = false;
|
fan_speed_change_requests[CoolingLine::TYPE_FORCE_RESUME_FAN] = false;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
new_gcode += GCodeWriter::set_fan(m_config.gcode_flavor, m_fan_speed, part_cooling_fan_min_pwm);
|
new_gcode += GCodeWriter::set_fan(m_config.gcode_flavor, m_fan_speed, part_cooling_fan_min_pwm);
|
||||||
|
m_current_fan_speed = m_fan_speed;
|
||||||
|
}
|
||||||
need_set_fan = false;
|
need_set_fan = false;
|
||||||
}
|
}
|
||||||
pos = line_end;
|
pos = line_end;
|
||||||
|
|||||||
Reference in New Issue
Block a user