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-07-06 02:57:33 +0300
committerFormerLurker <hochgebe@gmail.com>2021-07-06 02:57:33 +0300
commit9d3361e145c806a2ea0d3c7f1f6fc7252e4d0ef1 (patch)
tree52de3bf32785619982801e542c4121908916d145 /ArcWelderConsole
parentb2e44aa85c9da175c6e78fd909c9f92531f5f393 (diff)
Add alpha gcode length restrictions. Enhance output statistics. Create arc_welder_args. Add new progress type args to command line processor.
Diffstat (limited to 'ArcWelderConsole')
-rw-r--r--ArcWelderConsole/ArcWelderConsole.cpp258
-rw-r--r--ArcWelderConsole/ArcWelderConsole.h6
2 files changed, 125 insertions, 139 deletions
diff --git a/ArcWelderConsole/ArcWelderConsole.cpp b/ArcWelderConsole/ArcWelderConsole.cpp
index 16a6923..e7a1ea9 100644
--- a/ArcWelderConsole/ArcWelderConsole.cpp
+++ b/ArcWelderConsole/ArcWelderConsole.cpp
@@ -34,27 +34,19 @@
#include <tclap/CmdLine.h>
#define DEFAULT_ARG_DOUBLE_PRECISION 4
+#define PROGRESS_TYPE_NONE "NONE"
+#define PROGRESS_TYPE_SIMPLE "SIMPLE"
+#define PROGRESS_TYPE_FULL "FULL"
int main(int argc, char* argv[])
{
- std::string source_file_path;
- std::string target_file_path;
- double resolution_mm;
- double max_radius_mm;
- int min_arc_segments;
- double mm_per_arc_segment;
- double path_tolerance_percent;
- bool g90_g91_influences_extruder;
- bool hide_progress;
- bool overwrite_source_file = false;
- bool allow_3d_arcs = DEFAULT_ALLOW_3D_ARCS;
- bool allow_travel_arcs = DEFAULT_ALLOW_TRAVEL_ARCS;
- 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;
+
+ arc_welder_args args;
std::string log_level_string;
std::string log_level_string_default = "INFO";
+ std::string progress_type;
+ std::string progress_type_default_string = PROGRESS_TYPE_SIMPLE;
int log_level_value;
+ bool hide_progress = false;
// Add info about the application
std::string info = "Arc Welder: Anti-Stutter - Reduces the number of gcodes per second sent to a 3D printer that supports arc commands (G2 G3).";
@@ -154,9 +146,24 @@ int main(int argc, char* argv[])
arg_description_stream << "(experimental) - 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");
+ // -l --max-gcode-length
+ arg_description_stream.clear();
+ arg_description_stream.str("");
+ arg_description_stream << "The maximum length allowed for a generated G2/G3 command, not including any comments. 0 = no limit. Default Value: " << DEFAULT_MAX_GCODE_LENGTH;
+ TCLAP::ValueArg<int> max_gcode_length_arg("l", "max-gcode-length", arg_description_stream.str(), false, DEFAULT_MAX_GCODE_LENGTH, "int");
- // -g --hide-progress
- TCLAP::SwitchArg hide_progress_arg("p", "hide-progress", "If supplied, prevents progress updates from being displayed.", false);
+ // -p --progress-type
+ // -l --log-level
+ std::vector<std::string> progress_type_vector;
+ std::string progress_type_default_string = PROGRESS_TYPE_SIMPLE;
+ progress_type_vector.push_back(PROGRESS_TYPE_NONE);
+ progress_type_vector.push_back(PROGRESS_TYPE_SIMPLE);
+ progress_type_vector.push_back(PROGRESS_TYPE_FULL);
+ TCLAP::ValuesConstraint<std::string> progress_type_constraint(progress_type_vector);
+ arg_description_stream.clear();
+ arg_description_stream.str("");
+ arg_description_stream << "Sets the progress type display. Default Value " << progress_type_default_string;
+ TCLAP::ValueArg<std::string> progress_type_arg("p", "progress-type", arg_description_stream.str(), false, progress_type_default_string, &progress_type_constraint);
// -l --log-level
std::vector<std::string> log_levels_vector;
@@ -188,117 +195,125 @@ int main(int argc, char* argv[])
cmd.add(default_xyz_precision_arg);
cmd.add(default_e_precision_arg);
cmd.add(extrusion_rate_variance_percent_arg);
+ cmd.add(max_gcode_length_arg);
cmd.add(g90_arg);
- cmd.add(hide_progress_arg);
+ cmd.add(progress_type_arg);
cmd.add(log_level_arg);
// Parse the argv array.
cmd.parse(argc, argv);
// Get the value parsed by each arg.
- source_file_path = source_arg.getValue();
- target_file_path = target_arg.getValue();
+ args.source_path = source_arg.getValue();
+ args.target_path = target_arg.getValue();
- if (target_file_path.size() == 0)
+ if (args.target_path.size() == 0)
{
- target_file_path = source_file_path;
+ args.target_path = args.source_path;
}
- resolution_mm = resolution_arg.getValue();
- max_radius_mm = max_radius_arg.getValue();
- min_arc_segments = min_arc_segments_arg.getValue();
- mm_per_arc_segment = mm_per_arc_segment_arg.getValue();
- path_tolerance_percent = path_tolerance_percent_arg.getValue();
- allow_3d_arcs = allow_3d_arcs_arg.getValue();
- allow_travel_arcs = allow_travel_arcs_arg.getValue();
- g90_g91_influences_extruder = g90_arg.getValue();
- 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();
+ args.resolution_mm = resolution_arg.getValue();
+ args.max_radius_mm = max_radius_arg.getValue();
+ args.min_arc_segments = min_arc_segments_arg.getValue();
+ args.mm_per_arc_segment = mm_per_arc_segment_arg.getValue();
+ args.path_tolerance_percent = path_tolerance_percent_arg.getValue();
+ args.allow_3d_arcs = allow_3d_arcs_arg.getValue();
+ args.allow_travel_arcs = allow_travel_arcs_arg.getValue();
+ args.g90_g91_influences_extruder = g90_arg.getValue();
+ args.allow_dynamic_precision = allow_dynamic_precision_arg.getValue();
+ args.default_xyz_precision = default_xyz_precision_arg.getValue();
+ args.default_e_precision = default_e_precision_arg.getValue();
+ args.extrusion_rate_variance_percent = extrusion_rate_variance_percent_arg.getValue();
+ args.max_gcode_length = max_gcode_length_arg.getValue();
+ progress_type = progress_type_arg.getValue();
log_level_string = log_level_arg.getValue();
log_level_value = -1;
// Check the entered values
bool has_error = false;
- if (resolution_mm <= 0)
+ if (args.resolution_mm <= 0)
{
- std::cerr << "error: The provided resolution of " << resolution_mm << " is negative, which is not allowed." <<std::endl;
+ std::cerr << "error: The provided resolution of " << args.resolution_mm << " is negative, which is not allowed." <<std::endl;
has_error = true;
}
- if (path_tolerance_percent <= 0)
+ if (args.path_tolerance_percent <= 0)
{
- std::cerr << "error: The provided path tolerance percentage of " << path_tolerance_percent << " is negative, which is not allowed." << std::endl;
+ std::cerr << "error: The provided path tolerance percentage of " << args.path_tolerance_percent << " is negative, which is not allowed." << std::endl;
has_error = true;
}
- if (max_radius_mm > 1000000)
+ if (args.max_radius_mm > 1000000)
{
// warning
- std::cout << "warning: The provided path max radius of " << max_radius_mm << "mm is greater than 1000000 (1km), which is not recommended." << std::endl;
+ std::cout << "warning: The provided path max radius of " << args.max_radius_mm << "mm is greater than 1000000 (1km), which is not recommended." << std::endl;
}
- if (min_arc_segments < 0)
+ if (args.min_arc_segments < 0)
{
// warning
- std::cout << "warning: The provided min_arc_segments " << min_arc_segments << " is less than zero. Setting to 0." << std::endl;
- min_arc_segments = 0;
+ std::cout << "warning: The provided min_arc_segments " << args.min_arc_segments << " is less than zero. Setting to 0." << std::endl;
+ args.min_arc_segments = 0;
}
- if (mm_per_arc_segment < 0)
+ if (args.mm_per_arc_segment < 0)
{
// warning
- std::cout << "warning: The provided mm_per_arc_segment " << mm_per_arc_segment << "mm is less than zero. Setting to 0." << std::endl;
- mm_per_arc_segment = 0;
+ std::cout << "warning: The provided mm_per_arc_segment " << args.mm_per_arc_segment << "mm is less than zero. Setting to 0." << std::endl;
+ args.mm_per_arc_segment = 0;
}
- if (path_tolerance_percent > 0.05)
+ if (args.path_tolerance_percent > 0.05)
{
// warning
- std::cout << "warning: The provided path tolerance percent of " << path_tolerance_percent << " is greater than 0.05 (5%), which is not recommended." << std::endl;
+ std::cout << "warning: The provided path tolerance percent of " << args.path_tolerance_percent << " is greater than 0.05 (5%), which is not recommended." << std::endl;
}
- else if (path_tolerance_percent < 0.0001 && path_tolerance_percent > 0)
+ else if (args.path_tolerance_percent < 0.0001 && args.path_tolerance_percent > 0)
{
// warning
- std::cout << "warning: The provided path tolerance percent of " << path_tolerance_percent << " is less than greater than 0.001 (0.1%), which is not recommended." << std::endl;
+ std::cout << "warning: The provided path tolerance percent of " << args.path_tolerance_percent << " is less than greater than 0.001 (0.1%), which is not recommended." << std::endl;
}
- if (default_xyz_precision < 3)
+ if (args.default_xyz_precision < 3)
{
// warning
- std::cout << "warning: The provided default_xyz_precision " << default_xyz_precision << "mm is less than 3, with will cause issues printing arcs. A value of 3 will be used instead." << std::endl;
- default_xyz_precision = 3;
+ std::cout << "warning: The provided default_xyz_precision " << args.default_xyz_precision << "mm is less than 3, with will cause issues printing arcs. A value of 3 will be used instead." << std::endl;
+ args.default_xyz_precision = 3;
}
- if (default_e_precision < DEFAULT_E_PRECISION)
+ if (args.default_e_precision < DEFAULT_E_PRECISION)
{
// warning
- std::cout << "warning: The provided default_e_precision " << default_e_precision << "mm is less than 3, with will cause extrusion issues. A value of 3 will be used instead." << std::endl;
- default_e_precision = 3;
+ std::cout << "warning: The provided default_e_precision " << args.default_e_precision << "mm is less than 3, with will cause extrusion issues. A value of 3 will be used instead." << std::endl;
+ args.default_e_precision = 3;
}
- if (default_xyz_precision > 6)
+ if (args.default_xyz_precision > 6)
{
// warning
- std::cout << "warning: The provided default_xyz_precision " << default_xyz_precision << "mm is greater than 6, which may cause gcode checksum errors while printing depending on your firmeware, so a value of 6 will be used instead." << std::endl;
- default_xyz_precision = 6;
+ std::cout << "warning: The provided default_xyz_precision " << args.default_xyz_precision << "mm is greater than 6, which may cause gcode checksum errors while printing depending on your firmeware, so a value of 6 will be used instead." << std::endl;
+ args.default_xyz_precision = 6;
}
- if (default_e_precision > 6)
+ if (args.default_e_precision > 6)
{
// warning
- std::cout << "warning: The provided default_e_precision " << default_e_precision << "mm is greater than 6, which may cause gcode checksum errors while printing depending on your firmeware, so value of 6 will be used instead." << std::endl;
- default_e_precision = 6;
+ std::cout << "warning: The provided default_e_precision " << args.default_e_precision << "mm is greater than 6, which may cause gcode checksum errors while printing depending on your firmeware, so value of 6 will be used instead." << std::endl;
+ args.default_e_precision = 6;
}
- if (extrusion_rate_variance_percent < 0)
+ if (args.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;
+ std::cout << "warning: The provided extrusion_rate_variance_percent " << args.extrusion_rate_variance_percent << " is less than 0. Setting to the default." << std::endl;
+ args.extrusion_rate_variance_percent = DEFAULT_EXTRUSION_RATE_VARIANCE_PERCENT;
+ }
+
+ if (args.max_gcode_length < 0)
+ {
+ // warning
+ std::cout << "warning: The provided max_gcode_length " << args.max_gcode_length << " is less than 0. Setting to the default." << std::endl;
+ args.max_gcode_length = DEFAULT_MAX_GCODE_LENGTH;
}
if (has_error)
@@ -331,95 +346,56 @@ int main(int argc, char* argv[])
// Ensure the log level name is valid
std::vector<std::string> log_names;
- log_names.push_back("arc_welder.gcode_conversion");
+ log_names.push_back(ARC_WELDER_LOGGER_NAME);
std::vector<int> log_levels;
log_levels.push_back(log_levels::DEBUG);
logger* p_logger = new logger(log_names, log_levels);
p_logger->set_log_level_by_value(log_level_value);
-
- std::stringstream log_messages;
- std::string temp_file_path = "";
- log_messages << std::fixed << std::setprecision(DEFAULT_ARG_DOUBLE_PRECISION);
- if (source_file_path == target_file_path)
+ args.log = p_logger;
+
+ arc_welder* p_arc_welder = NULL;
+
+ if (progress_type == PROGRESS_TYPE_NONE)
{
- overwrite_source_file = true;
- if (!utilities::get_temp_file_path_for_file(source_file_path, temp_file_path))
- {
- log_messages << "The source and target path are the same, but a temporary file path could not be created. Is the path empty?";
- p_logger->log(0, INFO, log_messages.str());
- log_messages.clear();
- log_messages.str("");
- }
-
- // create a uuid with a tmp extension for the temporary file
- log_messages << "Source and target path are the same. The source file will be overwritten. Temporary file path: " << temp_file_path;
- p_logger->log(0, INFO, log_messages.str());
- log_messages.clear();
- log_messages.str("");
- target_file_path = temp_file_path;
+ p_logger->log(0, INFO, "Suppressing progress messages.");
+ args.callback = on_progress_suppress;
}
- log_messages << "Processing Gcode\n";
- log_messages << "\tSource File Path : " << source_file_path << "\n";
- if (overwrite_source_file)
+ else if (progress_type == PROGRESS_TYPE_FULL)
{
- log_messages << "\tTarget File Path (overwrite) : " << target_file_path << "\n";
- log_messages << "\tTemporary File Path : " << temp_file_path << "\n";
+ p_logger->log(0, INFO, "Displaying full progress messages.");
+ args.callback = on_progress_full;
}
- else
- {
- log_messages << "\tTarget File File : " << target_file_path << "\n";
+ else {
+ args.callback = on_progress_simple;
}
-
- log_messages << "\tResolution : " << resolution_mm << "mm (+-" << std::setprecision(5) << resolution_mm/2.0 << "mm)\n";
- log_messages << "\tPath Tolerance : " << std::setprecision(3) << path_tolerance_percent*100.0 << "%\n";
- log_messages << "\tMaximum Arc Radius : " << std::setprecision(0) << max_radius_mm << "mm\n";
- log_messages << "\tMin Arc Segments : " << std::setprecision(0) << min_arc_segments << "\n";
- log_messages << "\tMM Per Arc Segment : " << std::setprecision(3) << mm_per_arc_segment << "\n";
- log_messages << "\tAllow 3D Arcs : " << (allow_3d_arcs ? "True" : "False") << "\n";
- log_messages << "\tAllow Travel Arcs : " << (allow_travel_arcs ? "True" : "False") << "\n";
- 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*100.0 << "%\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");
+ // Log the arguments
+ std::stringstream log_messages;
+ log_messages << "Processing GCode.";
+ p_logger->log(0, INFO, log_messages.str());
+ log_messages.clear();
+ log_messages.str("");
+ log_messages << args.str();
p_logger->log(0, INFO, log_messages.str());
- arc_welder* p_arc_welder = NULL;
-
- if (overwrite_source_file)
- {
- 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_travel_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_travel_arcs, allow_dynamic_precision, default_xyz_precision, default_e_precision, extrusion_rate_variance_percent, DEFAULT_GCODE_BUFFER_SIZE, suppress_progress);
+ p_arc_welder = new arc_welder(args);
+
arc_welder_results results = p_arc_welder->process();
if (results.success)
{
- log_messages.clear();
- log_messages.str("");
- log_messages << "Target file at '" << target_file_path << "' created.";
-
- if (overwrite_source_file)
+ if (args.allow_travel_arcs)
{
log_messages.clear();
log_messages.str("");
- log_messages << "Deleting the original source file at '" << source_file_path << "'.";
+ log_messages << "Target File Travel Statistics:" << std::endl << results.progress.travel_statistics.str();
p_logger->log(0, INFO, log_messages.str());
- log_messages.clear();
- log_messages.str("");
- std::remove(source_file_path.c_str());
- log_messages << "Renaming temporary file at '" << target_file_path << "' to '" << source_file_path <<"'.";
- p_logger->log(0, INFO, log_messages.str());
- std::rename(target_file_path.c_str(), source_file_path.c_str());
}
+
log_messages.clear();
log_messages.str("");
- log_messages << std::endl << results.progress.segment_statistics.str();
+ log_messages << "Target File Extrusion Statistics:" << std::endl << results.progress.segment_statistics.str();
p_logger->log(0, INFO, log_messages.str() );
+
+
log_messages.clear();
log_messages.str("");
@@ -438,13 +414,21 @@ int main(int argc, char* argv[])
return 0;
}
-bool on_progress(arc_welder_progress progress, logger* p_logger, int logger_type)
+bool on_progress_full(arc_welder_progress progress, logger* p_logger, int logger_type)
{
std::cout << "Progress: "<< progress.str() << std::endl;
std::cout.flush();
return true;
}
-bool suppress_progress(arc_welder_progress progress, logger* p_logger, int logger_type)
+
+bool on_progress_simple(arc_welder_progress progress, logger* p_logger, int logger_type)
+{
+ std::cout << "Progress: " << progress.simple_progress_str() << std::endl;
+ std::cout.flush();
+ return true;
+}
+
+bool on_progress_suppress(arc_welder_progress progress, logger* p_logger, int logger_type)
{
return true;
}
diff --git a/ArcWelderConsole/ArcWelderConsole.h b/ArcWelderConsole/ArcWelderConsole.h
index 64425c9..1e4762f 100644
--- a/ArcWelderConsole/ArcWelderConsole.h
+++ b/ArcWelderConsole/ArcWelderConsole.h
@@ -25,6 +25,8 @@
#pragma once
#include "arc_welder.h"
#include "version.h"
-static bool on_progress(arc_welder_progress progress, logger* p_logger, int logger_type);
-static bool suppress_progress(arc_welder_progress progress, logger* p_logger, int logger_type);
+static bool on_progress_full(arc_welder_progress progress, logger* p_logger, int logger_type);
+static bool on_progress_simple(arc_welder_progress progress, logger* p_logger, int logger_type);
+static bool on_progress_suppress(arc_welder_progress progress, logger* p_logger, int logger_type);
+