ENH: CLI: add some params to support more functions

1. uptodate_filaments to support update the original filaments to newest config
2. allow_rotations/avoid_extrusion_cali_region for auto-arrange
3. skip_modified_gcodes to support skip modified gcodes

JIRA: STUDIO-5112
Change-Id: I95c09af1b5462cce3bf27aea32228d6d1d1d201d
This commit is contained in:
lane.wei 2023-11-04 17:32:52 +08:00 committed by Lane.Wei
parent 3c2dfeae5a
commit 48644e1fb4
3 changed files with 257 additions and 48 deletions

View file

@ -516,6 +516,67 @@ static int load_key_values_from_json(const std::string &file, std::map<std::stri
return 0; return 0;
} }
static std::set<std::string> gcodes_key_set = {"filament_end_gcode", "filament_start_gcode", "change_filament_gcode", "layer_change_gcode", "machine_end_gcode", "machine_pause_gcode", "machine_start_gcode",
"template_custom_gcode", "printing_by_object_gcode", "before_layer_change_gcode", "time_lapse_gcode"};
static void load_default_gcodes_to_config(DynamicPrintConfig& config, Preset::Type type)
{
if (config.size() == 0) {
BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< ", empty config, return directly";
return;
}
//add those empty gcodes by default
if (type == Preset::TYPE_PRINTER)
{
std::string change_filament_gcode = config.option<ConfigOptionString>("change_filament_gcode", true)->value;
BOOST_LOG_TRIVIAL(trace) << __FUNCTION__<< ", change_filament_gcode: "<< change_filament_gcode;
ConfigOptionString* layer_change_gcode_opt = config.option<ConfigOptionString>("layer_change_gcode", true);
BOOST_LOG_TRIVIAL(trace) << __FUNCTION__<< ", layer_change_gcode: "<<layer_change_gcode_opt->value;
ConfigOptionString* machine_end_gcode_opt = config.option<ConfigOptionString>("machine_end_gcode", true);
BOOST_LOG_TRIVIAL(trace) << __FUNCTION__<< ", machine_end_gcode: "<<machine_end_gcode_opt->value;
ConfigOptionString* machine_pause_gcode_opt = config.option<ConfigOptionString>("machine_pause_gcode", true);
BOOST_LOG_TRIVIAL(trace) << __FUNCTION__<< ", machine_pause_gcode: "<<machine_pause_gcode_opt->value;
ConfigOptionString* machine_start_gcode_opt = config.option<ConfigOptionString>("machine_start_gcode", true);
BOOST_LOG_TRIVIAL(trace) << __FUNCTION__<< ", machine_start_gcode: "<<machine_start_gcode_opt->value;
ConfigOptionString* template_custom_gcode_opt = config.option<ConfigOptionString>("template_custom_gcode", true);
BOOST_LOG_TRIVIAL(trace) << __FUNCTION__<< ", template_custom_gcode: "<<template_custom_gcode_opt->value;
ConfigOptionString* printing_by_object_gcode_opt = config.option<ConfigOptionString>("printing_by_object_gcode", true);
BOOST_LOG_TRIVIAL(trace) << __FUNCTION__<< ", printing_by_object_gcode: "<<printing_by_object_gcode_opt->value;
ConfigOptionString* before_layer_change_gcode_opt = config.option<ConfigOptionString>("before_layer_change_gcode", true);
BOOST_LOG_TRIVIAL(trace) << __FUNCTION__<< ", before_layer_change_gcode: "<<before_layer_change_gcode_opt->value;
ConfigOptionString* timeplase_gcode_opt = config.option<ConfigOptionString>("time_lapse_gcode", true);
BOOST_LOG_TRIVIAL(trace) << __FUNCTION__<< ", time_lapse_gcode: "<<timeplase_gcode_opt->value;
}
else if (type == Preset::TYPE_FILAMENT)
{
std::vector<std::string>& filament_start_gcodes = config.option<ConfigOptionStrings>("filament_start_gcode", true)->values;
if (filament_start_gcodes.empty()) {
filament_start_gcodes.resize(1, std::string());
BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< ", set filament_start_gcodes to empty";
}
else {
BOOST_LOG_TRIVIAL(trace) << __FUNCTION__<< ", filament_start_gcodes: "<<filament_start_gcodes[0];
}
std::vector<std::string>& filament_end_gcodes = config.option<ConfigOptionStrings>("filament_end_gcode", true)->values;
if (filament_end_gcodes.empty()) {
filament_end_gcodes.resize(1, std::string());
BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< ", set filament_end_gcode to empty";
}
else {
BOOST_LOG_TRIVIAL(trace) << __FUNCTION__<< ", filament_end_gcode: "<<filament_end_gcodes[0];
}
}
}
int CLI::run(int argc, char **argv) int CLI::run(int argc, char **argv)
{ {
// Mark the main thread for the debugger and for runtime checks. // Mark the main thread for the debugger and for runtime checks.
@ -601,6 +662,7 @@ int CLI::run(int argc, char **argv)
std::string outfile_dir = m_config.opt_string("outputdir", true); std::string outfile_dir = m_config.opt_string("outputdir", true);
const std::vector<std::string> &load_configs = m_config.option<ConfigOptionStrings>("load_settings", true)->values; const std::vector<std::string> &load_configs = m_config.option<ConfigOptionStrings>("load_settings", true)->values;
const std::vector<std::string> &uptodate_configs = m_config.option<ConfigOptionStrings>("uptodate_settings", true)->values; const std::vector<std::string> &uptodate_configs = m_config.option<ConfigOptionStrings>("uptodate_settings", true)->values;
const std::vector<std::string> &uptodate_filaments = m_config.option<ConfigOptionStrings>("uptodate_filaments", true)->values;
//BBS: always use ForwardCompatibilitySubstitutionRule::Enable //BBS: always use ForwardCompatibilitySubstitutionRule::Enable
//const ForwardCompatibilitySubstitutionRule config_substitution_rule = m_config.option<ConfigOptionEnum<ForwardCompatibilitySubstitutionRule>>("config_compatibility", true)->value; //const ForwardCompatibilitySubstitutionRule config_substitution_rule = m_config.option<ConfigOptionEnum<ForwardCompatibilitySubstitutionRule>>("config_compatibility", true)->value;
const ForwardCompatibilitySubstitutionRule config_substitution_rule = ForwardCompatibilitySubstitutionRule::Enable; const ForwardCompatibilitySubstitutionRule config_substitution_rule = ForwardCompatibilitySubstitutionRule::Enable;
@ -684,6 +746,7 @@ int CLI::run(int argc, char **argv)
int arrange_option; int arrange_option;
int plate_to_slice = 0, filament_count = 0, duplicate_count = 0, real_duplicate_count = 0; int plate_to_slice = 0, filament_count = 0, duplicate_count = 0, real_duplicate_count = 0;
bool first_file = true, is_bbl_3mf = false, need_arrange = true, has_thumbnails = false, up_config_to_date = false, normative_check = true, duplicate_single_object = false, use_first_fila_as_default = false, minimum_save = false, enable_timelapse = false; bool first_file = true, is_bbl_3mf = false, need_arrange = true, has_thumbnails = false, up_config_to_date = false, normative_check = true, duplicate_single_object = false, use_first_fila_as_default = false, minimum_save = false, enable_timelapse = false;
bool allow_rotations = true, skip_modified_gcodes = false, avoid_extrusion_cali_region = false;
Semver file_version; Semver file_version;
std::map<size_t, bool> orients_requirement; std::map<size_t, bool> orients_requirement;
std::vector<Preset*> project_presets; std::vector<Preset*> project_presets;
@ -720,6 +783,18 @@ int CLI::run(int argc, char **argv)
if (enable_timelapse_option) if (enable_timelapse_option)
enable_timelapse = enable_timelapse_option->value; enable_timelapse = enable_timelapse_option->value;
ConfigOptionBool* allow_rotations_option = m_config.option<ConfigOptionBool>("allow_rotations");
if (allow_rotations_option)
allow_rotations = allow_rotations_option->value;
ConfigOptionBool* skip_modified_gcodes_option = m_config.option<ConfigOptionBool>("skip_modified_gcodes");
if (skip_modified_gcodes_option)
skip_modified_gcodes = skip_modified_gcodes_option->value;
ConfigOptionBool* avoid_extrusion_cali_region_option = m_config.option<ConfigOptionBool>("avoid_extrusion_cali_region");
if (avoid_extrusion_cali_region_option)
avoid_extrusion_cali_region = avoid_extrusion_cali_region_option->value;
ConfigOptionString* pipe_option = m_config.option<ConfigOptionString>("pipe"); ConfigOptionString* pipe_option = m_config.option<ConfigOptionString>("pipe");
if (pipe_option) { if (pipe_option) {
pipe_name = pipe_option->value; pipe_name = pipe_option->value;
@ -753,7 +828,8 @@ int CLI::run(int argc, char **argv)
const std::vector<int> clone_objects = m_config.option<ConfigOptionInts>("clone_objects", true)->values; const std::vector<int> clone_objects = m_config.option<ConfigOptionInts>("clone_objects", true)->values;
//when load objects from stl/obj, the total used filaments set //when load objects from stl/obj, the total used filaments set
std::set<int> used_filament_set; std::set<int> used_filament_set;
BOOST_LOG_TRIVIAL(info) << boost::format("allow_multicolor_oneplate %1%, loaded_filament_ids size %2%, clone_objects size %3%")%allow_multicolor_oneplate %loaded_filament_ids.size() %clone_objects.size(); BOOST_LOG_TRIVIAL(info) << boost::format("allow_multicolor_oneplate %1%, allow_rotations %2% skip_modified_gcodes %3% avoid_extrusion_cali_region %4% loaded_filament_ids size %5%, clone_objects size %6%")
%allow_multicolor_oneplate %allow_rotations %skip_modified_gcodes %avoid_extrusion_cali_region %loaded_filament_ids.size() %clone_objects.size();
if (clone_objects.size() > 0) if (clone_objects.size() > 0)
{ {
if (clone_objects.size() != m_input_files.size()) if (clone_objects.size() != m_input_files.size())
@ -1517,34 +1593,83 @@ int CLI::run(int argc, char **argv)
fetch_compatible_values = true; fetch_compatible_values = true;
} }
//20230802 lhwei: remove below codes, don't replace filament currently //filament processes
/*if (load_filaments_config.empty() && !current_filaments_system_name.empty()) { if (load_filament_count == 0)
for (int index = 0; index < current_filaments_system_name.size(); index++) { {
std::string system_filament_path = resources_dir() + "/profiles/BBL/filament_full/"+current_filaments_system_name[index]+".json"; if (uptodate_filaments.size() > 0)
current_index++; {
if (! boost::filesystem::exists(system_filament_path)) { if (uptodate_filaments.size() != filament_count)
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__<< boost::format(":%1%, can not find system preset file: %2% ")%__LINE__ %system_filament_path; {
continue; BOOST_LOG_TRIVIAL(error) << boost::format("uptodate_filaments size %1% not equal to filament_count %2% ")%uptodate_filaments.size() %filament_count;
} record_exit_reson(outfile_dir, CLI_INVALID_PARAMS, 0, cli_errors[CLI_INVALID_PARAMS], sliced_info);
DynamicPrintConfig config; flush_and_exit(CLI_INVALID_PARAMS);
std::string config_type, config_name, filament_id, config_from;
int ret = load_config_file(system_filament_path, config, config_type, config_name, filament_id, config_from);
if (ret) {
record_exit_reson(outfile_dir, ret, 0, cli_errors[ret], sliced_info);
flush_and_exit(ret);
} }
for (unsigned int index = 0; index < filament_count; index ++)
{
std::string file = uptodate_filaments[index];
DynamicPrintConfig config;
std::string config_type, config_name, filament_id, config_from;
int ret = load_config_file(file, config, config_type, config_name, filament_id, config_from);
if (ret) {
BOOST_LOG_TRIVIAL(error) << boost::format("load uptodate_filaments %1% fail, index %2%!")%file %index;
record_exit_reson(outfile_dir, ret, 0, cli_errors[ret], sliced_info);
flush_and_exit(ret);
}
load_filaments_id.push_back(filament_id); if (config_type != "filament") {
load_filaments_name.push_back(config_name); BOOST_LOG_TRIVIAL(error) <<__FUNCTION__ << boost::format(": unknown config type %1% of file %2% in load-filaments") % config_type % file;
load_filaments_config.push_back(std::move(config)); record_exit_reson(outfile_dir, CLI_CONFIG_FILE_ERROR, 0, cli_errors[CLI_CONFIG_FILE_ERROR], sliced_info);
load_filaments_index.push_back(current_index); flush_and_exit(CLI_CONFIG_FILE_ERROR);
std::string inherits; }
if ((config_from == "User")||(config_from == "user")) {
inherits = config.option<ConfigOptionString>("inherits", true)->value; if (config_name != current_filaments_system_name[index]) {
BOOST_LOG_TRIVIAL(error) << boost::format("wrong filament config file %1% loaded, current filament config name %2%, index %3%")%config_name %current_filaments_system_name[index] %index;
record_exit_reson(outfile_dir, CLI_CONFIG_FILE_ERROR, 0, cli_errors[CLI_CONFIG_FILE_ERROR], sliced_info);
flush_and_exit(CLI_CONFIG_FILE_ERROR);
}
load_filaments_id.push_back(filament_id);
load_filaments_name.push_back(config_name);
load_filaments_config.push_back(std::move(config));
load_filaments_index.push_back(index+1);
load_filaments_inherit.push_back(config_name);
BOOST_LOG_TRIVIAL(info) << boost::format("load a filament config %1% from file %2%, using uptodate_filaments index %3%")%config_name %file %index;
} }
load_filaments_inherit.push_back(inherits);
} }
}*/ else
{
current_index = 0;
for (int index = 0; index < current_filaments_system_name.size(); index++)
{
std::string system_filament_path = resources_dir() + "/profiles/BBL/filament_full/"+current_filaments_system_name[index]+".json";
current_index++;
if (! boost::filesystem::exists(system_filament_path)) {
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__<< boost::format(":%1%, can not find system preset file: %2% ")%__LINE__ %system_filament_path;
continue;
}
DynamicPrintConfig config;
std::string config_type, config_name, filament_id, config_from;
int ret = load_config_file(system_filament_path, config, config_type, config_name, filament_id, config_from);
if (ret) {
record_exit_reson(outfile_dir, ret, 0, cli_errors[ret], sliced_info);
flush_and_exit(ret);
}
if (config_type != "filament") {
BOOST_LOG_TRIVIAL(error) <<__FUNCTION__ << boost::format(": unknown config type %1% of file %2% in load-filaments") % config_type % system_filament_path;
record_exit_reson(outfile_dir, CLI_CONFIG_FILE_ERROR, 0, cli_errors[CLI_CONFIG_FILE_ERROR], sliced_info);
flush_and_exit(CLI_CONFIG_FILE_ERROR);
}
load_filaments_id.push_back(filament_id);
load_filaments_name.push_back(config_name);
load_filaments_config.push_back(std::move(config));
load_filaments_index.push_back(current_index);
load_filaments_inherit.push_back(config_name);
BOOST_LOG_TRIVIAL(info) << boost::format("LINE %4%: load a filament config %1% from file %2%, index %3%")%config_name %system_filament_path %index %__LINE__;
}
}
}
} }
else if (is_bbl_3mf){ else if (is_bbl_3mf){
fetch_upward_values = true; fetch_upward_values = true;
@ -1734,12 +1859,24 @@ int CLI::run(int argc, char **argv)
} }
//update seperate configs into full config //update seperate configs into full config
auto update_full_config = [](DynamicPrintConfig& full_config, const DynamicPrintConfig& config, std::set<std::string>& diff_key_sets, bool update_all = false) { auto update_full_config = [](DynamicPrintConfig& full_config, const DynamicPrintConfig& config, std::set<std::string>& diff_key_sets, bool update_all = false, bool skip_gcodes = false) {
for (const t_config_option_key &opt_key : config.keys()) { const t_config_option_keys& config_keys = config.keys();
if (!update_all && !diff_key_sets.empty() && (diff_key_sets.find(opt_key) != diff_key_sets.end())) { BOOST_LOG_TRIVIAL(info) << boost::format("update_full_config: config keys count %1%")%config_keys.size();
//uptodate, diff keys, continue for (const t_config_option_key &opt_key : config_keys) {
BOOST_LOG_TRIVIAL(info) << boost::format("keep key %1%")%opt_key; if (!update_all && !diff_key_sets.empty()) {
continue; std::set<std::string>::iterator iter = diff_key_sets.find(opt_key);
if ( iter != diff_key_sets.end()) {
if (skip_gcodes && (gcodes_key_set.find(opt_key) != gcodes_key_set.end()))
{
diff_key_sets.erase(iter);
BOOST_LOG_TRIVIAL(info) << boost::format("%1%, gcodes %2% modified, reset to default.")%__LINE__ %opt_key;
}
else {
//uptodate, diff keys, continue
BOOST_LOG_TRIVIAL(info) << boost::format("%1%, keep key %2%")%__LINE__ %opt_key;
continue;
}
}
} }
const ConfigOption *source_opt = config.option(opt_key); const ConfigOption *source_opt = config.option(opt_key);
if (source_opt == nullptr) { if (source_opt == nullptr) {
@ -1788,16 +1925,28 @@ int CLI::run(int argc, char **argv)
} }
std::set<std::string> different_keys_set(different_keys.begin(), different_keys.end()); std::set<std::string> different_keys_set(different_keys.begin(), different_keys.end());
BOOST_LOG_TRIVIAL(info) << boost::format("update printer config to newest, different size %1%")%different_keys_set.size(); BOOST_LOG_TRIVIAL(info) << boost::format("update printer config to newest, different size %1%, different_settings: %2%")%different_keys_set.size() %different_settings[filament_count+1];
int ret; int ret;
load_default_gcodes_to_config(load_machine_config, Preset::TYPE_PRINTER);
if (new_printer_name.empty()) { if (new_printer_name.empty()) {
ret = update_full_config(m_print_config, load_machine_config, different_keys_set); int diff_keys_size = different_keys_set.size();
BOOST_LOG_TRIVIAL(info) << boost::format("no new printer, only update the different key, ret %1%")%ret; ret = update_full_config(m_print_config, load_machine_config, different_keys_set, false, skip_modified_gcodes);
if (diff_keys_size != different_keys_set.size()) {
//changed
BOOST_LOG_TRIVIAL(info) << boost::format("new different key size %1%")%different_keys_set.size();
different_keys.clear();
for (std::set<std::string>::iterator iter=different_keys_set.begin(); iter !=different_keys_set.end(); ++iter)
different_keys.emplace_back(*iter);
different_settings[filament_count+1] = Slic3r::escape_strings_cstyle(different_keys);
}
BOOST_LOG_TRIVIAL(info) << boost::format("no new printer, only update the different key, new different_settings: %1%")%different_settings[filament_count+1];
} }
else { else {
ret = update_full_config(m_print_config, load_machine_config, different_keys_set, true); 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, ret %1%")%ret; BOOST_LOG_TRIVIAL(info) << boost::format("load a new printer, update all the keys, different_settings: %1%")%different_settings[filament_count+1];
} }
if (ret) { if (ret) {
@ -1842,16 +1991,28 @@ int CLI::run(int argc, char **argv)
} }
std::set<std::string> different_keys_set(different_keys.begin(), different_keys.end()); std::set<std::string> different_keys_set(different_keys.begin(), different_keys.end());
BOOST_LOG_TRIVIAL(info) << boost::format("update process config to newest, different size %1%")%different_keys_set.size(); BOOST_LOG_TRIVIAL(info) << boost::format("update process config to newest, different size %1%, different_settings: %2%")%different_keys_set.size() %different_settings[0];
int ret; int ret;
load_default_gcodes_to_config(load_machine_config, Preset::TYPE_PRINT);
if (new_process_name.empty()) { if (new_process_name.empty()) {
ret = update_full_config(m_print_config, load_process_config, different_keys_set); int diff_keys_size = different_keys_set.size();
BOOST_LOG_TRIVIAL(info) << boost::format("no new process, only update the different key, ret %1%")%ret; ret = update_full_config(m_print_config, load_process_config, different_keys_set, false, skip_modified_gcodes);
if (diff_keys_size != different_keys_set.size()) {
//changed
BOOST_LOG_TRIVIAL(info) << boost::format("new different key size %1%")%different_keys_set.size();
different_keys.clear();
for (std::set<std::string>::iterator iter=different_keys_set.begin(); iter !=different_keys_set.end(); ++iter)
different_keys.emplace_back(*iter);
different_settings[0] = Slic3r::escape_strings_cstyle(different_keys);
}
BOOST_LOG_TRIVIAL(info) << boost::format("no new process, only update the different key, new different_settings: %1%")%different_settings[0];
} }
else { else {
ret = update_full_config(m_print_config, load_process_config, different_keys_set, true); ret = update_full_config(m_print_config, load_process_config, different_keys_set, true);
BOOST_LOG_TRIVIAL(info) << boost::format("load a new process, update all the keys, ret %1%")%ret; BOOST_LOG_TRIVIAL(info) << boost::format("load a new process, update all the keys, different_settings: %1%")%different_settings[0];
} }
if (ret) { if (ret) {
@ -1889,6 +2050,8 @@ int CLI::run(int argc, char **argv)
int filament_index = load_filaments_index[index]; int filament_index = load_filaments_index[index];
std::vector<std::string> different_keys; std::vector<std::string> different_keys;
load_default_gcodes_to_config(config, Preset::TYPE_FILAMENT);
if (load_filament_count > 0) { if (load_filament_count > 0) {
ConfigOptionStrings *opt_filament_settings = static_cast<ConfigOptionStrings *> (m_print_config.option("filament_settings_id", true)); ConfigOptionStrings *opt_filament_settings = static_cast<ConfigOptionStrings *> (m_print_config.option("filament_settings_id", true));
std::string& filament_name = load_filaments_name[index]; std::string& filament_name = load_filaments_name[index];
@ -1921,12 +2084,25 @@ int CLI::run(int argc, char **argv)
//parse the filament value to index th //parse the filament value to index th
//loop through options and apply them //loop through options and apply them
std::set<std::string> different_keys_set(different_keys.begin(), different_keys.end()); std::set<std::string> different_keys_set(different_keys.begin(), different_keys.end());
BOOST_LOG_TRIVIAL(info) << boost::format("update filament %1%'s config to newest, different size %2%")%filament_index%different_keys_set.size(); int diff_keys_size = different_keys_set.size();
BOOST_LOG_TRIVIAL(info) << boost::format("update filament %1%'s config to newest, different size %2%, name %3%, different_settings %4%")
%filament_index%different_keys_set.size()%load_filaments_name[index] % different_settings[filament_index];
for (const t_config_option_key &opt_key : config.keys()) { for (const t_config_option_key &opt_key : config.keys()) {
if ((load_filament_count == 0) && !different_keys_set.empty() && (different_keys_set.find(opt_key) != different_keys_set.end())) { if ((load_filament_count == 0) && !different_keys_set.empty())
//uptodate, diff keys, continue {
BOOST_LOG_TRIVIAL(info) << boost::format("keep key %1%")%opt_key; std::set<std::string>::iterator iter = different_keys_set.find(opt_key);
continue; if ( iter != different_keys_set.end()) {
if (skip_modified_gcodes && (gcodes_key_set.find(opt_key) != gcodes_key_set.end()))
{
different_keys_set.erase(iter);
BOOST_LOG_TRIVIAL(info) << boost::format("%1%, filament %2%'s gcodes %3% modified, reset to default.")%__LINE__ %filament_index %opt_key;
}
else {
//uptodate, diff keys, continue
BOOST_LOG_TRIVIAL(info) << boost::format("%1%, keep key %2%")%__LINE__ %opt_key;
continue;
}
}
} }
// Create a new option with default value for the key. // Create a new option with default value for the key.
// If the key is not in the parameter definition, or this ConfigBase is a static type and it does not support the parameter, // If the key is not in the parameter definition, or this ConfigBase is a static type and it does not support the parameter,
@ -1977,6 +2153,16 @@ int CLI::run(int argc, char **argv)
opt_vec_dst->set_at(opt_vec_src, filament_index-1, 0); opt_vec_dst->set_at(opt_vec_src, filament_index-1, 0);
} }
} }
if (diff_keys_size != different_keys_set.size()) {
//changed
different_keys.clear();
for (std::set<std::string>::iterator iter=different_keys_set.begin(); iter !=different_keys_set.end(); ++iter)
different_keys.emplace_back(*iter);
different_settings[filament_index] = Slic3r::escape_strings_cstyle(different_keys);
BOOST_LOG_TRIVIAL(info) << boost::format("filament %1% new different key size %2%, different_settings %3%")%filament_index %different_keys_set.size() %different_settings[filament_index];
}
} }
} }
@ -2986,9 +3172,9 @@ int CLI::run(int argc, char **argv)
//Step-2:prepare the arrange params //Step-2:prepare the arrange params
arrange_cfg.allow_rotations = true; arrange_cfg.allow_rotations = allow_rotations;
arrange_cfg.allow_multi_materials_on_same_plate = allow_multicolor_oneplate; arrange_cfg.allow_multi_materials_on_same_plate = allow_multicolor_oneplate;
arrange_cfg.avoid_extrusion_cali_region = false; arrange_cfg.avoid_extrusion_cali_region = avoid_extrusion_cali_region;
arrange_cfg.clearance_height_to_rod = height_to_rod; arrange_cfg.clearance_height_to_rod = height_to_rod;
arrange_cfg.clearance_height_to_lid = height_to_lid; arrange_cfg.clearance_height_to_lid = height_to_lid;
arrange_cfg.cleareance_radius = cleareance_radius; arrange_cfg.cleareance_radius = cleareance_radius;

View file

@ -939,7 +939,8 @@ void PresetBundle::update_system_preset_setting_ids(std::map<std::string, std::m
} }
//BBS: validate printers from previous project //BBS: validate printers from previous project
static std::set<std::string> gcodes_key_set = {"filament_end_gcode", "filament_start_gcode", "change_filament_gcode", "layer_change_gcode", "machine_end_gcode", "machine_pause_gcode", "machine_start_gcode", "template_custom_gcode"}; static std::set<std::string> gcodes_key_set = {"filament_end_gcode", "filament_start_gcode", "change_filament_gcode", "layer_change_gcode", "machine_end_gcode", "machine_pause_gcode", "machine_start_gcode",
"template_custom_gcode", "printing_by_object_gcode", "before_layer_change_gcode", "time_lapse_gcode"};
int PresetBundle::validate_presets(const std::string &file_name, DynamicPrintConfig& config, std::set<std::string>& different_gcodes) int PresetBundle::validate_presets(const std::string &file_name, DynamicPrintConfig& config, std::set<std::string>& different_gcodes)
{ {
bool validated = false; bool validated = false;

View file

@ -5425,6 +5425,12 @@ CLIMiscConfigDef::CLIMiscConfigDef()
def->cli_params = "\"setting1.json;setting2.json\""; def->cli_params = "\"setting1.json;setting2.json\"";
def->set_default_value(new ConfigOptionStrings()); def->set_default_value(new ConfigOptionStrings());
def = this->add("uptodate_filaments", coStrings);
def->label = "load uptodate filament settings when using uptodate";
def->tooltip = "load uptodate filament settings from the specified file when using uptodate";
def->cli_params = "\"filament1.json;filament2.json;...\"";
def->set_default_value(new ConfigOptionStrings());
/*def = this->add("output", coString); /*def = this->add("output", coString);
def->label = L("Output File"); def->label = L("Output File");
def->tooltip = L("The file where the output will be written (if not specified, it will be based on the input file)."); def->tooltip = L("The file where the output will be written (if not specified, it will be based on the input file).");
@ -5481,8 +5487,24 @@ CLIMiscConfigDef::CLIMiscConfigDef()
def = this->add("allow_multicolor_oneplate", coBool); def = this->add("allow_multicolor_oneplate", coBool);
def->label = "Allow multiple color on one plate"; def->label = "Allow multiple color on one plate";
def->tooltip = "If enabled, the arrange will allow multiple color on one plate "; def->tooltip = "If enabled, the arrange will allow multiple color on one plate";
def->set_default_value(new ConfigOptionBool(true)); def->set_default_value(new ConfigOptionBool(true));
def = this->add("allow_rotations", coBool);
def->label = "Allow rotatations when arrange";
def->tooltip = "If enabled, the arrange will allow rotations when place object";
def->set_default_value(new ConfigOptionBool(true));
def = this->add("avoid_extrusion_cali_region", coBool);
def->label = "Avoid extrusion calibrate region when doing arrange";
def->tooltip = "If enabled, the arrange will avoid extrusion calibrate region when place object";
def->set_default_value(new ConfigOptionBool(false));
def = this->add("skip_modified_gcodes", coBool);
def->label = "Skip modified gcodes in 3mf";
def->tooltip = "Skip the modified gcodes in 3mf from Printer or filament Presets";
def->cli_params = "option";
def->set_default_value(new ConfigOptionBool(false));
} }
const CLIActionsConfigDef cli_actions_config_def; const CLIActionsConfigDef cli_actions_config_def;