diff options
author | FormerLurker <hochgebe@gmail.com> | 2020-11-28 03:20:29 +0300 |
---|---|---|
committer | FormerLurker <hochgebe@gmail.com> | 2020-11-28 03:20:29 +0300 |
commit | 7da85eb0a6d659885b4a16fce7a0ba15ecbe0e39 (patch) | |
tree | 113b82b09851a545fd5666deab1b790cc52635d0 | |
parent | 359b6e92bf252a9ab6485179aee7f3148108aa86 (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.cpp | 16 | ||||
-rw-r--r-- | ArcWelder/arc_welder.h | 3 | ||||
-rw-r--r-- | ArcWelder/segmented_arc.cpp | 41 | ||||
-rw-r--r-- | ArcWelder/segmented_arc.h | 2 | ||||
-rw-r--r-- | ArcWelder/segmented_shape.cpp | 35 | ||||
-rw-r--r-- | ArcWelder/segmented_shape.h | 13 | ||||
-rw-r--r-- | ArcWelderInverseProcessor/inverse_processor.cpp | 31 | ||||
-rw-r--r-- | ArcWelderInverseProcessor/inverse_processor.h | 3 | ||||
-rw-r--r-- | ArcWelderTest/ArcWelderTest.cpp | 9 | ||||
-rw-r--r-- | ArcWelderTest/ArcWelderTest.h | 5 | ||||
-rw-r--r-- | GcodeProcessorLib/logger.cpp | 3 | ||||
-rw-r--r-- | PyArcWelder/py_arc_welder.cpp | 27 | ||||
-rw-r--r-- | PyArcWelder/py_arc_welder_extension.cpp | 15 | ||||
-rw-r--r-- | PyArcWelder/py_logger.cpp | 4 | ||||
-rw-r--r-- | PyArcWelder/python_helpers.cpp | 9 | ||||
-rw-r--r-- | PyArcWelder/python_helpers.h | 1 |
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); |