mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-17 10:15:56 +08:00
Fix: Cap speed by max_volumetric_speed even for dynamic overhangs.
This commit is contained in:
parent
78f4a6febb
commit
f64aea6499
@ -3040,6 +3040,20 @@ std::string GCodeGenerator::travel_to_first_position(const Vec3crd& point) {
|
|||||||
return gcode;
|
return gcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double cap_speed(
|
||||||
|
double speed, const double mm3_per_mm, const FullPrintConfig &config, int extruder_id
|
||||||
|
) {
|
||||||
|
const double general_cap{config.max_volumetric_speed.value};
|
||||||
|
if (general_cap > 0) {
|
||||||
|
speed = std::min(speed, general_cap / mm3_per_mm);
|
||||||
|
}
|
||||||
|
const double filament_cap{config.filament_max_volumetric_speed.get_at(extruder_id)};
|
||||||
|
if (filament_cap > 0) {
|
||||||
|
speed = std::min(speed, filament_cap / mm3_per_mm);
|
||||||
|
}
|
||||||
|
return speed;
|
||||||
|
}
|
||||||
|
|
||||||
std::string GCodeGenerator::_extrude(
|
std::string GCodeGenerator::_extrude(
|
||||||
const ExtrusionAttributes &path_attr,
|
const ExtrusionAttributes &path_attr,
|
||||||
const Geometry::ArcWelder::Path &path,
|
const Geometry::ArcWelder::Path &path,
|
||||||
@ -3139,33 +3153,15 @@ std::string GCodeGenerator::_extrude(
|
|||||||
speed = m_config.get_abs_value("first_layer_speed", speed);
|
speed = m_config.get_abs_value("first_layer_speed", speed);
|
||||||
else if (this->object_layer_over_raft())
|
else if (this->object_layer_over_raft())
|
||||||
speed = m_config.get_abs_value("first_layer_speed_over_raft", speed);
|
speed = m_config.get_abs_value("first_layer_speed_over_raft", speed);
|
||||||
if (m_config.max_volumetric_speed.value > 0) {
|
|
||||||
// cap speed with max_volumetric_speed anyway (even if user is not using autospeed)
|
|
||||||
speed = std::min(
|
|
||||||
speed,
|
|
||||||
m_config.max_volumetric_speed.value / path_attr.mm3_per_mm
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (EXTRUDER_CONFIG(filament_max_volumetric_speed) > 0) {
|
|
||||||
// cap speed with max_volumetric_speed anyway (even if user is not using autospeed)
|
|
||||||
speed = std::min(
|
|
||||||
speed,
|
|
||||||
EXTRUDER_CONFIG(filament_max_volumetric_speed) / path_attr.mm3_per_mm
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::pair<float, float> dynamic_speed_and_fan_speed{-1, -1};
|
std::pair<float, float> dynamic_speed_and_fan_speed{-1, -1};
|
||||||
if (path_attr.overhang_attributes.has_value()) {
|
if (path_attr.overhang_attributes.has_value()) {
|
||||||
double external_perim_reference_speed = m_config.get_abs_value("external_perimeter_speed");
|
double external_perim_reference_speed = m_config.get_abs_value("external_perimeter_speed");
|
||||||
if (external_perim_reference_speed == 0)
|
if (external_perim_reference_speed == 0)
|
||||||
external_perim_reference_speed = m_volumetric_speed / path_attr.mm3_per_mm;
|
external_perim_reference_speed = m_volumetric_speed / path_attr.mm3_per_mm;
|
||||||
if (m_config.max_volumetric_speed.value > 0)
|
external_perim_reference_speed = cap_speed(
|
||||||
external_perim_reference_speed = std::min(external_perim_reference_speed,
|
external_perim_reference_speed, path_attr.mm3_per_mm, m_config, m_writer.extruder()->id()
|
||||||
m_config.max_volumetric_speed.value / path_attr.mm3_per_mm);
|
);
|
||||||
if (EXTRUDER_CONFIG(filament_max_volumetric_speed) > 0) {
|
|
||||||
external_perim_reference_speed = std::min(external_perim_reference_speed,
|
|
||||||
EXTRUDER_CONFIG(filament_max_volumetric_speed) / path_attr.mm3_per_mm);
|
|
||||||
}
|
|
||||||
|
|
||||||
dynamic_speed_and_fan_speed = ExtrusionProcessor::calculate_overhang_speed(path_attr, this->m_config, m_writer.extruder()->id(),
|
dynamic_speed_and_fan_speed = ExtrusionProcessor::calculate_overhang_speed(path_attr, this->m_config, m_writer.extruder()->id(),
|
||||||
external_perim_reference_speed, speed);
|
external_perim_reference_speed, speed);
|
||||||
@ -3175,6 +3171,9 @@ std::string GCodeGenerator::_extrude(
|
|||||||
speed = dynamic_speed_and_fan_speed.first;
|
speed = dynamic_speed_and_fan_speed.first;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// cap speed with max_volumetric_speed anyway (even if user is not using autospeed)
|
||||||
|
speed = cap_speed(speed, path_attr.mm3_per_mm, m_config, m_writer.extruder()->id());
|
||||||
|
|
||||||
double F = speed * 60; // convert mm/sec to mm/min
|
double F = speed * 60; // convert mm/sec to mm/min
|
||||||
|
|
||||||
// extrude arc or line
|
// extrude arc or line
|
||||||
|
@ -587,7 +587,8 @@ void PrintConfigDef::init_fff_params()
|
|||||||
auto overhang_speed_setting_description = L("Overhang size is expressed as a percentage of overlap of the extrusion with the previous layer: "
|
auto overhang_speed_setting_description = L("Overhang size is expressed as a percentage of overlap of the extrusion with the previous layer: "
|
||||||
"100% would be full overlap (no overhang), while 0% represents full overhang (floating extrusion, bridge). "
|
"100% would be full overlap (no overhang), while 0% represents full overhang (floating extrusion, bridge). "
|
||||||
"Speeds for overhang sizes in between are calculated via linear interpolation. "
|
"Speeds for overhang sizes in between are calculated via linear interpolation. "
|
||||||
"If set as percentage, the speed is calculated over the external perimeter speed.");
|
"If set as percentage, the speed is calculated over the external perimeter speed. "
|
||||||
|
"Note that the speeds generated to gcode will never exceed the max volumetric speed value.");
|
||||||
|
|
||||||
def = this->add("overhang_speed_0", coFloatOrPercent);
|
def = this->add("overhang_speed_0", coFloatOrPercent);
|
||||||
def->label = L("speed for 0% overlap (bridge)");
|
def->label = L("speed for 0% overlap (bridge)");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user