Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FormerLurker/ArcWelderLib.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFormerLurker <hochgebe@gmail.com>2021-03-04 03:48:01 +0300
committerFormerLurker <hochgebe@gmail.com>2021-03-04 03:48:01 +0300
commit3649ab7fe0ff3ad61769d7c311bc052bedf2f098 (patch)
treea5d3e7fce794f2f35416064f76b707a08dd7ab63
parentfe18f18b4c005a2c4e4b69a5866d0d065bde82aa (diff)
Add extrusion rate variance percent parameter for cura Arachne.
-rw-r--r--ArcWelder/arc_welder.cpp169
-rw-r--r--ArcWelder/arc_welder.h5
-rw-r--r--ArcWelderConsole/ArcWelderConsole.cpp22
-rw-r--r--ArcWelderTest/ArcWelderTest.cpp1
-rw-r--r--GcodeProcessorLib/utilities.cpp9
-rw-r--r--GcodeProcessorLib/utilities.h1
-rw-r--r--PyArcWelder/py_arc_welder.h2
-rw-r--r--PyArcWelder/py_arc_welder_extension.cpp17
-rw-r--r--PyArcWelder/py_arc_welder_extension.h3
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;