ENH: add initial layer travel acceleration

jira: none
Change-Id: I1a9bb6bc8d260cb76a62b18ddaaac54bf74e8602
(cherry picked from commit ab91cb76eb7b3916e4b377ea6a30dcec2ff7bc97)
This commit is contained in:
zhimin.zeng 2025-03-21 12:05:15 +08:00 committed by lane.wei
parent ca36ee8096
commit cdd72cd549
12 changed files with 78 additions and 11 deletions

View File

@ -123,6 +123,9 @@
"top_surface_speed": [ "top_surface_speed": [
"30" "30"
], ],
"initial_layer_travel_acceleration": [
"6000"
],
"travel_acceleration": [ "travel_acceleration": [
"10000" "10000"
], ],

View File

@ -16,6 +16,12 @@
"10000", "10000",
"10000" "10000"
], ],
"initial_layer_travel_acceleration": [
"6000",
"6000",
"6000",
"6000"
],
"travel_acceleration": [ "travel_acceleration": [
"10000", "10000",
"10000", "10000",

View File

@ -2427,7 +2427,12 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
for (auto value : m_config.travel_acceleration.values) { for (auto value : m_config.travel_acceleration.values) {
travel_accelerations.emplace_back((unsigned int) floor(value + 0.5)); travel_accelerations.emplace_back((unsigned int) floor(value + 0.5));
} }
std::vector<unsigned int> first_layer_travel_accelerations;
for (auto value : m_config.initial_layer_travel_acceleration.values) {
first_layer_travel_accelerations.emplace_back((unsigned int) floor(value + 0.5));
}
m_writer.set_travel_acceleration(travel_accelerations); m_writer.set_travel_acceleration(travel_accelerations);
m_writer.set_first_layer_travel_acceleration(first_layer_travel_accelerations);
// OrcaSlicer: calib // OrcaSlicer: calib
if (print.calib_params().mode == CalibMode::Calib_PA_Line) { if (print.calib_params().mode == CalibMode::Calib_PA_Line) {
@ -3683,6 +3688,8 @@ GCode::LayerResult GCode::process_layer(
//BBS: set layer time fan speed after layer change gcode //BBS: set layer time fan speed after layer change gcode
gcode += ";_SET_FAN_SPEED_CHANGING_LAYER\n"; gcode += ";_SET_FAN_SPEED_CHANGING_LAYER\n";
m_writer.set_first_layer(this->on_first_layer());
if (print.calib_mode() == CalibMode::Calib_PA_Tower) { if (print.calib_mode() == CalibMode::Calib_PA_Tower) {
gcode += writer().set_pressure_advance(print.calib_params().start + static_cast<int>(print_z) * print.calib_params().step); gcode += writer().set_pressure_advance(print.calib_params().start + static_cast<int>(print_z) * print.calib_params().step);
} }

View File

@ -1218,8 +1218,11 @@ public:
} }
} }
void set_first_layer(bool is_first_layer) { m_is_first_layer = is_first_layer; }
void set_normal_acceleration(const std::vector<unsigned int> &accelerations) { m_normal_accelerations = accelerations; }; void set_normal_acceleration(const std::vector<unsigned int> &accelerations) { m_normal_accelerations = accelerations; };
void set_first_layer_normal_acceleration(const std::vector<unsigned int> &accelerations) { m_first_layer_normal_accelerations = accelerations; };
void set_travel_acceleration(const std::vector<unsigned int> &accelerations) { m_travel_accelerations = accelerations; }; void set_travel_acceleration(const std::vector<unsigned int> &accelerations) { m_travel_accelerations = accelerations; };
void set_first_layer_travel_acceleration(const std::vector<unsigned int> &accelerations) { m_first_layer_travel_accelerations = accelerations; };
void set_max_acceleration(unsigned int acceleration) { m_max_acceleration = acceleration; }; void set_max_acceleration(unsigned int acceleration) { m_max_acceleration = acceleration; };
void set_filament_map(const std::vector<int> &filament_map) { m_filament_map = filament_map; } void set_filament_map(const std::vector<int> &filament_map) { m_filament_map = filament_map; }
void set_accel_to_decel_enable(bool enable) { m_accel_to_decel_enable = enable; } void set_accel_to_decel_enable(bool enable) { m_accel_to_decel_enable = enable; }
@ -1227,18 +1230,20 @@ public:
private: private:
std::string set_normal_acceleration() { std::string set_normal_acceleration() {
if (m_normal_accelerations.empty() || m_filament_map.empty()) std::vector<unsigned int> accelerations = m_is_first_layer ? m_first_layer_normal_accelerations : m_normal_accelerations;
if (accelerations.empty() || m_filament_map.empty())
return std::string(); return std::string();
unsigned int acc = m_normal_accelerations[m_filament_map[m_current_tool] - 1]; unsigned int acc = accelerations[m_filament_map[m_current_tool] - 1];
return set_acceleration_impl(acc); return set_acceleration_impl(acc);
} }
std::string set_travel_acceleration() std::string set_travel_acceleration()
{ {
if (m_travel_accelerations.empty() || m_filament_map.empty()) std::vector<unsigned int> accelerations = m_is_first_layer ? m_first_layer_travel_accelerations : m_travel_accelerations;
if (accelerations.empty() || accelerations.empty())
return std::string(); return std::string();
unsigned int acc = m_travel_accelerations[m_filament_map[m_current_tool] - 1]; unsigned int acc = accelerations[m_filament_map[m_current_tool] - 1];
return set_acceleration_impl(acc); return set_acceleration_impl(acc);
} }
std::string set_acceleration_impl(unsigned int acceleration) { std::string set_acceleration_impl(unsigned int acceleration) {
@ -1278,7 +1283,10 @@ private:
return gcode.str(); return gcode.str();
} }
std::vector<unsigned int> m_normal_accelerations; std::vector<unsigned int> m_normal_accelerations;
std::vector<unsigned int> m_first_layer_normal_accelerations;
std::vector<unsigned int> m_travel_accelerations; std::vector<unsigned int> m_travel_accelerations;
std::vector<unsigned int> m_first_layer_travel_accelerations;
bool m_is_first_layer{false};
unsigned int m_max_acceleration{0}; unsigned int m_max_acceleration{0};
unsigned int m_last_acceleration{0}; unsigned int m_last_acceleration{0};
std::vector<int> m_filament_map; std::vector<int> m_filament_map;
@ -1606,11 +1614,21 @@ WipeTower::WipeTower(const PrintConfig& config, int plate_idx, Vec3d plate_origi
m_normal_accels.emplace_back((unsigned int) floor(value + 0.5)); m_normal_accels.emplace_back((unsigned int) floor(value + 0.5));
} }
m_first_layer_normal_accels.clear();
for (auto value : config.initial_layer_acceleration.values) {
m_first_layer_normal_accels.emplace_back((unsigned int) floor(value + 0.5));
}
m_travel_accels.clear(); m_travel_accels.clear();
for (auto value : config.travel_acceleration.values) { for (auto value : config.travel_acceleration.values) {
m_travel_accels.emplace_back((unsigned int) floor(value + 0.5)); m_travel_accels.emplace_back((unsigned int) floor(value + 0.5));
} }
m_first_layer_travel_accels.clear();
for (auto value : config.initial_layer_travel_acceleration.values) {
m_first_layer_travel_accels.emplace_back((unsigned int) floor(value + 0.5));
}
m_max_accels = config.machine_max_acceleration_extruding.values.front(); m_max_accels = config.machine_max_acceleration_extruding.values.front();
// Read absolute value of first layer speed, if given as percentage, // Read absolute value of first layer speed, if given as percentage,
@ -2423,10 +2441,13 @@ void WipeTower::set_for_wipe_tower_writer(WipeTowerWriter &writer)
{ {
writer.set_normal_acceleration(m_normal_accels); writer.set_normal_acceleration(m_normal_accels);
writer.set_travel_acceleration(m_travel_accels); writer.set_travel_acceleration(m_travel_accels);
writer.set_first_layer_normal_acceleration(m_first_layer_normal_accels);
writer.set_first_layer_travel_acceleration(m_first_layer_travel_accels);
writer.set_max_acceleration(m_max_accels); writer.set_max_acceleration(m_max_accels);
writer.set_filament_map(m_filament_map); writer.set_filament_map(m_filament_map);
writer.set_accel_to_decel_enable(m_accel_to_decel_enable); writer.set_accel_to_decel_enable(m_accel_to_decel_enable);
writer.set_accel_to_decel_factor(m_accel_to_decel_factor); writer.set_accel_to_decel_factor(m_accel_to_decel_factor);
writer.set_first_layer(m_cur_layer_id == 0);
} }
WipeTower::ToolChangeResult WipeTower::finish_layer(bool extrude_perimeter, bool extruder_fill) WipeTower::ToolChangeResult WipeTower::finish_layer(bool extrude_perimeter, bool extruder_fill)

