Improve checking placeholders

Dialog now shows all issues within the same dialog

If a custom gcode value is not specified within the config, a testing value is added. This ensures that (most) of the custom gcode is parsed, and thus checked against the definitions.
This commit is contained in:
Ocraftyone 2023-12-30 07:37:34 -05:00
parent d839d673d0
commit 4e3039b6f9
No known key found for this signature in database
GPG key ID: 85836ED21AD4D125
2 changed files with 64 additions and 10 deletions

View file

@ -1585,6 +1585,21 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu
check_placeholder_parser_failed(); check_placeholder_parser_failed();
#if ORCA_CHECK_GCODE_PLACEHOLDERS
if (!m_placeholder_error_messages.empty()){
std::ostringstream message;
message << "Some EditGcodeDialog defs were not specified properly. Do so in PrintConfig under SlicingStatesConfigDef:" << std::endl;
for (const auto& error : m_placeholder_error_messages) {
message << std::endl << error.first << ": " << std::endl;
for (const auto& str : error.second)
message << str << ", ";
message.seekp(-2, std::ios_base::end);
message << std::endl;
}
throw Slic3r::PlaceholderParserError(message.str());
}
#endif
BOOST_LOG_TRIVIAL(debug) << "Start processing gcode, " << log_memory_info(); BOOST_LOG_TRIVIAL(debug) << "Start processing gcode, " << log_memory_info();
// Post-process the G-code to update time stamps. // Post-process the G-code to update time stamps.
@ -2915,8 +2930,9 @@ void GCode::process_layers(
std::string GCode::placeholder_parser_process(const std::string &name, const std::string &templ, unsigned int current_extruder_id, const DynamicConfig *config_override) std::string GCode::placeholder_parser_process(const std::string &name, const std::string &templ, unsigned int current_extruder_id, const DynamicConfig *config_override)
{ {
// Orca: Modified functionality from PS implementation since debug is rarely used in current workflow. // Orca: Added CMake config option since debug is rarely used in current workflow.
// Allows generation to be toggled via a CMake config option. // Also changed from throwing error immediately to storing messages till slicing is completed
// to raise all errors at the same time.
#if !defined(NDEBUG) || defined(ORCA_CHECK_GCODE_PLACEHOLDERS) // CHECK_CUSTOM_GCODE_PLACEHOLDERS #if !defined(NDEBUG) || defined(ORCA_CHECK_GCODE_PLACEHOLDERS) // CHECK_CUSTOM_GCODE_PLACEHOLDERS
if (config_override) { if (config_override) {
const auto& custom_gcode_placeholders = custom_gcode_specific_placeholders(); const auto& custom_gcode_placeholders = custom_gcode_specific_placeholders();
@ -2929,17 +2945,24 @@ std::string GCode::placeholder_parser_process(const std::string &name, const std
for (const std::string& key : config_override->keys()) { for (const std::string& key : config_override->keys()) {
// 2-nd check: "key" have to be present in s_CustomGcodeSpecificOptions for "name" custom G-code ; // 2-nd check: "key" have to be present in s_CustomGcodeSpecificOptions for "name" custom G-code ;
if (std::find(placeholders.begin(), placeholders.end(), key) == placeholders.end()) if (std::find(placeholders.begin(), placeholders.end(), key) == placeholders.end()) {
throw Slic3r::PlaceholderParserError(format("\"%s\" placeholder for \"%s\" custom G-code \n" auto& vector = m_placeholder_error_messages[name + " - option not specified for custom gcode type (s_CustomGcodeSpecificOptions)"];
"needs to be added to s_CustomGcodeSpecificOptions", key.c_str(), name.c_str())); if (std::find(vector.begin(), vector.end(), key) == vector.end())
vector.emplace_back(key);
}
// 3-rd check: "key" have to be present in CustomGcodeSpecificConfigDef for "key" placeholder; // 3-rd check: "key" have to be present in CustomGcodeSpecificConfigDef for "key" placeholder;
if (!custom_gcode_specific_config_def.has(key)) if (!custom_gcode_specific_config_def.has(key)) {
throw Slic3r::PlaceholderParserError(format("Definition of \"%s\" placeholder \n" auto& vector = m_placeholder_error_messages[name + " - option has no definition (CustomGcodeSpecificConfigDef)"];
"needs to be added to CustomGcodeSpecificConfigDef", key.c_str())); if (std::find(vector.begin(), vector.end(), key) == vector.end())
vector.emplace_back(key);
} }
} }
else }
throw Slic3r::PlaceholderParserError(format("\"%s\" custom G-code needs to be added to s_CustomGcodeSpecificOptions", name.c_str())); else {
auto& vector = m_placeholder_error_messages[name + " - gcode type not found in s_CustomGcodeSpecificOptions"];
if (vector.empty())
vector.emplace_back("");
}
} }
#endif #endif
@ -4294,6 +4317,33 @@ void GCode::apply_print_config(const PrintConfig &print_config)
m_writer.apply_print_config(print_config); m_writer.apply_print_config(print_config);
m_config.apply(print_config); m_config.apply(print_config);
m_scaled_resolution = scaled<double>(print_config.resolution.value); m_scaled_resolution = scaled<double>(print_config.resolution.value);
#if ORCA_CHECK_GCODE_PLACEHOLDERS
// If the gcode value is empty, set a value so that the check code within the parser is run
for (auto opt : std::initializer_list<ConfigOptionString*>{
&m_config.machine_start_gcode,
&m_config.machine_end_gcode,
&m_config.before_layer_change_gcode,
&m_config.layer_change_gcode,
&m_config.time_lapse_gcode,
&m_config.change_filament_gcode,
&m_config.change_extrusion_role_gcode,
&m_config.printing_by_object_gcode,
&m_config.machine_pause_gcode,
&m_config.template_custom_gcode,
}) {
if (opt->empty())
opt->set(new ConfigOptionString(";VALUE FOR TESTING"));
}
for (auto opt : std::initializer_list<ConfigOptionStrings*>{
&m_config.filament_start_gcode,
&m_config.filament_end_gcode
}) {
if (opt->empty())
for (int i = 0; i < opt->size(); ++i)
opt->set_at(new ConfigOptionString(";VALUE FOR TESTING"), i, 0);
}
#endif
} }
void GCode::append_full_config(const Print &print, std::string &str) void GCode::append_full_config(const Print &print, std::string &str)

View file

@ -518,6 +518,10 @@ private:
double m_last_mm3_per_mm; double m_last_mm3_per_mm;
#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING #endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
#if ORCA_CHECK_GCODE_PLACEHOLDERS
std::map<std::string, std::vector<std::string>> m_placeholder_error_messages;
#endif
Point m_last_pos; Point m_last_pos;
bool m_last_pos_defined; bool m_last_pos_defined;