ENH: CLI: refine some logic

1. set wipe tower position to default when duplicate object
2. add cli_safe check logic when switch printers

JIRA: no jira
Change-Id: Iebe62f8be6acd6f44743abf3b0fe92ec04c94197
This commit is contained in:
lane.wei 2023-11-28 21:23:51 +08:00 committed by Lane.Wei
parent d9ef16588a
commit 59e67c0b10
2 changed files with 133 additions and 6 deletions

View File

@ -0,0 +1,21 @@
{
"printer": {
"Bambu Lab A1": {
"cli_safe_acceleration_e": "0,0",
"cli_safe_acceleration_extruding": "0,0",
"cli_safe_acceleration_retracting": "0,0",
"cli_safe_acceleration_travel":"6000,6000",
"cli_safe_acceleration_x": "6000,6000",
"cli_safe_acceleration_y": "6000,6000",
"cli_safe_acceleration_z": "0,0",
"cli_safe_jerk_e": "0,0",
"cli_safe_jerk_x": "0,0",
"cli_safe_jerk_y": "0,0",
"cli_safe_jerk_z": "0,0",
"cli_safe_speed_e": "0,0",
"cli_safe_speed_x": "0,0",
"cli_safe_speed_y": "0,0",
"cli_safe_speed_z": "0,0"
}
}
}

View File

