diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index b11f069f19..ac0e1b7e65 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1419,17 +1419,107 @@ StringObjectException Print::validate(StringObjectException *warning, Polygons* } } - if (warning && (m_default_object_config.default_jerk == 1 || m_default_object_config.outer_wall_jerk == 1 || - m_default_object_config.inner_wall_jerk == 1)) { - warning->string = L("Setting the jerk speed too low could lead to artifacts on curved surfaces"); - if (m_default_object_config.outer_wall_jerk == 1) - warning->opt_key = "outer_wall_jerk"; - else if (m_default_object_config.inner_wall_jerk == 1) - warning->opt_key = "inner_wall_jerk"; - else - warning->opt_key = "default_jerk"; - } + // check if print speed/accel/jerk is higher than the maximum speed of the printer + if (warning) { + try { + auto check_motion_ability_object_setting = [&](const std::initializer_list& keys_to_check, + double limit) -> std::string { + std::string warning_key; + for (const auto& key : keys_to_check) { + if (m_default_object_config.get_abs_value(key) > limit) { + warning_key = key; + break; + } + } + return warning_key; + }; + auto check_motion_ability_region_setting = [&](const std::initializer_list& keys_to_check, + double limit) -> std::string { + std::string warning_key; + for (const auto& key : keys_to_check) { + if (m_default_region_config.get_abs_value(key) > limit) { + warning_key = key; + break; + } + } + return warning_key; + }; + std::string warning_key; + // check jerk + if (m_default_object_config.default_jerk == 1 || m_default_object_config.outer_wall_jerk == 1 || + m_default_object_config.inner_wall_jerk == 1) { + warning->string = L("Setting the jerk speed too low could lead to artifacts on curved surfaces"); + if (m_default_object_config.outer_wall_jerk == 1) + warning_key = "outer_wall_jerk"; + else if (m_default_object_config.inner_wall_jerk == 1) + warning_key = "inner_wall_jerk"; + else + warning_key = "default_jerk"; + + warning->opt_key = warning_key; + } + + if (warning_key.empty() && m_default_object_config.default_jerk > 0) { + auto jerk_to_check = {"default_jerk", "outer_wall_jerk", "inner_wall_jerk", "infill_jerk", + "top_surface_jerk", "initial_layer_jerk", "travel_jerk"}; + const auto max_jerk = std::min(m_config.machine_max_jerk_x.values[0], m_config.machine_max_jerk_y.values[0]); + warning_key.clear(); + if (m_default_object_config.default_jerk > 0) + warning_key = check_motion_ability_object_setting(jerk_to_check, max_jerk); + if (!warning_key.empty()) { + warning->string = L("The jerk is set higher than the printer's maximum jerk " + "(machine_max_jerk_x/machine_max_jerk_y), resulting in the jerk speed being capped.\nYou might " + "consider increasing the maximum jerk in your printer settings."); + warning->opt_key = warning_key; + } + } + + // check acceleration + if (warning_key.empty() && m_default_object_config.default_acceleration > 0) { + auto accel_to_check = { + "default_acceleration", + "inner_wall_acceleration", + "outer_wall_acceleration", + "bridge_acceleration", + "initial_layer_acceleration", + "sparse_infill_acceleration", + "internal_solid_infill_acceleration", + "top_surface_acceleration", + "travel_acceleration", + }; + const auto max_accel = m_config.machine_max_acceleration_extruding.values[0]; + warning_key = check_motion_ability_object_setting(accel_to_check, max_accel); + if (!warning_key.empty()) { + warning->string = L( + "The acceleration is set higher than the printer's maximum extruding acceleration " + "(machine_max_acceleration_extruding), resulting in the print acceleration being capped.\nYou might " + "consider increasing the maximum acceleration in your printer settings."); + warning->opt_key = warning_key; + } + } + + // check speed + if (warning_key.empty()) { + auto speed_to_check = {"inner_wall_speed", "outer_wall_speed", "sparse_infill_speed", "internal_solid_infill_speed", + "top_surface_speed", "bridge_speed", "internal_bridge_speed", "gap_infill_speed"}; + const auto max_speed = std::min(m_config.machine_max_speed_x.values[0], m_config.machine_max_speed_y.values[0]); + warning_key.clear(); + warning_key = check_motion_ability_region_setting(speed_to_check, max_speed); + if (warning_key.empty() && m_config.travel_speed > max_speed) + warning_key = "travel_speed"; + if (!warning_key.empty()) { + warning->string = L("The speed is set higher than the printer's maximum speed " + "(machine_max_speed_x/machine_max_speed_y), resulting in the print speed being capped.\nYou might " + "consider increasing the maximum speed in your printer settings."); + warning->opt_key = warning_key; + } + } + + } catch (std::exception& e) { + BOOST_LOG_TRIVIAL(warning) << "Orca: validate motion ability failed: " << e.what() << std::endl; + } + } return {}; }