mirror of
https://git.mirrors.martin98.com/https://github.com/slic3r/Slic3r.git
synced 2025-08-16 21:05:57 +08:00
parent
37a6688174
commit
688121b104
@ -258,6 +258,7 @@ group:Speed for non-print moves
|
|||||||
end_line
|
end_line
|
||||||
group:sidetext_width$7:Modifiers
|
group:sidetext_width$7:Modifiers
|
||||||
line:First layer speed
|
line:First layer speed
|
||||||
|
setting:label_width$8:width$4:first_layer_min_speed
|
||||||
setting:label_width$8:width$4:first_layer_speed
|
setting:label_width$8:width$4:first_layer_speed
|
||||||
setting:label_width$8:width$4:first_layer_infill_speed
|
setting:label_width$8:width$4:first_layer_infill_speed
|
||||||
end_line
|
end_line
|
||||||
|
@ -3861,15 +3861,15 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string
|
|||||||
vol_speed = m_config.max_print_speed.value;
|
vol_speed = m_config.max_print_speed.value;
|
||||||
// if using a % of an auto speed, use the % over the volumetric speed.
|
// if using a % of an auto speed, use the % over the volumetric speed.
|
||||||
if (path.role() == erExternalPerimeter) {
|
if (path.role() == erExternalPerimeter) {
|
||||||
speed = m_config.get_abs_value("external_perimeter_speed", vol_speed);
|
speed = m_config.external_perimeter_speed.get_abs_value(vol_speed);
|
||||||
} else if (path.role() == erInternalBridgeInfill) {
|
} else if (path.role() == erInternalBridgeInfill) {
|
||||||
speed = m_config.get_abs_value("bridge_speed_internal", vol_speed);
|
speed = m_config.bridge_speed_internal.get_abs_value(vol_speed);
|
||||||
} else if (path.role() == erOverhangPerimeter) {
|
} else if (path.role() == erOverhangPerimeter) {
|
||||||
speed = m_config.get_abs_value("overhangs_speed", vol_speed);
|
speed = m_config.overhangs_speed.get_abs_value(vol_speed);
|
||||||
} else if (path.role() == erSolidInfill) {
|
} else if (path.role() == erSolidInfill) {
|
||||||
speed = m_config.get_abs_value("solid_infill_speed", vol_speed);
|
speed = m_config.solid_infill_speed.get_abs_value(vol_speed);
|
||||||
} else if (path.role() == erTopSolidInfill) {
|
} else if (path.role() == erTopSolidInfill) {
|
||||||
speed = m_config.get_abs_value("top_solid_infill_speed", vol_speed);
|
speed = m_config.top_solid_infill_speed.get_abs_value(vol_speed);
|
||||||
}
|
}
|
||||||
if(speed == 0){
|
if(speed == 0){
|
||||||
speed = vol_speed;
|
speed = vol_speed;
|
||||||
@ -3877,16 +3877,20 @@ std::string GCode::_before_extrude(const ExtrusionPath &path, const std::string
|
|||||||
}
|
}
|
||||||
if (speed == 0) // this code shouldn't trigger as if it's 0, you have to get a m_volumetric_speed
|
if (speed == 0) // this code shouldn't trigger as if it's 0, you have to get a m_volumetric_speed
|
||||||
speed = m_config.max_print_speed.value;
|
speed = m_config.max_print_speed.value;
|
||||||
if (this->on_first_layer())
|
if (this->on_first_layer()) {
|
||||||
|
const double base_speed = speed;
|
||||||
if (path.role() == erInternalInfill || path.role() == erSolidInfill) {
|
if (path.role() == erInternalInfill || path.role() == erSolidInfill) {
|
||||||
double first_layer_infill_speed = m_config.get_abs_value("first_layer_infill_speed", speed);
|
double first_layer_infill_speed = m_config.first_layer_infill_speed.get_abs_value(base_speed);
|
||||||
if(first_layer_infill_speed > 0)
|
if (first_layer_infill_speed > 0)
|
||||||
speed = std::min(first_layer_infill_speed, speed);
|
speed = std::min(first_layer_infill_speed, speed);
|
||||||
} else {
|
} else {
|
||||||
double first_layer_speed = m_config.get_abs_value("first_layer_speed", speed);
|
double first_layer_speed = m_config.first_layer_speed.get_abs_value(base_speed);
|
||||||
if (first_layer_speed > 0)
|
if (first_layer_speed > 0)
|
||||||
speed = std::min(first_layer_speed, speed);
|
speed = std::min(first_layer_speed, speed);
|
||||||
}
|
}
|
||||||
|
double first_layer_min_speed = m_config.first_layer_min_speed.get_abs_value(base_speed);
|
||||||
|
speed = std::max(first_layer_min_speed, speed);
|
||||||
|
}
|
||||||
// cap speed with max_volumetric_speed anyway (even if user is not using autospeed)
|
// cap speed with max_volumetric_speed anyway (even if user is not using autospeed)
|
||||||
if (m_config.max_volumetric_speed.value > 0 && path.mm3_per_mm > 0) {
|
if (m_config.max_volumetric_speed.value > 0 && path.mm3_per_mm > 0) {
|
||||||
speed = std::min(m_config.max_volumetric_speed.value / path.mm3_per_mm, speed);
|
speed = std::min(m_config.max_volumetric_speed.value / path.mm3_per_mm, speed);
|
||||||
|
@ -502,6 +502,7 @@ const std::vector<std::string>& Preset::print_options()
|
|||||||
// speeds
|
// speeds
|
||||||
"external_perimeter_speed",
|
"external_perimeter_speed",
|
||||||
"first_layer_speed",
|
"first_layer_speed",
|
||||||
|
"first_layer_min_speed",
|
||||||
"infill_speed",
|
"infill_speed",
|
||||||
"perimeter_speed",
|
"perimeter_speed",
|
||||||
"small_perimeter_speed",
|
"small_perimeter_speed",
|
||||||
|
@ -118,6 +118,7 @@ bool Print::invalidate_state_by_config_options(const std::vector<t_config_option
|
|||||||
"first_layer_flow_ratio",
|
"first_layer_flow_ratio",
|
||||||
"first_layer_speed",
|
"first_layer_speed",
|
||||||
"first_layer_infill_speed",
|
"first_layer_infill_speed",
|
||||||
|
"first_layer_min_speed",
|
||||||
"full_fan_speed_layer",
|
"full_fan_speed_layer",
|
||||||
"gap_fill_speed",
|
"gap_fill_speed",
|
||||||
"gcode_comments",
|
"gcode_comments",
|
||||||
|
@ -1114,7 +1114,7 @@ void PrintConfigDef::init_fff_params()
|
|||||||
"If the extruder is not centered, choose the largest value for safety. "
|
"If the extruder is not centered, choose the largest value for safety. "
|
||||||
"This setting is used to check for collisions and to display the graphical preview "
|
"This setting is used to check for collisions and to display the graphical preview "
|
||||||
"in the plater."
|
"in the plater."
|
||||||
"\nSet to 0 to disable clearance checking.");
|
"\nSet zero to disable clearance checking.");
|
||||||
def->sidetext = L("mm");
|
def->sidetext = L("mm");
|
||||||
def->min = 0;
|
def->min = 0;
|
||||||
def->mode = comExpert;
|
def->mode = comExpert;
|
||||||
@ -1235,7 +1235,7 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->category = OptionCategory::cooling;
|
def->category = OptionCategory::cooling;
|
||||||
def->tooltip = L("If layer print time is estimated below this number of seconds, fan will be enabled "
|
def->tooltip = L("If layer print time is estimated below this number of seconds, fan will be enabled "
|
||||||
"and its speed will be calculated by interpolating the default and maximum speeds."
|
"and its speed will be calculated by interpolating the default and maximum speeds."
|
||||||
"\nSet to 0 to disable.");
|
"\nSet zero to disable.");
|
||||||
def->sidetext = L("approximate seconds");
|
def->sidetext = L("approximate seconds");
|
||||||
def->min = 0;
|
def->min = 0;
|
||||||
def->max = 1000;
|
def->max = 1000;
|
||||||
@ -1838,14 +1838,14 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->set_default_value(new ConfigOptionFloatOrPercent(75, true));
|
def->set_default_value(new ConfigOptionFloatOrPercent(75, true));
|
||||||
|
|
||||||
def = this->add("first_layer_speed", coFloatOrPercent);
|
def = this->add("first_layer_speed", coFloatOrPercent);
|
||||||
def->label = L("Default");
|
def->label = L("Max");
|
||||||
def->full_label = L("Default first layer speed");
|
def->full_label = L("Default first layer speed");
|
||||||
def->category = OptionCategory::speed;
|
def->category = OptionCategory::speed;
|
||||||
def->tooltip = L("If expressed as absolute value in mm/s, this speed will be applied to all the print moves "
|
def->tooltip = L("If expressed as absolute value in mm/s, this speed will be applied to all the print moves "
|
||||||
"but infill of the first layer, it can be overwritten by the 'default' (default depends of the type of the path) "
|
"but infill of the first layer, it can be overwritten by the 'default' (default depends of the type of the path) "
|
||||||
"speed if it's lower than that. If expressed as a percentage "
|
"speed if it's lower than that. If expressed as a percentage "
|
||||||
"it will scale the current speed."
|
"it will scale the current speed."
|
||||||
"\nSet it at 100% to remove any first layer speed modification (with first_layer_infill_speed).");
|
"\nSet it at 100% to remove any first layer speed modification (with first_layer_infill_speed and first_layer_speed_min).");
|
||||||
def->sidetext = L("mm/s or %");
|
def->sidetext = L("mm/s or %");
|
||||||
def->ratio_over = "depends";
|
def->ratio_over = "depends";
|
||||||
def->min = 0;
|
def->min = 0;
|
||||||
@ -1865,6 +1865,20 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->min = 0;
|
def->min = 0;
|
||||||
def->mode = comExpert;
|
def->mode = comExpert;
|
||||||
def->set_default_value(new ConfigOptionFloatOrPercent(30, false));
|
def->set_default_value(new ConfigOptionFloatOrPercent(30, false));
|
||||||
|
|
||||||
|
def = this->add("first_layer_min_speed", coFloatOrPercent);
|
||||||
|
def->label = L("Min");
|
||||||
|
def->full_label = L("Min first layer speed");
|
||||||
|
def->category = OptionCategory::speed;
|
||||||
|
def->tooltip = L("If expressed as absolute value in mm/s, this speed will be applied to all the print moves"
|
||||||
|
", it can be overwritten by the 'default' (default depends of the type of the path) speed if it's higher than that."
|
||||||
|
" If expressed as a percentage it will scale the current speed."
|
||||||
|
"\nSet zero to disable.");
|
||||||
|
def->sidetext = L("mm/s or %");
|
||||||
|
def->ratio_over = "depends";
|
||||||
|
def->min = 0;
|
||||||
|
def->mode = comAdvanced;
|
||||||
|
def->set_default_value(new ConfigOptionFloatOrPercent(0, false));
|
||||||
|
|
||||||
def = this->add("first_layer_temperature", coInts);
|
def = this->add("first_layer_temperature", coInts);
|
||||||
def->label = L("First layer");
|
def->label = L("First layer");
|
||||||
@ -2687,7 +2701,7 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->label = L("Minimum extrusion length");
|
def->label = L("Minimum extrusion length");
|
||||||
def->category = OptionCategory::speed;
|
def->category = OptionCategory::speed;
|
||||||
def->tooltip = L("Too many too small commands may overload the firmware / connection. Put a higher value here if you see strange slowdown."
|
def->tooltip = L("Too many too small commands may overload the firmware / connection. Put a higher value here if you see strange slowdown."
|
||||||
"\n0 to disable.");
|
"\nSet zero to disable.");
|
||||||
def->sidetext = L("mm");
|
def->sidetext = L("mm");
|
||||||
def->min = 0;
|
def->min = 0;
|
||||||
def->precision = 8;
|
def->precision = 8;
|
||||||
@ -3080,7 +3094,7 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->category = OptionCategory::slicing;
|
def->category = OptionCategory::slicing;
|
||||||
def->tooltip = L("Minimum detail resolution, used to simplify the input file for speeding up "
|
def->tooltip = L("Minimum detail resolution, used to simplify the input file for speeding up "
|
||||||
"the slicing job and reducing memory usage. High-resolution models often carry "
|
"the slicing job and reducing memory usage. High-resolution models often carry "
|
||||||
"more details than printers can render. Set to zero to disable any simplification "
|
"more details than printers can render. Set zero to disable any simplification "
|
||||||
"and use full resolution from input. "
|
"and use full resolution from input. "
|
||||||
"\nNote: Slic3r has an internal working resolution of 0.0001mm."
|
"\nNote: Slic3r has an internal working resolution of 0.0001mm."
|
||||||
"\nInfill & Thin areas are simplified up to 0.0125mm.");
|
"\nInfill & Thin areas are simplified up to 0.0125mm.");
|
||||||
@ -3359,7 +3373,7 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->category = OptionCategory::cooling;
|
def->category = OptionCategory::cooling;
|
||||||
def->tooltip = L("If layer print time is estimated below this number of seconds, print moves "
|
def->tooltip = L("If layer print time is estimated below this number of seconds, print moves "
|
||||||
"speed will be scaled down to extend duration to this value, if possible."
|
"speed will be scaled down to extend duration to this value, if possible."
|
||||||
"\nSet to 0 to disable.");
|
"\nSet zero to disable.");
|
||||||
def->sidetext = L("approximate seconds");
|
def->sidetext = L("approximate seconds");
|
||||||
def->min = 0;
|
def->min = 0;
|
||||||
def->max = 1000;
|
def->max = 1000;
|
||||||
@ -3454,7 +3468,7 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->label = L("cutoff");
|
def->label = L("cutoff");
|
||||||
def->full_label = L("Curve smoothing cutoff dist");
|
def->full_label = L("Curve smoothing cutoff dist");
|
||||||
def->category = OptionCategory::slicing;
|
def->category = OptionCategory::slicing;
|
||||||
def->tooltip = L("Maximum distance between two points to allow adding new ones. Allow to avoid distorting long strait areas. 0 to disable.");
|
def->tooltip = L("Maximum distance between two points to allow adding new ones. Allow to avoid distorting long strait areas.\nSet zero to disable.");
|
||||||
def->sidetext = L("mm");
|
def->sidetext = L("mm");
|
||||||
def->min = 0;
|
def->min = 0;
|
||||||
def->cli = "curve-smoothing-cutoff-dist=f";
|
def->cli = "curve-smoothing-cutoff-dist=f";
|
||||||
@ -3621,7 +3635,7 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->category = OptionCategory::slicing;
|
def->category = OptionCategory::slicing;
|
||||||
def->tooltip = L("This is the rounding error of the input object."
|
def->tooltip = L("This is the rounding error of the input object."
|
||||||
" It's used to align points that should be in the same line."
|
" It's used to align points that should be in the same line."
|
||||||
" Put 0 to disable.");
|
"\nSet zero to disable.");
|
||||||
def->sidetext = L("mm");
|
def->sidetext = L("mm");
|
||||||
def->min = 0;
|
def->min = 0;
|
||||||
def->precision = 8;
|
def->precision = 8;
|
||||||
@ -3687,7 +3701,7 @@ void PrintConfigDef::init_fff_params()
|
|||||||
" This number allow to keep some if there is a low number of perimeter over the void."
|
" This number allow to keep some if there is a low number of perimeter over the void."
|
||||||
"\nIf this setting is equal or higher than the top/bottom solid layer count, it won't evict anything."
|
"\nIf this setting is equal or higher than the top/bottom solid layer count, it won't evict anything."
|
||||||
"\nIf this setting is set to 1, it will evict all solid fill are are only over perimeters."
|
"\nIf this setting is set to 1, it will evict all solid fill are are only over perimeters."
|
||||||
"\nSet it to 0 to disable.");
|
"\nSet zero to disable.");
|
||||||
def->min = 0;
|
def->min = 0;
|
||||||
def->mode = comAdvanced;
|
def->mode = comAdvanced;
|
||||||
def->set_default_value(new ConfigOptionInt(2));
|
def->set_default_value(new ConfigOptionInt(2));
|
||||||
@ -4471,7 +4485,7 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->tooltip = L("Set this to the height moved when your Z motor (or equivalent) turns one step."
|
def->tooltip = L("Set this to the height moved when your Z motor (or equivalent) turns one step."
|
||||||
"If your motor needs 200 steps to move your head/plater by 1mm, this field should be 1/200 = 0.005."
|
"If your motor needs 200 steps to move your head/plater by 1mm, this field should be 1/200 = 0.005."
|
||||||
"\nNote that the gcode will write the z values with 6 digits after the dot if z_step is set (it's 3 digits if it's disabled)."
|
"\nNote that the gcode will write the z values with 6 digits after the dot if z_step is set (it's 3 digits if it's disabled)."
|
||||||
"\nPut 0 to disable.");
|
"\nSet zero to disable.");
|
||||||
def->cli = "z-step=f";
|
def->cli = "z-step=f";
|
||||||
def->sidetext = L("mm");
|
def->sidetext = L("mm");
|
||||||
def->min = 0;
|
def->min = 0;
|
||||||
@ -5538,6 +5552,7 @@ void PrintConfigDef::to_prusa(t_config_option_key& opt_key, std::string& value,
|
|||||||
"fill_smooth_width",
|
"fill_smooth_width",
|
||||||
"fill_smooth_distribution",
|
"fill_smooth_distribution",
|
||||||
"first_layer_infill_speed",
|
"first_layer_infill_speed",
|
||||||
|
"first_layer_min_speed",
|
||||||
"gap_fill",
|
"gap_fill",
|
||||||
"gap_fill_min_area",
|
"gap_fill_min_area",
|
||||||
"gap_fill_overlap",
|
"gap_fill_overlap",
|
||||||
|
@ -1304,6 +1304,7 @@ public:
|
|||||||
ConfigOptionPercent first_layer_flow_ratio;
|
ConfigOptionPercent first_layer_flow_ratio;
|
||||||
ConfigOptionFloatOrPercent first_layer_speed;
|
ConfigOptionFloatOrPercent first_layer_speed;
|
||||||
ConfigOptionFloatOrPercent first_layer_infill_speed;
|
ConfigOptionFloatOrPercent first_layer_infill_speed;
|
||||||
|
ConfigOptionFloatOrPercent first_layer_min_speed;
|
||||||
ConfigOptionInts first_layer_temperature;
|
ConfigOptionInts first_layer_temperature;
|
||||||
ConfigOptionInts full_fan_speed_layer;
|
ConfigOptionInts full_fan_speed_layer;
|
||||||
ConfigOptionFloatOrPercent infill_acceleration;
|
ConfigOptionFloatOrPercent infill_acceleration;
|
||||||
@ -1404,6 +1405,7 @@ protected:
|
|||||||
OPT_PTR(first_layer_flow_ratio);
|
OPT_PTR(first_layer_flow_ratio);
|
||||||
OPT_PTR(first_layer_speed);
|
OPT_PTR(first_layer_speed);
|
||||||
OPT_PTR(first_layer_infill_speed);
|
OPT_PTR(first_layer_infill_speed);
|
||||||
|
OPT_PTR(first_layer_min_speed);
|
||||||
OPT_PTR(first_layer_temperature);
|
OPT_PTR(first_layer_temperature);
|
||||||
OPT_PTR(full_fan_speed_layer);
|
OPT_PTR(full_fan_speed_layer);
|
||||||
OPT_PTR(infill_acceleration);
|
OPT_PTR(infill_acceleration);
|
||||||
|
@ -197,7 +197,8 @@ std::string PresetHints::maximum_volumetric_flow_description(const PresetBundle
|
|||||||
const auto &support_material_extrusion_width = *print_config.option<ConfigOptionFloatOrPercent>("support_material_extrusion_width");
|
const auto &support_material_extrusion_width = *print_config.option<ConfigOptionFloatOrPercent>("support_material_extrusion_width");
|
||||||
const auto &top_infill_extrusion_width = *print_config.option<ConfigOptionFloatOrPercent>("top_infill_extrusion_width");
|
const auto &top_infill_extrusion_width = *print_config.option<ConfigOptionFloatOrPercent>("top_infill_extrusion_width");
|
||||||
const auto &first_layer_speed = *print_config.option<ConfigOptionFloatOrPercent>("first_layer_speed");
|
const auto &first_layer_speed = *print_config.option<ConfigOptionFloatOrPercent>("first_layer_speed");
|
||||||
const auto &first_layer_infill_speed = *print_config.option<ConfigOptionFloatOrPercent>("first_layer_infill_speed");
|
const auto& first_layer_infill_speed = *print_config.option<ConfigOptionFloatOrPercent>("first_layer_infill_speed");
|
||||||
|
const auto& first_layer_min_speed = *print_config.option<ConfigOptionFloatOrPercent>("first_layer_infill_speed");
|
||||||
|
|
||||||
// Index of an extruder assigned to a feature. If set to 0, an active extruder will be used for a multi-material print.
|
// Index of an extruder assigned to a feature. If set to 0, an active extruder will be used for a multi-material print.
|
||||||
// If different from idx_extruder, it will not be taken into account for this hint.
|
// If different from idx_extruder, it will not be taken into account for this hint.
|
||||||
@ -228,16 +229,24 @@ std::string PresetHints::maximum_volumetric_flow_description(const PresetBundle
|
|||||||
const float bfr = bridging ? bridge_flow_ratio : 0.f;
|
const float bfr = bridging ? bridge_flow_ratio : 0.f;
|
||||||
double max_flow = 0.;
|
double max_flow = 0.;
|
||||||
std::string max_flow_extrusion_type;
|
std::string max_flow_extrusion_type;
|
||||||
auto limit_by_first_layer_speed = [&first_layer_speed, first_layer](double speed_normal, double speed_max) {
|
auto limit_by_first_layer_speed = [&first_layer_min_speed , &first_layer_speed, first_layer](double speed_normal, double speed_max) {
|
||||||
if (first_layer && first_layer_speed.value > 0)
|
if (first_layer) {
|
||||||
|
const double base_speed = speed_normal;
|
||||||
// Apply the first layer limit.
|
// Apply the first layer limit.
|
||||||
speed_normal = first_layer_speed.get_abs_value(speed_normal);
|
if (first_layer_speed.value > 0)
|
||||||
|
speed_normal = std::min(first_layer_speed.get_abs_value(base_speed), speed_normal);
|
||||||
|
speed_normal = std::max(first_layer_min_speed.get_abs_value(base_speed), speed_normal);
|
||||||
|
}
|
||||||
return (speed_normal > 0.) ? speed_normal : speed_max;
|
return (speed_normal > 0.) ? speed_normal : speed_max;
|
||||||
};
|
};
|
||||||
auto limit_infill_by_first_layer_speed = [&first_layer_infill_speed, first_layer](double speed_normal, double speed_max) {
|
auto limit_infill_by_first_layer_speed = [&first_layer_min_speed, &first_layer_infill_speed, first_layer](double speed_normal, double speed_max) {
|
||||||
if (first_layer && first_layer_infill_speed.value > 0)
|
if (first_layer) {
|
||||||
|
const double base_speed = speed_normal;
|
||||||
// Apply the first layer limit.
|
// Apply the first layer limit.
|
||||||
speed_normal = first_layer_infill_speed.get_abs_value(speed_normal);
|
if(first_layer_infill_speed.value > 0)
|
||||||
|
speed_normal = std::min(first_layer_infill_speed.get_abs_value(base_speed), speed_normal);
|
||||||
|
speed_normal = std::max(first_layer_min_speed.get_abs_value(base_speed), speed_normal);
|
||||||
|
}
|
||||||
return (speed_normal > 0.) ? speed_normal : speed_max;
|
return (speed_normal > 0.) ? speed_normal : speed_max;
|
||||||
};
|
};
|
||||||
if (perimeter_extruder_active) {
|
if (perimeter_extruder_active) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user