@ -1053,7 +1053,7 @@ int CLI::run(int argc, char **argv)
Semver file_version;
std::map<size_t, bool> orients_requirement;
std::vector<Preset*> project_presets;
std::string new_printer_name, current_printer_name, new_process_name, current_process_name, current_printer_system_name, current_process_system_name, new_process_system_name, new_printer_system_name, printer_model_id;//, printer_inherits, print_inherits;
std::string new_printer_name, current_printer_name, new_process_name, current_process_name, current_printer_system_name, current_process_system_name, new_process_system_name, new_printer_system_name, printer_model_id, printer_model;//, printer_inherits, print_inherits;
std::vector<std::string> upward_compatible_printers, new_print_compatible_printers, current_print_compatible_printers, current_different_settings;
std::vector<std::string> current_filaments_name, current_filaments_system_name, current_inherits_group;
DynamicPrintConfig load_process_config, load_machine_config;
@ -1584,7 +1584,7 @@ int CLI::run(int argc, char **argv)
config.set("printer_settings_id", new_printer_name, true);
//get printer_model_id
std::string printer_model = config.option<ConfigOptionString>("printer_model", true)->value;
printer_model = config.option<ConfigOptionString>("printer_model", true)->value;
if (!printer_model.empty()) {
std::string printer_model_path = resources_dir() + "/profiles/BBL/machine_full/"+printer_model+".json";
if (boost::filesystem::exists(printer_model_path))
@ -1779,7 +1779,7 @@ int CLI::run(int argc, char **argv)
config.set("printer_settings_id", config_name, true);
//get printer_model_id
std::string printer_model = config.option<ConfigOptionString>("printer_model", true)->value;
printer_model = config.option<ConfigOptionString>("printer_model", true)->value;
if (!printer_model.empty()) {
std::string printer_model_path = resources_dir() + "/profiles/BBL/machine_full/"+printer_model+".json";
if (boost::filesystem::exists(printer_model_path))
@ -1860,7 +1860,7 @@ int CLI::run(int argc, char **argv)
config.set("printer_settings_id", config_name, true);
//get printer_model_id
std::string printer_model = config.option<ConfigOptionString>("printer_model", true)->value;
printer_model = config.option<ConfigOptionString>("printer_model", true)->value;
if (!printer_model.empty()) {
std::string printer_model_path = resources_dir() + "/profiles/BBL/machine_full/"+printer_model+".json";
if (boost::filesystem::exists(printer_model_path))
@ -2259,6 +2259,70 @@ int CLI::run(int argc, char **argv)
else {
ret = update_full_config(m_print_config, load_machine_config, different_keys_set, true);
BOOST_LOG_TRIVIAL(info) << boost::format("load a new printer, update all the keys, different_settings: %1%")%different_settings[filament_count+1];
if (new_printer_name != current_printer_name)
{
//printer safe check
BOOST_LOG_TRIVIAL(info) << boost::format("check printer cli safe params, current_printer_name %1%, new_printer_name %2%, printer_model %3%")%current_printer_name %new_printer_name %printer_model;
std::map<std::string, std::string> printer_params;
std::string cli_config_file = resources_dir() + "/profiles/BBL/cli_config.json";
boost::filesystem::path directory_path(cli_config_file);
BOOST_LOG_TRIVIAL(info) << boost::format("line %1% , will parse file %2%")%__LINE__ % cli_config_file;
if (!fs::exists(directory_path)) {
BOOST_LOG_TRIVIAL(warning) << boost::format("file %1% not exist.")%cli_config_file;
}
else {
try {
json root_json;
boost::nowide::ifstream ifs(cli_config_file);
ifs >> root_json;
ifs.close();
if (root_json.contains("printer")) {
json printer_json = root_json["printer"];
if (!printer_model.empty() && printer_json.contains(printer_model)) {
json new_printer_json = printer_json[printer_model];
printer_params = new_printer_json.get<std::map<std::string, std::string>>();
for (auto param_iter = printer_params.begin(); param_iter != printer_params.end(); param_iter++)
{
std::string key = param_iter->first;
//replace "cli_safe" with "machine_max"
key.replace(0, 8, "machine_max");
ConfigOptionFloats* option = m_print_config.option<ConfigOptionFloats>(key);
if (option) {
//de-serialize the values from param_iter->second, and do the compare here
unsigned int array_count = option->size();
ConfigOptionFloats new_option;
new_option.deserialize(param_iter->second);
unsigned int new_array_count = new_option.size();
for (unsigned int index = 0; index < array_count; index++)
{
if ((index < new_array_count) && new_option.values[index] != 0.f && (new_option.values[index] < option->values[index]))
{
BOOST_LOG_TRIVIAL(info) << boost::format("set key %1% index %2%, from %3% to %4%") % key %index %option->values[index] % new_option.values[index];
option->values[index] = new_option.values[index];
}
}
}
else
BOOST_LOG_TRIVIAL(warning) << boost::format("can not find key %1% in config") %key;
}
}
else {
BOOST_LOG_TRIVIAL(info) << boost::format("can not find key %1% in the file")%printer_model;
}
}
else {
BOOST_LOG_TRIVIAL(warning) << boost::format("can not find key printer in the file");
}
}
catch (std::exception &err) {
BOOST_LOG_TRIVIAL(error) << __FUNCTION__<< ": parse file "<<cli_config_file<<" got a generic exception, reason = " << err.what();
}
}
}
}
if (ret) {
@ -3337,6 +3401,13 @@ int CLI::run(int argc, char **argv)
x = I3_WIPE_TOWER_DEFAULT_X_POS;
y = I3_WIPE_TOWER_DEFAULT_Y_POS;
}
if (x < WIPE_TOWER_MARGIN) {
x = WIPE_TOWER_MARGIN;
}
if (y < WIPE_TOWER_MARGIN) {
y = WIPE_TOWER_MARGIN;
}
ConfigOptionFloat wt_x_opt(x);
ConfigOptionFloat wt_y_opt(y);
@ -3564,6 +3635,13 @@ int CLI::run(int argc, char **argv)
x = I3_WIPE_TOWER_DEFAULT_X_POS;
y = I3_WIPE_TOWER_DEFAULT_Y_POS;
}
if (x < WIPE_TOWER_MARGIN) {
x = WIPE_TOWER_MARGIN;
}
if (y < WIPE_TOWER_MARGIN) {
y = WIPE_TOWER_MARGIN;
}
ConfigOptionFloat wt_x_opt(x);
ConfigOptionFloat wt_y_opt(y);
@ -3634,8 +3712,22 @@ int CLI::run(int argc, char **argv)
}
if (m_print_config.has("wipe_tower_x") && (is_smooth_timelapse || !arrange_cfg.is_seq_print || (selected.size() <= 1))) {
float x = dynamic_cast<const ConfigOptionFloats *>(m_print_config.option("wipe_tower_x"))->get_at(plate_to_slice-1);
float y = dynamic_cast<const ConfigOptionFloats *>(m_print_config.option("wipe_tower_y"))->get_at(plate_to_slice-1);
float x;
float y;
if (duplicate_count > 0) {
auto printer_structure_opt = m_print_config.option<ConfigOptionEnum<PrinterStructure>>("printer_structure");
x = WIPE_TOWER_DEFAULT_X_POS;
y = WIPE_TOWER_DEFAULT_Y_POS;
if (printer_structure_opt && printer_structure_opt->value == PrinterStructure::psI3) {
x = I3_WIPE_TOWER_DEFAULT_X_POS;
y = I3_WIPE_TOWER_DEFAULT_Y_POS;
}
}
else {
//keep the original
x = dynamic_cast<const ConfigOptionFloats *>(m_print_config.option("wipe_tower_x"))->get_at(plate_to_slice-1);
y = dynamic_cast<const ConfigOptionFloats *>(m_print_config.option("wipe_tower_y"))->get_at(plate_to_slice-1);
}
float w = dynamic_cast<const ConfigOptionFloat *>(m_print_config.option("prime_tower_width"))->value;
float a = dynamic_cast<const ConfigOptionFloat *>(m_print_config.option("wipe_tower_rotation_angle"))->value;
float v = dynamic_cast<const ConfigOptionFloat *>(m_print_config.option("prime_volume"))->value;
@ -3684,6 +3776,20 @@ int CLI::run(int argc, char **argv)
x = (float)plate_width - w - margin - wp_brim_width;
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format("arrange wipe_tower: exceeds the border, change x to %1%, plate_width=%2%")%y %plate_width;
}
if (x < margin) {
x = margin;
}
if (y < margin) {
y = margin;
}
//update wipe_tower_x and wipe_tower_y
ConfigOptionFloat wt_x_opt(x);
ConfigOptionFloat wt_y_opt(y);
ConfigOptionFloats* wipe_x_option = m_print_config.option<ConfigOptionFloats>("wipe_tower_x", true);
ConfigOptionFloats* wipe_y_option = m_print_config.option<ConfigOptionFloats>("wipe_tower_y", true);
wipe_x_option->set_at(&wt_x_opt, plate_to_slice-1, 0);
wipe_y_option->set_at(&wt_y_opt, plate_to_slice-1, 0);
ArrangePolygon wipe_tower_ap;