diff options
author | FormerLurker <hochgebe@gmail.com> | 2021-03-04 03:48:01 +0300 |
---|---|---|
committer | FormerLurker <hochgebe@gmail.com> | 2021-03-04 03:48:01 +0300 |
commit | 3649ab7fe0ff3ad61769d7c311bc052bedf2f098 (patch) | |
tree | a5d3e7fce794f2f35416064f76b707a08dd7ab63 | |
parent | fe18f18b4c005a2c4e4b69a5866d0d065bde82aa (diff) |
Add extrusion rate variance percent parameter for cura Arachne.
-rw-r--r-- | ArcWelder/arc_welder.cpp | 169 | ||||
-rw-r--r-- | ArcWelder/arc_welder.h | 5 | ||||
-rw-r--r-- | ArcWelderConsole/ArcWelderConsole.cpp | 22 | ||||
-rw-r--r-- | ArcWelderTest/ArcWelderTest.cpp | 1 | ||||
-rw-r--r-- | GcodeProcessorLib/utilities.cpp | 9 | ||||
-rw-r--r-- | GcodeProcessorLib/utilities.h | 1 | ||||
-rw-r--r-- | PyArcWelder/py_arc_welder.h | 2 | ||||
-rw-r--r-- | PyArcWelder/py_arc_welder_extension.cpp | 17 | ||||
-rw-r--r-- | PyArcWelder/py_arc_welder_extension.h | 3 |
9 files changed, 157 insertions, 72 deletions
diff --git a/ArcWelder/arc_welder.cpp b/ArcWelder/arc_welder.cpp index c49f64d..a1f4ca7 100644 --- a/ArcWelder/arc_welder.cpp +++ b/ArcWelder/arc_welder.cpp @@ -49,6 +49,7 @@ arc_welder::arc_welder( bool allow_dynamic_precision, unsigned char default_xyz_precision, unsigned char default_e_precision, + double extrusion_rate_variance_percent, int buffer_size, progress_callback callback) : current_arc_( DEFAULT_MIN_SEGMENTS, @@ -83,6 +84,7 @@ arc_welder::arc_welder( gcode_position_args_ = get_args_(g90_g91_influences_extruder, buffer_size); allow_3d_arcs_ = allow_3d_arcs; allow_dynamic_precision_ = allow_dynamic_precision; + extrusion_rate_variance_percent_ = extrusion_rate_variance_percent; notification_period_seconds = 1; lines_processed_ = 0; gcodes_processed_ = 0; @@ -93,6 +95,7 @@ arc_welder::arc_welder( waiting_for_arc_ = false; previous_feedrate_ = -1; gcode_position_args_.set_num_extruders(8); + previous_extrusion_rate_ = 0; for (int index = 0; index < 8; index++) { gcode_position_args_.retraction_lengths[0] = .0001; @@ -399,6 +402,7 @@ int arc_welder::process_gcode(parsed_command cmd, bool is_end, bool is_reprocess bool is_previous_extruder_relative = p_pre_pos->is_extruder_relative; extruder extruder_current = p_cur_pos->get_current_extruder(); extruder previous_extruder = p_pre_pos->get_current_extruder(); + //std::cout << lines_processed_ << " - " << cmd.gcode << ", CurrentEAbsolute: " << cur_extruder.e <<", ExtrusionLength: " << cur_extruder.extrusion_length << ", Retraction Length: " << cur_extruder.retraction_length << ", IsExtruding: " << cur_extruder.is_extruding << ", IsRetracting: " << cur_extruder.is_retracting << ".\n"; int lines_written = 0; @@ -425,6 +429,22 @@ int arc_welder::process_gcode(parsed_command cmd, bool is_end, bool is_reprocess } } + // calculate the extrusion rate (mm/mm) and see how much it changes + double mm_extruded_per_mm_travel = 0; + double extrusion_rate_change_percent = 0; + if (movement_length_mm > 0) + { + mm_extruded_per_mm_travel = extruder_current.e_relative / movement_length_mm; + if (previous_extrusion_rate_ > 0) + { + extrusion_rate_change_percent = std::fabs(utilities::get_percent_change(previous_extrusion_rate_, mm_extruded_per_mm_travel)); + } + } + if (extrusion_rate_change_percent > extrusion_rate_variance_percent_) + { + std::cout << "Extrusion Rate Change Percent: " << extrusion_rate_change_percent << "\n"; + } + // We need to make sure the printer is using absolute xyz, is extruding, and the extruder axis mode is the same as that of the previous position // TODO: Handle relative XYZ axis. This is possible, but maybe not so important. bool is_g1_g2 = cmd.command == "G0" || cmd.command == "G1"; @@ -458,6 +478,7 @@ int arc_welder::process_gcode(parsed_command cmd, bool is_end, bool is_reprocess utilities::is_equal(p_cur_pos->x_firmware_offset, p_pre_pos->x_firmware_offset) && utilities::is_equal(p_cur_pos->y_firmware_offset, p_pre_pos->y_firmware_offset) && utilities::is_equal(p_cur_pos->z_firmware_offset, p_pre_pos->z_firmware_offset) && + (previous_extrusion_rate_ == 0 || utilities::less_than_or_equal(extrusion_rate_change_percent, extrusion_rate_variance_percent_)) && !p_cur_pos->is_relative && ( !waiting_for_arc_ || @@ -511,86 +532,95 @@ int arc_welder::process_gcode(parsed_command cmd, bool is_end, bool is_reprocess } } } - else if (debug_logging_enabled_ ){ - if (is_end) - { - p_logger_->log(logger_type_, DEBUG, "Procesing final shape, if one exists."); - } - else if (!cmd.is_empty) - { - if (!cmd.is_known_command) - { - p_logger_->log(logger_type_, DEBUG, "Command '" + cmd.command + "' is Unknown. Gcode:" + cmd.gcode); - } - else if (cmd.command != "G0" && cmd.command != "G1") - { - p_logger_->log(logger_type_, DEBUG, "Command '"+ cmd.command + "' is not G0/G1, skipping. Gcode:" + cmd.gcode); - } - else if (!allow_3d_arcs_ && !utilities::is_equal(p_cur_pos->z, p_pre_pos->z)) + else { + previous_extrusion_rate_ = 0; + if (debug_logging_enabled_) { + if (is_end) { - p_logger_->log(logger_type_, DEBUG, "Z axis position changed, cannot convert:" + cmd.gcode); + p_logger_->log(logger_type_, DEBUG, "Procesing final shape, if one exists."); } - else if (p_cur_pos->is_relative) + else if (!cmd.is_empty) { - p_logger_->log(logger_type_, DEBUG, "XYZ Axis is in relative mode, cannot convert:" + cmd.gcode); - } - else if ( - waiting_for_arc_ && !( - (previous_extruder.is_extruding && extruder_current.is_extruding) || - (previous_extruder.is_retracting && extruder_current.is_retracting) - ) - ) - { - std::string message = "Extruding or retracting state changed, cannot add point to current arc: " + cmd.gcode; - if (verbose_logging_enabled_) + if (!cmd.is_known_command) { - - message.append( - " - Verbose Info\n\tCurrent Position Info - Absolute E:" + utilities::to_string(extruder_current.e) + - ", Offset E:" + utilities::to_string(extruder_current.get_offset_e()) + - ", Mode:" + (p_cur_pos->is_extruder_relative_null ? "NULL" : p_cur_pos->is_extruder_relative ? "relative" : "absolute") + - ", Retraction: " + utilities::to_string(extruder_current.retraction_length) + - ", Extrusion: " + utilities::to_string(extruder_current.extrusion_length) + - ", Retracting: " + (extruder_current.is_retracting ? "True" : "False") + - ", Extruding: " + (extruder_current.is_extruding ? "True" : "False") - ); - message.append( - "\n\tPrevious Position Info - Absolute E:" + utilities::to_string(previous_extruder.e) + - ", Offset E:" + utilities::to_string(previous_extruder.get_offset_e()) + - ", Mode:" + (p_pre_pos->is_extruder_relative_null ? "NULL" : p_pre_pos->is_extruder_relative ? "relative" : "absolute") + - ", Retraction: " + utilities::to_string(previous_extruder.retraction_length) + - ", Extrusion: " + utilities::to_string(previous_extruder.extrusion_length) + - ", Retracting: " + (previous_extruder.is_retracting ? "True" : "False") + - ", Extruding: " + (previous_extruder.is_extruding ? "True" : "False") - ); - p_logger_->log(logger_type_, VERBOSE, message); + p_logger_->log(logger_type_, DEBUG, "Command '" + cmd.command + "' is Unknown. Gcode:" + cmd.gcode); + } + else if (cmd.command != "G0" && cmd.command != "G1") + { + p_logger_->log(logger_type_, DEBUG, "Command '" + cmd.command + "' is not G0/G1, skipping. Gcode:" + cmd.gcode); + } + else if (!allow_3d_arcs_ && !utilities::is_equal(p_cur_pos->z, p_pre_pos->z)) + { + p_logger_->log(logger_type_, DEBUG, "Z axis position changed, cannot convert:" + cmd.gcode); + } + else if (p_cur_pos->is_relative) + { + p_logger_->log(logger_type_, DEBUG, "XYZ Axis is in relative mode, cannot convert:" + cmd.gcode); + } + else if ( + waiting_for_arc_ && !( + (previous_extruder.is_extruding && extruder_current.is_extruding) || + (previous_extruder.is_retracting && extruder_current.is_retracting) + ) + ) + { + std::string message = "Extruding or retracting state changed, cannot add point to current arc: " + cmd.gcode; + if (verbose_logging_enabled_) + { + + message.append( + " - Verbose Info\n\tCurrent Position Info - Absolute E:" + utilities::to_string(extruder_current.e) + + ", Offset E:" + utilities::to_string(extruder_current.get_offset_e()) + + ", Mode:" + (p_cur_pos->is_extruder_relative_null ? "NULL" : p_cur_pos->is_extruder_relative ? "relative" : "absolute") + + ", Retraction: " + utilities::to_string(extruder_current.retraction_length) + + ", Extrusion: " + utilities::to_string(extruder_current.extrusion_length) + + ", Retracting: " + (extruder_current.is_retracting ? "True" : "False") + + ", Extruding: " + (extruder_current.is_extruding ? "True" : "False") + ); + message.append( + "\n\tPrevious Position Info - Absolute E:" + utilities::to_string(previous_extruder.e) + + ", Offset E:" + utilities::to_string(previous_extruder.get_offset_e()) + + ", Mode:" + (p_pre_pos->is_extruder_relative_null ? "NULL" : p_pre_pos->is_extruder_relative ? "relative" : "absolute") + + ", Retraction: " + utilities::to_string(previous_extruder.retraction_length) + + ", Extrusion: " + utilities::to_string(previous_extruder.extrusion_length) + + ", Retracting: " + (previous_extruder.is_retracting ? "True" : "False") + + ", Extruding: " + (previous_extruder.is_extruding ? "True" : "False") + ); + p_logger_->log(logger_type_, VERBOSE, message); + } + else + { + p_logger_->log(logger_type_, DEBUG, message); + } + + } + else if (p_cur_pos->is_extruder_relative != p_pre_pos->is_extruder_relative) + { + p_logger_->log(logger_type_, DEBUG, "Extruder axis mode changed, cannot add point to current arc: " + cmd.gcode); + } + else if (waiting_for_arc_ && p_pre_pos->f != p_cur_pos->f) + { + p_logger_->log(logger_type_, DEBUG, "Feedrate changed, cannot add point to current arc: " + cmd.gcode); + } + else if (waiting_for_arc_ && p_pre_pos->feature_type_tag != p_cur_pos->feature_type_tag) + { + p_logger_->log(logger_type_, DEBUG, "Feature type changed, cannot add point to current arc: " + cmd.gcode); + } + else if (previous_extrusion_rate_ != 0 && !utilities::is_equal(previous_extrusion_rate_, mm_extruded_per_mm_travel)) + { + p_logger_->log(logger_type_, DEBUG, "Previus extrusion rate changed: " + cmd.gcode); } else { - p_logger_->log(logger_type_, DEBUG, message); + // Todo: Add all the relevant values + p_logger_->log(logger_type_, DEBUG, "There was an unknown issue preventing the current point from being added to the arc: " + cmd.gcode); } - - } - else if (p_cur_pos->is_extruder_relative != p_pre_pos->is_extruder_relative) - { - p_logger_->log(logger_type_, DEBUG, "Extruder axis mode changed, cannot add point to current arc: " + cmd.gcode); - } - else if (waiting_for_arc_ && p_pre_pos->f != p_cur_pos->f) - { - p_logger_->log(logger_type_, DEBUG, "Feedrate changed, cannot add point to current arc: " + cmd.gcode); - } - else if (waiting_for_arc_ && p_pre_pos->feature_type_tag != p_cur_pos->feature_type_tag) - { - p_logger_->log(logger_type_, DEBUG, "Feature type changed, cannot add point to current arc: " + cmd.gcode); - } - else - { - // Todo: Add all the relevant values - p_logger_->log(logger_type_, DEBUG, "There was an unknown issue preventing the current point from being added to the arc: " + cmd.gcode); } } } + previous_extrusion_rate_ = mm_extruded_per_mm_travel; + if (!arc_added && !(cmd.is_empty && cmd.comment.length() == 0)) { if (current_arc_.get_num_segments() < current_arc_.get_min_segments()) { @@ -837,7 +867,8 @@ void arc_welder::add_arcwelder_comment_to_target() stream << "; allow_dynamic_precision=True\n"; } stream << "; default_xyz_precision=" << std::setprecision(0) << static_cast<int>(current_arc_.get_xyz_precision()) << "\n"; - stream << "; default_e_precision=" << std::setprecision(0) << static_cast<int>(current_arc_.get_e_precision()) << "\n\n"; + stream << "; default_e_precision=" << std::setprecision(0) << static_cast<int>(current_arc_.get_e_precision()) << "\n"; + stream << "; extrusion_rate_variance_percent=" << std::setprecision(3) << static_cast<int>(extrusion_rate_variance_percent_) << "%\n\n"; output_file_ << stream.str(); diff --git a/ArcWelder/arc_welder.h b/ArcWelder/arc_welder.h index 6d00ec4..2da8929 100644 --- a/ArcWelder/arc_welder.h +++ b/ArcWelder/arc_welder.h @@ -415,6 +415,8 @@ struct arc_welder_results { #define DEFAULT_GCODE_BUFFER_SIZE 1000 #define DEFAULT_G90_G91_INFLUENCES_EXTRUDER false #define DEFAULT_ALLOW_DYNAMIC_PRECISION false +#define DEFAULT_EXTRUSION_RATE_VARIANCE_PERCENT 1 +//#define DEFAULT_EXTRUSION_RATE_VARIANCE 0.0001 class arc_welder { public: @@ -432,6 +434,7 @@ public: bool allow_dynamic_precision = DEFAULT_ALLOW_DYNAMIC_PRECISION, unsigned char default_xyz_precision = DEFAULT_XYZ_PRECISION, unsigned char default_e_precision = DEFAULT_E_PRECISION, + double extrusion_rate_variance_percent = DEFAULT_EXTRUSION_RATE_VARIANCE_PERCENT, int buffer_size = DEFAULT_GCODE_BUFFER_SIZE, progress_callback callback = NULL); void set_logger_type(int logger_type); @@ -478,6 +481,8 @@ private: // We don't care about the printer settings, except for g91 influences extruder. gcode_position* p_source_position_; double previous_feedrate_; + double previous_extrusion_rate_; + double extrusion_rate_variance_percent_; gcode_parser parser_; bool verbose_output_; int logger_type_; diff --git a/ArcWelderConsole/ArcWelderConsole.cpp b/ArcWelderConsole/ArcWelderConsole.cpp index 0ebe847..691f155 100644 --- a/ArcWelderConsole/ArcWelderConsole.cpp +++ b/ArcWelderConsole/ArcWelderConsole.cpp @@ -50,6 +50,7 @@ int main(int argc, char* argv[]) bool allow_dynamic_precision = DEFAULT_ALLOW_DYNAMIC_PRECISION; unsigned char default_xyz_precision = DEFAULT_XYZ_PRECISION; unsigned char default_e_precision = DEFAULT_E_PRECISION; + double extrusion_rate_variance_percent = DEFAULT_EXTRUSION_RATE_VARIANCE_PERCENT; std::string log_level_string; std::string log_level_string_default = "INFO"; int log_level_value; @@ -140,6 +141,13 @@ int main(int argc, char* argv[]) arg_description_stream << "The default precision of E output gcode parameters. The precision may be larger than this value if allow-dynamic-precision is set to true. Default Value: " << DEFAULT_E_PRECISION; TCLAP::ValueArg<unsigned char> default_e_precision_arg("e", "default-e-precision", arg_description_stream.str(), false, DEFAULT_E_PRECISION, "unsigned char"); + // -v --extrusion-rate-variance + arg_description_stream.clear(); + arg_description_stream.str(""); + arg_description_stream << "The allowed variance in extrusion rate by percent. Default Value: " << DEFAULT_EXTRUSION_RATE_VARIANCE_PERCENT; + TCLAP::ValueArg<double> extrusion_rate_variance_percent_arg("v", "extrusion-rate-variance-percent", arg_description_stream.str(), false, DEFAULT_EXTRUSION_RATE_VARIANCE_PERCENT, "double"); + + // -g --hide-progress TCLAP::SwitchArg hide_progress_arg("p", "hide-progress", "If supplied, prevents progress updates from being displayed.", false); @@ -171,6 +179,7 @@ int main(int argc, char* argv[]) cmd.add(allow_dynamic_precision_arg); cmd.add(default_xyz_precision_arg); cmd.add(default_e_precision_arg); + cmd.add(extrusion_rate_variance_percent_arg); cmd.add(g90_arg); cmd.add(hide_progress_arg); cmd.add(log_level_arg); @@ -197,6 +206,7 @@ int main(int argc, char* argv[]) allow_dynamic_precision = allow_dynamic_precision_arg.getValue(); default_xyz_precision = default_xyz_precision_arg.getValue(); default_e_precision = default_e_precision_arg.getValue(); + extrusion_rate_variance_percent = extrusion_rate_variance_percent_arg.getValue(); hide_progress = hide_progress_arg.getValue(); log_level_string = log_level_arg.getValue(); @@ -275,6 +285,13 @@ int main(int argc, char* argv[]) default_e_precision = 6; } + if (extrusion_rate_variance_percent < 0) + { + // warning + std::cout << "warning: The provided extrusion_rate_variance_percent " << extrusion_rate_variance_percent << " is less than 0. Setting to the default." << std::endl; + extrusion_rate_variance_percent = DEFAULT_EXTRUSION_RATE_VARIANCE_PERCENT; + } + if (has_error) { return 1; @@ -353,6 +370,7 @@ int main(int argc, char* argv[]) log_messages << "\tAllow Dynamic Precision : " << (allow_dynamic_precision ? "True" : "False") << "\n"; log_messages << "\tDefault XYZ Precision : " << std::setprecision(0) << static_cast<int>(default_xyz_precision) << "\n"; log_messages << "\tDefault E Precision : " << std::setprecision(0) << static_cast<int>(default_e_precision) << "\n"; + log_messages << "\tExtrusion Rate Variance % : " << std::setprecision(3) << extrusion_rate_variance_percent << "%\n"; log_messages << "\tG90/G91 Influences Extruder : " << (g90_g91_influences_extruder ? "True" : "False") << "\n"; log_messages << "\tLog Level : " << log_level_string << "\n"; log_messages << "\tHide Progress Updates : " << (hide_progress ? "True" : "False"); @@ -364,9 +382,9 @@ int main(int argc, char* argv[]) target_file_path = temp_file_path; } if (!hide_progress) - p_arc_welder = new arc_welder(source_file_path, target_file_path, p_logger, resolution_mm, path_tolerance_percent, max_radius_mm, min_arc_segments, mm_per_arc_segment, g90_g91_influences_extruder, allow_3d_arcs, allow_dynamic_precision, default_xyz_precision, default_e_precision, DEFAULT_GCODE_BUFFER_SIZE, on_progress); + p_arc_welder = new arc_welder(source_file_path, target_file_path, p_logger, resolution_mm, path_tolerance_percent, max_radius_mm, min_arc_segments, mm_per_arc_segment, g90_g91_influences_extruder, allow_3d_arcs, allow_dynamic_precision, default_xyz_precision, default_e_precision, extrusion_rate_variance_percent, DEFAULT_GCODE_BUFFER_SIZE, on_progress); else - p_arc_welder = new arc_welder(source_file_path, target_file_path, p_logger, resolution_mm, path_tolerance_percent, max_radius_mm, min_arc_segments, mm_per_arc_segment, g90_g91_influences_extruder, allow_3d_arcs, allow_dynamic_precision, default_xyz_precision, default_e_precision, DEFAULT_GCODE_BUFFER_SIZE, suppress_progress); + p_arc_welder = new arc_welder(source_file_path, target_file_path, p_logger, resolution_mm, path_tolerance_percent, max_radius_mm, min_arc_segments, mm_per_arc_segment, g90_g91_influences_extruder, allow_3d_arcs, allow_dynamic_precision, default_xyz_precision, default_e_precision, extrusion_rate_variance_percent, DEFAULT_GCODE_BUFFER_SIZE, suppress_progress); arc_welder_results results = p_arc_welder->process(); if (results.success) diff --git a/ArcWelderTest/ArcWelderTest.cpp b/ArcWelderTest/ArcWelderTest.cpp index 9add004..3cb916c 100644 --- a/ArcWelderTest/ArcWelderTest.cpp +++ b/ArcWelderTest/ArcWelderTest.cpp @@ -305,6 +305,7 @@ static void TestAntiStutter(std::string filePath) DEFAULT_ALLOW_DYNAMIC_PRECISION, DEFAULT_XYZ_PRECISION, DEFAULT_E_PRECISION, + DEFAULT_EXTRUSION_RATE_VARIANCE_PERCENT, DEFAULT_GCODE_BUFFER_SIZE, on_progress); //FIRMWARE_COMPENSATION_TEST_1 diff --git a/GcodeProcessorLib/utilities.cpp b/GcodeProcessorLib/utilities.cpp index dbe23fb..041f91f 100644 --- a/GcodeProcessorLib/utilities.cpp +++ b/GcodeProcessorLib/utilities.cpp @@ -171,6 +171,15 @@ double utilities::get_percent_change(int v1, int v2) return 0; } +double utilities::get_percent_change(double v1, double v2) +{ + if (v1 != 0) + { + return ((v2 - v1) / v1) * 100.0; + } + return 0; +} + std::string utilities::get_percent_change_string(int v1, int v2, int precision) { std::stringstream format_stream; diff --git a/GcodeProcessorLib/utilities.h b/GcodeProcessorLib/utilities.h index 401bed4..b41d6f6 100644 --- a/GcodeProcessorLib/utilities.h +++ b/GcodeProcessorLib/utilities.h @@ -49,6 +49,7 @@ public: static std::istream& safe_get_line(std::istream& is, std::string& t); static std::string center(std::string input, int width); static double get_percent_change(int v1, int v2); + static double get_percent_change(double v1, double v2); static std::string get_percent_change_string(int v1, int v2, int precision); static int get_num_digits(int x); diff --git a/PyArcWelder/py_arc_welder.h b/PyArcWelder/py_arc_welder.h index ed4e8cc..6813c34 100644 --- a/PyArcWelder/py_arc_welder.h +++ b/PyArcWelder/py_arc_welder.h @@ -49,6 +49,7 @@ public: bool allow_dynamic_precision, unsigned char default_xyz_precision, unsigned char default_e_precision, + double extrusion_rate_variance_percent, int buffer_size, PyObject* py_progress_callback ): arc_welder( @@ -65,6 +66,7 @@ public: allow_dynamic_precision, default_xyz_precision, default_e_precision, + extrusion_rate_variance_percent, buffer_size ){ guid_ = guid; diff --git a/PyArcWelder/py_arc_welder_extension.cpp b/PyArcWelder/py_arc_welder_extension.cpp index 1e0728b..71c3855 100644 --- a/PyArcWelder/py_arc_welder_extension.cpp +++ b/PyArcWelder/py_arc_welder_extension.cpp @@ -210,6 +210,7 @@ extern "C" args.allow_dynamic_precision, args.default_xyz_precision, args.default_e_precision, + args.extrusion_rate_variance_percent, DEFAULT_GCODE_BUFFER_SIZE, py_progress_callback ); @@ -342,11 +343,25 @@ static bool ParseArgs(PyObject* py_args, py_gcode_arc_args& args, PyObject** py_ args.default_e_precision = 6; } + // Extract the extrusion_rate_variance + PyObject* py_extrusion_rate_variance_percent = PyDict_GetItemString(py_args, "extrusion_rate_variance_percent"); + if (py_extrusion_rate_variance_percent == NULL) + { + std::string message = "ParseArgs - Unable to retrieve the extrusion_rate_variance_percent parameter from the args."; + p_py_logger->log_exception(GCODE_CONVERSION, message); + return false; + } + args.extrusion_rate_variance_percent = gcode_arc_converter::PyFloatOrInt_AsDouble(py_extrusion_rate_variance_percent); + if (args.extrusion_rate_variance_percent < 0) + { + args.extrusion_rate_variance_percent = DEFAULT_EXTRUSION_RATE_VARIANCE_PERCENT; // Set to the default if no resolution is provided, or if it is less than 0. + } + // Extract the path tolerance_percent PyObject* py_path_tolerance_percent = PyDict_GetItemString(py_args, "path_tolerance_percent"); if (py_path_tolerance_percent == NULL) { - std::string message = "ParseArgs - Unable to retrieve the py_path_tolerance_percent parameter from the args."; + std::string message = "ParseArgs - Unable to retrieve the path_tolerance_percent parameter from the args."; p_py_logger->log_exception(GCODE_CONVERSION, message); return false; } diff --git a/PyArcWelder/py_arc_welder_extension.h b/PyArcWelder/py_arc_welder_extension.h index 2c2ecec..9b979fe 100644 --- a/PyArcWelder/py_arc_welder_extension.h +++ b/PyArcWelder/py_arc_welder_extension.h @@ -69,6 +69,7 @@ struct py_gcode_arc_args { bool allow_dynamic_precision_, unsigned char default_xyz_precision_, unsigned char default_e_precision_, + double extrusion_rate_variance_percent_, int log_level_ ) { guid = guid_; @@ -83,6 +84,7 @@ struct py_gcode_arc_args { allow_dynamic_precision = allow_dynamic_precision_; default_xyz_precision = default_xyz_precision_; default_e_precision = default_e_precision_; + extrusion_rate_variance_percent = extrusion_rate_variance_percent_; g90_g91_influences_extruder = g90_g91_influences_extruder_; log_level = log_level_; } @@ -95,6 +97,7 @@ struct py_gcode_arc_args { bool allow_dynamic_precision; unsigned char default_xyz_precision; unsigned char default_e_precision; + double extrusion_rate_variance_percent; bool g90_g91_influences_extruder; double max_radius_mm; int min_arc_segments; |