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>2020-11-28 03:20:29 +0300
committerFormerLurker <hochgebe@gmail.com>2020-11-28 03:20:29 +0300
commit7da85eb0a6d659885b4a16fce7a0ba15ecbe0e39 (patch)
tree113b82b09851a545fd5666deab1b790cc52635d0
parent359b6e92bf252a9ab6485179aee7f3148108aa86 (diff)
Fix Python unicode logging issues. Add sin approximation to inverse processor. Fix log levels and progress output. Add firmware compensation statistics.
-rw-r--r--ArcWelder/arc_welder.cpp16
-rw-r--r--ArcWelder/arc_welder.h3
-rw-r--r--ArcWelder/segmented_arc.cpp41
-rw-r--r--ArcWelder/segmented_arc.h2
-rw-r--r--ArcWelder/segmented_shape.cpp35
-rw-r--r--ArcWelder/segmented_shape.h13
-rw-r--r--ArcWelderInverseProcessor/inverse_processor.cpp31
-rw-r--r--ArcWelderInverseProcessor/inverse_processor.h3
-rw-r--r--ArcWelderTest/ArcWelderTest.cpp9
-rw-r--r--ArcWelderTest/ArcWelderTest.h5
-rw-r--r--GcodeProcessorLib/logger.cpp3
-rw-r--r--PyArcWelder/py_arc_welder.cpp27
-rw-r--r--PyArcWelder/py_arc_welder_extension.cpp15
-rw-r--r--PyArcWelder/py_logger.cpp4
-rw-r--r--PyArcWelder/python_helpers.cpp9
-rw-r--r--PyArcWelder/python_helpers.h1
16 files changed, 125 insertions, 92 deletions
diff --git a/ArcWelder/arc_welder.cpp b/ArcWelder/arc_welder.cpp
index 981eeec..9fe02d0 100644
--- a/ArcWelder/arc_welder.cpp
+++ b/ArcWelder/arc_welder.cpp
@@ -205,7 +205,7 @@ arc_welder_results results;
bool continue_processing = true;
p_logger_->log(logger_type_, DEBUG, "Configuring progress updates.");
- int read_lines_before_clock_check = 5000;
+ int read_lines_before_clock_check = 1000;
double next_update_time = get_next_update_time();
const clock_t start_clock = clock();
p_logger_->log(logger_type_, DEBUG, "Getting source file size.");
@@ -247,6 +247,8 @@ arc_welder_results results;
parsed_command cmd;
// Communicate every second
+ p_logger_->log(logger_type_, DEBUG, "Sending initial progress update.");
+ continue_processing = on_progress_(get_progress_(static_cast<long>(gcodeFile.tellg()), static_cast<double>(start_clock)));
p_logger_->log(logger_type_, DEBUG, "Processing source file.");
while (std::getline(gcodeFile, line) && continue_processing)
{
@@ -278,7 +280,7 @@ arc_welder_results results;
process_gcode(cmd, false, false);
// Only continue to process if we've found a command and either a progress_callback_ is supplied, or debug loggin is enabled.
- if (has_gcode && (progress_callback_ != NULL || info_logging_enabled_))
+ if (has_gcode)
{
if ((lines_processed_ % read_lines_before_clock_check) == 0 && next_update_time < clock())
{
@@ -302,12 +304,12 @@ arc_welder_results results;
p_logger_->log(logger_type_, DEBUG, "Fetching the final progress struct.");
arc_welder_progress final_progress = get_progress_(static_cast<long>(file_size_), static_cast<double>(start_clock));
- if (progress_callback_ != NULL || info_logging_enabled_)
+ if (debug_logging_enabled_)
{
- // Sending final progress update message
- p_logger_->log(logger_type_, VERBOSE, "Sending final progress update message.");
- on_progress_(arc_welder_progress(final_progress));
+ p_logger_->log(logger_type_, DEBUG, "Sending final progress update message.");
}
+ on_progress_(arc_welder_progress(final_progress));
+
p_logger_->log(logger_type_, DEBUG, "Processing complete, closing source and target file.");
output_file_.close();
gcodeFile.close();
@@ -355,7 +357,7 @@ arc_welder_progress arc_welder::get_progress_(long source_file_position, double
progress.compression_ratio = (static_cast<float>(source_file_position) / static_cast<float>(progress.target_file_size));
progress.compression_percent = (1.0 - (static_cast<float>(progress.target_file_size) / static_cast<float>(source_file_position))) * 100.0f;
}
-
+ progress.num_firmware_compensations = current_arc_.get_num_firmware_compensations();
progress.segment_statistics = segment_statistics_;
return progress;
diff --git a/ArcWelder/arc_welder.h b/ArcWelder/arc_welder.h
index 22cf4b6..0e6bb81 100644
--- a/ArcWelder/arc_welder.h
+++ b/ArcWelder/arc_welder.h
@@ -352,6 +352,7 @@ struct arc_welder_progress {
lines_processed = 0;
points_compressed = 0;
arcs_created = 0;
+ num_firmware_compensations = 0;
source_file_size = 0;
source_file_position = 0;
target_file_size = 0;
@@ -365,6 +366,7 @@ struct arc_welder_progress {
int lines_processed;
int points_compressed;
int arcs_created;
+ int num_firmware_compensations;
double compression_ratio;
double compression_percent;
long source_file_position;
@@ -381,6 +383,7 @@ struct arc_welder_progress {
stream << ", current_file_line: " << lines_processed;
stream << ", points_compressed: " << points_compressed;
stream << ", arcs_created: " << arcs_created;
+ stream << ", num_firmware_compensations: " << num_firmware_compensations;
stream << ", compression_ratio: " << compression_ratio;
stream << ", size_reduction: " << compression_percent << "% ";
return stream.str();
diff --git a/ArcWelder/segmented_arc.cpp b/ArcWelder/segmented_arc.cpp
index bd4b964..9f02049 100644
--- a/ArcWelder/segmented_arc.cpp
+++ b/ArcWelder/segmented_arc.cpp
@@ -36,6 +36,7 @@ segmented_arc::segmented_arc() : segmented_shape(DEFAULT_MIN_SEGMENTS, DEFAULT_M
max_radius_mm_ = DEFAULT_MAX_RADIUS_MM;
min_arc_segments_ = DEFAULT_MIN_ARC_SEGMENTS,
allow_3d_arcs_ = DEFAULT_allow_3d_arcs;
+ num_firmware_compensations_ = 0;
}
segmented_arc::segmented_arc(
@@ -64,6 +65,7 @@ segmented_arc::segmented_arc(
min_arc_segments_ = 0;
}
allow_3d_arcs_ = allow_3d_arcs;
+ num_firmware_compensations_ = 0;
}
segmented_arc::~segmented_arc()
@@ -98,6 +100,11 @@ int segmented_arc::get_min_arc_segments() const
return min_arc_segments_;
}
+int segmented_arc::get_num_firmware_compensations() const
+{
+ return num_firmware_compensations_;
+}
+
double segmented_arc::get_mm_per_arc_segment() const
{
return mm_per_arc_segment_;
@@ -149,15 +156,6 @@ bool segmented_arc::try_add_point(point p, double e_relative)
point_added = true;
points_.push_back(p);
original_shape_length_ += distance;
- if (points_.count() == get_min_segments())
- {
- if (!arc::try_create_arc(points_, current_arc_, original_shape_length_, max_radius_mm_, resolution_mm_, path_tolerance_percent_, min_arc_segments_, mm_per_arc_segment_, xyz_precision_, allow_3d_arcs_))
- {
- point_added = false;
- points_.pop_back();
- original_shape_length_ -= distance;
- }
- }
}
else
{
@@ -214,11 +212,30 @@ bool segmented_arc::try_add_point_internal_(point p, double pd)
if (arc::try_create_arc(points_, current_arc_, original_shape_length_, max_radius_mm_, resolution_mm_, path_tolerance_percent_, min_arc_segments_, mm_per_arc_segment_, xyz_precision_, allow_3d_arcs_))
{
- if (!is_shape())
+ // See how many arcs will be interpolated
+ bool firmware_corrected = false;
+ if (min_arc_segments_ > 0 && mm_per_arc_segment_ > 0)
{
- set_is_shape(true);
+ double circumference = 2.0 * PI_DOUBLE * current_arc_.radius;
+ int num_segments = (int)std::floor(circumference / min_arc_segments_);
+ if (num_segments < min_arc_segments_) {
+ //num_segments = (int)std::ceil(circumference/approximate_length) * (int)std::ceil(approximate_length / mm_per_arc_segment);
+ num_segments = (int)std::floor(circumference / original_shape_length_);
+ if (num_segments < min_arc_segments_) {
+ firmware_corrected = true;
+ num_firmware_compensations_++;
+ }
+ }
+ }
+
+ if (!firmware_corrected)
+ {
+ if (!is_shape())
+ {
+ set_is_shape(true);
+ }
+ return true;
}
- return true;
}
// Can't create the arc. Remove the point and remove the previous segment length.
points_.pop_back();
diff --git a/ArcWelder/segmented_arc.h b/ArcWelder/segmented_arc.h
index 10ad7f0..a51cbbd 100644
--- a/ArcWelder/segmented_arc.h
+++ b/ArcWelder/segmented_arc.h
@@ -56,6 +56,7 @@ public:
double get_max_radius() const;
int get_min_arc_segments() const;
double get_mm_per_arc_segment() const;
+ int get_num_firmware_compensations() const;
private:
bool try_add_point_internal_(point p, double pd);
@@ -67,6 +68,7 @@ private:
double max_radius_mm_;
int min_arc_segments_;
double mm_per_arc_segment_;
+ int num_firmware_compensations_;
bool allow_3d_arcs_;
};
diff --git a/ArcWelder/segmented_shape.cpp b/ArcWelder/segmented_shape.cpp
index 945c912..d9041eb 100644
--- a/ArcWelder/segmented_shape.cpp
+++ b/ArcWelder/segmented_shape.cpp
@@ -332,8 +332,6 @@ bool arc::try_create_arc(
double approximate_length,
double resolution,
double path_tolerance_percent,
- int min_arc_segments,
- double mm_per_arc_segment,
bool allow_3d_arcs)
{
double polar_start_theta = c.get_polar_radians(start_point);
@@ -439,20 +437,6 @@ bool arc::try_create_arc(
angle_radians *= -1.0;
}
- // See how many arcs will be interpolated
- if (min_arc_segments > 0 && mm_per_arc_segment > 0)
- {
- double circumference = 2.0*PI_DOUBLE*c.radius;
- int num_segments = (int)std::ceil(circumference/mm_per_arc_segment);
- if (num_segments < min_arc_segments) {
- // We might be able to salvage this. See if there would be enough segments if we use an arc of the current size
- num_segments = (int)std::ceil(circumference / arc_length);
- if (num_segments < min_arc_segments) {
- return false;
- }
- }
- }
-
target_arc.center.x = c.center.x;
target_arc.center.y = c.center.y;
target_arc.center.z = c.center.z;
@@ -469,20 +453,6 @@ bool arc::try_create_arc(
}
bool arc::try_create_arc(
- const circle& c,
- const array_list<point>& points,
- arc& target_arc,
- double approximate_length,
- double resolution,
- double path_tolerance_percent,
- int min_arc_segments,
- double mm_per_arc_segment,
- bool allow_3d_arcs)
-{
- int mid_point_index = ((points.count() - 2) / 2) + 1;
- return arc::try_create_arc(c, points[0], points[mid_point_index], points[points.count() - 1], target_arc, approximate_length, resolution, path_tolerance_percent, min_arc_segments, mm_per_arc_segment, allow_3d_arcs);
-}
-bool arc::try_create_arc(
const array_list<point>& points,
arc& target_arc,
double approximate_length,
@@ -497,11 +467,14 @@ bool arc::try_create_arc(
circle test_circle;
if (circle::try_create_circle(points, max_radius_mm, resolution_mm, xyz_precision, allow_3d_arcs, false, test_circle))
{
+ // We could save a bit of processing power and do our firmware compensation here, but we won't be able to track statistics for this easily.
+ // moved check to segmented_arc.cpp
int mid_point_index = ((points.count() - 2) / 2) + 1;
- return arc::try_create_arc(test_circle, points[0], points[mid_point_index], points[points.count() - 1], target_arc, approximate_length, resolution_mm, path_tolerance_percent, min_arc_segments, mm_per_arc_segment, allow_3d_arcs);
+ return arc::try_create_arc(test_circle, points[0], points[mid_point_index], points[points.count() - 1], target_arc, approximate_length, resolution_mm, path_tolerance_percent, allow_3d_arcs);
}
return false;
}
+
#pragma endregion
segmented_shape::segmented_shape(int min_segments, int max_segments, double resolution_mm, double path_tolerance_percnet) : points_(max_segments)
diff --git a/ArcWelder/segmented_shape.h b/ArcWelder/segmented_shape.h
index 7e57c54..eda6a7c 100644
--- a/ArcWelder/segmented_shape.h
+++ b/ArcWelder/segmented_shape.h
@@ -163,19 +163,8 @@ struct arc : circle
double approximate_length,
double resolution = DEFAULT_RESOLUTION_MM,
double path_tolerance_percent = ARC_LENGTH_PERCENT_TOLERANCE_DEFAULT,
- int min_arc_segments = DEFAULT_MIN_ARC_SEGMENTS,
- double mm_per_arc_segment = DEFAULT_MM_PER_ARC_SEGMENT,
- bool allow_3d_arcs = DEFAULT_allow_3d_arcs);
- static bool try_create_arc(
- const circle& c,
- const array_list<point>& points,
- arc& target_arc,
- double approximate_length,
- double resolution = DEFAULT_RESOLUTION_MM,
- double path_tolerance_percent = ARC_LENGTH_PERCENT_TOLERANCE_DEFAULT,
- int min_arc_segments = DEFAULT_MIN_ARC_SEGMENTS,
- double mm_per_arc_segment = DEFAULT_MM_PER_ARC_SEGMENT,
bool allow_3d_arcs = DEFAULT_allow_3d_arcs);
+
static bool try_create_arc(
const array_list<point>& points,
arc& target_arc,
diff --git a/ArcWelderInverseProcessor/inverse_processor.cpp b/ArcWelderInverseProcessor/inverse_processor.cpp
index d82568c..f40a66b 100644
--- a/ArcWelderInverseProcessor/inverse_processor.cpp
+++ b/ArcWelderInverseProcessor/inverse_processor.cpp
@@ -347,16 +347,39 @@ void inverse_processor::mc_arc(float* position, float* target, float* offset, fl
if (segments > 1)
{
// Initialize the extruder axis
-
- float cos_T = cos(theta_per_segment);
- float sin_T = sin(theta_per_segment);
+ float cos_T, sin_T, sin_Ti, cos_Ti;
+ //float cos_T = cos(theta_per_segment);
+ //float sin_T = sin(theta_per_segment);
+ float sq_theta_per_segment = theta_per_segment * theta_per_segment;
+ sin_T = theta_per_segment - sq_theta_per_segment * theta_per_segment / 6;
+ cos_T = 1 - 0.5f * sq_theta_per_segment; // Small angle approximation
+
+ //cos_T = 1 - 0.5 * theta_per_segment * theta_per_segment; // Small angle approximation
+ //sin_T = theta_per_segment;
float r_axisi;
uint16_t i;
-
+ int8_t count = 0;
for (i = 1; i < segments; i++) { // Increment (segments-1)
+
+ if (count < cs_.n_arc_correction) {
+ // Apply vector rotation matrix
r_axisi = r_axis_x * sin_T + r_axis_y * cos_T;
r_axis_x = r_axis_x * cos_T - r_axis_y * sin_T;
r_axis_y = r_axisi;
+ count++;
+ }
+ else {
+ // Arc correction to radius vector. Computed only every N_ARC_CORRECTION increments.
+ // Compute exact location by applying transformation matrix from initial radius vector(=-offset).
+ cos_Ti = cos(i * theta_per_segment);
+ sin_Ti = sin(i * theta_per_segment);
+ r_axis_x = -offset[X_AXIS] * cos_Ti + offset[Y_AXIS] * sin_Ti;
+ r_axis_y = -offset[X_AXIS] * sin_Ti - offset[Y_AXIS] * cos_Ti;
+ count = 0;
+
+ }
+
+
// Update arc_target location
p_x = center_axis_x + r_axis_x;
diff --git a/ArcWelderInverseProcessor/inverse_processor.h b/ArcWelderInverseProcessor/inverse_processor.h
index a5f7184..6762953 100644
--- a/ArcWelderInverseProcessor/inverse_processor.h
+++ b/ArcWelderInverseProcessor/inverse_processor.h
@@ -45,6 +45,7 @@ enum AxisEnum { X_AXIS = 0, Y_AXIS= 1, Z_AXIS = 2, E_AXIS = 3, X_HEAD = 4, Y_HEA
#define DEFAULT_MIN_ARC_SEGMENTS 0 // OPTIONAL - The enforced minimum segments in a full circle of the same radius.
#define DEFAULT_ARC_SEGMENTS_PER_SEC 0 // OPTIONAL - Use feedrate to choose segment length.
// approximation will not be used for the first segment. Subsequent segments will be corrected following DEFAULT_N_ARC_CORRECTION.
+#define DEFAULT_N_ARC_CORRECTIONS 24
struct ConfigurationStore {
ConfigurationStore() {
@@ -52,11 +53,13 @@ struct ConfigurationStore {
min_mm_per_arc_segment = DEFAULT_MIN_MM_PER_ARC_SEGMENT;
min_arc_segments = DEFAULT_MIN_ARC_SEGMENTS;
arc_segments_per_sec = DEFAULT_ARC_SEGMENTS_PER_SEC;
+ n_arc_correction = DEFAULT_N_ARC_CORRECTIONS;
}
float mm_per_arc_segment; // This value is ALWAYS used.
float min_mm_per_arc_segment; // if less than or equal to 0, this is disabled
int min_arc_segments; // If less than or equal to zero, this is disabled
double arc_segments_per_sec; // If less than or equal to zero, this is disabled
+ int n_arc_correction;
};
class inverse_processor {
diff --git a/ArcWelderTest/ArcWelderTest.cpp b/ArcWelderTest/ArcWelderTest.cpp
index b121d05..4b893cb 100644
--- a/ArcWelderTest/ArcWelderTest.cpp
+++ b/ArcWelderTest/ArcWelderTest.cpp
@@ -237,7 +237,7 @@ static void TestAntiStutter(std::string filePath)
//double max_resolution = 1;
double max_radius_mm = DEFAULT_MAX_RADIUS_MM;
//int min_arc_segments = DEFAULT_MIN_ARC_SEGMENTS;
- int min_arc_segments = 12;
+ int min_arc_segments = 24;
double mm_per_arc_segment = 1;
double path_tolerance_percent = ARC_LENGTH_PERCENT_TOLERANCE_DEFAULT; // 1 percent
@@ -253,11 +253,12 @@ static void TestAntiStutter(std::string filePath)
logger_levels.push_back(log_levels::ERROR);
logger_levels.push_back(log_levels::CRITICAL);
logger* p_logger = new logger(logger_names, logger_levels);
- p_logger->set_log_level(INFO);
+ //p_logger->set_log_level(INFO);
+ p_logger->set_log_level_by_value(5);
//arc_welder arc_welder_obj(BENCHY_0_5_MM_NO_WIPE, "C:\\Users\\Brad\\Documents\\3DPrinter\\AntiStutter\\test_output.gcode", p_logger, max_resolution, false, 50, static_cast<progress_callback>(on_progress));
//arc_welder arc_welder_obj(SIX_SPEED_TEST, "C:\\Users\\Brad\\Documents\\3DPrinter\\AntiStutter\\test_output.gcode", p_logger, max_resolution, false, 50, on_progress);
arc_welder arc_welder_obj(
- BENCHY_L1_DIFFICULT,
+ BENCHY_MIN_RADIUS_TEST,
"C:\\Users\\Brad\\Documents\\3DPrinter\\AntiStutter\\test_output.gcode",
p_logger,
max_resolution,
@@ -269,6 +270,8 @@ static void TestAntiStutter(std::string filePath)
true,
DEFAULT_GCODE_BUFFER_SIZE,
on_progress);
+ //FIRMWARE_COMPENSATION_TEST_1
+ //BENCHY_MIN_RADIUS_TEST
//BENCHY_DIFFICULT
//BENCHY_LAYER_1GCODE
//SMALL_TEST
diff --git a/ArcWelderTest/ArcWelderTest.h b/ArcWelderTest/ArcWelderTest.h
index 90ed99a..ea3fdf9 100644
--- a/ArcWelderTest/ArcWelderTest.h
+++ b/ArcWelderTest/ArcWelderTest.h
@@ -86,5 +86,10 @@ static std::string SPIRAL_VASE_TEST_CYLINDER = "C:\\Users\\Brad\\Documents\\3DPr
static std::string SPIRAL_VASE_TEST_SINGLE_LAYER_CYLINDER = "C:\\Users\\Brad\\Documents\\3DPrinter\\AntiStutter\\SpiralVaseTest\\SpiralVaseSingleLayer_Cylinder.gcode";
static std::string SPIRAL_VASE_TEST_PI_BOWL = "C:\\Users\\Brad\\Documents\\3DPrinter\\AntiStutter\\SpiralVaseTest\\SpiralVaseTest_PiBowl.gcode";
+static std::string FIRMWARE_COMPENSATION_TEST_1 = "C:\\Users\\Brad\\Documents\\3DPrinter\\AntiStutter\\cylinder_tests\\cylinder_test_0.1_5.0_0.1.gcode";
+static std::string BENCHY_MIN_RADIUS_TEST = "C:\\Users\\Brad\\Documents\\3DPrinter\\AntiStutter\\BenchyMinRadiusTest.gcode";
+
+
+
diff --git a/GcodeProcessorLib/logger.cpp b/GcodeProcessorLib/logger.cpp
index 9fa5a6d..5b1e4eb 100644
--- a/GcodeProcessorLib/logger.cpp
+++ b/GcodeProcessorLib/logger.cpp
@@ -51,9 +51,10 @@ void logger::set_log_level_by_value(const int logger_type, const int level_value
}
void logger::set_log_level_by_value(const int level_value)
{
+ int log_level = get_log_level_for_value(level_value);
for (int type_index = 0; type_index < num_loggers_; type_index++)
{
- logger_levels_[type_index] = get_log_level_for_value(level_value);
+ logger_levels_[type_index] = log_level;
}
}
void logger::set_log_level(const int logger_type, const int log_level)
diff --git a/PyArcWelder/py_arc_welder.cpp b/PyArcWelder/py_arc_welder.cpp
index fc185fe..36588f2 100644
--- a/PyArcWelder/py_arc_welder.cpp
+++ b/PyArcWelder/py_arc_welder.cpp
@@ -32,7 +32,7 @@ PyObject* py_arc_welder::build_py_progress(const arc_welder_progress& progress,
if (pyMessage == NULL)
return NULL;
double total_count_reduction_percent = progress.segment_statistics.get_total_count_reduction_percent();
- PyObject* py_progress = Py_BuildValue("{s:d,s:d,s:d,s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:f,s:f,s:f,s:f,s:i,s:i,s:f}",
+ PyObject* py_progress = Py_BuildValue("{s:d,s:d,s:d,s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:f,s:f,s:f,s:f,s:i,s:i,s:f}",
"percent_complete",
progress.percent_complete, //1
"seconds_elapsed",
@@ -47,26 +47,28 @@ PyObject* py_arc_welder::build_py_progress(const arc_welder_progress& progress,
progress.points_compressed, //6
"arcs_created",
progress.arcs_created, //7
+ "num_firmware_compensations",
+ progress.num_firmware_compensations, //8
"source_file_position",
- progress.source_file_position, //8
+ progress.source_file_position, //9
"source_file_size",
- progress.source_file_size, //9
+ progress.source_file_size, //10
"target_file_size",
- progress.target_file_size, //10
+ progress.target_file_size, //11
"compression_ratio",
- progress.compression_ratio, //11
+ progress.compression_ratio, //12
"compression_percent",
- progress.compression_percent, //12
+ progress.compression_percent, //13
"source_file_total_length",
- progress.segment_statistics.total_length_source, //13
+ progress.segment_statistics.total_length_source, //14
"target_file_total_length",
- progress.segment_statistics.total_length_target, //14
+ progress.segment_statistics.total_length_target, //15
"source_file_total_count",
- progress.segment_statistics.total_count_source, //15
+ progress.segment_statistics.total_count_source, //16
"target_file_total_count",
- progress.segment_statistics.total_count_target, //16
+ progress.segment_statistics.total_count_target, //17
"total_count_reduction_percent",
- total_count_reduction_percent //17
+ total_count_reduction_percent //18
);
@@ -98,6 +100,7 @@ bool py_arc_welder::on_progress_(const arc_welder_progress& progress)
PyGILState_STATE gstate = PyGILState_Ensure();
PyObject* pContinueProcessing = PyObject_CallObject(py_progress_callback_, func_args);
+ PyGILState_Release(gstate);
Py_DECREF(func_args);
Py_DECREF(py_dict);
bool continue_processing;
@@ -118,6 +121,6 @@ bool py_arc_welder::on_progress_(const arc_welder_progress& progress)
}
Py_DECREF(pContinueProcessing);
}
- PyGILState_Release(gstate);
+
return continue_processing;
}
diff --git a/PyArcWelder/py_arc_welder_extension.cpp b/PyArcWelder/py_arc_welder_extension.cpp
index 5f7553c..e9d85ca 100644
--- a/PyArcWelder/py_arc_welder_extension.cpp
+++ b/PyArcWelder/py_arc_welder_extension.cpp
@@ -28,6 +28,7 @@
#include "arc_welder.h"
#include "py_logger.h"
#include "python_helpers.h"
+#include "version.h"
#if PY_MAJOR_VERSION >= 3
int main(int argc, char* argv[])
@@ -47,10 +48,10 @@ int main(int argc, char* argv[])
// Initialize the Python interpreter. Required.
Py_Initialize();
// We are not using threads, do not enable.
- /*std::cout << "Initializing threads...";
+ std::cout << "Initializing threads...";
if (!PyEval_ThreadsInitialized()) {
PyEval_InitThreads();
- }*/
+ }
// Optionally import the module; alternatively, import can be deferred until the embedded script imports it.
PyImport_ImportModule("PyArcWelder");
PyMem_RawFree(program);
@@ -126,8 +127,9 @@ PyInit_PyArcWelder(void)
extern "C" void initPyArcWelder(void)
#endif
{
- std::cout << "Initializing PyArcWelder V0.1.0rc1.dev2 - Copyright (C) 2019 Brad Hochgesang.";
-
+ std::cout << "Initializing PyArcWelder";
+ std::cout << "\nVersion: " << GIT_TAGGED_VERSION << ", Branch: " << GIT_BRANCH << ", BuildDate: " << BUILD_DATE;
+ std::cout << "\nCopyright(C) " << COPYRIGHT_DATE << " - " << AUTHOR;
#if PY_MAJOR_VERSION >= 3
std::cout << " Python 3+ Detected...";
PyObject* module = PyModule_Create(&moduledef);
@@ -159,7 +161,7 @@ extern "C" void initPyArcWelder(void)
p_py_logger->initialize_loggers();
std::string message = "PyArcWelder V0.1.0rc1.dev2 imported - Copyright (C) 2019 Brad Hochgesang...";
p_py_logger->log(GCODE_CONVERSION, INFO, message);
- p_py_logger->set_log_level_by_value(DEBUG);
+ p_py_logger->set_log_level(ERROR);
std::cout << " Initialization Complete\r\n";
#if PY_MAJOR_VERSION >= 3
@@ -190,8 +192,7 @@ extern "C"
{
return NULL;
}
- p_py_logger->set_log_level_by_value(args.log_level);
-
+ p_py_logger->set_log_level(args.log_level);
std::string message = "py_gcode_arc_converter.ConvertFile - Beginning Arc Conversion.";
p_py_logger->log(GCODE_CONVERSION, INFO, message);
diff --git a/PyArcWelder/py_logger.cpp b/PyArcWelder/py_logger.cpp
index 1020331..0418ef5 100644
--- a/PyArcWelder/py_logger.cpp
+++ b/PyArcWelder/py_logger.cpp
@@ -203,7 +203,7 @@ void py_logger::log(const int logger_type, const int log_level, const std::strin
return;
}
}
- PyObject* pyMessage = gcode_arc_converter::PyUnicode_SafeFromString(message);
+ PyObject* pyMessage = gcode_arc_converter::PyBytesOrString_FromString(message);
if (pyMessage == NULL)
{
std::cout << "Unable to convert the log message '" << message.c_str() << "' to a PyString/Unicode message.\r\n";
@@ -222,7 +222,6 @@ void py_logger::log(const int logger_type, const int log_level, const std::strin
{
std::cout << "Logging.arc_welder_log - null was returned from the specified logger.\r\n";
PyErr_SetString(PyExc_ValueError, "Logging.arc_welder_log - null was returned from the specified logger.");
- return;
}
else
{
@@ -234,7 +233,6 @@ void py_logger::log(const int logger_type, const int log_level, const std::strin
// return an error.
PyErr_Print();
PyErr_Clear();
- return;
}
}
else
diff --git a/PyArcWelder/python_helpers.cpp b/PyArcWelder/python_helpers.cpp
index acaae19..3eaa39c 100644
--- a/PyArcWelder/python_helpers.cpp
+++ b/PyArcWelder/python_helpers.cpp
@@ -72,6 +72,15 @@ namespace gcode_arc_converter {
#endif
}
+ PyObject* PyBytesOrString_FromString(std::string str)
+ {
+#if PY_MAJOR_VERSION >= 3
+ return PyBytes_FromString(str.c_str());
+#else
+ return PyString_FromString(str.c_str());
+#endif
+ }
+
double PyFloatOrInt_AsDouble(PyObject* py_double_or_int)
{
if (PyFloat_CheckExact(py_double_or_int))
diff --git a/PyArcWelder/python_helpers.h b/PyArcWelder/python_helpers.h
index 93ad23d..80d59ed 100644
--- a/PyArcWelder/python_helpers.h
+++ b/PyArcWelder/python_helpers.h
@@ -34,6 +34,7 @@ namespace gcode_arc_converter {
const char* PyUnicode_SafeAsString(PyObject* py);
PyObject* PyString_SafeFromString(const char* str);
PyObject* PyUnicode_SafeFromString(std::string str);
+ PyObject* PyBytesOrString_FromString(std::string str);
double PyFloatOrInt_AsDouble(PyObject* py_double_or_int);
long PyIntOrLong_AsLong(PyObject* value);
bool PyFloatLongOrInt_Check(PyObject* value);