View File

@ -462,7 +462,9 @@ private:
GCodeFlavor m_gcode_flavor; GCodeFlavor m_gcode_flavor;
std::vector<unsigned int> m_normal_accels; std::vector<unsigned int> m_normal_accels;
std::vector<unsigned int> m_first_layer_normal_accels;
std::vector<unsigned int> m_travel_accels; std::vector<unsigned int> m_travel_accels;
std::vector<unsigned int> m_first_layer_travel_accels;
unsigned int m_max_accels; unsigned int m_max_accels;
bool m_accel_to_decel_enable; bool m_accel_to_decel_enable;
float m_accel_to_decel_factor; float m_accel_to_decel_factor;

View File

@ -175,6 +175,16 @@ void GCodeWriter::set_travel_acceleration(const std::vector<unsigned int>& accel
m_travel_accelerations = accelerations; m_travel_accelerations = accelerations;
} }
void GCodeWriter::set_first_layer_travel_acceleration(const std::vector<unsigned int> &travel_accelerations)
{
m_first_layer_travel_accelerations = travel_accelerations;
}
void GCodeWriter::set_first_layer(bool is_first_layer)
{
m_is_first_layer = is_first_layer;
}
std::string GCodeWriter::set_extrude_acceleration() std::string GCodeWriter::set_extrude_acceleration()
{ {
return set_acceleration_impl(m_acceleration); return set_acceleration_impl(m_acceleration);
@ -182,14 +192,15 @@ std::string GCodeWriter::set_extrude_acceleration()
std::string GCodeWriter::set_travel_acceleration() std::string GCodeWriter::set_travel_acceleration()
{ {
if (m_travel_accelerations.empty()) std::vector<unsigned int> travel_accelerations = m_is_first_layer ? m_first_layer_travel_accelerations : m_travel_accelerations;
if (travel_accelerations.empty())
return std::string(); return std::string();
Extruder *cur_filament = filament(); Extruder *cur_filament = filament();
if (!cur_filament) if (!cur_filament)
return std::string(); return std::string();
return set_acceleration_impl(m_travel_accelerations[cur_filament->extruder_id()]); return set_acceleration_impl(travel_accelerations[cur_filament->extruder_id()]);
} }
std::string GCodeWriter::set_acceleration_impl(unsigned int acceleration) std::string GCodeWriter::set_acceleration_impl(unsigned int acceleration)
@ -529,7 +540,7 @@ std::string GCodeWriter::travel_to_xyz(const Vec3d &point, const std::string &co
} }
m_pos = dest_point; m_pos = dest_point;
this->set_current_position_clear(true); this->set_current_position_clear(true);
return slop_move + xy_z_move; return set_travel_acceleration() + slop_move + xy_z_move;
} }
else if (!this->will_move_z(point(2))) { else if (!this->will_move_z(point(2))) {
double nominal_z = m_pos(2) - m_lifted; double nominal_z = m_pos(2) - m_lifted;

View File

@ -56,6 +56,8 @@ public:
std::string set_chamber_temperature(int temperature, bool wait = false); std::string set_chamber_temperature(int temperature, bool wait = false);
void set_acceleration(unsigned int acceleration); void set_acceleration(unsigned int acceleration);
void set_travel_acceleration(const std::vector<unsigned int>& travel_accelerations); void set_travel_acceleration(const std::vector<unsigned int>& travel_accelerations);
void set_first_layer_travel_acceleration(const std::vector<unsigned int>& travel_accelerations);
void set_first_layer(bool is_first_layer);
std::string set_pressure_advance(double pa) const; std::string set_pressure_advance(double pa) const;
std::string set_jerk_xy(double jerk); std::string set_jerk_xy(double jerk);
std::string reset_e(bool force = false); std::string reset_e(bool force = false);
@ -158,8 +160,10 @@ private:
std::string m_gcode_label_objects_start; std::string m_gcode_label_objects_start;
std::string m_gcode_label_objects_end; std::string m_gcode_label_objects_end;
bool m_is_first_layer{false};
unsigned int m_acceleration{0}; unsigned int m_acceleration{0};
std::vector<unsigned int> m_travel_accelerations; // multi extruder, extruder size std::vector<unsigned int> m_travel_accelerations; // multi extruder, extruder size
std::vector<unsigned int> m_first_layer_travel_accelerations; // multi extruder, extruder size
std::string _travel_to_z(double z, const std::string &comment,bool tool_change=false); std::string _travel_to_z(double z, const std::string &comment,bool tool_change=false);
std::string _spiral_travel_to_z(double z, const Vec2d &ij_offset, const std::string &comment, bool tool_change = false); std::string _spiral_travel_to_z(double z, const Vec2d &ij_offset, const std::string &comment, bool tool_change = false);

View File

@ -860,7 +860,7 @@ static std::vector<std::string> s_Preset_print_options {
"inner_wall_speed", "outer_wall_speed", "sparse_infill_speed", "internal_solid_infill_speed", "inner_wall_speed", "outer_wall_speed", "sparse_infill_speed", "internal_solid_infill_speed",
"top_surface_speed", "support_speed", "support_object_xy_distance", "support_object_first_layer_gap","support_interface_speed", "top_surface_speed", "support_speed", "support_object_xy_distance", "support_object_first_layer_gap","support_interface_speed",
"bridge_speed", "gap_infill_speed", "travel_speed", "travel_speed_z", "initial_layer_speed", "outer_wall_acceleration", "bridge_speed", "gap_infill_speed", "travel_speed", "travel_speed_z", "initial_layer_speed", "outer_wall_acceleration",
"initial_layer_acceleration", "top_surface_acceleration", "default_acceleration", "travel_acceleration", "inner_wall_acceleration", "sparse_infill_acceleration", "initial_layer_acceleration", "top_surface_acceleration", "default_acceleration", "travel_acceleration", "initial_layer_travel_acceleration", "inner_wall_acceleration", "sparse_infill_acceleration",
"accel_to_decel_enable", "accel_to_decel_factor", "skirt_loops", "skirt_distance", "accel_to_decel_enable", "accel_to_decel_factor", "skirt_loops", "skirt_distance",
"skirt_height", "draft_shield", "skirt_height", "draft_shield",
"brim_width", "brim_object_gap", "brim_type", "enable_support", "support_type", "support_threshold_angle", "enforce_support_layers", "brim_width", "brim_object_gap", "brim_type", "enable_support", "support_type", "support_threshold_angle", "enforce_support_layers",

View File

@ -105,8 +105,6 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n
"overhang_fan_threshold", "overhang_fan_threshold",
"overhang_threshold_participating_cooling", "overhang_threshold_participating_cooling",
"slow_down_for_layer_cooling", "slow_down_for_layer_cooling",
"default_acceleration",
"travel_acceleration",
"deretraction_speed", "deretraction_speed",
"close_fan_the_first_x_layers", "close_fan_the_first_x_layers",
"machine_end_gcode", "machine_end_gcode",
@ -299,7 +297,10 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n
|| opt_key == "initial_layer_infill_speed" || opt_key == "initial_layer_infill_speed"
|| opt_key == "travel_speed" || opt_key == "travel_speed"
|| opt_key == "travel_speed_z" || opt_key == "travel_speed_z"
|| opt_key == "initial_layer_speed") { || opt_key == "initial_layer_speed"
|| opt_key == "default_acceleration"
|| opt_key == "travel_acceleration"
|| opt_key == "initial_layer_travel_acceleration") {
//|| opt_key == "z_offset") { //|| opt_key == "z_offset") {
steps.emplace_back(psWipeTower); steps.emplace_back(psWipeTower);
steps.emplace_back(psSkirtBrim); steps.emplace_back(psSkirtBrim);

View File

@ -1258,6 +1258,15 @@ void PrintConfigDef::init_fff_params()
def->nullable = true; def->nullable = true;
def->set_default_value(new ConfigOptionFloatsNullable{500.0}); def->set_default_value(new ConfigOptionFloatsNullable{500.0});
def = this->add("initial_layer_travel_acceleration", coFloats);
def->label = L("Initial layer travel");
def->tooltip = L("The acceleration of travel of initial layer");
def->sidetext = "mm/s²";
def->min = 0;
def->mode = comAdvanced;
def->nullable = true;
def->set_default_value(new ConfigOptionFloatsNullable{500.0});
def = this->add("default_filament_profile", coStrings); def = this->add("default_filament_profile", coStrings);
def->label = L("Default filament profile"); def->label = L("Default filament profile");
def->tooltip = L("Default filament profile when switch to this machine profile"); def->tooltip = L("Default filament profile when switch to this machine profile");
@ -5647,6 +5656,7 @@ std::set<std::string> print_options_with_variant = {
"travel_speed_z", "travel_speed_z",
"default_acceleration", "default_acceleration",
"travel_acceleration", "travel_acceleration",
"initial_layer_travel_acceleration",
"initial_layer_acceleration", "initial_layer_acceleration",
"outer_wall_acceleration", "outer_wall_acceleration",
"inner_wall_acceleration", "inner_wall_acceleration",

View File

@ -1156,6 +1156,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE(
((ConfigOptionBools, slow_down_for_layer_cooling)) ((ConfigOptionBools, slow_down_for_layer_cooling))
((ConfigOptionFloatsNullable, default_acceleration)) ((ConfigOptionFloatsNullable, default_acceleration))
((ConfigOptionFloatsNullable, travel_acceleration)) ((ConfigOptionFloatsNullable, travel_acceleration))
((ConfigOptionFloatsNullable, initial_layer_travel_acceleration))
((ConfigOptionFloatsNullable, inner_wall_acceleration)) ((ConfigOptionFloatsNullable, inner_wall_acceleration))
((ConfigOptionFloatsOrPercentsNullable, sparse_infill_acceleration)) ((ConfigOptionFloatsOrPercentsNullable, sparse_infill_acceleration))
((ConfigOptionBools, activate_air_filtration)) ((ConfigOptionBools, activate_air_filtration))

View File

@ -2176,6 +2176,7 @@ void TabPrint::build()
optgroup = page->new_optgroup(L("Acceleration"), L"param_acceleration", 15); optgroup = page->new_optgroup(L("Acceleration"), L"param_acceleration", 15);
optgroup->append_single_option_line("default_acceleration", "", 0); optgroup->append_single_option_line("default_acceleration", "", 0);
optgroup->append_single_option_line("travel_acceleration", "", 0); optgroup->append_single_option_line("travel_acceleration", "", 0);
optgroup->append_single_option_line("initial_layer_travel_acceleration", "", 0);
optgroup->append_single_option_line("initial_layer_acceleration", "", 0); optgroup->append_single_option_line("initial_layer_acceleration", "", 0);
optgroup->append_single_option_line("outer_wall_acceleration", "", 0); optgroup->append_single_option_line("outer_wall_acceleration", "", 0);
optgroup->append_single_option_line("inner_wall_acceleration", "", 0); optgroup->append_single_option_line("inner_wall_acceleration", "", 0);